PCINT - Это сложно. Как сделать дооолгое нажатие =)
Добавлено: Сб июл 18, 2015 05:11:56
Озаботился я придумать новую фишку, доселя невиданную и не испытаннуя. Почему так? Сколько не листал я форумов, как-то мало кто работал с этим прерыванием.
Тема, видимо, не изучена так хорошо как таймеры. Какова преследуемая цель?
Цель: Распознать нажатие одной из трех кнопок в прерывании ISR(PCINT0_vect), ну и как то это обработать в основной программе...
Например зажечь светодиод по короткому нажатию а погасить по очень долгому
Но сколько не бился - проблема зависла. МК не может распознать долгое и очень долгое нажатие. Хотя вот с коротким все же вышло замечательно.
Идея в чем...
Во первых: чтобы распознать нажатие на определенной кнопке нужно написать что-то вроде этого...
Спойлер
Код: Выделить всё
ISR(PCINT0_vect)
{
if ((PINB & 0x04)==0x00)
{
flag_button_minus = 1;
}
if ((PINB & 0x02)==0x00)
{
flag_button_plus = 1;
}
if ((PINB & 0x01)==0x00)
{
flag_button_start_stop = 1;
}Спойлер
Код: Выделить всё
flag_button_minus = 0;
flag_button_plus = 0;
flag_button_start_stop = 0;
Показан пример для одной из кнопок...
Спойлер
Код: Выделить всё
void get_button_set()
{
if (((PINB & 0x04)==0x00) && (flag_quick == 1))
{
// Выполняем что-то
flag_quick = 0;
}
else if (((PINB & 0x04)==0x00) && (flag_average == 1))
{
// Выполняем что-то еще
flag_quick = 0, flag_average = 0;
}
else if (((PINB & 0x04)==0x00) && (flag_long == 1))
{
// Выполняем и убегаем =)
flag_quick = 0, flag_average = 0, flag_long = 0;
}
}Спойлер
Код: Выделить всё
if (( flag_button_minus == 1 ) || ( flag_button_plus == 1 ) || ( flag_button_start_stop == 1 ))
{
ms10++;
if (ms10 > 10)
{
flag_quick = 1;
ms2700++;
if (ms2700>2700)
{
flag_average = 1;
ms5000++;
if (ms5000 >5000)
{
flag_long = 1;
}
}
}
}
Очень не понятна ситуация с отсчетом времени. Куда его не суй - он не работает. Пробовал и в прерывание и в таймерную часть сувать(глючит все конечно же), и в функцию пробовал спрятать. И как дальше быть? Может и не должно так работать, как я хочу.
P.S.
Нашел еще один глюк. После включения устройства нужно сделать 5-6 нажатий на кнопку, прежде чем она начнет работать хорошо
------
8:37 утра...
debounce
Я нарыл новую инфу. От дребезга избавляются тут... http://www.avrfreaks.net/forum/pin-chan ... debouncing
Посмотрю, может переиграю
Между прочим я тоже пробовал работать через PCIFR=0;
Это все фуфло, ибо этот флаг встает колом. С этими аппаратными флагами вечно одни глюки.
Конечно, читая эту статью, мне приходили разные мысли. Подразумевается, что это прерывание выдаёт сигнал как по фронту, так и по спаду. Когда я это заметил, после первой зашивки, думал что кондер поможет. Я пока не готов использовать хаки. Пока меня такое поведение МК еще не совсем добило
Мда. Мужик тоже согласен что дальнейшая обработка должна быть в главном цикле... "i totally agree with you all, the button test procedure should stay in the main!"
Я ощутил всю красоту тормозов всунув ПП прерывания легкую обработку. (мысли вслух)
Не, то что там советуют не для таких как я. Мы пойдем туда, где есть мёд. Мед есть там, где есть пчелы...