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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Samuel (Gast)


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


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


Bewertung
0 lesenswert
nicht lesenswert
sei(); ?

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

von Sascha W. (sascha-w)


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

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]
  • [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.