Hallo, mir soll der TCB0 Timer eines AVR128DB28 ein niederfrequentes Signal am zugehörigen Pin A2 (als Output konfiguriert) liefern. Problem: Da kommt nix, der Pin bleibt auf Low. Das Ganze soll im Periodic Interrupt Mode (siehe Screenshot der zugehörigen Datenblatt Passage) geschehen. Was läuft hier schief? Der zugehörige Timer-Asm-Initcode schaut so aus: ;WO freischalten ldi XL,$10 sts TCB0_CTRLB,XL ;Top Value mit 4000 laden ldi XL,$a0 ldi XH,$f sts TCB0_CCMPL,XL sts TCB0_CCMPH,XH ;Timer bei 8/2= 4Mhz aktivieren: ldi XL,3 out TCB0_CTRLA,XL Auf alternative Ports ist auch kein Pin umgebogen.
Stefan schrieb: > Was läuft hier schief? DB Abschnitt 24.3.3.2. lesen und anwenden. Insbesondere auch den 7. Satz in diesem Abschnitt berücksichtigen.
c-hater schrieb: > DB Abschnitt 24.3.3.2. lesen und anwenden. Der führt hier auch nicht weiter. > Insbesondere auch den 7. Satz > in diesem Abschnitt berücksichtigen. Stefan schrieb: > am > zugehörigen Pin A2 (als Output konfiguriert) Abschnitt 24.3.2 (siehe Bild) erklärt die Schritte zur Initalisierung des hier beabsichtigten Periodic Interrupt Mode. Dazu kann wie beschrieben optional die Waveform am zugehörigen TCB0 Output-Pin WO = PA2 verfügbar gemacht werden! Bislang also alles leider keine Erklärung :-(
Stefan schrieb: > Stefan schrieb: >> am >> zugehörigen Pin A2 (als Output konfiguriert) Das ist dem geposteten Code nicht zu entnehmen. Wer weiß, was sonst noch alles NICHT im geposteten Code steht. Poste also einen VOLLSTÄNDIGEN Code, der das Problem zeigt, dann sehen wir weiter. Sehr wahrscheinlich ist aber, dass du schon bei der Erstellung dieses Codes selber auf das Problem stößt...
c-hater schrieb: > Poste also einen VOLLSTÄNDIGEN Code, der das Problem zeigt, So ist es bereits geschehen, c-hater! Speziell für Dich als vertrauensbildende Maßnahme noch die Konfiguration des PA2 als Output: sbi VPORTA_DIR,2 c-hater schrieb: > Sehr wahrscheinlich ist aber, dass du schon bei der Erstellung dieses > Codes selber auf das Problem stößt Sehr wahrscheinlich ist daß Du momentan auch keinen Plan hast.
> ein niederfrequentes Signal
Wie sollte dieses denn aussehen? Tastgrad 0.5? Welche Frequenz? Also ich
interpretiere das Datenblatt so, dass im 'Periodic Interrupt Mode'
schlicht kein Ausgangssignal erzeugt wird.
S. Landolt schrieb: > Also ich interpretiere das Datenblatt so, dass im 'Periodic Interrupt > Mode' schlicht kein Ausgangssignal erzeugt wird. Interpretieren? Wie kommst Du drauf? Stefan schrieb: > Abschnitt 24.3.2 (siehe Bild) erklärt die Schritte zur Initalisierung > des hier beabsichtigten Periodic Interrupt Mode. Dazu kann wie > beschrieben optional die Waveform am zugehörigen TCB0 Output-Pin WO = > PA2 verfügbar gemacht werden!
24.3.2 erklärt allgemein die Initialisierung; das 'it' in '... to start using it' bezieht sich auf 'TCB', nicht auf 'Periodic Interrupt Mode'.
S. Landolt schrieb: > Wie sollte dieses denn aussehen? Tastgrad 0.5? Jepp. > Welche Frequenz? Halbe Überlauffrequenz. Entspricht im Prinzip dem CTC-Mode der klassischen AVR8-Timer. > Also ich > interpretiere das Datenblatt so, dass im 'Periodic Interrupt Mode' > schlicht kein Ausgangssignal erzeugt wird. Das interpretierst du wohl falsch. Wenn das so wäre, würde die vierte Zeile in Table24-2 keinen Sinn ergeben.
Dann zeigen Sie mir ein lauffähiges Programm - hätte ich im alten Jahr noch etwas dazugelernt.
Stefan schrieb: > Sehr wahrscheinlich ist daß Du momentan auch keinen Plan hast. Richtig. Weil du wohl deine Fehler nicht offenlegst. Liefere einfach ein vollständiges, assemblierbares Beispiel, welches das Problem zeigt, dann kann man ohne viel Aufwand sehen, was rauskommt und wo das Problem liegt. So funktioniert Fehlersuche.
c-hater schrieb: > Weil du wohl deine Fehler nicht offenlegst. So ein Quatsch. Welche sollten das sein? > dann kann man ohne viel Aufwand sehen, was rauskommt und wo das Problem > liegt. Das könntest Du auch jetzt schon. Oder eben nicht. S. Landolt schrieb: > 24.3.2 erklärt allgemein die Initialisierung; das 'it' in '... to > start using it' bezieht sich auf 'TCB', nicht auf 'Periodic Interrupt > Mode'. Ich werde das so hinnehmen müssen. Im Periodic Interrupt wird nichts ausgegeben.
Also unter uns, Stefan: zwischenzeitlich habe ich einiges probiert, auch mit dem ähnlichen ATmega4809 - es kommt bei mir hier im TCB-'Periodic Interrupt Mode' kein Ausgangssignal.
S. Landolt schrieb: > Also unter uns, Stefan: zwischenzeitlich habe ich einiges > probiert, auch > mit dem ähnlichen ATmega4809 - es kommt bei mir hier im TCB-'Periodic > Interrupt Mode' kein Ausgangssignal. Ich bedanke mich. Da werde ich umdisponieren müssen. Vom TCB0 bin ich einigermaßen enttäuscht, es wäre doch ein Leichtes gewesen, das Signal bei der ohnehin dafür vorgesehenen Freischaltung via CCMPEN in CTRLB auch im Default-Modus dieses Timers auszugeben!
> Vom TCB0 bin ich einigermaßen enttäuscht
Da sind wir zu zweit; allein schon die Beschränkung beim Vorteiler ist
mir unverständlich.
S. Landolt schrieb: > allein schon die Beschränkung beim Vorteiler ist > mir unverständlich. Wo wir gerade bei Enttäuschungen sind, den hätte ich auch schon fast erwähnt... Schon sehr speziell dieser Timer, dafür in vielfacher Ausführung. Vom kostbaren TCA gibts unter 48 Pins beim AVR128DB im Gegenzug nur einen ;-(
Hallo, bin von hier Beitrag "Re: Frage zu CCL-Einheit in neueren AVR-Controllern" hierher geleitet wurden. Ich denke das Manual wird hier falsch interpretiert. Der Name Periodic Interrupt sagt schon was der Mode macht, Interrupts erzeugen. Im Periodic Interrupt Mode kann man einen Aufgaben nur in ISR erledigen lassen. Wenn man einen Takt mit TCB erzeugen möchte, warum dann nicht mit 8Bit PWM Modus? Der Periodic Interrupt löst ja nur einen Puls/Flag aus, wenn der zum WO rausgeleitet würde hätte man nichts gewonnen. Abgesehen vom PWM Mode möchte ich erwähnen das der TCB ein Mess-Timer ist. Die gesamte Funktionalität ist darauf ausgerichtet. > 24.3.2 Initialization > By default, the TCB is in Periodic Interrupt mode. ... Der 1. Satz sagt nur aus, dass der Timer in Defaultkonfig auf Periodic Interrupt Mode eingestellt ist, weil Registerwert 0. An der Stelle wird der Timer noch allgemein beschrieben. Die einzelnen Modi werden später erklärt. Desweiteren wissen wir ja das das Manual fehlerhaft bzw. unvollständig ist. Keine Ahnung wann ein Update rauskommt. Dabei ist auch die Tabelle 24-2 leider Irreführend. Das Port Funktion Überschreiben funktioniert ja auch nicht immer. Lieber selbst auf Ausgang setzen oder vorher probieren. Das man 32Bit Input Capture im Gegensatz zur Beschreibung mit allen Mess-Modi nutzen kann hatte ich ja schon einmal vor langer Zeit erwähnt. Und ja die fehlenden Prescaler für TCB stören mich auch, aber man findet Umwege. :-) Mal ein anderes Bsp. Mit einem Umweg über die RTC und Eventsystem und ohne TCA kann man dann den TCB Takt verlangsamen.
1 | #include <avr/interrupt.h> |
2 | #include <util/atomic.h> |
3 | #include "AVRxDB_Pin.h" |
4 | #include "AVRxDB_TCBn.h" |
5 | |
6 | OutputPin <pinPD0> pinTakt; |
7 | TCB <0> tcb0; |
8 | |
9 | void setup() |
10 | {
|
11 | pinTakt.init(); |
12 | initEventSystem(); |
13 | initTCBn(tcb0); |
14 | initRTC(); |
15 | }
|
16 | |
17 | void loop (void) |
18 | { } |
19 | |
20 | void initRTC (void) |
21 | {
|
22 | RTC.CLKSEL = RTC_CLKSEL_INT32K_gc; // period duration 30,518µs |
23 | RTC.CTRLA = RTC_PRESCALER_DIV32_gc; // prescaler 32 * 30,518µs = 976,5625µs |
24 | RTC.PER = 102; // 102,4 set period = 100ms / 0,977ms |
25 | while (RTC.STATUS > 0) { ; } // wait for all register to be synchronized |
26 | RTC.CTRLA |= RTC_RTCEN_bm; // RTC enable |
27 | }
|
28 | |
29 | void initEventSystem(void) |
30 | {
|
31 | EVSYS.CHANNEL7 = EVSYS_CHANNEL7_RTC_OVF_gc; // connect 'RTC OVF' to channel 7 |
32 | EVSYS.USERTCB0COUNT = EVSYS_USER_CHANNEL7_gc; // connect generator 'RTC OVF' with user 'TCB0' via channel 7 |
33 | }
|
34 | |
35 | ISR(TCB0_INT_vect) |
36 | {
|
37 | pinTakt.toggle(); |
38 | tcb0.deleteFlagCAPT(); |
39 | }
|
40 | |
41 | void initTCBn (auto &timer) // TCB Periodic Interrupt Mode |
42 | {
|
43 | timer.reset(); |
44 | timer.setModeINT(); |
45 | timer.enableCAPTInterrupt(); |
46 | timer.setCLKEVENT(); |
47 | timer.setCompare(9); |
48 | timer.enable(); |
49 | }
|
> Mal ein anderes Bsp. > Mit einem Umweg über die RTC und Eventsystem ... Wenn dies auch für den hier diskutierten 'Periodic Interrupt Mode' oder den von Ihnen angesprochenen '8-Bit PWM mode' funktionierte, wär's nett - ist dem so?
Hallo, ja dem ist so. Das Bsp. setzt den Timer in den Periodic Interrupt Mode. Ich habe mir nur eine Lib erstellt und mich mit den Bezeichnungen an das Manual/Defines angelehnt und möglichst sprechende Namen verwendet. Falls du mehr Einzelheiten benötigst zwecks Übersetzung C/C++ <> Assembler sag Bescheid. gekürzter Auszug was was entspricht.
1 | setModeINT() ............ CTRLB - TCB_CNTMODE_INT_gc |
2 | enableCAPTInterrupt() ... INTCTRL - TCB_CAPT_bm |
3 | setCLKEVENT() ........... CTRLA - TCB_CLKSEL_EVENT_gc |
4 | setCompare(9) ........... CCMP - value |
5 | enable() ................ CTRLA - TCB_ENABLE_bm |
Der Umweg sollte mit allen Modi funktionieren. Es wird nur der Takteingang von TCBn von einer anderen Quelle gespeist. In dem Fall vom RTC OVF Puls. Man könnte auch einen I/O Pin verwenden, den übers Eventsystem dem TCBn Takteingang zuführen und mittels Taster von Hand takten o.a.. Noch nicht probiert aber muss gehen. Oder per Software-Event den TCBn takten lassen. Probiert - funktioniert. Ist das gleiche Prinzip wie vom RTC OVF Puls. Darauf kam ich u.a. weil ich mit dem Arduino Nano Every rumgespielt habe und mir fehlten außen paar Pins für die CCL. Das Board ist zu klein und es sind nicht alle Pins vom ATmega4809 rausgeführt. Also habe ich mir übers Eventsystem die Zugänge zwischen Pins und den CCL Ein- und Ausgängen gelegt. Dann kam eins zum anderen.
Danke für die Rückmeldung. Ich tat mich mit dem von Ihnen gezeigten Programm etwas schwer (und tue es noch), hatte folglich heute morgen das Ganze mal selbst probiert (in Assembler).
Hallo, wenn ich irgendwie helfen kann mach ich das. Gibt es Probleme beim Übersetzen in Assembler oder im Verständnis? Funktioniert dein Programm?
Oh ja, ich hatte das mit dem 'CLKSEL=EVENT' schon mal gemacht, vor geraumer Zeit, allerdings mit TCB und TCD als Generator, und war jetzt durch den RTC etwas irritiert - aber natürlich funktioniert das mit diesem genauso. Und um auf den Auslöser zurückzukommen: auch die Ansteuerung von PA2 im 'Periodic Interrupt Mode' per CCL funktioniert, seit anfang Januar, aber Stefan hatte wohl seine eigene Lösung gefunden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.