Forum: Mikrocontroller und Digitale Elektronik Der ATXMEGA256A3BU und sein Timer0


von Klaus Dieter D. (Gast)


Lesenswert?

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
void timerCMPInit( 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
11
  
12
  PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
13
  
14
  sei();
15
}

Die entsprechende ISR ist auch vorhanden..

von Klaus Dieter D. (Gast)


Lesenswert?

Keiner eine Idee?

von J. Zimmermann (Gast)


Lesenswert?

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

von Mikki M. (mmerten)


Lesenswert?

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

von Klaus Dieter D. (Gast)


Lesenswert?

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.

von J. Zimmermann (Gast)


Lesenswert?

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

von Klaus Dieter D. (Gast)


Lesenswert?

1
ISR( TCC0_CCA_vect )
2
{
3
 
4
  readStpm32Ms++;
5
}

von J. Zimmermann (Gast)


Lesenswert?

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

von Klaus Dieter D. (Gast)


Lesenswert?

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

von Horst S. (Gast)


Lesenswert?

Wenn ich das so richtig sehe, initialisierst Du da den Timer auf 
"Frequency"?!?

Probier mal bitte, ob da nicht der Overflow-Vektor kommt.

von Klaus Dieter D. (Gast)


Lesenswert?

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.

von Klaus Dieter D. (Gast)


Lesenswert?

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.

von J. Zimmermann (Gast)


Lesenswert?

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

von J. Zimmermann (Gast)


Lesenswert?

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

von Klaus Dieter D. (Gast)


Lesenswert?

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)) ?

von J. Zimmermann (Gast)


Lesenswert?

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

von Klaus Dieter D. (Gast)


Lesenswert?

Also wenn es bei dir Funktioniert.. Wundert mich echt.. Hast du den 
gleichen Prozessor?

Ist meine Formel überhaupt richtig?
1
#define TIMER_CMP_CALC      (uint16_t)( ( F_CPU / ( 2 * TIMER_PRESCALER ) * ( TIMER_HZ + 1 ) ) )

Ja. Die Frequenz habe ich auch definiert. Die Headerdatei für den 
Interrupt ist auch vorhanden ( sonst würde der Overflow ja nicht 
triggern..)

von Klaus Dieter D. (Gast)


Lesenswert?

Habe es hin bekommen. Danke an alle für eure Bemühungen.

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.