Страница 282 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 11:05:14
*Trigger*
Естественно, там ошибки. Нужно указать элемент массива. Вы ведь хотели сделать массив?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 11:16:56
kotriks
И как это сделать?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 11:28:52
*Trigger*
После имени массива (off.data) в квадратных скобках написать номер элемента: off.data[5], например.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 12:02:42
Аlex
Странный какой-то народ. Объявляют как переменную, используют как массив. Объявляют как массив, а используют как переменную :roll:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 12:23:13
*Trigger*
Да уж, странно...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 19:17:08
kotriks
и к чему эта 5 к примеру будет привязана , ничего ваще не понял.
пс. чё странного то в авр студио норм компилится и работает в квавре вечно косяки какие то.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн ноя 04, 2013 19:21:27
Аlex
и к чему эта 5 к примеру будет привязана
К тому же, к чему и в Вашем коде привязана а:

Код: Выделить всё

off.data[a]=0;
Вы хотели массив, Вам его и предоставили.
А косяки в программе, а не в компиляторе. Причём очевидные.
Разберитесь в своих мыслях и определитесь, что Вам нужно и что хотите... Можете даже рассказать нам, советом всегда поможем.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 19:11:25
dimmar
Всем привет! Программированием стал изучать недавно.
И вот столкнулся с написанием прошивки с использованием DS18B20
Использовал стандартную библиотеку из CodeVision AVR.
А именно: температуру показывает, но периодически проскакивает -9999.
Как с эти бороться? Что-то почитал в нете, но или язык не тот и мне непонятен, или советы по решению этой проблемы есть, но у меня почему-то не работают. Но ведь сколько уже этих градусников и термостатов собрано. Вот сейчас на одном форуме тему по этой проблеме прочитал, и там в конце модератор свой проект выложил, типа вот вам всё работает. Симулирую в протеусе, та же фигня. Объясните пожалуйста доступно.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 19:25:42
oleg110592
индикация на прерывании?
http://radiokot.ru/forum/viewtopic.php?t=8179&view=next

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 19:54:17
dimmar
Да, на прерывании.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 20:51:00
0867532
я обычно делаю так:
создаю переменную flag
создаю прерывание по таймеру(самое медленное)
и в него пишу flag = 1;
далее пихаю индикацию в основной цикл
и в нём же проверяю flag.
если flag = 1 { считываю инфу с ds18b20; flag = 0;}
всё.
если медленности прерывания по таймеру недостаточно, то можно поставить ещё переменную, которая считает прерывания, и по достижению 5 ,скажем, запиливаем flag=1; а счётчик возвращаем в 0.
работает стабильно уже 1месяц:)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 21:26:34
dimmar
0867532 писал(а):я обычно делаю так:
создаю переменную flag
создаю прерывание по таймеру(самое медленное)
и в него пишу flag = 1;
далее пихаю индикацию в основной цикл
и в нём же проверяю flag.
если flag = 1 { считываю инфу с ds18b20; flag = 0;}
всё.
если медленности прерывания по таймеру недостаточно, то можно поставить ещё переменную, которая считает прерывания, и по достижению 5 ,скажем, запиливаем flag=1; а счётчик возвращаем в 0.
работает стабильно уже 1месяц:)

А индикация какая, мне нужна семисегментная. А можно посмотреть ваш код, если он на си?
oleg110592 писал(а):индикация на прерывании?
http://radiokot.ru/forum/viewtopic.php?t=8179&view=next
Почитал тему, но как править библиотеку не пойму. Единственное что сделал это обернул все строки wl_write() wl_init() заперетом и разрешением прерывания, как советовали, но картина не изменилась.
Часто упоминаются переделанные библиотеки, но где их взять?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 21:52:34
0867532

Код: Выделить всё

