ATXmega zähler in Normal Mode und zusätzlich einen Compare Int

Gast #3519874
Lesenswert?
• ▲
▼
Hallo zusammen


Ich habe im AtXmega16A4U den Timer D 0 im Normal Mode am laufen

Also er zählt von 0 bis 65535 hoch.
Dannach erzeugt er einen OVF und beginnt wieder bei 0.

Nun möchte ich zwischendurch jedoch noch einen compare interrupt 
auslösen.

Meine fragen, wie konfiguriere ich den Timer?

Hier mein bisheriger code:
1
EVSYS.CH0MUX = EVSYS_CHMUX_TCD0_OVF_gc;  //Event Chanell 0 auf Overflow von TCD0
2
  
3
  //Timer D0 & D1 als 32Bit Counter zur Messung des Nulldurchganges und der Phasenverschiebung
4
  TCD1.PER = 0xFFFF;  //Maximale TOP-Werte für beide Counter
5
  TCD0.PER = 0xFFFF;  
6
  TCD1.CTRLA = TC_CLKSEL_EVCH0_gc;  //Clocksource von TCD1  ist Event CH0
7
  TCD0.CTRLA = TC_CLKSEL_DIV1_gc;  //Clocksource von TCD0  ist Sysclock mit 32MHz
8
  
9
  
10
  TCD0.CCA = 50000;
11
  
12
  //TCD1.INTFLAGS |= TC1_CCAIF_bm;
13
  TCD0.INTCTRLB |= (TC0_CCAINTLVL1_bm | TC0_CCAINTLVL0_bm); //Interrupt aktivieren
14
  
15
  
16
  PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;  //Alle Interruptlevel aktivieren

Funktioniert leider nicht.

Der Interrupt wird nicht aktiv!
1
ISR(TCD0_CCA_vect)
2
{
3
  PORTE.OUT = ~(PORTE.OUT & 0x02); //LED Toggle
4
}
Gast #3519961
Lesenswert?
• ▲
▼
Push

Aktuelle initialisierung:
1
  TCD1.PER = 0xFFFF;  //Maximale TOP-Werte für beide Counter
2
  TCD0.PER = 0xFFFF;  
3
  
4
  TCD0.INTCTRLB |= TC_CCBINTLVL_HI_gc;
5
  TCD0.CCB = 5000;
6
  
7
  TCD1.CTRLA = TC_CLKSEL_EVCH0_gc;  //Clocksource von TCD1  ist Event CH0
8
  TCD0.CTRLA = TC_CLKSEL_DIV1_gc;  //Clocksource von TCD0  ist Sysclock mit 32MHz

Es wird jedoch nur einmalig ein Compare Interrupt ausgelöst...

Was mache ich falsch?
#3520607
Lesenswert?
• ▲
▼
@Samuel,

ich frage mich ob das überhaupt geht, du kannst die Timer zwar über den 
Event koppeln, der Compare gilt jedoch losgelöst immer nur für den 
jeweiligen 16-Bit Timer. Allerdings sollte die ISR trotzdem auslösen, im 
Low-Counter eben bei jedem Durchlauf unabhängig vom Zählerstand der 
oberen 16-Bit.

Vor dem Beschreiben von PMIC.CTRL musst du noch das CPU.CCP=0xD8 setzen 
- oder macht das der Compiler selbst?!

Sascha

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.