Easyelectronics.ru

Электроника для всех
Текущее время: 02 мар 2021, 00:19

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 29 июл 2013, 15:43 
Только пришел

Зарегистрирован: 09 май 2012, 18:52
Сообщения: 21
Добрый день.
Писал простетское меню, один уровень всего.


1. Проверка FCU
2. Проверка FUC

Есть кнопки отмена (она же стрелка вверх)
Кнопка стрелка вниз
Кнопка ентер.

Все они посажены на INT0, INT1, INT2.
Написал код.
Код:
#include <mega16.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
int i=10;

#include <lcd.h>

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{lcd_clear(); 
delay_ms(700);
       
if (i==10)
        {i=i+10;}
else{i=i-10}           

 
       
lcd_clear();
     

}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{lcd_clear(); 
delay_ms(700);
             
               
        if (i==11 || i==21)
        {
        i=i-1;
        }           
lcd_clear();       
       
}

// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{ lcd_clear();     
delay_ms(700);
        if (i==10 || i==20)
        {
        i=i+1;
        }     
lcd_clear();                       
}



void main(void)
{

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;


// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: On
// INT1 Mode: Low level
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0xE0;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0xE0;


// LCD module initialization
lcd_init(8);
lcd_init(8);
lcd_clear();
PORTB.3=1;

#pragma rl+
lcd_gotoxy(0,0);
lcd_putsf("Ультра");
#pragma rl-
#pragma rl+
lcd_gotoxy(2,1);
lcd_putsf("тест");
#pragma rl-

delay_ms(1000);
lcd_clear();

// Global enable interrupts
#asm("sei")



while (1)
      {
                   
             if(i==10)
                                {                               
                                #pragma rl+
                                lcd_gotoxy(0,0);
                                lcd_putsf("Проверка");
                                #pragma rl-
                                lcd_gotoxy(0,1);
                                lcd_putsf("UFS");
                                }
                   
                 


                        if(i==20)
                                {
                                 
                                #pragma rl+
                                lcd_gotoxy(0,0);
                                lcd_putsf("Проверка");
                                #pragma rl-
                                lcd_gotoxy(0,1);
                                lcd_putsf("UFC");
                               
                                }     
                                       

                   
                             
                         
                           if(i==11||i==21)
                                {     
                                 
                                #pragma rl+
                                lcd_gotoxy(0,0);
                                lcd_putsf("Нет");
                                #pragma rl-
                               
                                #pragma rl+
                                lcd_gotoxy(0,1);
                                lcd_putsf("ответа");
                                #pragma rl-
                                }
                       
                         
                               
                         

      }; 
      }




Баги такие:
1.Бывает редко подвисает контроллер и не реагирует на нажатие кнопок, например если часто на них нажимать.
2. При смене меню i=10,i=20 все отображается корректно, но когда уходим на уровень i=11 и i=21, то на дислплее то первая строка, то всторая строка остается недотертой
например : Проверка FCU затем бамс и "Нет ответка" вместо "нет ответа" , или проверка "UFCетка".

Если очищать дисплей в цикле while, то он начинает мерцать.

Что в коде не так? Такое ощущение, что прерывания обрабатываются неккоректно, или дисплей чистит только часть строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 29 июл 2013, 16:58 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2912
Откуда: Санкт-Петербург
Ещё не вник, но на delay_ms(700) внутри обработчика прерывания у меня выпали глаза.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 31 июл 2013, 00:56 
Только пришел

Зарегистрирован: 09 май 2012, 18:52
Сообщения: 21
Ну да борщ 7с.
Но в тоже время вопрос, все тыкают по кнопкам по разному.
Прерывание по низкому уровню настроено.
Я вот тыкну на 2с, прерывание начнеться, а если кнопку не отпустить оно еще раз счетчик накрутит.
Или я не прав?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 31 июл 2013, 02:58 
Здравствуйте!

