Hallo,
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:
Johannes Fe schrieb:> Habe ein Minimal-Testprogramm erstellt, siehe Anhang. Eigentlich sollte> PA0 durch die ISR mit ca. 50 Hz (20 MHz/(6*65000)) getoggelt werden, was
Woher kommt die 6? Aber erstmal egal.
> aber nicht passiert – PA0 bleibt einfach dauerhaft low.
Im DB konnte ich keinen Hinweis auf die Existenz dieses Registers
finden:
> xout VPORTA_OUTTGL, tmp0
Da hätte der Assembler meckern müssen. Hat er das nicht getan, ist es
wohl ein Bug im Device-Include.
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."
Ob S. schrieb:> Woher kommt die 6? Aber erstmal egal.
Voreinstellung des Clock-Teilers nach Reset.
Ob S. schrieb:>> xout VPORTA_OUTTGL, tmp0>> Da hätte der Assembler meckern müssen.
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.
Veit D. schrieb:> PortA ist vorhanden.
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.
Hallo,
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?
S. L. schrieb:> Sie müssen den CAPT-Interrupt verwenden:
Habe "TCB_OVF_bm" auf "TCB_CAPT_bm" geändert, ohne Erfolg. Immer noch
kein Output, weder auf PA0 noch PA2.
Veit D. schrieb:> Ein einfacher Blinktest funktioniert?> In welchem Modus soll TCB konfiguriert werden?
Ja, ich hatte vorher schon an demselben Controller eine
LED-Multiplexanzeige, nur mit Warteschleifen statt Interrupt, das hat
funktioniert.
Modus soll Periodic Interrupt sein, das ist auch die Voreinstellung.
Hallo,
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.
Veit D. schrieb:> 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"
Grüßle,
Volker
Hallo,
@ 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.
Veit D. schrieb:> Wir reden aktuell von .OUTTGL und nicht von .IN
Einen Input-Port kannst du auch nicht per Software toggeln. ;-)
Daher wird das Input-Register für Schreibzugriffe missbraucht, um das
zugehörige Output-Register zu toggeln.
Diese Funktionalität gab es auch schon bei den klassischen AVRs.
Sorry für die Sendepause, ich war unterwegs ...
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).
S. L. schrieb:> Sie müssen den CAPT-Interrupt verwenden:
Das war das Problem; ich hatte mal wieder das Datenblatt nicht
sorgfältig genug gelesen ... Vielen Dank!
> ... versehentlich den doppelten Wert ...
Also zumindest die Formulierung war ja richtig:
> PA0 durch die ISR mit ca. 50 Hz ... getoggelt
ergibt dann ein Rechtecksignal mit 25 Hz.
> Datenblatt nicht sorgfältig genug gelesen
Das ging mir vor geraumer Zeit haargenauso - rein intuitiv ist an dieser
Stelle der CAPT-Interrupt ziemlich eigenartig.
S. L. schrieb:> 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.
Aer selbst das war wohl noch zuviel Aufwand...