Paso 1: Prescalers y el registro de partido de comparar
El primer parámetro que analizaremos es la velocidad a la cual el temporizador incrementa el contador. El reloj de Arduino funciona a 16MHz, esto es la velocidad más rápida que los temporizadores pueden incrementar sus contadores. A 16MHz cada tick del contador representa 1/16,000,000 de segundo (~ 63ns), por lo que un contador te llevará 10/16,000,000 segundos para llegar a un valor de 9 (los contadores están a 0 indexadas) y 100/16,000,000 segundos para llegar a un valor de 99.
En muchas situaciones, usted encontrará que la configuración de la velocidad del contador a 16MHz es demasiado rápido. Timer0 y timer2 son temporizadores de 8 bits, lo que significa que pueden almacenar un valor de contador máximo de 255. Timer1 es un temporizador de 16 bits, lo que significa que puede almacenar un valor de contador máximo de 65535. Una vez que un contador llegue a su máximo, le marca a cero (esto es llamado desbordamiento). Esto significa que en 16MHz, incluso si tenemos el registro del partido de comparar el valor máximo del contador, interrupciones ocurrirán cada 256/16,000,000 segundos (~ 16us) para los contadores de 8 bits y cada 65.536/16,000,000 segundos (~ 4 ms) para el contador de 16 bits. Claramente, esto no es muy útil si sólo desea interrumpir una vez por segundo.
En su lugar puede controlar la velocidad del aumento del contador de tiempo usando algo llamado un prescaler. Un prescaler dicta la velocidad de su reloj automático según la siguiente ecuación:
(velocidad de reloj (Hz)) = (velocidad de reloj de Arduino (16MHz)) / divisor
Así que un 1 prescaler aumentará el contador a 16MHz, un prescaler de 8 incrementará a 2MHz, un prescaler 64 = 250kHz y así sucesivamente. Como se indica en las tablas anteriores, puede igualar el prescaler 1, 8, 64, 256 y 1024. (Voy a explicar el significado de CS12, CS11 y CS10 en el paso siguiente).
Ahora puede calcular la frecuencia de interrupción con la siguiente ecuación:
interrumpir la frecuencia (Hz) = (velocidad del reloj de Arduino 16.000, 000Hz) / (prescaler * (comparan coincidir con registro + 1))
el + 1 es en porque las comparan coincidir con registro cero indexado
reordenando la ecuación anterior, se puede resolver para el valor de registro de partido compare que le dará a su frecuencia de interrupción deseada:
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
así que si querías una interrupción cada segundo (frecuencia de 1Hz):
Comparar registro partido = [16000000 / (prescaler * 1)] -1
con un prescaler de 1024 obtendrá:
Comparar registro partido = [16000000 / (1024 * 1)] -1
= 15.624
desde 256 15.624 < < 65.536, debe utilizar el timer1 para esta interrupción.