Зарегистрирован: 21 июн 2013, 03:08
Сообщения: 3
А еще двойная очистка. Зачем? Для надежности? И не совсем понятна логика работы с этим самым i. Переход i через ноль учитывали?
а вообще, если хотите, бросьте весь проект, посмотрю что не так и отвечу предметно :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 31 июл 2013, 10:25 
Только пришел

Зарегистрирован: 09 май 2012, 18:52
Сообщения: 21
Это весь проект.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 31 июл 2013, 23:40 
Старожил

Зарегистрирован: 23 ноя 2010, 20:08
Сообщения: 1098
Откуда: тебя ебёт?
Хардварное прерывание имеет смысл для события, на которое нужна мгновенная реакция. То есть вот прям всё бросаем и резко переключаемся на.
Нажатие кнопки живым человеком при лазании по меню к таким событиям не относится, плюс-минус десятки миллисекунд реакции - практически эквивалентны "отложим на послезавтра" по процессорным понятиям. Т.о. кнопки необходимо и достаточно опрашивать в (майнлупе и / по таймеру как вариант) свободное от более других дел время с хоть какой-нибудь периодичностью.

Рекомендуется к обгуглению по словам "антидребезг", "обработка кнопок" something like. Тема вдоль поперёк обсосана, а давайте ещё разок!

Заодно как-нибудь типа "44780 видеобуфер", "44780 videoRAM" можно попробовать.


Последний раз редактировалось _noise 31 июл 2013, 23:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 31 июл 2013, 23:47 
Здравствуйте!

Зарегистрирован: 21 июн 2013, 03:08
Сообщения: 3
EESamara писал(а):
Это весь проект.


Блин, ну трудно что ли проектик в CV архиватором было ужать да выложить, чтобы я по коду не искал, куда вы, например, дисплей приткнули, а? Считай тот же проект сделал.
Короче, вот практически ваш код, но доработанный с помощью моего напильника:
Show

Я слегка отформатировал ваш, чтобы легче было его читать.
Теперь по сути:
0. Строка 19, нет точки с запятой.

1.Обработчик прерывания должен быть максимально коротким, сидеть в нем по 700 мс и более - нельзя.
Если очень хочется заблокировать опрос кнопок, висящих на прерываниях, лучше на некоторое время запретите сами прерывания :).
Я сделал именно так.

2.Прерывание может возникнуть когда угодно, в т.ч. при выполнении очистки дисплея в основной проге.
А в прерывании длиннющая задержка и еще две(!) последовательных очистки.
Результат: периодически возникающая хрень на экране.

3. На LCD обычно отправляют данные, когда что то обновилось или измеряется, т.е.,
когда ситуация может измениться. В вашей программе бедный LCD постоянно обновляется. Смысл?

4. Не понял, что вы хотели сказать "#pragma rl+" и "#pragma rl-"?

5. Зачем дважды инициализируете и очищаете экран? Для надежности что ли :)?

6. Вы перемудрили с меню. Посмотрите, если нажать на кнопку, висящую на Int2, а потом последовательно жать на кнопку, висящую на
Int0 i быстро уйдет в минуса и вся логика проги нарушится. Причем на экране ничего не будет отрисовываться...
Я добавил дополнительное условие в обработчике EXT_INT0, так что теперь этого бага нет.

Вообще, посмотрите внимательно, у вас i может принимать значения не только 10,11,20,21, но еще и, например 9.
А программа эту ситуацию отрабатывать не умеет, отчего впадает в ступор :), что у вас и наблюдалось.

Как то так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 01 авг 2013, 02:09 
Только пришел

Зарегистрирован: 09 май 2012, 18:52
Сообщения: 21
Спасибо большое.
Только теперь я в Москве, а в пятницу уже выступать на конференции


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Меню проблемы с очисткой дисплея (CVAVR)
СообщениеДобавлено: 01 авг 2013, 02:10 
Только пришел

Зарегистрирован: 09 май 2012, 18:52
Сообщения: 21
Спасибо большое.
Только теперь я в Москве, а в пятницу уже выступать на конференции. Ребята,, помогите пожалуйста прошить AVR в Москве, у меня программатора здесь нет


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB