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

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

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

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

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

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

Сообщение kotriks »

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

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

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

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

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

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

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

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

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

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

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

Сообщение kotriks »

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

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

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

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

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

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

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

Сообщение dimmar »

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

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

Сообщение oleg110592 »

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

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

Сообщение dimmar »

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

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

Сообщение 0867532 »

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

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

Сообщение dimmar »

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


А индикация какая, мне нужна семисегментная. А можно посмотреть ваш код, если он на си?

oleg110592 писал(а):индикация на прерывании?
viewtopic.php?t=8179&view=next


Почитал тему, но как править библиотеку не пойму. Единственное что сделал это обернул все строки wl_write() wl_init() заперетом и разрешением прерывания, как советовали, но картина не изменилась.
Часто упоминаются переделанные библиотеки, но где их взять?
Что поиск рулит знаю. Забанен во всех поисковых системах.
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

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

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

Сообщение oleg110592 »

обернул все строки wl_write() wl_init()

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

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

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

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

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

Сообщение oleg110592 »

а так:
#asm("cli")
temper=ds18b20_temperature(0);
#asm("sei")
будет еще некрасивее индикация
раскладываем число на разряды

это, имхо в прерывании лучше не делать
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

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

Сообщение dimmar »

dimmar писал(а):а так:#asm("cli")temper=ds18b20_temperature(0);#asm("sei")будет еще некрасивее индикация


Так тоже -9999 проскакивает.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Тема по 18В20: viewtopic.php?f=61&t=64022
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

2 dimmar ответил viewtopic.php?f=61&t=64022&p=1830530#p1830530
2 модератор перенесите, пожалуйста
Tenken
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт янв 17, 2013 21:25:30
Откуда: Тула

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

Сообщение Tenken »

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

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