Forum: Mikrocontroller und Digitale Elektronik Der ATXMEGA256A3BU und sein Timer0


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Klaus Dieter D. (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee?

von J. Zimmermann (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
1
ISR( TCC0_CCA_vect )
2
{
3
 
4
  readStpm32Ms++;
5
}

von J. Zimmermann (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Habe es hin bekommen. Danke an alle für eure Bemühungen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.