Hallo @ all, ich verwende einen XMEGA128A3 und möchte hier den Timer T0 benutzen. Er ist bereits fertig konfiguriert und läuft so weit auch. Jedoch habe ich noch einige Verständnisprobleme. Ich möchte den Timer anhalten und dann wieder starten. Bevor ich den Timer wieder neu starte möchte ich das CNT Register wieder überschreiben. Jedoch habe ich kein Flag gefunden mit dem ich den Counter einfach starten und anhalten kann. Ich kann natürlich den Clock abschalten jedoch denke ich das dies nicht der richtige Weg ist. Habe ich etwas übershen
Hi. Wieso soll denn das Abschalten des Clocks der falsche Weg sein? So weit ich weiß gibts beim XMega kein extra Flag dafür. Um den Timer zurückzusetzen muss man nach dem Datenblatt ebenfalls den Clock abschalten (also CTRLA auf Null setzen). Vieleicht hilft dir das Tut hier weiter: http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial#timer quadral
Kann ich denn das CNT Register neu beschreiben nachdem ich den CLK abgeschaltet habe?
Ich benutze den Wizard von Codevision um den Timer zu konfigurieren, Hier ist mir jedoch aufgefallen das der Clock bereits sehr früh eingeschaltet wird und danach sehr viele Konfigurationsparameter geändert wurden. Demnach läuft der Timer ja bereits und wird im Betrieb konfiguriert das kann doch nicht wirklich richtig sein. Gibt es noch einige Beispiele wie man den Timer beim XMEGA konfiguriert?
1 | // Timer/Counter TCC0 initialization |
2 | void tcc0_init(void) |
3 | { |
4 | unsigned char s; |
5 | unsigned char n; |
6 | |
7 | // Note: the correct PORTC direction for the Compare Channels outputs |
8 | // is configured in the ports_init function |
9 | |
10 | // Save interrupts enabled/disabled state |
11 | s=SREG; |
12 | |
13 | // Disable interrupts |
14 | #asm("cli") |
15 | |
16 | // Disable and reset the timer/counter just to be sure |
17 | tc0_disable(&TCC0); |
18 | |
19 | // Clock source: Peripheral Clock/64 |
20 | TCC0.CTRLA=(TCC0.CTRLA & (~TC0_CLKSEL_gm)) | TC_CLKSEL_DIV64_gc; |
21 | |
22 | // Mode: Normal Operation, Overflow Int./Event on TOP |
23 | // Compare/Capture on channel A: Off |
24 | // Compare/Capture on channel B: Off |
25 | // Compare/Capture on channel C: Off |
26 | // Compare/Capture on channel D: Off |
27 | TCC0.CTRLB=(TCC0.CTRLB & (~(TC0_CCAEN_bm | TC0_CCBEN_bm | TC0_CCCEN_bm | TC0_CCDEN_bm | TC0_WGMODE_gm))) | TC_WGMODE_NORMAL_gc; |
28 | |
29 | // Capture event source: None |
30 | // Capture event action: None |
31 | TCC0.CTRLD=(TCC0.CTRLD & (~(TC0_EVACT_gm | TC0_EVSEL_gm))) | TC_EVACT_OFF_gc | TC_EVSEL_OFF_gc; |
32 | |
33 | // Overflow interrupt: Disabled |
34 | // Error interrupt: Disabled |
35 | TCC0.INTCTRLA=(TCC0.INTCTRLA & (~(TC0_ERRINTLVL_gm | TC0_OVFINTLVL_gm))) | TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_OFF_gc; |
36 | |
37 | // Compare/Capture channel A interrupt: Disabled |
38 | // Compare/Capture channel B interrupt: Disabled |
39 | // Compare/Capture channel C interrupt: Disabled |
40 | // Compare/Capture channel D interrupt: Disabled |
41 | TCC0.INTCTRLB=(TCC0.INTCTRLB & (~(TC0_CCDINTLVL_gm | TC0_CCCINTLVL_gm | TC0_CCBINTLVL_gm | TC0_CCAINTLVL_gm))) | TC_CCDINTLVL_OFF_gc | TC_CCCINTLVL_OFF_gc | TC_CCBINTLVL_OFF_gc | TC_CCAINTLVL_OFF_gc; |
42 | |
43 | // High resolution extension: Off |
44 | HIRESC.CTRL&= ~HIRES_HREN0_bm; |
45 | |
46 | // Advanced Waveform Extension initialization |
47 | // Optimize for speed |
48 | #pragma optsize- |
49 | |
50 | // Disable locking the AWEX configuration registers just to be sure |
51 | n=MCU.AWEXLOCK & (~MCU_AWEXCLOCK_bm); |
52 | CCP=CCP_IOREG_gc; |
53 | MCU.AWEXLOCK=n; |
54 | // Restore optimization for size if needed |
55 | #pragma optsize_default |
56 | |
57 | // Pattern generation: Off |
58 | // Dead time insertion: Off |
59 | AWEXC.CTRL&= ~(AWEX_PGM_bm | AWEX_CWCM_bm | AWEX_DTICCDEN_bm | AWEX_DTICCCEN_bm | AWEX_DTICCBEN_bm | AWEX_DTICCAEN_bm); |
60 | |
61 | // Fault protection initialization |
62 | // Fault detection on OCD Break detection: On |
63 | // Fault detection restart mode: Latched Mode |
64 | // Fault detection action: None (Fault protection disabled) |
65 | AWEXC.FDCTRL=(AWEXC.FDCTRL & (~(AWEX_FDDBD_bm | AWEX_FDMODE_bm | AWEX_FDACT_gm))) | AWEX_FDACT_NONE_gc; |
66 | |
67 | // Fault detect events: |
68 | // Event channel 0: Off |
69 | // Event channel 1: Off |
70 | // Event channel 2: Off |
71 | // Event channel 3: Off |
72 | // Event channel 4: Off |
73 | // Event channel 5: Off |
74 | // Event channel 6: Off |
75 | // Event channel 7: Off |
76 | AWEXC.FDEVMASK=0b00000000; |
77 | |
78 | // Make sure the fault detect flag is cleared |
79 | AWEXC.STATUS|=AWEXC.STATUS & AWEX_FDF_bm; |
80 | |
81 | // Clear the interrupt flags |
82 | TCC0.INTFLAGS=TCC0.INTFLAGS; |
83 | |
84 | // Set counter register |
85 | TCC0.CNT=0x0000; |
86 | |
87 | // Set period register |
88 | TCC0.PER=0xFFFF; |
89 | |
90 | // Set channel A Compare/Capture register |
91 | TCC0.CCA=0x0000; |
92 | |
93 | // Set channel B Compare/Capture register |
94 | TCC0.CCB=0x0000; |
95 | |
96 | // Set channel C Compare/Capture register |
97 | TCC0.CCC=0x0000; |
98 | |
99 | // Set channel D Compare/Capture register |
100 | TCC0.CCD=0x0000; |
101 | |
102 | // Restore interrupts enabled/disabled state |
103 | SREG=s; |
104 | } |
Ews ist doch nicht normal das der Timer konfiguriert wird während er bereits läuft. Jedoch macht Atmel es in einem Beispiel genauso.
Hi. Guck mal in das Tutorial vom Stromflo (Link siehe oben). Ansonsten evt. die Aplication Nodes von Atmel. Hmm... Ich glaube ich verstehe was du meinst. Wenn nun der Timer aktiviert wird, bevor ihm eine Periode zugewiesen wurde und der Overflow-Interrupt aktiviert ist, hängt sich der µC auf, da er andauernd in die ISR springt. Ich glaube aber, dass wenn Per Null ist, der Timer im Warparound ist. Er Zählt also andauernd bis CNT überläuft und beginnt dann vom neuen. Der Overflow-Interrupt wird dann nicht ausgeführt. Das würde auch zu der Codezeile passen, in der CNT auf Null gesetzt wird, bevor die Periode zugewiesen wird. Kann auch sein, dass der Compiler den Code anders umsetzt als er dasteht. quadral
Ich habe bereits bei Atmel nachgeschaut. Die aktivieren auch immer zuerst den CLK. Was würde denn passieren wenn ich die Konfigurationsregister ohne aktiverten CLK beschreiben würden? Werden die neuen Zustände übernommen oder geht dies nur mit dem aktiverten CLK Counter? Wenn die Konfigurations auch ohne CLK geht dann kann man ja zuerst die Konfiguration in einer Funktion implementieren. Das Start und Anhalten des Counters würde ich dann mit Hilfe einer Makros vornehmen.
Ich habe es mal mit dem Debugger ausprobiert. Wenn der CLK vom Timer 0 nicht aktiviert ist kann man Daten in das CNT Register und PER Register schreiben. Es stellt sich nun die Frage ob alle Konfigurationen ohne Timer CLK vorgenommen werden kann.
Hi. Die Register PER und CLK sind ganz stink normale Register. Die Werte, die du ihnen zuweist werden unmittelbar übernommen. Es spielt dabei keine Rolle ob CLK zugewiesen ist oder nicht. Was willst du denn überhaupt mit dem Timer machen? quadral
Servus, Johann schrieb: > Jedoch habe ich kein Flag gefunden mit dem ich den Counter einfach > > starten und anhalten kann Den Timer kann man im laufenden Betrieb stoppen, man braucht es aber im allgemeinen nicht. Stopp: TCC0.CTRLA = TC_CLKSEL_OFF_gc /* Timer Off */ Weiter: TCC0.CTRLA = TC_CLKSEL_DIV64_gc /* System Clock / 64 */ Gruß XMEGA
Warum macht der Wizard denn so ein komplizierte Sache // Clock source: Peripheral Clock/64 TCC0.CTRLA=(TCC0.CTRLA & (~TC0_CLKSEL_gm)) | TC_CLKSEL_DIV64_gc; Dies sollte doch genau das gleiche machen: TCC0.CTRLA = TC_CLKSEL_DIV64_gc /* System Clock / 64 */
Servus,
> Warum macht der Wizard denn so ein komplizierte Sache
das schaut zwar kompliziert aus, man ist sich aber mit dieser Metode
absolut sicher, dass keie überflüssigen oder vergessen Codeteile die
Konfiguration versauen.
Wenn du dir absolut sicher bist, kannst du ja dein Code verwenden.
Gruß XMEGA
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.