Forum: Mikrocontroller und Digitale Elektronik ATXmega zähler in Normal Mode und zusätzlich einen Compare Int


von Samuel (Gast)


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
}

von Samuel (Gast)


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?

von Basti (Gast)


Lesenswert?

sei(); ?

Oder wenn du ASF benutzt... erstmal den Takt zum Counter freischalten...

von Sascha W. (sascha-w)


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

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
Noch kein Account? Hier anmelden.