Temporizador de 16 bits de ATMega: ¿Cómo calcular el conteo del temporizador?

Intento usar el temporizador de 16 bits de ATMega en cada tic del reloj midi. Un latido tiene 24 tics de reloj midi. Por ejemplo, 60 latidos por minuto = 1 latido por segundo = 24 tics por segundo.

¿Cómo puedo configurar el temporizador para x veces por segundo (dependiendo del valor de bpm)?

Estoy inicializando el temporizador en mi arduino con:

void setup()
{
cli();          // disable global interrupts
TCCR1A = 0;     // set entire TCCR1A register to 0
TCCR1B = 0;     // same for TCCR1B

// set compare match register to desired timer count:
OCR1A = 6510;

// turn on CTC mode:
TCCR1B |= (1 << WGM12);

// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);

// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);

// enable global interrupts:
sei();
}

No me sale el calculo de OCR1A. Debería depender de un valor de bpm.

Respuestas (2)

La frecuencia de la interrupción de su temporizador será igual a la siguiente:

frecuencia de reloj del microcontrolador ( preescalador ) × ( comparar el valor del registro de coincidencia + 1 )

Entonces, dado que mencionó que está usando un Arduino que viene con un cristal de 16 MHz, para lograr una frecuencia de interrupción de 24 Hz, el valor del registro de coincidencia de comparación (OCR1A) debe ser 650, dado un preescalador de 1024.

Si desea cambiar el BPM, deberá configurar OCR1A sobre la marcha.

https://oscarliang.com/arduino-timer-and-interrupt-tutorial/ consulte este sitio donde la función de interrupción del temporizador se activa cada 0,5 segundos, el período es igual a 1/62500 (16 mhz con 256 preescala) tomaría un período para ir de 0000 0000 a 0000 0001 para determinar el valor de ocr1a (occr1a-0+1)*periodo=0,5 (el temporizador cuenta desde 0 hasta occr1a) occr1a=(0,5/periodo)+1