Forum: Mikrocontroller und Digitale Elektronik Timer nicht konstant


von Lloyd (Gast)


Lesenswert?

Hallo,

ich habe hier ein vermutlich ganz einfaches Problem aber ich weiß 
einfach nicht wie ich es lösen soll:

Timer 1 löst alle 100us aus, in der ISR ist dann ein switch der 
Abwechselnd unterschiedliche Ding macht. Das Problem ist jetzt dass der 
Timer immer erst wieder weiter läuft wenn die ISR verlassen wird, obwohl 
ich die neuen Zählerwerte gleich zu beginn wieder schreibe:

ISR(TIMER1_OVF_vect)
{
  cli();
  TCNT1H = 0xff;
  TCNT1L = 0x12;
....
  sei();
}

Das Problem ist dadurch natürlich dass die Interrupts nicht konstant 
alle 100us ausgelöst werden sondern je nachdem wie viel es in dem 
speziellen Fall zu tun gibt dauert es immer etwas bis viel länger.

Wie kann man das denn beheben?

Vielen Dank schon mal
Lloyd

von spess53 (Gast)


Lesenswert?

Hi

Für solche Zwecke gibt es den CTC-Modus. Der Vergleichswert wird in ein 
Comparerregister geladen. Beim Erreichen des Wertes wird ein Interrupt 
ausgelöst und der Timer wird automatisch wieder auf Null gesetzt. Du 
brauchst dich nur um deine eigentliche ISR kümmern.

MfG Spess

von Stefan E. (sternst)


Lesenswert?

Und nimm das cli() und sei() raus. Das ist nicht nur überflüssig, 
sondern sogar kontraproduktiv.

von Lloyd (Gast)


Lesenswert?

Ok cli und sei habe ich raus genommen, habe aber noch den selben Effekt.

Passiert im CTC Modus nicht genau das selbe und es wird erst 
weitergezählt wenn ich die ISR verlasse?

von ... (Gast)


Lesenswert?

Kann es sein, das die Abarbeitung deiner Interruptroutine länger als 
100us dauert?

Kannst es ja in der Art prüfen:

if (TIFR & (1 << OCF1A))
{
  puts("TIMER OVERFLOW\n");
}

(Bit anpassen)

von Lloyd (Gast)


Lesenswert?

ohhh jaaa du hast Recht! Dauert ca. 110us...

von spess53 (Gast)


Lesenswert?

Hi

>Passiert im CTC Modus nicht genau das selbe und es wird erst
>weitergezählt wenn ich die ISR verlasse?

Nein. Der Zähler läuft sofort weiter.

MfG Spess

von Lloyd (Gast)


Lesenswert?

Danke euch allen! Lag tatsächlich daran dass die ISR teilweise länger 
dauerte als die Zeit zwischen 2 Interrupts.

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.