Paso 6: Desbordamiento de controlador
Así que vamos a asumir que el registro de timer/counter0 acaba desbordado. Ahora sabemos que el programa recibe una señal de interrupción y ejecuta 0x0020 que dice el contador de programa PC para saltar a la etiqueta "overflow_handler" el siguiente es el código que escribió después de esa etiqueta:
overflow_handler: inc overflows cpi overflows, 61 brne PC+2 clr overflows reti
Lo primero que hace es incrementar la variable "desbordamientos" (que es nuestro nombre de registro de trabajo de propósito general R17) entonces "compara" el contenido de desbordamientos con el número 61. La manera en que los trabajos de la cpi de instrucción son que simplemente resta los dos números y si el resultado es cero establece la bandera Z del registro SREG (te dije que estaríamos viendo este registro todo el tiempo). Si los dos números son iguales entonces la bandera Z será 1, si los dos números no son iguales, entonces será un 0.
La siguiente línea dice "brne PC + 2", lo que significa "rama si no es igual". Esencialmente, comprueba el flag Z en SREG y si no es uno (es decir, los dos números no son iguales, si fueran iguales, se crearía la bandera de cero) la PC ramifica a PC + 2, lo que significa salta la siguiente linea y va directo a "reti" que regresa de la interrupción a cualquier lugar en el código cuando llegó la interrupción. Si la instrucción brne encontró un 1 en el bit del indicador de cero no rama y en su lugar sólo seguirá la siguiente línea que clr desbordamientos restablecer a 0.
¿Cuál es el resultado neto de todo esto?
Así vemos que cada vez que hay un desbordamiento del temporizador este controlador aumenta el valor de "desbordamientos" de uno. Así que la variable "desborda" es contando el número de desbordamientos que se producen. Cuando el número llega a 61 nos restablecerlo a cero.
Ahora ¿por qué en el mundo ¿hacer?
Vamos a ver. ¿Recordar que nuestra velocidad de reloj de la CPU es 16MHz y "prescaled" con TCCR0B para que el contador solo cuenta a una tasa de 15625 cuentas por segunda a la derecha? Y cada vez que el temporizador llega a una cuenta de 255 que desborda. Eso significa que desborda 15625/256 = 61.04 veces por segundo. Nos estamos manteniendo la cuenta del número de desbordamientos con nuestra variable "desbordamientos" y estamos comparando ese número con 61. Así vemos que "desborda" será igual a 61 cada segundo! Así nuestro handler restablecerá "desborda" a cero una vez cada segundo. Así que si tuviéramos que simplemente controlar los variable "desbordamientos" y tomar nota de cada tiempo restablece a cero que sería contando segundo a segundo en tiempo real.
Ahora que hemos "manejado" las interrupciones de desbordamiento del temporizador. Asegúrese de que entender cómo esta obras y entonces se mueven en el siguiente paso donde hacemos uso de ello.