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 haben den CTC-Modus nicht eingestellt, WGM12 befindet sich in TCCR1B
brhans
bielu000