CodeVision AVR в вопросах и ответах
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Да как хотите. Менюшке без разницы, как вы в нее параметры передадите. Назначение интов - мгновенная реакция на событие. По таймеру просто опрос. В вашем случае кнопок инты - излишество.
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Ясно! А смотрите, допустим мне надо, чтобы последовательно нажимая скажем INT0, можно было бы переключать пункты меню? Как мне кажется нужно использовать оператор switch(), только как включить его в программу никак неразберусь. Подскажите пожалуйста!!!!
Заранее спасибо!!!!
Заранее спасибо!!!!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
При попадании в интовое прерывание ведете счет переменной, от 0 до 2. В зависимости от ее состояния выбираете нужное действие. Вот он, свич.
Код: Выделить всё
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
....
break;
case 1:
....
break;
case 2:
....
break;
default:
....
break;
}
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Понял! Спасибо сейчас попробую!
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Подкаректируйте пожалуйста фрагмент исходника:
[size=85]#asm("sei");
while(1);
}
interrupt [EXT_INT0] void ExtInt0(void)
{
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD0");
}
break;
case 1:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD1");
}
break;
case 2:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD2");
}
break;
}
} [/size]
punkt_menu описывается так:??? - unsigned char punkt_menu; ????
Спасибо!!!!!
[size=85]#asm("sei");
while(1);
}
interrupt [EXT_INT0] void ExtInt0(void)
{
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD0");
}
break;
case 1:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD1");
}
break;
case 2:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD2");
}
break;
}
} [/size]
punkt_menu описывается так:??? - unsigned char punkt_menu; ????
Спасибо!!!!!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Да что ж ты родной все с этими вхилами........ Опять же нафига каждый раз клеар и гото. Пальцы не устают тарабанить по клаве? В самом начале сделал и все. Дефолт зачем выкинул?
Описание переменной верное.
Описание переменной верное.
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Ну, понял косяки исправил, но в протеусе при нажатии на инт0 работает вообщем только case1. Что может быть??? Так по поводу клир, если его не делать то на дисплее остается ранее выведенный текст??
Спасибо!!!!
Спасибо!!!!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Это
вставьте перед свичем. В остальных местах убрать.
А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Код: Выделить всё
lcd_clear( );
lcd_gotoxy(0,0);вставьте перед свичем. В остальных местах убрать.
А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
; 0000 0043 case 0:
0000a3 9730 SBIW R30,0
0000a4 f441 BRNE _0x13
; 0000 0044 while(1){ МАТЬ-ПЕРЕМАТЬ!!!!!!!!!!!!!
_0x14:
; 0000 0045 lcd_gotoxy(0,0);
0000a5 e0e0 LDI R30,LOW(0)
0000a6 940e 01b8 CALL SUBOPT_0x0
; 0000 0046 lcd_putsf( "LCD0");
+
0000a8 e6ef +LDI R30 , LOW ( 2 * _0x0 + 27 )
0000a9 e0f0 +LDI R31 , HIGH ( 2 * _0x0 + 27 )
__POINTW1FN _0x0,27
0000aa 940e 01bd CALL SUBOPT_0x1
; 0000 0047 }
0000ac cff8 RJMP _0x14
Обратить внимание на строчку с восклицательными знаками. Сами прикиньте, что делает этот оператор. Немудрено, что кнопка обрабатывается один раз.
Код: Выделить всё
; 0000 003F if(++punkt_menu > 3) punkt_menu= 0;Что за тройка???????
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Нет. Там 2-ка, просто перед тем как отправить не обновил, просто решил поэксперементировать. Так там двойка., а что со сторчкой мать-..... объясни пожалуйста.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Так, еще раз. Убрать вхилы из обработчика прерывания. Чтобы дать возможность программе не крутиться на одном месте, а вылезти из прерывания и ждать следующего.
Кто-нибудь! Налейте мне валерианки.
Кто-нибудь! Налейте мне валерианки.
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Отлично! Все понял все работает!!! Дружище спасибо тебе за помощь!!!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Фуф! Теперь с чувством выполненного долга пойду баиньки. Этот день принес еще одного кота.
Docendo discimus
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Доброго времени суток!!! Можно Вас подастовать еще вопросами, просто очень надо, поставленна была вот такая задача, а в мою бытность этому неучили, так что приходится осваивать самому. Ящик с валерьянкой с меня!!!

- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Docendo discimus
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
pyzhman писал(а):Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Восторг и похвала Вашему терпению!!!
Вот кто воспитывает подрастающих котят)Ставим плюсы: )
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Ясно! Отлично! Спасибо за понимание! Вообщем вопрос такой, есть фрагмент исходника, со switch:
if(++punkt_menu>4) punkt_menu= 0;
switch(punkt_menu)
{
case 1:delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD0");
break;
case 2:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD1");
break;
case 3:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD2");
break;
case 4:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD3");
break;
default:
}
как при выборе соответствующего пункта меню вставить туда рабочий текст программы которая должно выполняться в этом пункет меню.
P.S. Вставка delay_us(500); пойдет как антидребезг?
Заранее благодарен!!!
if(++punkt_menu>4) punkt_menu= 0;
switch(punkt_menu)
{
case 1:delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD0");
break;
case 2:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD1");
break;
case 3:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD2");
break;
case 4:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD3");
break;
default:
}
как при выборе соответствующего пункта меню вставить туда рабочий текст программы которая должно выполняться в этом пункет меню.
P.S. Вставка delay_us(500); пойдет как антидребезг?
Заранее благодарен!!!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: CodeVision AVR в вопросах и ответах
- delay_us(500)
Поставьте конструкцию switch-case в тело цикла. И выполняйте там необходимые действия.