Paso 48: Software: tiempo demoras y animaciones
Una de las formas más efectivas para hacerlo es usar un contador global que obtiene se incrementa en una rutina de interrupción. En la rutina de servicio de interrupción para Timer3, hay una variable global de 32-bit (count32) que es incrementada en cada interrupción. Esta variable se utiliza en la mayoría de nuestros retrasos de interrupción junto con una función llamada ' Time_Check (UINT32 * marca, intervalo UINT16)' que permitan el seguimiento del tiempo de retardo mientras se mantiene el flujo del programa. Vamos a crear una animación de ejemplo que se ilumina cada fila de la rejilla LED uno por uno. Nosotros lo llamamos 'Our_Test_Animation(void)'.
Our_Test_Animation(void)
1) en el archivo Globals.h, dedicar seq [x] a la función que está creando. 'x' es una variable no utilizada en la matriz de [] seq. Para este ejemplo usaremos seq [24].
2) agregue el prototipo de función al archivo de encabezado y la función en el archivo de programa de C. Para este ejemplo, nuestra será 'UINT8 Our_Test_Animation(void)'.
3) declarar la variable 'estática UINT8 last_seq' que es igual a 0xFF y 'estática UINT32 tmark' variable que es igual a 0. Estas variables tienen que ser estática para que la rutina Recuerde sus valores cuando coloca a través de la animación.
4) necesitamos al menos una variable local llamada 'retraso' que se utiliza para hacer referencia a 'count32' en la función Time_Check(). 'demora' hace exactamente lo que se llama, retrasa el programa una determinada cantidad de tiempo (8ms/interrupción * valor de 'retraso').
5) El valor de reposición de seq [x] es 0xFF. Cuando la rutina comienza a ejecutar el ' si (seq [24] == 0xFF)' pieza de código, esto es hasta ciertas variables para la puesta en marcha de nuestra animación.
6) el siguiente ' si (seq [24]! = last_seq)' declaración comprueba si hay una nueva secuencia. Si hay, last_seq actualizará el valor actual de la seq [24], luego actualizar la referencia de sincronización (tmark) y luego actualizar el código de la animación.
7) ' si (Time_Check (& tmark, retraso))' comprueba si la cantidad de tiempo transcurrido desde el último bucle a través de la función. Si tiene, se actualizará seq [24] a la siguiente secuencia y la animación se actualizará en el siguiente bucle a través de la función.
8) ' si (seq [24] > 31)' comprobará para ver si todas las secuencias han sido ejecutadas y si la animación ha terminado. El valor de '31' depende de cuántas secuencias tiene en su rutina (tenemos 32 secuencias de esta rutina, 0 - 31). Si todas las secuencias han sido ejecutados, set seq [24] a su valor predeterminado de 0xFF y devolver un 0 indicando que ha finalizado la animación.
9) si la animación no ha ejecutado todas sus secuencias devolverá un 1.
Cruz de referencia los pasos anteriores con el código terminado en la foto #4. Al crear una animación de esta manera, estamos limitados a 255 secuencias (255 secuencias + 1 secuencia de reset) porque estamos utilizando una variable de 8 bits para seq [x]. Si usted necesita más de 255 cuadros, puede cambiar seq [x] a una variable de 16 bits y tienen secuencias hasta 65535. Si usted necesita más precisa sincronización de Timer3 puede ofrecer (~ 8ms por interrupción), puede configurar Timer5 interrumpir cuanto antes y mover allí el contador global (count32). Por último, la cantidad predeterminada de animaciones que el código puede soportar es de 50. Si usted necesita más de 50 animaciones de interrupción retrasó, basta con aumentar el valor de la constante SEQ_AMOUNT (typedefs.h) el valor que usted necesita.
La principal limitación al uso de un retraso de la interrupción de este es que nuestro bucle principal tiene que ser eficiente y no perder demasiado tiempo en ninguna rutina en el bucle principal. El programa debe seguir fluyendo todo el camino a través de porque si detiene para demasiado largo retrasará el momento en el resto de las rutinas junto con él. Foto #5 contiene otro ejemplo de una animación llamada Cycle_Colors(void) que utiliza el mismo formato de retardo de interrupciones.