A medida que desarrollábamos el sistema de menús nos encontramos con la necesidad de utilizar un gran número de timers para contabilizar tiempos y, mediante el uso de flags, poder controlar procesos.
Primero, para el juego de piedra papel o tijera, en el que se tienen que utilizar diferentes usos para la cuenta atrás antes de iniciar la partida, el tiempo que queda el resultado de cada partida, y el tiempo en el que se muestra el resultado del juego (conjunto de partidas). Luego en el menú de reloj, donde hacemos parpadear el dígito que se está utilizando en cada momento. Y por último al salir de cada uno de los submenús, dando un tiempo desde que salimos hasta que se puede entrar a cualquier otro, para evitar salir y entrar inmediatamente por error.
Necesitábamos por tanto utilizar un gran número de timers, algunos de los cuales a la vez, y la mayoría con tiempos de interrupción bastante diferentes (de entre poco menos de un segundo y hasta tres segundos). Poniendo en la práctica la solución observada en problemas de la asignatura SEDG, creamos una variable global timeOut. Cada vez que queramos hacer uso de un timer, modificamos su valor e iniciamos el mismo timer; en la interrupción del timer dicha variable se va decrementando hasta llegar a 0, en cuyo momento se desactiva el timer.
Por precisar de varios timers al mismo tiempo, no nos basta con una única variable timeOut. Creamos un array de timeouts de un total de TIMEOUTS posiciones, de tal forma que con la misma fuente de interrupción (timer3) podemos implementar varios timers diferentes. Cada vez que el timer esté activado, recorrerá el array de timeouts y disminuirá todas aquellas posiciones en las que haya un entero diferente de 0. Cuando timeOut[x], siendo x cualquiera de las posiciones posibles, llegue a 0, es que ha transcurrido el periodo previsto.
El periodo de todos estos timers, a pesar de variar, es siempre de un tiempo apreciable para el usuario. Configuramos la interrupción por timer3 a un valor de 0,2 segundos. Dado el reloj de 80MHz y el preescalado máximo de 256, el periodo de cuenta del temporizador será de 3.2 us, y por tanto lo configuraremos para que interumpa cada 62500 ciclos de cuenta. Nuestros periodos serán por tanto siempre de un múltiplo de 0,2 segundos.
Iniciamos la posición deseada del array de timeOuts mediante una función timeOut, la cual inicia el timer3 si no lo estaba ya.
Puede consultarse aquí la rutina de interrupción del timer (timer3) y la breve función para inicialización de timeOuts (función timeOut).
No hay comentarios:
Publicar un comentario