XMEGA 128A3 Timer starten und anhalten

Gast #2078900
Lesenswert?

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
Gast #2079004
Lesenswert?

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
}
Gast #2079040
Lesenswert?

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
Gast #2079059
Lesenswert?

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.
Gast #2079142
Lesenswert?

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.
Gast #2079177
Lesenswert?

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
Gast #2079721
Lesenswert?

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
Gast #2081546
Lesenswert?

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 */
Gast #2081741
Lesenswert?

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

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