Paso 53: Software: interrumpir la rutina
El corazón del código del cubo de LED es la rutina de interrupción.
Cada vez que se ejecuta esta interrupción, el cubo se borra datos de la nueva capa se cargan en la matriz de cierre y la nueva capa está encendida. Esto sigue siendo en hasta la próxima vez los funcionamientos de la interrupción, donde el cubo es despejó otra vez, datos para la siguiente capa se cargan en la matriz de cierre, y la capa siguiente está encendida.
El ATmega32 tiene 3 contadores de tiempo/contadores. Estos se pueden establecer en cuenta continuamente y desencadenar una rutina de interrupción cada vez que lleguen a un cierto número. El contador se restablece cuando se llama a la rutina de interrupción.
Utilizamos Timer2 con un prescaler de 128 y un valor de comparar la salida de 10. Esto significa que el contador se incrementa en 1 para cada ciclo de cpu 128. Cuando Timer2 llega a 10, se resetea a 0 y se llama la rutina de interrupción. Con una frecuencia de 14745600 Hz, 128 prescaler y salida compara de 10, la rutina de interrupción se llama cada ciclo 1408th de la CPU (128 * 11) o 10472,7 veces por segundo. Muestra una capa a la vez, por lo que toma 8 carreras de la interrupción para dibujar el cubo entero una vez. Esto nos da una tasa de refresco de 1309 FPS (10472.7/8). A este ritmo de actualización, el cubo del LED es parpadeo 100% gratis. Algunos podrían decir que 1300 FPS es excesiva, pero la rutina de interrupción es bastante eficiente. A este ritmo de actualización alto, sólo utiliza aproximadamente el 21% del tiempo de CPU. Podemos medir esta conectando un osciloscopio a la línea de habilitación de salida (OE). Esto se tira alto en el inicio de cada interrupción y bajo al final, así que da una indicación bastante buena de tiempo dentro de la rutina de interrupción.
Antes de cualquier interrupciones de tiempo pueden comenzar, tenemos que configurar el temporizador 2. Esto se hace en la función ioinit().
TCCR2 (temporizador contador de Control de registro 2) es un registro de 8 bits que contiene la configuración para la fuente de reloj del temporizador y el modo de operación. Seleccionamos una fuente de reloj con un prescaler de 1/128. Esto significa 2 temporizador/contador es incrementet por 1 ciclo cada 128 CPU.
Hemos creado a modo de CTC. (Claro en temporizador comparar). En este modo, el valor del contador TCNT2 es continuamente comparado con OCR2 (salida comparar registro 2). Cada vez que TCNT2 alcanza el valor almacenado en OCR2, se restablece a 0 y empieza a contar desde 0. Al mismo tiempo, se activa una interrupción y se llama la rutina de interrupción.
Para cada ejecución de la interrupción, la siguiente ocurre:
1) todos los transistores de capa se apagan.
2) habilitar salida (OE) se tira para desactivar la salida de la matriz de cierre.
3) un bucle recorre = 0-7. Para cada paso un byte es salida en el bus de datos y el i + 1 es la salida en el bus de dirección. Añadimos el + 1 porque el 74HC138 tiene salidas bajas activas y la línea de reloj 74HC574 se activa en el flanco ascendente (transición de bajo a alto).
4) habilitar salida es tirado bajo para permitir salida para la matriz de cierre otra vez.
5) se enciende el transistor para la capa actual.
6) current_layer es incrementar o restablecer a 0 si se mueve más allá de 7.
Eso es todo. La rutina de interrupción es bastante simple. Estoy seguro de que hay algunas optimizaciones que podríamos haber utilizado, pero no sin comprometer humano legibilidad del código. Con el propósito de este instructable, pensamos legibilidad es un equilibrio razonable para un ligero aumento en el rendimiento.