Я контролирую кнопку с помощью микроконтроллера, где я пытаюсь позаботиться о четырех вещах вместе:
Ниже приведен краткий псевдокод того, что я уже реализовал. Я думаю, что он охватывает все эти случаи.
Видите ли вы какие-либо возможные улучшения или потенциальные проблемы? (Например, меня интересуют любые тонкие случаи, которые могут быть слепыми пятнами для моего подхода.)
Псевдокод:
Main loop {
Sleep
}
Falling-Interrupt {
Disable Falling-Interrupt
Enable 50-millisecond-Debounce-Timer-Interrupt
}
50-millisecond-Debounce-Timer-Interrupt {
if PushButton state is still LOW {
Enable Rising-Interrupt
Enable 1000-millisecond-Hold-Timer-Interrupt
}
}
1000-millisecond-Hold-Timer-Interrupt {
Register as Pushbutton long-hold
}
Rising-Interrupt {
if (Time since Falling-Interrupt < 1000 millisecond) {
Register as Button Short-press
}
Disable 1000-millisecond-Hold-Timer-Interrupt
Enable 25-millisecond-Debounce-Timer-Interrupt
}
25-millisecond-Debounce-Timer-Interrupt {
Enable Falling-Interrupt
}
Я не могу поместить код в комментарий, поэтому и отвечаю. Мой «каркас» для простых встраиваемых систем — это основной цикл с опросом. Для минимизации потребления тока основной цикл может ожидать, скажем, 50 мс в режиме ожидания. Я не знаю, какой UC вы используете, я знаком с PIC, которые могут выйти из спящего режима по прерыванию.
set up an interrupt to wake me from sleep each 50 ms
down_counter = 0
for(;;){
sleep();
if( key down ){
down_counter++;
if( down_counter == 20 ){
(start of) long_down detected
}
} else {
if( down_counter > 1 && down_counter < 20 ){
(end of) short press detected
}
down_counter = 0;
}
}
Воутер ван Оойен
бордбит
Ник Алексеев
re: how can I detect a pushbutton event amidst sleep?
Вы можете использовать только одно (1) прерывание: Falling-Interrupt. Просыпайтесь по этому прерыванию, выполняйте остальную часть устранения дребезга в основном цикле. Вернитесь в сон, если код показывает, что нажатие кнопки не было «настоящим».