La interrupción de comparación de salida no funciona avr atmega

Hola, estoy tratando de hacer que el LED parpadee usando interrupciones en el temporizador de 16 bits. Mi modelo atmega es Atmega168A. La frecuencia de reloj del chip es de 12Mhz.

Aquí está mi código:

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect)
{
    PORTC ^= (1 << PC5);
}

int main()
{

    DDRC |= (1 << PC5);

    PORTC |= (1 << PC5); //led on

    sei();

    TIMSK1 |= (1 <<  OCIE1A); // cmp interruupt enable
    TCCR1B |= (1 << CS12) | (1 << CS10); //prescalser 64
    OCR1A = 11718; // value to compare
    TCCR1A |= (1 << WGM12); // set ctc mode



    while(1)
    {

    }

    return 0;
}

Cuando se encienda el led de inicio del programa. Después de comparar el partido, debería apagarse. Y funciona, pero con un problema extraño.

Si cambio OCR1A, solo cambia el primer período de tiempo antes de que se encienda y se apague el led.

Cuando configuro OCR1A, por ejemplo, 0x100, el LED se apaga muy rápidamente.

Cuando configuro OCR1A, por ejemplo, 0xfffa, el LED se apaga lentamente.

Pero sólo el primer cambio de estado.

Otro parpadeo del led no se hace cargo de los cambios de OCR1A.

¿Qué ocurre?

¿Necesito restablecer algunas banderas o algo así?

Está suponiendo que el temporizador se restablece a cero cuando alcanza el valor de comparación. no lo hace
@brahans Hmmm, agregué TCNT1 = 0x00 en ISR y funciona. ¿Pero por qué? ¿El TCNT1 no debe borrarse automáticamente? Como dice el documento: "El valor del contador (TCNT1) aumenta hasta que se produce una coincidencia de comparación con OCR1A o ICR1, y luego se borra TCNT1".

Respuestas (1)

No configuró el modo CTC, WGM12 está en TCCR1B