Yo soy la supervisión de un pulsador con un microcontrolador donde estoy tratando de cuidar de cuatro cosas:
- 50 milisegundos de rebote al empuje de comenzar y de 25 mseg de rebote al empuje de liberación
- identificar un corto de prensa, que se define como cuando se suelta el botón < 1 segundo
- identificar una larga espera, definida como cuando 1 segundo pasa desde el botón push-comenzar
- dormir tanto como sea posible cuando no haciendo otra cosa
A continuación, una breve pseudocódigo de lo que he implementado hasta el momento. Creo que cubre todos estos casos.
¿Ve alguna de las posibles mejoras o posibles problemas? (E. g., Estoy interesado en cualquier sutil de los casos que podrían ser blindspots 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
}