Paso 2: Estructuración temporizador interrumpe
Código de configuración del temporizador se realiza dentro de la función de setup() {} en un sketch de Arduino.
El código para configurar interrupciones de contador de tiempo es un poco difícil de mirar, pero es realmente no es tan difícil. Prácticamente sólo copiar el mismo campo principal de código y cambiar el prescaler y comparar el registro del partido para fijar la frecuencia de interrupción correcta.
La estructura principal de la configuración de interrupción se ve así:
Observe cómo cambia el valor de OCR #A (compara partido valor) para cada una de estas configuraciones de temporizador. Como se explicó en el último paso, esto se calculó según la siguiente ecuación:
Comparar registro partido = [16.000, 000Hz / (prescaler * deseado frecuencia de interrupción)] - 1
Recuerde que cuando utilice temporizadores de 0 y 2 este número debe ser menos de 256 y menos de 65536 para timer1
Observe también cómo las configuraciones entre los tres temporizadores difieren ligeramente en la línea que se convierte en modo de CTC:
TCCR0A | = (1 << WGM01); //for timer0
TCCR1B | = (1 << WGM12); //for timer1
TCCR2A | = (1 << WGM21); //for timer2
Esto sigue directamente de la hoja de datos de la ATMEL 328/168.
Por último, observe cómo la configuración de las prescalers sigue las tablas en el último paso (la tabla para el timer 0 se repite arriba),
TCCR2B | = (1 << CS22); Sistema CS #2 bit para 64 prescaler para el temporizador 2
TCCR1B | = (1 << CS11); Sistema CS #1 bit para 8 prescaler para el temporizador 1
TCCR0B | = (1 << CS02) | (1 << CS00); Set 2 CS y CS #0 pedacitos para 1024 prescaler para el timer 0
Observe en el último paso que hay diferentes escala de opciones para los diferentes temporizadores. Por ejemplo, el timer2 no tiene la opción de 1024 prescaler.
Los comandos que desea ejecutar durante las interrupciones de temporizador se encuentra en el sketch de Arduino encapsulado en las siguientes:
ISR(TIMER0_COMPA_vect) {//change 0 a 1 para el timer1 y timer2 2
comandos de interrupción aquí
}
Este pedacito de código debe estar ubicado fuera de las funciones setup() y loop(). Además, intente mantener la rutina de interrupción más corta posible, especialmente si se interrumpe en una frecuencia alta. Incluso cabe hacer frente a los puertos/pins del chip ATMEL directamente en lugar de utilizar las funciones digitalWrite() y digitalRead(). Puede encontrar más información sobre eso aquí.
Ejemplo-el bosquejo siguiente configura y ejecuta 3 interrupciones de contador de tiempo:
Las imágenes de arriba muestran las salidas de estas interrupciones de timer. La Fig 1 muestra una onda cuadrada que oscila entre 0 y 5V a 1kHz (timer0 interrupción), la fig 2 muestra el LED conectado al pin 13 encendido durante un segundo entonces apagar durante un segundo (interrupción timer1), fig 3 muestra una onda de pulso oscila entre 0 y 5V con una frecuencia de 4khz (interrupción del timer2).