Der ATXMEGA256A3BU und sein Timer0

Gast #5526963
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..
Gast #5527397
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
#5527489
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
Gast #5527694
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.
Gast #5527697
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
Gast #5527711
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
Gast #5527718
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..
Gast #5527750
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.
Gast #5527752
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.
Gast #5527755
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
Gast #5527763
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)) ?
Gast #5527822
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
Gast #5527833
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..)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.