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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Да как хотите. Менюшке без разницы, как вы в нее параметры передадите. Назначение интов - мгновенная реакция на событие. По таймеру просто опрос. В вашем случае кнопок инты - излишество.
Docendo discimus
Контактная информация:
Реклама
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Ясно! А смотрите, допустим мне надо, чтобы последовательно нажимая скажем INT0, можно было бы переключать пункты меню? Как мне кажется нужно использовать оператор switch(), только как включить его в программу никак неразберусь. Подскажите пожалуйста!!!!
Заранее спасибо!!!!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

При попадании в интовое прерывание ведете счет переменной, от 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
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Понял! Спасибо сейчас попробую!
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Дребезг! Дребезг не забудь!!!
Docendo discimus
Контактная информация:
Реклама
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

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

Спасибо!!!!!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Да что ж ты родной все с этими вхилами........ Опять же нафига каждый раз клеар и гото. Пальцы не устают тарабанить по клаве? В самом начале сделал и все. Дефолт зачем выкинул?
Описание переменной верное.
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Ну, понял косяки исправил, но в протеусе при нажатии на инт0 работает вообщем только case1. Что может быть??? Так по поводу клир, если его не делать то на дисплее остается ранее выведенный текст??
Спасибо!!!!
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Это

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

lcd_clear( );
lcd_gotoxy(0,0);
вставьте перед свичем. В остальных местах убрать.
А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Вот этот файл.
Вложения
Prog1.rar
(9.32 КБ) 129 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение 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;
Что за тройка???????
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Нет. Там 2-ка, просто перед тем как отправить не обновил, просто решил поэксперементировать. Так там двойка., а что со сторчкой мать-..... объясни пожалуйста.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Так, еще раз. Убрать вхилы из обработчика прерывания. Чтобы дать возможность программе не крутиться на одном месте, а вылезти из прерывания и ждать следующего.
Кто-нибудь! Налейте мне валерианки. :)
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Отлично! Все понял все работает!!! Дружище спасибо тебе за помощь!!!
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Фуф! Теперь с чувством выполненного долга пойду баиньки. Этот день принес еще одного кота.
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение John-RADIST »

Доброго времени суток!!! Можно Вас подастовать еще вопросами, просто очень надо, поставленна была вот такая задача, а в мою бытность этому неучили, так что приходится осваивать самому. Ящик с валерьянкой с меня!!! :))) :))) :)))
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Docendo discimus
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

pyzhman писал(а):Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Восторг и похвала Вашему терпению!!! :beer: Вот кто воспитывает подрастающих котят)
Ставим плюсы: )
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Сообщение 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); пойдет как антидребезг?
Заранее благодарен!!!
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

  • delay_us(500)
Не подойдет. Нужен антидребезг, а не задержка реакции на нажатие. Суть антидребезга: кнопка опрашивается несколько раз, с периодом например 1мс. Если все опросы показали один результат (нажата / не нажата) то этот результат считается истинным.
Поставьте конструкцию switch-case в тело цикла. И выполняйте там необходимые действия.
Ответить

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