¡AVR Timer1 OCR1A controla la interrupción TIMER1_COMPB_vect!

Estaba luchando con las interrupciones del temporizador en mi proyecto. No pude hacer que funcionara correctamente. Así que decidí escribir un código simple y vi un caso muy interesante.

ISR(TIMER1_COMPB_vect)
{

        PORTB ^= (1 << PORTB5);

}


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

    OCR1A = 10000;
    OCR1B = 100;

    TCCR1B |= (1 << WGM12);

    TCCR1B |= (1 << CS10);
    TCCR1B |= (1 << CS12);

    TIMSK1 |= (1 << OCIE1A);
    TIMSK1 |= (1 << OCIE1B);
    DDRB= 0xFF;

    #define F_CPU 16000000
    sei();
    while (1)
    {

    }
}

Aquí está mi código. Cuando cambio el valor de OCR1B, no pasa nada, pero si cambio el valor de OCR1A, el parpadeo se vuelve más rápido. ¿Hay una explicación lógica para esto?

Respuestas (1)

Al configurarlo, TCCR1B |= (1 << WGM12);opera el temporizador en modo CTC contando desde 0 hasta el valor asignado a OCR1A y ​​de regreso a cero nuevamente.

Con el valor dado del OCR1A = 10000;temporizador cuenta 0-10000, 0-10000...
Por cada cuenta 0-10000 obtiene una Interrupción de comparación B Match cuando el contador alcanza el valor de 100 (porque ha configurado OCR1B = 100).

Al cambiar OCR1A, esencialmente cambia el límite de conteo superior del temporizador, lo que significa que también cambia la duración de cada ciclo de conteo, por lo que la interrupción de coincidencia de comparación B ocurre más rápido.

Como ejemplo, si configura OCR1A = 5000;Comparar B, la interrupción ocurre dos veces más rápido en comparación con cuando, OCR1A = 10000;porque el temporizador reinicia el conteo cuando llega a 5000 en lugar de 10000, por lo que el período del contador se acorta.

Como nota al margen, asegúrese de incluir en su código las funciones del controlador de interrupciones para todas las interrupciones habilitadas ( ISR(TIMER1_COMPA_vect)parece que faltan) o pueden ocurrir reinicios.

Olvidé mencionar algo. Cuando cambio el valor de OCR1B, la velocidad de parpadeo no cambia. lo agrego a mi pregunta
@Zgrkpnr__ El valor de OCR1A controla el período del temporizador 1. No importa cuál sea el valor de OCR1B, la interrupción de coincidencia de comparación B aún ocurre una vez por ciclo de conteo con una tasa controlada por el período del temporizador (valor OCR1A)
@Zgrkpnr__ Eso depende de usted, el temporizador tiene varios modos y la funcionalidad de interrupción puede o no ser útil según el modo que use. Puede crear una señal PWM usando OCR1A para controlar la frecuencia y OCR1B para controlar el ciclo de trabajo, pero no tiene mucho sentido, ya que el temporizador se adapta mejor a los modos PWM.
Edité mi comentario. De hecho, no te entendí correctamente en primer lugar. Ahora entiendo que "B ocurre solo una vez en un ciclo de 0 a ORC1A sin importar cuál sea su valor".