ich versuche gerade, den Timer TCB0 eines AVR16EB32 zu benutzen, und scheitere daran, dass die zugehörige ISR aus irgendeinem Grund nicht aufgerufen wird.
Habe ein Minimal-Testprogramm erstellt, siehe Anhang. Eigentlich sollte PA0 durch die ISR mit ca. 50 Hz (20 MHz/(6*65000)) getoggelt werden, was aber nicht passiert – PA0 bleibt einfach dauerhaft low.
Hoffe, jemand kann mir einen Tip geben, woran es liegen könnte.
Grüße
Nachtrag: Auch bei Aktivierung des Waveform Outputs lässt sich am entsprechenden Output (PA2) nichts feststellen, dieses bleibt statisch low. Der dafür relevante Code:
Zur ursprünglichen Fragestellung:
Sie müssen den CAPT-Interrupt verwenden:
"Periodic Interrupt Mode: In the Periodic Interrupt mode, the counter counts to the capture value and restarts from BOTTOM. A CAPT interrupt and event is generated when the CNT is equal to TOP."
Ja stimmt, das gibt es nicht. Gerade nochmal assembliert, keine Fehlermeldung. Sehr seltsam. Vorher hatte ich aber "sbi VPORTA_IN, 0", da hat es auch nicht funktioniert.
Ja klar. Und es gibt auch eine PORTA_OUTTOGL-Register. Aber kein VPORTA_OUTTGL. Das gibt es nirgendwo. Die VPORTs haben immer nur vier Register. DIR, OUT, IN und INTFLAGS.
das Datenblatt ist noch schwer Beta. Ich würde nicht verstehen warum das Register OUTTGL für die EB Serie wegrationalisiert werden sollte.
Kannst du ohne jeden Timer einen Pin toggeln lassen und dann mittels OUTTGL?
ich glaube ich habs. OUTTGL gibt es nicht für VPORTx. Gibt es nur für PORTx. Auch bei allen anderen AVRs ist das so. Warum du aber mit VPORTA_OUTTGL keine Fehlermeldung bekommst ist eine gute Frage.
ich glaube ich habs. OUTTGL gibt es nicht für VPORTx. Gibt es nur für
PORTx. Auch bei allen anderen AVRs ist das so.
Doch, wie bei den neueren AVRs und den ATtiny0/1/2 toggelt ein Schreibzugriff auf VPORT.IN die Portbits, die mit einer '1' beschrieben werden, wie im Datenblatt beschrieben:
"Writing a `1' to bit n in this bit field will toggle the corresponding bit in PORTx.OUT"
@ Volker:
Wir reden aktuell von .OUTTGL und nicht von .IN. OUTTGL gibt es nicht für VPORT. Das ist die Verwechselung vom TO. Das muss auch mit PORTA.OUTTGL funktionieren. Beides muss funktionieren, VPORTA.IN oder PORTA.OUTTGL.
Asche auf mein Haupt, habe gerade die Ursache gefunden:
Ich hatte zwischenzeitlich die Asm-Datei in ein temporäres Verzeichnis kopiert, und versehentlich dann dort weiterbearbeitet, statt im ursprünglichen Verzeichnis, wo ich die alte Version erneut assembliert habe. Deshalb auch das Ausbleiben der Fehlermeldung bei VPORTA_OUTTGL.
Der angehängte Code funktioniert nun, ca. 25 Hz an PA0 (das ist richtig, oben hatte ich versehentlich den doppelten Wert angegeben).
Das ging mir vor geraumer Zeit haargenauso - rein intuitiv ist an dieser
Stelle der CAPT-Interrupt ziemlich eigenartig.
Ja. Das liegt aber nur an der fragwürdigen Namensgebung. Hätte man das Ding z.B. CCMP_CAPT genannt, wäre die Sache klarer. Noch klarer (und kürzer) wäre es, wenn man Kram analog zu den Classic-ATmegas OC und IC genannt hätte. Denn im Prinzip ist es ja ganz genau dasselbe: ein vorhandenes Registerpaar wird je nach Funktion einmal als Input Capture und einmal als Output Compare verwendet.
Bei diesen elenden Type-B-Timern kommt dann noch das unsägliche Sharing hinzu, was nichtmal jeder funktional verschiedenen Interruptquelle ein eigenes Interruptflag spendiert. Und noch schlimmer: allen möglichen Interruptqueelen des Timers nur einen einzigen gemeinsamen Interruptvektor.
Also: die Type-B-Timer sind eine ziemliche Fehlentwicklung. Hier wäre es sehr viel schöner gewesen, wenn statt dessen die "Timer1-Type"-Timer der Classic-ATmegas zu übernehmen. Aber klar, damit würden die Features zur "Kaskadierung" wegfallen müssen (mit einem TimerA oder auch untereinander), die auch oft ganz nützlich sind. Das wäre der Nachteil gewesen.
Bleibt: Ohne nennenswerten Entwickleraufwand wäre die bestmögliche Lösung wohl halt einfach eine treffendere Benennung der Symbole gewesen.