www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Woher kommt der Timerüberlauf


Autor: Martin L. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich benutze das angefügte C-Programm um die Zeitdauer einer
Fließkommaberechnung auf einem AVR (Mega16) zu messen.
Das Ganze funktioniert mit einem Timer und geht meiner Ansicht nach
auch schon ganz gut.
Bei Timerprescaler 256 -> zählt er bis 17, bei 64 bis 70, bei 8 bis 556
usw. Das sind demnach 1/(7,372MHz/256)x17 = 600uS.

Nun die Frage: ich habe auch den TimerÜberlauf-Interrupt aktiviert um
zu sehen ob der Timer überläuft. Dieser ist an eine Zählvariable
gekoppelt und zählt somit die Timerüberläufe.

Wenn ich mich recht entsinne dann sind Timer0 und Timer2 beim Mega16
8-Bit Timer die erst bei 255 überlaufen. Die Frage ist nun: Warum wird
dann bei meinem Programm bei jedem Durchgang ein Überlauf produziert?

Wenn ich Timer1 nutze der ja ein 16-Bit Timer ist, wird bei Prescaler
256 & 64 kein Timer-Überlauf-Interrupt ausgelöst und bei Prescaler
kleiner 64 geht es dann wieder los. Der 16-Bit-Timer dürfe selbst bei
Prescaler 1 nicht überlaufen.

Wo liegt der Denkfehler?

Grüße
Martin

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest Du vor dem Starten oder Freugeben der
Überlauf-Interruptes das entsprechende Flag rücksetzen ('1'
reischreiben). Wenn das Flag schon ansteht geht der µC gleich in den
Interrupt.

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die 17 ist das aus dem Timerregister oder aus deiner Überlaufvariable?

Autor: Martin L. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da sich anscheinend bislang nur wenige (oder keine Leute) meinen C-Code
angesehen haben hänge ich nochmal die reine c-Datei an.

@Sonic: Welches Flag meinst Du? Ich aktiviere in Zeile 83 den
Timer1-Überlaufinterupt "TIMSK |= ( 1 << TOIE1 );" nach meiner
Berechnung setze ich das Flag wieder zurück "TIMSK &= ~( 1 << TOIE1
);"
Vor allem, warum tritt der Timer1-Überlauf nicht bei den Prescalern 256
& 64 auf?

@masterof: Die 17 ist die Differenz des Timerzählregisters vor der
Berechnung - Timerzählregisters nach der Berechnung.

Code-Auszug:
TIMSK |= ( 1 << TOIE1 );
// bei Timer1-Überlauf wird Interrupt ausgelöst
TCNT1=0;
treg1=TCNT1; // Zählerstand1 sichern
ek = wk-xk;
yk = PI_Regler(ek);
treg2=TCNT1; // Zählerstand2 sichern
TIMSK &= ~( 1 << TOIE1 );
// bei Timer1-Überlauf wird kein Interrupt ausgelöst
tregdiff=treg2-treg1;

Gruz
Martin

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Vielleicht solltest Du vor dem Starten oder Freugeben der
Überlauf-Interruptes das entsprechende Flag rücksetzen ('1'
reischreiben)."


Jau, so isses !

Du machst davor tonnenweise schnarchlahme UART-Textausgabe und da läuft
halt der Timer über.

Ich würde allerdings einfach nur zur Messung den Timer starten und
stoppen, dann kann auch nichts überlaufen.


Peter

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Welches Flag meinst Du? Ich aktiviere in Zeile 83 den
> Timer1-Überlaufinterupt "TIMSK |= ( 1 << TOIE1 );" nach meiner
> Berechnung setze ich das Flag wieder zurück "TIMSK &= ~( 1 << TOIE1
> );"

Das TOIE1 ist kein Flag, sondern das Enable-Bit für den
Timer-Overflow-Interrupt. Das Interrupt-Flag, das sonic meint, heißt
TOV1 und steht im TIFR!

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich setze das TOV1 - Flag VOR dem Freigeben des Timer-INTs zurück, dann
bin ich sicher dass es nicht schon ansteht.

Autor: Martin L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Leute ich habs gerafft wo mein Denkfehler lag...

Gruz
Martin

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.