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

0

Hola, estoy tratando de hacer un parpadeo del led usando interrupciones en un temporizador de 16 bits. Mi modelo de atmega es Atmega168A. La velocidad de reloj del chip es 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 enciende el led de inicio del programa. Después de comparar el partido debe apagarse. Y funciona, pero con un problema extraño.

Si cambio OCR1A, solo cambia el primer periodo de tiempo antes de que se encienda y 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 solo cambia el primer estado.

Otros parpadeos de led no controlan los cambios de OCR1A.

¿Qué pasa?

¿Necesito restablecer algunas banderas o algo así?

    
pregunta bielu000

1 respuesta

1

No configuraste el modo CTC, WGM12 está en TCCR1B

    
respondido por el Maple

Lea otras preguntas en las etiquetas