while (1) {
if (doflag == 1) {
rtc_get_time(&hrs,&min,&sec);
hrst = hrs/10;
hrso = hrs%10;
mint = min/10;
mino = min%10;
doflag = 0; 
}
if (PINC.7==0) {delay_ms(50); setupflag=1;}
if (setupflag==1) {
    if (PINC.4==0) { Chrs++; delay_ms(50);}
    if (PINC.5==0) { Chrs--; delay_ms(50);}
    if (PINC.7==0) {setupflag=2; delay_ms(50);}         
    hrst = Chrs/10;
    hrso = Chrs%10;
    mint = 99;
    mino = 99;    
}
if (setupflag==2) {
    if (PINC.4==0) { Cmin++; delay_ms(50);}
    if (PINC.5==0) { Cmin--; delay_ms(50);}
    if (PINC.7==0) { rtc_set_time(Chrs,Cmin,0);setupflag=0; delay_ms(50);}
    hrst = 99;
    hrso = 99;
    mint = Cmin/10;
    mino = Cmin%10;
}
if (mino == 0) {NUM0();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 1) {NUM1();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 2) {NUM2();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 3) {NUM3();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 4) {NUM4();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 5) {NUM5();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 6) {NUM6();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 7) {NUM7();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 8) {NUM8();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mino == 9) {NUM9();PORTA.4 = 0xFF;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0x00;}
delay_us(300);
if (mint == 0) {NUM0();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 1) {NUM1();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 2) {NUM2();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 3) {NUM3();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 4) {NUM4();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 5) {NUM5();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 6) {NUM6();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 7) {NUM7();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 8) {NUM8();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
if (mint == 9) {NUM9();PORTA.4 = 0x00;PORTA.5 = 0xFF;PORTA.6 = 0x00;PORTA.7 = 0x00;}
delay_us(300);
if (hrso == 0) {NUM0();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 1) {NUM1();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 2) {NUM2();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 3) {NUM3();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 4) {NUM4();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 5) {NUM5();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 6) {NUM6();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 7) {NUM7();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 8) {NUM8();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
if (hrso == 9) {NUM9();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0xFF;PORTA.7 = 0x00;}
delay_us(300);
if (hrst == 0) {NUM0();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 1) {NUM1();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 2) {NUM2();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 3) {NUM3();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 4) {NUM4();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 5) {NUM5();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 6) {NUM6();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 7) {NUM7();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 8) {NUM8();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
if (hrst == 9) {NUM9();PORTA.4 = 0x00;PORTA.5 = 0x00;PORTA.6 = 0x00;PORTA.7 = 0xFF;}
delay_us(300);
это основной цикл
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
if (setupflag == 0) {
waitflag++;
waitflag2++;
if (waitflag == 5) { PORTD.3 = !PORTD.3; waitflag = 0;}
if (waitflag2 == 50) {waitflag2 = 0; doflag = 1; } }
}
это прерывание
Я не очень помню что есть что, код старый(но рабочий), похож на кучу мусора, но я думаю смысл вы поймёте.
Тут ещё и код настройки времени
PS Ох, тогда я ещё не знал что такое массив:)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 23:05:55
oleg110592
обернул все строки wl_write() wl_init()
там же вроде все попроще:
temperature=ds18b20_temperature(0); //один датчик

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 23:26:51
dimmar
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

// Индикация по прерыванию таймера 2
PORTD = 0xFF; //гасим все разряды
PORTB = (1 << segcounter); //выбираем следующий разряд
switch (segcounter)
{
//case 0:
//PORTD = ~(SEGMENT[display1 % 10000 / 1000]); // здесь раскладываем число на разряды этот тысячи
//break;
case 0:
if (display1>99){
PORTD = ~(SEGMENT[display1 % 1000 / 100]);
}
break;
case 1:
if (display1>9){
PORTD = ~(SEGMENT[display1 % 100 / 10]);
}
break;
case 2:
PORTD = ~(SEGMENT[display1 % 10]);
break;
case 3:
if (display>99){
PORTD = ~(SEGMENT[display % 1000 / 100]);
}
break;
case 4:
if (display>9){
PORTD = ~(SEGMENT[display % 100 / 10]);
}
break;
case 5:
PORTD = ~(SEGMENT[display % 10]);
break;
}
if ((segcounter++) > 4) segcounter = 0;

}
Индикация

while (1)
{
temper=ds18b20_temperature(0);
display1=temper;
}

Да, датчик один, вроде всё просто, но иногда -9999

Можно конечно запретить вывод -9999

temper=ds18b20_temperature(0);

if (temper>-55){
display1=temper;
}

Но это как то не красиво.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт ноя 05, 2013 23:54:51
oleg110592
а так:
#asm("cli")
temper=ds18b20_temperature(0);
#asm("sei")
будет еще некрасивее индикация
раскладываем число на разряды
это, имхо в прерывании лучше не делать

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср ноя 06, 2013 10:00:56
dimmar
dimmar писал(а):а так:#asm("cli")temper=ds18b20_temperature(0);#asm("sei")будет еще некрасивее индикация
Так тоже -9999 проскакивает.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср ноя 06, 2013 10:03:04
Gudd-Head

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср ноя 06, 2013 11:57:15
oleg110592
2 dimmar ответил http://radiokot.ru/forum/viewtopic.php? ... 0#p1830530
2 модератор перенесите, пожалуйста

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт ноя 07, 2013 21:48:35
Tenken
Здраствуйте изучать контроллеры начал недавно) по книге Белова) . Дошел до главы прерываний по таймеру и сдвига светодиодов) в книге устройства описано на 2313, но т к случайно "зашил"не тот фьюз контроллер пришлось пока отложить, но благо была атмега 8 попробывал написать хоть что- то для неё нифига не получилось... кварц на 4 мгц. Подскажите пожалуйста