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:
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 ;-)