mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA 128A3 Timer starten und anhalten


Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: qudral (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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-...

quadral

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich denn das CNT Register neu beschreiben nachdem ich den CLK 
abgeschaltet habe?

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

// Timer/Counter TCC0 initialization
void tcc0_init(void)
{
   unsigned char s;
   unsigned char n;

   // Note: the correct PORTC direction for the Compare Channels outputs
   // is configured in the ports_init function

   // Save interrupts enabled/disabled state
   s=SREG;
   
   // Disable interrupts
   #asm("cli")

   // Disable and reset the timer/counter just to be sure
   tc0_disable(&TCC0);
   
   // Clock source: Peripheral Clock/64
   TCC0.CTRLA=(TCC0.CTRLA & (~TC0_CLKSEL_gm)) | TC_CLKSEL_DIV64_gc;
   
   // Mode: Normal Operation, Overflow Int./Event on TOP
   // Compare/Capture on channel A: Off
   // Compare/Capture on channel B: Off
   // Compare/Capture on channel C: Off
   // Compare/Capture on channel D: Off   
   TCC0.CTRLB=(TCC0.CTRLB & (~(TC0_CCAEN_bm | TC0_CCBEN_bm | TC0_CCCEN_bm | TC0_CCDEN_bm | TC0_WGMODE_gm))) | TC_WGMODE_NORMAL_gc;

   // Capture event source: None
   // Capture event action: None
   TCC0.CTRLD=(TCC0.CTRLD & (~(TC0_EVACT_gm | TC0_EVSEL_gm))) | TC_EVACT_OFF_gc | TC_EVSEL_OFF_gc;

   // Overflow interrupt: Disabled
   // Error interrupt: Disabled
   TCC0.INTCTRLA=(TCC0.INTCTRLA & (~(TC0_ERRINTLVL_gm | TC0_OVFINTLVL_gm))) | TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_OFF_gc;

   // Compare/Capture channel A interrupt: Disabled
   // Compare/Capture channel B interrupt: Disabled
   // Compare/Capture channel C interrupt: Disabled
   // Compare/Capture channel D interrupt: Disabled
   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;

   // High resolution extension: Off
   HIRESC.CTRL&= ~HIRES_HREN0_bm;

   // Advanced Waveform Extension initialization
   // Optimize for speed
#pragma optsize- 
   
   // Disable locking the AWEX configuration registers just to be sure
   n=MCU.AWEXLOCK & (~MCU_AWEXCLOCK_bm);
   CCP=CCP_IOREG_gc;
   MCU.AWEXLOCK=n;
   // Restore optimization for size if needed
#pragma optsize_default

   // Pattern generation: Off
   // Dead time insertion: Off
   AWEXC.CTRL&= ~(AWEX_PGM_bm | AWEX_CWCM_bm | AWEX_DTICCDEN_bm | AWEX_DTICCCEN_bm | AWEX_DTICCBEN_bm | AWEX_DTICCAEN_bm);

   // Fault protection initialization
   // Fault detection on OCD Break detection: On
   // Fault detection restart mode: Latched Mode
   // Fault detection action: None (Fault protection disabled)
   AWEXC.FDCTRL=(AWEXC.FDCTRL & (~(AWEX_FDDBD_bm | AWEX_FDMODE_bm | AWEX_FDACT_gm))) | AWEX_FDACT_NONE_gc;
   
   // Fault detect events: 
   // Event channel 0: Off
   // Event channel 1: Off
   // Event channel 2: Off
   // Event channel 3: Off
   // Event channel 4: Off
   // Event channel 5: Off
   // Event channel 6: Off
   // Event channel 7: Off
   AWEXC.FDEVMASK=0b00000000;
   
   // Make sure the fault detect flag is cleared
   AWEXC.STATUS|=AWEXC.STATUS & AWEX_FDF_bm;

   // Clear the interrupt flags
   TCC0.INTFLAGS=TCC0.INTFLAGS;
   
   // Set counter register
   TCC0.CNT=0x0000;
   
   // Set period register
   TCC0.PER=0xFFFF;
   
   // Set channel A Compare/Capture register
   TCC0.CCA=0x0000;
   
   // Set channel B Compare/Capture register
   TCC0.CCB=0x0000;
   
   // Set channel C Compare/Capture register
   TCC0.CCC=0x0000;
   
   // Set channel D Compare/Capture register
   TCC0.CCD=0x0000;

   // Restore interrupts enabled/disabled state
   SREG=s;
}


Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ews ist doch nicht normal das der Timer konfiguriert wird während er 
bereits läuft. Jedoch macht Atmel es in einem Beispiel genauso.

Autor: qudral (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: qudral (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.