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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

Естественно, там ошибки. Нужно указать элемент массива. Вы ведь хотели сделать массив?
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

И как это сделать?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

После имени массива (off.data) в квадратных скобках написать номер элемента: off.data[5], например.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Странный какой-то народ. Объявляют как переменную, используют как массив. Объявляют как массив, а используют как переменную :roll:
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

Да уж, странно...
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

и к чему эта 5 к примеру будет привязана , ничего ваще не понял.
пс. чё странного то в авр студио норм компилится и работает в квавре вечно косяки какие то.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

и к чему эта 5 к примеру будет привязана
К тому же, к чему и в Вашем коде привязана а:

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

off.data[a]=0;
Вы хотели массив, Вам его и предоставили.
А косяки в программе, а не в компиляторе. Причём очевидные.
Разберитесь в своих мыслях и определитесь, что Вам нужно и что хотите... Можете даже рассказать нам, советом всегда поможем.
Контактная информация:
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Сообщение dimmar »

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

Сообщение oleg110592 »

индикация на прерывании?
http://radiokot.ru/forum/viewtopic.php?t=8179&view=next
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Сообщение dimmar »

Да, на прерывании.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Встал на лапы
Аватара пользователя
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва

Сообщение 0867532 »

я обычно делаю так:
создаю переменную flag
создаю прерывание по таймеру(самое медленное)
и в него пишу flag = 1;
далее пихаю индикацию в основной цикл
и в нём же проверяю flag.
если flag = 1 { считываю инфу с ds18b20; flag = 0;}
всё.
если медленности прерывания по таймеру недостаточно, то можно поставить ещё переменную, которая считает прерывания, и по достижению 5 ,скажем, запиливаем flag=1; а счётчик возвращаем в 0.
работает стабильно уже 1месяц:)
Если возникнут вопросы - посмотрите на мой аватар.
Контактная информация:
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Сообщение 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() заперетом и разрешением прерывания, как советовали, но картина не изменилась.
Часто упоминаются переделанные библиотеки, но где их взять?
Что поиск рулит знаю. Забанен во всех поисковых системах.
Встал на лапы
Аватара пользователя
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва

Сообщение 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 Ох, тогда я ещё не знал что такое массив:)
Если возникнут вопросы - посмотрите на мой аватар.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

обернул все строки wl_write() wl_init()
там же вроде все попроще:
temperature=ds18b20_temperature(0); //один датчик
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Сообщение 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;
}

Но это как то не красиво.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

а так:
#asm("cli")
temper=ds18b20_temperature(0);
#asm("sei")
будет еще некрасивее индикация
раскладываем число на разряды
это, имхо в прерывании лучше не делать
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Сообщение dimmar »

dimmar писал(а):а так:#asm("cli")temper=ds18b20_temperature(0);#asm("sei")будет еще некрасивее индикация
Так тоже -9999 проскакивает.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

2 dimmar ответил http://radiokot.ru/forum/viewtopic.php? ... 0#p1830530
2 модератор перенесите, пожалуйста
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт янв 17, 2013 21:25:30
Откуда: Тула

Сообщение Tenken »

Здраствуйте изучать контроллеры начал недавно) по книге Белова) . Дошел до главы прерываний по таймеру и сдвига светодиодов) в книге устройства описано на 2313, но т к случайно "зашил"не тот фьюз контроллер пришлось пока отложить, но благо была атмега 8 попробывал написать хоть что- то для неё нифига не получилось... кварц на 4 мгц. Подскажите пожалуйста
Вложения
Без имени-1.jpg
фьюзы
(120.1 КБ) 304 скачивания
1.c
программа
(2.76 КБ) 239 скачиваний
Ответить

Вернуться в «AVR»