Страница 163 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 17:33:05
pyzhman
Да как хотите. Менюшке без разницы, как вы в нее параметры передадите. Назначение интов - мгновенная реакция на событие. По таймеру просто опрос. В вашем случае кнопок инты - излишество.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 19:14:02
John-RADIST
Ясно! А смотрите, допустим мне надо, чтобы последовательно нажимая скажем INT0, можно было бы переключать пункты меню? Как мне кажется нужно использовать оператор switch(), только как включить его в программу никак неразберусь. Подскажите пожалуйста!!!!
Заранее спасибо!!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 19:24:32
pyzhman
При попадании в интовое прерывание ведете счет переменной, от 0 до 2. В зависимости от ее состояния выбираете нужное действие. Вот он, свич.
Код: Выделить всё
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
....
break;
case 1:
....
break;
case 2:
....
break;
default:
....
break;
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 19:35:58
John-RADIST
Понял! Спасибо сейчас попробую!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 19:39:22
pyzhman
Дребезг! Дребезг не забудь!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 19:48:29
John-RADIST
Подкаректируйте пожалуйста фрагмент исходника:
#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;
}
}
punkt_menu описывается так:??? - unsigned char punkt_menu; ????
Спасибо!!!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 20:01:11
pyzhman
Да что ж ты родной все с этими вхилами........ Опять же нафига каждый раз клеар и гото. Пальцы не устают тарабанить по клаве? В самом начале сделал и все. Дефолт зачем выкинул?
Описание переменной верное.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 20:10:09
John-RADIST
Ну, понял косяки исправил, но в протеусе при нажатии на инт0 работает вообщем только case1. Что может быть??? Так по поводу клир, если его не делать то на дисплее остается ранее выведенный текст??
Спасибо!!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 20:33:20
pyzhman
Это
вставьте перед свичем. В остальных местах убрать.
А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:11:11
John-RADIST
Вот этот файл.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:17:37
pyzhman
Код: Выделить всё
; 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;
Что за тройка???????
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:24:26
John-RADIST
Нет. Там 2-ка, просто перед тем как отправить не обновил, просто решил поэксперементировать. Так там двойка., а что со сторчкой мать-..... объясни пожалуйста.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:37:39
pyzhman
Так, еще раз. Убрать вхилы из обработчика прерывания. Чтобы дать возможность программе не крутиться на одном месте, а вылезти из прерывания и ждать следующего.
Кто-нибудь! Налейте мне валерианки.

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:42:25
John-RADIST
Отлично! Все понял все работает!!! Дружище спасибо тебе за помощь!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт дек 16, 2011 21:45:41
pyzhman
Фуф! Теперь с чувством выполненного долга пойду баиньки. Этот день принес еще одного кота.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб дек 17, 2011 08:32:32
John-RADIST
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб дек 17, 2011 08:40:58
pyzhman
Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб дек 17, 2011 08:53:38
ibiza11
pyzhman писал(а):Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Восторг и похвала Вашему терпению!!!

Вот кто воспитывает подрастающих котят)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 00:05:21
John-RADIST
Ясно! Отлично! Спасибо за понимание! Вообщем вопрос такой, есть фрагмент исходника, со 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); пойдет как антидребезг?
Заранее благодарен!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 06:09:54
BerZerK-ku
Не подойдет. Нужен антидребезг, а не задержка реакции на нажатие. Суть антидребезга: кнопка опрашивается несколько раз, с периодом например 1мс. Если все опросы показали один результат (нажата / не нажата) то этот результат считается истинным.
Поставьте конструкцию switch-case в тело цикла. И выполняйте там необходимые действия.