www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMega: 32Bit-Timer geht nicht im "Frequency Capture" Modus ?


Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ich benutze nachfolgenden Code auf einem XMega A1:
EVSYS.CH0MUX = EVSYS_CHMUX_RTC_OVF_gc;
EVSYS.CH1MUX = EVSYS_CHMUX_TCC0_OVF_gc;

TCC1.PER = 0xFFFF;
TCC1.CTRLD = TC_EVSEL_CH0_gc | TC_EVACT_FRW_gc | TC1_EVDLY_bm;
TCC1.CTRLB = TC1_CCAEN_bm;
TCC1.CTRLA = TC_CLKSEL_EVCH1_gc;

TCC0.INTCTRLB = TC_CCAINTLVL_HI_gc;
TCC0.PER = 0xFFFF;
TCC0.CTRLD = TC_EVSEL_CH0_gc | TC_EVACT_FRW_gc;
TCC0.CTRLB = TC0_CCAEN_bm;
TCC0.CTRLA = TC_CLKSEL_DIV1_gc;

PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;

Die zwei Timer TCC0 und TCC1 werden zu einem 32Bit Timer über Event 
Channel #1 verknüpft und sollen ein "Frequency Capture" vom Event 
Channel #0 durchführen. Event #0 wird ausgelösst durch den RTC Overflow, 
wobei die RTC mit externem 32kHz Uhrenquarz getaktet wird und der OVF 
jede Sekunde kommt. Die Timer laufen mit 32MHz Takt.

Ich messe also die Anzahl an CPU Takten die die RTC alle Sekunde 
benötigt.

Ich habe nun fest gestellt das der normale Input Capture 
(TC_EVACT_CAPT_gc) und Pulse Width Capture (TC_EVACT_PW_gc) 
funktionieren. Beide liefern das gleiche Ergebnis. Mit denen könnte ich 
letzendlich leben und die ISR() sähe dann so aus:
volatile uint32_t ticks = 0;
volatile uint8_t  update = 0;

ISR(TCC0_CCA_vect) {

    static uint32_t last = 0;
    uint32_t f = TCC0.CCA | (uint32_t)TCC1.CCA << 16;
    ticks = f - last;
    last = f;
    update++;
}

Allerdings müsste auch der "Frequency Capture" funktionieren, man sollte 
also die Frequenz des Eintreffens eines Events ausmessen können. Das 
würde natürlich die ISR vereinfachen, weil der Timer Counter in diesem 
Modus automatisch zurück gesetzt wird.
ISR(TCC0_CCA_vect) {

    ticks = TCC0.CCA | (uint32_t)TCC1.CCA << 16;
    update++;
}

Ich bekomme aber diesen Capture Modus nicht an's laufen.

Hat jemand eine Idee was ich falsch machen könnte oder ob das generell 
nicht geht ? Und wenn warum nicht ?

Gruß Hagen

PS: übrigens ist das ein Test zu den Fähigkeiten der DFLLs und der 
Kalibrierung der internen Oszillatoren mit Hilfe des externem 32kHz 
Uhrenquarzes. Erstes Ergebnis: externer Quarz ist bei weitem stabiler.

Autor: Gad Zinkler (gad)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hagen,
deine Frage ist zwar schon etwas her, aber vielleicht interessiert es 
trotzdem noch.
Allerdings programmiere ich alles in asm, aber das sollte auch kein 
Problem sein für C-Programmierer.


Im Anhang ist die Konfiguration.
TCE0/TCE1 sind konfiguriert als 32 Bit Timer im Frequency Capture Mode.
TCE0 Clock Source ist der Systemtakt
TCE0 Caputue Ereignis kommt vom Quadrature Encoder und ist auf Event 
Channel 0.
TCE1 Clock Source ist der Überlauf von TCE0 (Ereignis liegt auf Event 
Channel 1).
TCE1 Capture Ereignis ist das gleiche wie bei TCE0 (Event Channel 0).

Damit werden beide Timer über das selbe Capture Ereignis getriggert.

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.