Forum: Mikrocontroller und Digitale Elektronik AVR128DB28: TCB0 liefert kein Signal an PA2


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

Stefan schrieb:
> out     TCB0_CTRLA,XL

Korrektur:
sts TCB0_CTRLA,XL

von c-hater (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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 :-(

von c-hater (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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!

von S. Landolt (Gast)


Lesenswert?

24.3.2 erklärt allgemein die Initialisierung; das 'it' in '... to start 
using it' bezieht sich auf 'TCB', nicht auf 'Periodic Interrupt Mode'.

von c-hater (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

Dann zeigen Sie mir ein lauffähiges Programm - hätte ich im alten Jahr 
noch etwas dazugelernt.

von c-hater (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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!

von S. Landolt (Gast)


Lesenswert?

> Vom TCB0 bin ich einigermaßen enttäuscht

Da sind wir zu zweit; allein schon die Beschränkung beim Vorteiler ist 
mir unverständlich.

von Stefan (Gast)


Lesenswert?

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 ;-(

von Veit D. (devil-elec)


Lesenswert?

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
}

von S. Landolt (Gast)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn ich irgendwie helfen kann mach ich das. Gibt es Probleme beim 
Übersetzen in Assembler oder im Verständnis? Funktioniert dein Programm?

von S. Landolt (Gast)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

auch schön.  :-)

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.