mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer nicht konstant


Autor: Lloyd (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Lloyd (Gast)
Datum:

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

Autor: ... (Gast)
Datum:

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

Autor: Lloyd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohhh jaaa du hast Recht! Dauert ca. 110us...

Autor: spess53 (Gast)
Datum:

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

Autor: Lloyd (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.