Hallo alle miteinander...
Ich möchte timergesteuert den INT0-Interrupt aktivieren und
deaktivieren. Dafür hatte ich vor, den Timer1 im Normal-Mode laufen zu
lassen und über das OCR1A Register den Vergleichswert zu definieren. In
der CompareMatch ISR wird dann einfach der INT0-Interrupt eingeschaltet
oder ausgeschaltet.
TCNT1 soll bei einem CompareMatch nicht zurückgesetzt werden
Laut Datenblatt zählt der Normal-Mode bis 0XFFF ohne zurücksetzen und
als CompareMatch kann OCR1A benutzt werden.
Nun habe ich das ganze einfach mal ausprobiert. Hab vorerst in die
ISR(TIMER1_COMPA_vect) ein Pintoggeln reingenommen und mir dann den
Ausgang angesehen.
Nun ist es so, dass am Ausgang einfach eine 50/50-PWM (Periode von 8,192
ms) ist, unabhängig davon welcher Wert in dem Vergleichsregister drin
steht. Wenn man die 8,192ms betrachtet, sieht es so aus als wäre es der
OverflowInterrupt und nicht der CompareMatch.
Hat jemand eine Idee woran das liegen könnte?
Hier meine Initialisierung für den Timer:
1 | void init_timer(void)
|
2 | {
|
3 | TCCR1A &= ~(1<<WGM11) | (1<<WGM10); //Normal-Mode
|
4 | TCCR1B &= ~(1<<WGM13) | (1<<WGM12);
|
5 | TIMSK |= (1<<OCIE1A); // Compare Match Int aktivieren
|
6 | OCR1A = 32767;
|
7 | TCCR1B |= (1<<CS10); //Timer starten
|
8 | }
|
und hier die passende ISR
1 | ISR(TIMER1_COMPA_vect)
|
2 | {
|
3 | PORTD ^= (1<<PD3);
|
4 | }
|
Danke schonmal im Voraus.