Forum: Mikrocontroller und Digitale Elektronik ATXMEGA Timer Interrupt ISR Problem


von Sébastien M. (sebi211)


Lesenswert?

Guteen Abend liebe Mikrocontroller Community

Ich schlage mich gerade bei einem Projekt mit einem blöden SW Problem zu 
tode. Ich verwende aktuell einen ATXMEGA32E5 und bin gerade den Timer am 
testen. Ich verwende Timer 5 nur um in eine Interrupt Service Routine zu 
springen und da sehe ich ein Problem: Der Timer beginnt erst wieder zu 
zählen wenn ich die Service Routine verlasse. Ich habe mich durch das 
Datenblatt geschlagen bin jedoch nicht fündig geworden und da die 
XMEGAE5 Serie neu ist auch nicht wirklich in Foren.

Kann mir da jemand helfen?

Init und ISR sehen so aus:
1
void TIMER_INIT(void)
2
{
3
  TCC5.CTRLB = 0x40;              // Timer auf Byte Mode einstellen
4
  TCC5.INTCTRLA = 0x01;                    // Overflow Interrupt freigeben
5
  PMIC.CTRL |= PMIC_HILVLEN_bm |PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm; 
6
  sei();                            // Interrupts freigeben
7
  TCC5.CTRLA = 0x04;                      // Timer Prescaler gleich 8 und Timer starten
8
}
9
10
ISR (TCC5_OVF_vect)
11
{
12
  TCC5.INTFLAGS &=0xFE;
13
  PORTD.OUT = 0x10;
14
  entprell_counter++;                                
15
  Zeit.usekunde++;                                  
16
  if(Zeit.usekunde>=15625)                            
17
  {
18
    Zeit.usekunde = 0;                      
19
    Zeit.sekunde++;
20
  }
21
  PORTD.OUT = 0x00;
22
}

Besten Dank und mfG
Sebi

von Bastler (Gast)


Lesenswert?

Wie hast du ermittelt, daß der solange die ISR läuft, nicht weiterzählt? 
Dein Code-Fragment sagt dazu nichts.

von Sébastien M. (sebi211)


Lesenswert?

Oszilloskop an PORTC angehängt und einzelne Codeabschnitte der ISR 
entfernt.

Habe aber gerade etwas anderes bemerkt. Der die Zyklen zwischen den 
einzelnen Interrupts ist viel zu kurz. Stelle mal manuell den OVF Wert 
ein vielleicht bringt das was.

von Bastler (Gast)


Lesenswert?

Aha, und der PORTC erlaubt Zugriff auf den Timer!?! Per Oszi?
Du mißt den Int-Zyklus und die Dauer der ISR. Hoffentlich nicht mit 
einen Analog-Oszi, das hat viele Qualitäten, aber exakte Messung von 
Zeiten gehört nicht dazu.

von Sébastien M. (sebi211)


Lesenswert?

Wie PORTC erlaubt zugriff? Ich habe den oben im meinem Code als Ausgang 
gesetzt nur um die Laufzeit der ISR Routine zu überprüfen. Theoretisch 
mir der Einstellung und dem 32MHz Oszi sollte der Zyklus 64 us 
(Prescaler = 8, Timer in Byte Mode also zählt 0- 255) betragen jedoch 
ist der nur 2 us.

Ist einer der Top Picoscopes glaub mir der ist genau.

von Sébastien M. (sebi211)


Lesenswert?

Habe jetzt gerade ein interessantes Problem entdeckt: der Prescaler 
lässt sich nicht richtig einstellen

von Sébastien M. (sebi211)


Lesenswert?

Ok ich habe jetzt dieses Problem endlich gefunden!!! Overflow Flag wurde 
nach der Service Routine vom Controller selbst nicht wirklich gelöscht!!

von Bernd M. (bernd_m)


Lesenswert?

Wo genau in deinem code setzt du portc?

von ooha (Gast)


Lesenswert?

Sébastien Monn schrieb:
> Habe jetzt gerade ein interessantes Problem entdeckt: der Prescaler
> lässt sich nicht richtig einstellen

Sébastien Monn schrieb:
> Ok ich habe jetzt dieses Problem endlich gefunden!!! Overflow Flag wurde
> nach der Service Routine vom Controller selbst nicht wirklich gelöscht!!

Das Schei..ding geht ja gar nicht. Tausch den mal aus.

von Sébastien M. (sebi211)


Lesenswert?

Hmmm jein so halb. Es hat noch kinderkrankheiten die man aber gut 
umgehen kann.

von Helmut (Gast)


Lesenswert?

ooha schrieb:
> Sébastien Monn schrieb:
> Ok ich habe jetzt dieses Problem endlich gefunden!!! Overflow Flag wurde
> nach der Service Routine vom Controller selbst nicht wirklich gelöscht!!
>
> Das Schei..ding geht ja gar nicht. Tausch den mal aus.

Steht auch so in der Doku, also regt Euch nicht auf!

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.