AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
12.06.2013, 14:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Многофункциональная кнопка
Здравствуйте!!!
Пишу обработчик нажатия на кнопку и встретился с трудностью определения "долгого и короткого" нажатия на кнопку.
По сути нужно написать код обработчика в котором учитывается продолжительность нажатия с целью запуска разного рода действий...
Задача:
1) При нажатии на кнопку коротким толчком (если это именно нажатие, а не дребезг)- зажечь светодиод чтоб он горел постоянно пока не будет еще раз нажата кнопка, причём любой продолжительности (при этом светодиод должен погаснуть)!
2) Если нажать на кнопку и удерживать её "долго" (порядка 3-5сек.) - светодиод должен гореть, но лишь пока мы удерживаем кнопку.
Как только отпустили кнопку светодиод тут же должен гаснуть!
Я написал код, но он работает коряво и через раз, в протеусе светодиод ведёт себя не культурно- моргает как попало
Помогите оформить идейку советом, примером ну или хоть как то
PHP код:
|
if (PINB.0==0){ // если нажали на кнопку то...
delay_ms(50); // задержка
if (PINB.0==0){ // если не дребезг то...
flags=1; // выставляем флаг нажатия и...
count++; // увеличиваем счетчик
if (count›20){ // если count больше 20 (долгое удержание кнопки), то...
while(PINB.0==0){led_=1;} // зажигаем светодиод с условием (ГОРИТ) пока держим кнопку
led_=0;
flags=0; // сбрасываем флаг нажатия кнопки
count=0; // и сбрасываем счетчик
}
}
if (PINB.0!=0){ // если отжали кнопку
count=0;
if (flags==1){ // но флаг был ранее установлен
while(PINB.0!=0){led_=1;} // зажигаем светодиод с условием (ПОСТОЯННО ГОРИТ) пока не нажмем на кнопку
led_=0;
flags=0; // сбрасываем флаг нажатия кнопки
}
}
}
|
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
12.06.2013, 14:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Многофункциональная кнопка
|
|
|
Сказали "Спасибо" omercury
|
|
|
12.06.2013, 14:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: Многофункциональная кнопка
Там вроде таймер задействован
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
12.06.2013, 15:18
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Многофункциональная кнопка
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 12.06.2013 в 15:21.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
12.06.2013, 15:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Многофункциональная кнопка
dosikus, ты в какой по счёту программе структуры начал использовать?
Сообщение от Uragan90
|
Там вроде таймер задействован
|
У тебя системный таймер есть?
Или перебей на задержках, если хочешь. Алгоритм.
|
|
|
Сказали "Спасибо" omercury
|
|
|
12.06.2013, 15:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Многофункциональная кнопка
На АВР в качестве системного таймера прекрасно работает вачдог
Заодно потребление минимально
|
|
|
|
12.06.2013, 15:36
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Многофункциональная кнопка
Сообщение от omercury
|
dosikus, ты в какой по счёту программе структуры начал использовать?
|
Дык, ну перебить на просто переменные .
Пощадим Ураганчика ...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 12.06.2013 в 15:39.
|
|
|
|
12.06.2013, 15:46
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Многофункциональная кнопка
Кстати о кнопках . Засвечу , хоть и без отслеживания длительности .
Давилка дребезга на вертикальных счетчиках . Сразу 8 кнопок .
Код:
|
volatile unsigned char input,flag_100ms,count_10ms; |
...
Код:
|
void interrupt low_priority tmr1_ov(void)
{
static unsigned char tick_count, in_state, in_cnt0, in_cnt1;
unsigned char in_delta, in_toggle;
if (TMR1IE && TMR1IF) {
TMR1IF = 0;
TMR1 = (TMR1_RELOAD-TMR1_OVHEAD);
if ((++tick_count) == 10) {
tick_count = 0;
if(++count_10ms==10){
count_10ms=0;
flag_100ms=1;
}
in_delta = (~IN_PORT) ^ in_state;
in_cnt1 = in_cnt1 ^ in_cnt0;
in_cnt0 = ~in_cnt0;
in_cnt0 &= in_delta;
in_cnt1 &= in_delta;
in_toggle = in_cnt0 & in_cnt1;
in_state ^= in_toggle;
input = in_state;
}
return;
}
} |
__________________
Осторожно , злой кот
|
|
|
|
12.06.2013, 15:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Многофункциональная кнопка
Сообщение от dosikus
|
Использую
|
Тестер, конечно, молодец, но моя чуть менее ресурсоёмкая и в прерывании не висит. Но это из-за подхода - у меня кейпресс, у него кейскан. Как библиотечная функция его универсальней.
|
|
|
|
12.06.2013, 16:02
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Многофункциональная кнопка
omercury, Здесь приаттач плиз, лениво по той ветке скакать.
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:17.
|
|