Hallo in die Runde,
ich stand gerade vor dem gleichen Problem wie Christian vor einem Jahr bei dem vom Timer TCB0 her identischen AVR64DD32.
Ich initialisiere den Timer,
das Capture-Flag wird gesetzt,
ich kann es in main() abfragen, einen Pin toggeln und das Capture Flag löschen.
Es blinkt.
Wenn ich stattdessen eine ISR verwende, passiert nichts.
Das von Georg vorgestellte Programm läuft jedoch problemlos.
Die Lösung war:
Ich hatte noch einen zweiten Timer (TimerA) initialisiert, und den overflow-interrupt aktiviert:
1 |
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
|
Den habe ich aber nicht genutzt und daher keine ISR geschrieben und auch das Interrupt-Flag nicht zurückgesetzt.
Damit habe ich den Interrupt von TCB0 blockiert.
Er lief zwar und das Interrupt-bzw. Capture-Flag wurde gesetzt und konnte in main() ausgelesen und zurückgesetzt werden, eine ISR wurde aber nicht aufgerufen.
Fazit:
Eine ISR für TCA0 ist notwendig, egal ob sie das Flag zurücksetzt oder nicht, d.h. sie kann auch leer sein.
In diesem Fall muss das Flag an anderer Stelle zurückgesetzt werden.
Ich vermute, dass ich jetzt nicht nur mein Problem gelöst habe, sondern auch noch etwas über Interrupt-Handling gelernt habe ;-)