Forum: Mikrocontroller und Digitale Elektronik XMega Timer Interrupt via Compare


von Ronny H. (ron_h)


Angehängte Dateien:

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.

von spess53 (Gast)


Lesenswert?

Hi

Vielleicht könntest du dich von deinem Tunnelblick auf dein Projekt 
lösen, und mal erzählen, worum es geht.

MfG Spess

von Steffen (Gast)


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

von Steffen (Gast)


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.

von Steffen (Gast)


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. :-)

von Steffen (Gast)


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

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.