Temporizadores y contadores son tan esenciales que usted verá muchos ejemplos que a lo largo de esta serie. Como el nombre lo dice, se utilizan temporizadores para tiempo y contando. Cuenta y el tiempo le permite hacer algunas cosas muy prolijo como brillos de LED controladores, grados de ángulo de los ejes del servo, recibiendo datos de los sensores que transmiten en PWM, crear un contador de tiempo o simplemente añadiendo una variable de tiempo a su proyecto de microcontrolador.
En primer lugar es importante entender que hay un reloj interior (o exterior) los microcontroladores AVR. Todos los microcontroladores tienen relojes en ellos o utilizan un reloj externo. Microcontroladores requieren relojes por lo que los programas pueden ejecutarse en ritmo con el reloj. Como los programas que estamos escribiendo, pasa como cada tick de reloj, las instrucciones son procesadas en tiempo con las señales del reloj.
Las funciones de temporizador y contador en el microcontrolador cuentan en sincronía con el reloj del microcontrolador. Sin embargo, el contador solo cuenta hasta 65535 (contador de 16 bits) o 256 (contador de 8 bits). Dista mucho de las 1.000.000 garrapatas por segundo que ofrece el estándar Microcontrolador AVR. El microcontrolador ofrece una función muy útil llamada escala. Escala es una manera simplista para el contador al pasar un cierto número de ticks de reloj. Los microcontroladores AVR permiten escala de los números: 8, 64, 256 y 1024. Por ejemplo, si juego a 64 en el prescaler, el contador sólo contará cada vez el reloj hace tictac 64 veces. Esto significa que en un segundo (que el microcontrolador haga clic 1.000.000 veces) el contador sólo contaría hasta 15.625. Si el contador cuenta hacia arriba a ese número, entonces usted sería capaz de parpadear un LED cada un segundo.
Principalmente, los temporizadores tienen un registro para el control y un registro que contiene el número de cuenta. El registro de control contiene algunos interruptores para activar o desactivar características. Y adivinaron que it... una de las características es que escala para seleccionar. El registro de control se llama TCCR0 o TCCR1 (Timer/Counter Control Register). El TCCR0 es el registro de control de 8 bits y sólo tiene un registro de control de 8 bits, por lo que sólo hay 8 interruptores para encender y apagar. TCCR1 es 16 bits, por lo que cuenta con 16 interruptores para encender y apagar, pero viene en dos registros de 8 bits marcados A y B (TCCR1A y TCCR1B). Los interruptores son las siguientes: FOC (fuerza de salida de comparar), WGM (modo de generación de forma de onda), COM (Comparar Match Output Mode) y CS (reloj seleccione).
El registro que contiene la cuenta se llama el registro TCNT. Y hay una versión de 8 bits (TCNT0) y una versión de 16 bits (TCNT1). TCNT1 registro realmente obtiene su número de otros dos registros de 8 bits para crear un número completo de 16 bits, sino que es todo detrás de las escenas (abstraídas) para que usted no tiene que preocuparse acerca de cómo la TCNT1 obtiene esta capacidad a 16 bits, sólo que es mágico.
En el video, se muestran dos programas: uno que simplemente muestra un parpadeo del LED solo en aproximadamente 1 segundo y otro programa que tiene una fila de 7 LEDs persiguiendo a cada segundo y otra fila de 7 LEDs persiguiendo a cada uno en 1 segundo. El programa de este último se muestra aquí ya que tiene las características más usadas con el temporizador de 16 bits.
Sin ser repetitivo de posts anteriores, el programa inicializa los puertos para los LEDs y fija el temporizador/contador 1 # (el temporizador de 16 bits). El registro TCCR1B de control se utiliza para establecer el factor de escala de 64 con el CS10 y CS11 cambia.
Ya que queremos uno de los 7 LEDs para perseguir a 1/7 de segundo cada uno, tomamos el número 15.625 (1000000/64 - recuerda el 1000000 es el reloj de 1 mhz de la micrcontroller) y divídalo por 7 a ~ 2,232.143. Ahora, que estás diciendo, pero usar sólo 2232 en el programa!! eso es porque TCNT1 sólo acepta enteros (sin decimales). Ahora que estás diciendo, el tiempo estará apagada por la cantidad de decimales!!!! Es cierto, pero el reloj interno del AVR es +-10% inexacta de todas formas. Si se utiliza un cristal externo, usted debe utilizar un número perfecto que representa la cuenta apropiada.
Usted notará que el TCNT1 es también restablecer a cero manualmente. Esto es necesario de lo contrario la TCNT1 se mantenga contando pasado el 2232 de la condición que se estableció. Hay otras características de control que tiene una puesta a cero automático de este número, pero llegaremos a eso en otro tutorial. Las partes restantes del programa está utilizando cosas que hemos aprendido en tutoriales anteriores (giro de LED encendido y apagado y arreglos de discos).