Guten Abend gestandene Programmierer ;)
Habe aktuell so meine Probleme mit dem Timer0 und dem CompareMatch
'A'...
Habe ich den Timer falsch konfiguriert? Soll er aktuell so wie im Code
überhaupt keinen "CompareMatchInterruptA" auslösen?
Villeicht sieht ja jemand auf anhieb einen Fehler..?
1
voidtimerCMPInit(TC0_t*tim)
2
{
3
/* Timer (TC0)
4
* Wird hier auf Compare Match Interrupt konfiguriert
5
* Konfigurationen sind in "timer.h" vorzunehmen
6
*/
7
tim->CTRLA=TC_CLKSEL_DIV256_gc;// Takt konfigurieren ( mit ggf. Vorteiler )
8
tim->CTRLB=(TC0_CCAEN_bm|TC0_WGMODE0_bm);// Compare Match 'A' aktivieren
9
tim->CCA=1249;// Compare Match Wert
10
tim->INTCTRLB=TC_CCAINTLVL_HI_gc;// Interrupt "Compare Match" aktivieren / Priorität des Interrupts festlegen
Evtl. ist das zugehörige PR-Bit gesetzt. Je nach Timer:
PR.PRPC &= ~PR_TC0_bm; (Siehe "Power Reduction")
TC0_CCAEN_bm enabled das Comparematch nicht, legt nur den zugehörigen
Pin als Compareausgang fest.
Poste mal die ISR.
mfg
Achim
Die Freigabe des Interrupt Controller erfordert eine "Timed Sequenz" da
dieses ein protected Register ist. Einfaches ändern des PMIC.CTRL
Registers reicht nicht.
in ASM sieht das z.B. so aus
inb ZL,PMIC_CTRL
ori ZL,(PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm)
ldi ZH,0xD8 // Freigabe Protected I/O
outb CPU_CCP,ZH
outb PMIC_CTRL,ZL // alle Interrupt Level freigeben
J. Zimmermann schrieb:> Evtl. ist das zugehörige PR-Bit gesetzt. Je nach Timer:> PR.PRPC &= ~PR_TC0_bm; (Siehe "Power Reduction")> TC0_CCAEN_bm enabled das Comparematch nicht, legt nur den zugehörigen> Pin als Compareausgang fest.> Poste mal die ISR.> mfg> Achim
Genau das war meine Frage. Was aktiviert denn dann den Compare Match?
Der Timer läuft ja, der Overflow wird angetriggert.
Mikki M:
> Die Freigabe des Interrupt Controller erfordert eine "Timed Sequenz" da> dieses ein protected Register ist. Einfaches ändern des PMIC.CTRL> Registers reicht nicht.
Stimmt so nicht. Nur das IVSEL-Bit ist geschützt, alle anderen lassen
sich ohne CCP verändern.
mfg
Achim
Klaus Dieter D. schrieb:> Genau das war meine Frage. Was aktiviert denn dann den Compare Match?> Der Timer läuft ja, der Overflow wird angetriggert.
Garnicht. Es wird immer verglichen, Du programmierst die Reaktion auf
den Compare Match, in dem Du entweder PWM erzeugst oder inen INT
auslöst.
Teste mal die schon geposteten Hinweise.
Aufruf Deiner Ini mit &? (timerCMPInit(&TCC0) z.B. ?)
mfg
Achim
J. Zimmermann schrieb:> Klaus Dieter D. schrieb:> Genau das war meine Frage. Was aktiviert denn dann den Compare Match?> Der Timer läuft ja, der Overflow wird angetriggert.>> Garnicht. Es wird immer verglichen, Du programmierst die Reaktion auf> den Compare Match, in dem Du entweder PWM erzeugst oder inen INT> auslöst.> Teste mal die schon geposteten Hinweise.> Aufruf Deiner Ini mit &? (timerCMPInit(&TCC0) z.B. ?)> mfg> Achim
Ja so Ini. ich den Timer.
Wie müsste denn die Init. aussehen damit der Interrupt ausgelöst wird?
Also PAM oder einen PIN toggeln möchte ich nicht..
Ich habe zwei ISR im Code. Und ich Toggle in beiden ne LED.
Diese werden auch getoggelt, bloß verhallt sich mein Rest des Codes
dann sehr seltsam. Bei dem Overflow Interrupt hingegen ist alles so wie
es sein soll. Daher auch meine Frage ob
Ich den Compare Match richtig konfigurieren.
Horst S. schrieb:> Wenn ich das so richtig sehe, initialisierst Du da den Timer auf> "Frequency"?!?>> Probier mal bitte, ob da nicht der Overflow-Vektor kommt.
Und ja so habe ich es verstanden. Das er dann ein Compare Match auslöst.
Hab mal Deinen Code übernommen, funktioniert. Kann eigentlich nur sein,
dass wie gesagt, das PR-Rg nicht resettet wurde. Oder:
- While(1); am main-ende vergessen?
- readStpm32Ms Volatile?
mfg
Achim
Horst S. schrieb:> Probier mal bitte, ob da nicht der Overflow-Vektor kommt.
Kann nur passieren, wenn das zugehörige Int-Enable gesetzt ist. Das
Overflow-Flag wird natürlich gesetzt, ohne Folgen.
mfg
Achim
J. Zimmermann schrieb:> Hab mal Deinen Code übernommen, funktioniert. Kann eigentlich nur> sein, dass wie gesagt, das PR-Rg nicht resettet wurde. Oder:> - While(1); am main-ende vergessen?> - readStpm32Ms Volatile?> mfg> Achim
Habe nichts vergessen. Die Variable ist auch richtig deklariert.
Muss das Power Reduction Register resettet werden? Bei dem Overflow
klappt es auch ohne resetten.
Wie genau berechne ich denn die Zeit für den Compare Match?
FCPU / ( 2DIVISOR * ( TSOLL+1)) ?
Klaus Dieter D. schrieb:> Muss das Power Reduction Register resettet werden? Bei dem Overflow> klappt es auch ohne resetten.
Es gibt für jede Hardware-Unit ein PR-Bit, wenn der Overflow
funktioniert, ist das dem TCC0 zugeordnete richtig eingestellt (=0). Ich
würde, solange das Capture nicht funktioniert,erst mal mit einem
kostanten Wert arbeite (wie in Deinem Code-Schnipsel).
Wie schon gepostet - hab Deinen Code getestet. Kann dann nur am
"Drumrum" liegen.
Takt?
#include <avr/interrupt.h> ?
Klaus Dieter D. schrieb:> Bei dem Overflow> klappt es auch ohne resetten.
Hast Du das mit Int-Routine getestet?
mfg
Achim