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

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

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

Сообщение pyzhman »

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

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

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

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

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

Сообщение 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
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

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

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

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

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

Сообщение pyzhman »

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

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

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

Подкаректируйте пожалуйста фрагмент исходника:
[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 в вопросах и ответах

Сообщение pyzhman »

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

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

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

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

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

Сообщение pyzhman »

Это

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

lcd_clear( );
lcd_gotoxy(0,0);

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

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

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

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

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

Сообщение 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
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

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

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

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

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

Сообщение pyzhman »

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

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

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

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

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

Сообщение pyzhman »

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

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

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

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

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

Сообщение pyzhman »

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

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

Сообщение ibiza11 »

pyzhman писал(а):Всегда пожалуйста, если это меня. Ведусь на валерьянку.

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

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

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

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

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

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

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