Estoy monitoreando un botón pulsador con un microcontrolador donde estoy tratando de encargarme de cuatro cosas juntas:
A continuación se muestra un breve pseudocódigo de lo que he implementado hasta ahora. Creo que cubre todos estos casos.
¿Ve alguna posible mejora o problema potencial? (Por ejemplo, estoy interesado en cualquier caso sutil que pueda ser un punto ciego para mi enfoque).
Pseudocódigo:
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
}
No puedo poner código en un comentario, por lo tanto, una respuesta. Mi 'marco' para sistemas integrados simples es el bucle principal con sondeo. Para minimizar el consumo de corriente, el bucle principal puede esperar, digamos, 50 ms en modo inactivo. No sé qué uC usa, estoy familiarizado con los PIC, que pueden despertarse de un sueño por una interrupción.
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;
}
}
Wouter van Ooijen
mordedura de tablas
Nick Alexeev
re: how can I detect a pushbutton event amidst sleep?
Puede usar solo una (1) interrupción: Falling-Interrupt. Despiértate con esta interrupción, haz el resto del rebote en el ciclo principal. Vuelva a dormir, si el código determina que la presión del botón no fue "real".