Forum: Mikrocontroller und Digitale Elektronik AVR16EB32 - TCB0-Interrupt wird nicht ausgelöst


von Johannes Fe (jofe)


Angehängte Dateien:

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

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


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.

von S. L. (sldt)


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

von Veit D. (devil-elec)


Lesenswert?

Hallo,

PortA ist vorhanden.
Ein einfacher Blinktest funktioniert?
In welchem Modus soll TCB konfiguriert werden?

von Johannes Fe (jofe)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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.

von S. L. (sldt)


Lesenswert?

> Gerade nochmal assembliert, keine Fehlermeldung

Dem würde ich nachgehen, bei mir kommt sehr wohl eine: 'Undefined 
symbol: VPORTA_OUTTGL'.

von Veit D. (devil-elec)


Lesenswert?

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?

von Johannes Fe (jofe)


Lesenswert?

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.

von Johannes Fe (jofe)


Lesenswert?

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.

von S. L. (sldt)


Lesenswert?

> ... ohne Erfolg ...

Bei mir läuft das mit dem CAPT-Interrupt - wie sieht Ihr aktuelles 
Programm aus?

von Veit D. (devil-elec)


Lesenswert?

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.

Beitrag #7729321 wurde vom Autor gelöscht.
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Und jetzt noch mal, aber richtig; 25 Hz auf A0.

von Volker B. (Firma: L-E-A) (vobs)


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

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich weiß das alles. Ich kenne die Controller.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Habe mir gerade die alten Xmegas mal angesehen, auch dort gab es bei den 
virtual ports kein OUTTGL, sondern nur DIR, OUT, IN und INTFLAGS.

von Johannes Fe (jofe)


Angehängte Dateien:

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!

: Bearbeitet durch User
von S. L. (sldt)


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.

von Ob S. (Firma: 1984now) (observer)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.