No se cuanto tiempo tenes que tener abierta la canilla pero
En mi caso si fueran segundos, lo que haria es tener un Timer corriendo siempre, el cual cada interrupcion sea de 1 segundo ( o si es de 0.5s que sean 2 ), a lo que me estoy intentando hacer entender es que si tus tiempos son de segundos, con esto podemos saber cuantos segundos pasaron.
Haria una tabla, la cual seria algo asi:
uint8_t Tiempos[] = {90,80,70,60,50,40,30,20,10};
Si se presiono el boton, procedo a cargar el tiempo ese en una variable aparte, supongamos que esa variable se llame tiempo_actual. Tambien procedo a incrementar el indice ( variable : tiempo_indice ). Tambien estaria bueno tener una variable mas que se llame tiempo_reset la cual cargamos con 100 cada ves que detectamos un boton.
Entonces el funcionamiento seria:
- Solo leo los botones si tiempo_actual es 0.
- Aumento tiempo_indice si y solo si: Se presiono un boton Y tiempo_actual es igual a 0 (tiempo_actual igual a 0 me permite omitir los botones presionados durante la marcha)
- La salida se activa solo si tiempo_actual es distinto de 0. Sino esta desactivada.
- tiempo_reset debe volver a 100 si se presiona un boton.
- Si tiempo_reset llega a 0 debe ponerse un 0 en tiempo_indice.
Posibles problemas con esta implementacion:
- Al ser de 1 segundo cada ves que atendemos exige presionar el boton por 1 segundo como maximo. Pero tranquilamente podes reducir el tiempo de interrupcion a 0.5s de esa forma se ve mas rapido la presion del boton.
Espero que te sirva de idea. Solo necesitas en este caso la interrupcion del timer.