¿Qué es TIMER en Electrónica Embebida?
El temporizador es una especie de interrupción. Es como un reloj simple que puede medir el intervalo de tiempo de un evento. Cada microcontrolador tiene un reloj (oscilador), digamos que en Arduino Uno es de 16Mhz. Este es el responsable de la velocidad. Cuanto mayor sea la frecuencia de reloj, mayor será la velocidad de procesamiento. Un temporizador utiliza un contador que cuenta a cierta velocidad dependiendo de la frecuencia del reloj. En Arduino Uno se necesitan 1/16000000 segundos o 62 nanosegundos para hacer un solo conteo. Lo que significa que Arduino se mueve de una instrucción a otra instrucción por cada 62 nanosegundos.
En esta página se buscan establecer nuestros bits de registro del temporizador para usar la interrupción de desbordamiento del temporizador para alternar un LED cada vez que ocurra una interrupción.
El valor del precargador del bit del temporizador también se puede ajustar usando botones para controlar la duración en la que ocurre la interrupción.
Timers / Temporizadores en Arduino UNO
En Arduino UNO hay tres temporizadores que se utilizan para diferentes funciones.
Timer0 / Temporizador0:
Es un temporizador de 8 bits y se utiliza en funciones de temporizador como delay(), millis().
Timer1 / Temporizador1:
Es un temporizador de 16 bits y se usa en la biblioteca de servos.
Timer2/Temporizador2:
Es un temporizador de 8 bits y se utiliza en la función tone().
Registros de Timer de Arduino
Para cambiar la configuración de los temporizadores, se utilizan registros de temporizador.
A) TIMER1: Registros de control de temporizador / Timer (TCCRnA/B):
Este registro contiene los bits de control principales del temporizador y se utiliza para controlar los preescaladores del temporizador. También permite controlar el modo de temporizador usando los bits WGM.
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | – | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler / Preescalador
Los bits CS12, CS11, CS10 en TCCR1B establecen el valor del preescalador. Se utiliza un preescalador para configurar la velocidad del reloj del temporizador. Arduino Uno tiene preescaladores de 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | Uso |
0 | 0 | 0 | No Clock Timer STOP |
0 | 0 | 1 | CLCK i/o /1 No Prescaling |
0 | 1 | 0 | CLK i/o /8 (From Prescaler) |
0 | 1 | 1 | CLK i/o /64 (From Prescaler) |
1 | 0 | 0 | CLK i/o /256 (From Prescaler) |
1 | 0 | 1 | CLK i/o /1024 (From Prescaler) |
1 | 1 | 0 | External clock source on T1 Pin. Clock on falling edge |
1 | 1 | 1 | External Clock source on T1 pin. Clock on rising edge. |
B) TIMER 2: Registro de temporizador/contador (TCNTn)
Este registro se utiliza para controlar el valor del contador y establecer un valor de precarga. Fórmula para el valor del precargador para el tiempo requerido en segundos: TCNTn = 65535 – (16x1010xTiempo en segundos / Valor del preescalador) Para calcular el valor del precargador para el temporizador 1 durante un tiempo de 2 segundos:
TCNT1 = 65535 – (16×106x2 / 1024) = 34285
Interrupciones del temporizador de Arduino
Hay varias interrupciones de temporizador en Arduino:
a) Interrupción de desbordamiento del temporizador:
Cada vez que el temporizador alcanza su valor máximo, por ejemplo (16 Bit-65535), se produce la interrupción de desbordamiento del temporizador. Por lo tanto, se llama a una rutina de servicio de interrupción ISR cuando el bit de interrupción de desbordamiento del temporizador está habilitado en el TOIEx presente en el registro de máscara de interrupción del temporizador TIMSKx.
Formato de la función ISR:
ISR(TIMER1_COMPA_vect)
{
}
Registro de comparación de salida (OCRnA/B):
Aquí, cuando se produce la interrupción de coincidencia de comparación de salida, se llama al servicio de interrupción ISR (TIMERx_COMPy_vect) y también se establecerá el bit indicador OCFxy en el registro TIFRx. Este ISR se habilita configurando el bit de habilitación en OCIExy presente en el registro TIMSKx. Donde TIMSKx es Registro de máscara de interrupción de temporizador.
Captura de entrada de temporizador:
A continuación, cuando se produce la interrupción de captura de entrada del temporizador, se llama al servicio de interrupción ISR (TIMERx_CAPT_vect) y también se establece el bit indicador ICFx en TIFRx (registro de indicador de interrupción del temporizador). Este ISR se habilita configurando el bit de habilitación en ICIEx presente en el registro TIMSKx.