XMega Timer Interrupt via Compare

OP #2065171
Lesenswert?
• ▲
▼
Hallo Zusammen,

ich möchte gern mit dem Timer0 3 verschiedene Interrupts auslösen
und 3 verschiedene ISR starten. Die Zeitpunkte wann die ISR starten,
werden über die Compare / Capture Register festgelegt.

Timer0 Periode 250
CCA 50
CCB 100
CCC 150

Die Zeitpunkte werden richtig erkannt und auch die entsprechenden 
Interruptflags gesetzt. Das Problem hierbei ist, dass der Programmzähler
grundsätzlich nur in den Interruptvector 0x0028 (Overflow Timer 0) 
springt und nicht etwa in:

.org 0x0032 rjmp timer0_ccpa
.org 0x0034 rjmp timer0_ccpb
.org 0x0036 rjmp timer0_ccpc
.org 0x0038 rjmp timer0_ccpd

Vielleicht findet jemand den Fehler und kann mir helfen. Im Anhang 
befindet sich die Konfiguration für den Timer.
Angehängte Dateien:
Gast #2065656
Lesenswert?
• ▲
▼
Wieso nutzt du nicht die Namen für die Timerflags, so wie sie im define 
des XMegas stehen? Dann wird sowas viel übersichtlicher.

Ich weiß nur, dass man den Overflow Interrupt des benutzten Timers auch 
mit dem jeweiligen Level (high,med,low) freigeben muss.

Hast du das auch gemacht?

Tip:
jeder Timer hat laut include define des Controller Types auch folgende 
Bezeichnung
zum Beispiel:
TCC0base
und dann die ganzen offset Register wie zb. CNTRLA-Register
TC0_CNTRLAoffset
Gast #2065685
Lesenswert?
• ▲
▼
Ach ja, was mir gerade auffällt:
Dein Timer läuft ja nur bis 200 (Register PER). Dein Comparewert für CCD 
ist aber 250. Da kommt dein Timer nie hin. Denn er zählt ja immer nur 
bis 200 und setzt sich dann selber wieder auf 0 zurück.
Gast #2065694
Lesenswert?
• ▲
▼
Und dann wird der Interrupt Compare für CCD gar nicht erst frei gegeben. 
Denn, deie freigegebenen Interrups:

Overflow, CCA, CCB, CCC (alle mit hi-priority)

Mal sehen was ich noch alles finde. :-)
Gast #2065717
Lesenswert?
• ▲
▼
So sollten die Interruptvectoren auf alle Fälle funktionieren!
1
.cseg      ;Beginn eines Code-Segmentes
2

3
;******************** START INTERRUPT VECTOREN ************************
4
.org 0                 rjmp   MCU_RESTART  ; Reset                    *
5
.org TCC1_OVF_vect     rjmp   Tim1C_OVF    ;                          *
6
.org TCC1_CCA_vect     rjmp   Tim1C_CCA    ;                          *
7
.org TCC1_CCB_vect     rjmp   Tim1C_CCB    ;                          *
8
.org TCC1_CCC_vect     rjmp   Tim1C_CCC    ;                          *
9
.org TCC1_CCD_vect     rjmp   Tim1C_CCD    ;                          *
10
;********************* ENDE INTERRUPT VECTOREN ************************
11

12
.org  INT_VECTORS_SIZE
13

14
MCU_RESTART:
15
; programmcode begins here

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren