AVR16EB32 - TCB0-Interrupt wird nicht ausgelöst

#7729281
Lesenswert?

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:

1
; Initialize and start TCB0:
2
.equ TCB0_CCMPVAL = 65_000
3
    ldi     tmp0, low(TCB0_CCMPVAL)
4
    xout    TCB0_CCMPL, tmp0
5
    ldi     tmp0, high(TCB0_CCMPVAL)
6
    xout    TCB0_CCMPH, tmp0
7
    ldi     tmp0, TCB_CCMPEN_bm
8
    xout    TCB0_CTRLB, tmp0
9
    ldi     tmp0, TCB_ENABLE_bm
10
    xout    TCB0_CTRLA, tmp0
Angehängte Dateien:
(Firma: 1984now) #7729298
Lesenswert?

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.

#7729303
Lesenswert?

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."

Beitrag #7729321 wurde von einem Moderator gelöscht.
(Firma: L-E-A) #7729331
Lesenswert?

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

#7729413
Lesenswert?

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!

Angehängte Dateien:
#7729484
Lesenswert?

... 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.

(Firma: 1984now) #7729599
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren