CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Естественно, там ошибки. Нужно указать элемент массива. Вы ведь хотели сделать массив?
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
И как это сделать?
Re: CodeVision AVR в вопросах и ответах
После имени массива (off.data) в квадратных скобках написать номер элемента: off.data[5], например.
Этот пост оказался полезен? Не поленись, нажми
слева!

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

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
и к чему эта 5 к примеру будет привязана , ничего ваще не понял.
пс. чё странного то в авр студио норм компилится и работает в квавре вечно косяки какие то.
пс. чё странного то в авр студио норм компилится и работает в квавре вечно косяки какие то.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
К тому же, к чему и в Вашем коде привязана а:и к чему эта 5 к примеру будет привязана
Код: Выделить всё
off.data[a]=0;
А косяки в программе, а не в компиляторе. Причём очевидные.
Разберитесь в своих мыслях и определитесь, что Вам нужно и что хотите... Можете даже рассказать нам, советом всегда поможем.
Re: CodeVision AVR в вопросах и ответах
Всем привет! Программированием стал изучать недавно.
И вот столкнулся с написанием прошивки с использованием DS18B20
Использовал стандартную библиотеку из CodeVision AVR.
А именно: температуру показывает, но периодически проскакивает -9999.
Как с эти бороться? Что-то почитал в нете, но или язык не тот и мне непонятен, или советы по решению этой проблемы есть, но у меня почему-то не работают. Но ведь сколько уже этих градусников и термостатов собрано. Вот сейчас на одном форуме тему по этой проблеме прочитал, и там в конце модератор свой проект выложил, типа вот вам всё работает. Симулирую в протеусе, та же фигня. Объясните пожалуйста доступно.
И вот столкнулся с написанием прошивки с использованием DS18B20
Использовал стандартную библиотеку из CodeVision AVR.
А именно: температуру показывает, но периодически проскакивает -9999.
Как с эти бороться? Что-то почитал в нете, но или язык не тот и мне непонятен, или советы по решению этой проблемы есть, но у меня почему-то не работают. Но ведь сколько уже этих градусников и термостатов собрано. Вот сейчас на одном форуме тему по этой проблеме прочитал, и там в конце модератор свой проект выложил, типа вот вам всё работает. Симулирую в протеусе, та же фигня. Объясните пожалуйста доступно.
Что поиск рулит знаю. Забанен во всех поисковых системах.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
индикация на прерывании?
viewtopic.php?t=8179&view=next
viewtopic.php?t=8179&view=next
Re: CodeVision AVR в вопросах и ответах
Да, на прерывании.
Что поиск рулит знаю. Забанен во всех поисковых системах.
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
я обычно делаю так:
создаю переменную flag
создаю прерывание по таймеру(самое медленное)
и в него пишу flag = 1;
далее пихаю индикацию в основной цикл
и в нём же проверяю flag.
если flag = 1 { считываю инфу с ds18b20; flag = 0;}
всё.
если медленности прерывания по таймеру недостаточно, то можно поставить ещё переменную, которая считает прерывания, и по достижению 5 ,скажем, запиливаем flag=1; а счётчик возвращаем в 0.
работает стабильно уже 1месяц:)
создаю переменную flag
создаю прерывание по таймеру(самое медленное)
и в него пишу flag = 1;
далее пихаю индикацию в основной цикл
и в нём же проверяю flag.
если flag = 1 { считываю инфу с ds18b20; flag = 0;}
всё.
если медленности прерывания по таймеру недостаточно, то можно поставить ещё переменную, которая считает прерывания, и по достижению 5 ,скажем, запиливаем flag=1; а счётчик возвращаем в 0.
работает стабильно уже 1месяц:)
Если возникнут вопросы - посмотрите на мой аватар.
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
Код: Выделить всё
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 в вопросах и ответах
обернул все строки wl_write() wl_init()
там же вроде все попроще:
temperature=ds18b20_temperature(0); //один датчик
Re: CodeVision AVR в вопросах и ответах
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;
}
Но это как то не красиво.
{
// Индикация по прерыванию таймера 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 в вопросах и ответах
а так:
#asm("cli")
temper=ds18b20_temperature(0);
#asm("sei")
будет еще некрасивее индикация
это, имхо в прерывании лучше не делать
#asm("cli")
temper=ds18b20_temperature(0);
#asm("sei")
будет еще некрасивее индикация
раскладываем число на разряды
это, имхо в прерывании лучше не делать
Re: CodeVision AVR в вопросах и ответах
dimmar писал(а):а так:#asm("cli")temper=ds18b20_temperature(0);#asm("sei")будет еще некрасивее индикация
Так тоже -9999 проскакивает.
Что поиск рулит знаю. Забанен во всех поисковых системах.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
Тема по 18В20: viewtopic.php?f=61&t=64022
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
2 dimmar ответил viewtopic.php?f=61&t=64022&p=1830530#p1830530
2 модератор перенесите, пожалуйста
2 модератор перенесите, пожалуйста
Re: CodeVision AVR в вопросах и ответах
Здраствуйте изучать контроллеры начал недавно) по книге Белова) . Дошел до главы прерываний по таймеру и сдвига светодиодов) в книге устройства описано на 2313, но т к случайно "зашил"не тот фьюз контроллер пришлось пока отложить, но благо была атмега 8 попробывал написать хоть что- то для неё нифига не получилось... кварц на 4 мгц. Подскажите пожалуйста
- Вложения
-
- Без имени-1.jpg
- фьюзы
- (120.1 КБ) 303 скачивания
-
- 1.c
- программа
- (2.76 КБ) 238 скачиваний