Output Compare Interrupt funktioniert nicht avr atmega

Hey, ich versuche, LED mit Interrupts auf 16-Bit-Timer zu blinken. Mein Atmega-Modell ist Atmega168A. Die Chiptaktrate beträgt 12 MHz.

Hier ist mein Code:

#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;
}

Wenn die Programmstart-LED aufleuchtet. Nach dem Vergleich sollte es sich ausschalten. Und es funktioniert, aber mit einem seltsamen Problem.

Wenn ich OCR1A ändere, ändert sich nur die erste Zeitspanne vor dem Ein- und Ausschalten der LED.

Wenn ich OCR1A z. B. 0x100 einstelle, erlischt die LED sehr schnell.

Wenn ich OCR1A z. B. 0xfffa einstelle, erlischt die LED langsam.

Aber nur der erste Zustandswechsel.

Ein weiteres LED-Blinken übernimmt keine Änderungen von OCR1A.

Was ist falsch?

Muss ich einige Flags oder so etwas zurücksetzen?

Sie gehen davon aus, dass der Timer auf Null zurückgesetzt wird, wenn er den Vergleichswert erreicht. Das tut es nicht.
@brahans Hmmm, ich habe TCNT1 = 0x00 in ISR hinzugefügt und es funktioniert. Aber warum? Sollte TCNT1 nicht automatisch gelöscht werden?

Antworten (1)

Sie haben den CTC-Modus nicht eingestellt, WGM12 befindet sich in TCCR1B