Behandeln von Timeroverflow

Gast #6372028
Hi, bevor direkt Kritik im Bezug zu "Benutz die SuFu" kommt:
Das habe ich. Auf den ersten drei Seiten mit u.a. den Suchbegriffen 
"Timer overflow behandeln" kam nichts passendes.

Zu meinem eigentlichen Problem:
Ich möchte durch Input Capture die Zeit zwischen zwei Signalen ermitteln 
und verwende dafür logischerweise einen Timer. Bisher mache ich das so:

Zeit = alter Timerwert - neuer Timerwert. Soweit klappt das auch, 
allerdings nur, so lange dieser nicht überläuft. Darum meine Frage:
Wie behandle ich in diesem Fall einen Timerüberlauf? Ich vermute es gibt 
da einen bereits etablierten "Königsweg"? Kann ich bei meinem Ansatz 
bleiben oder passt das dann garnicht mehr?

MfG

Dr.Med.Den.Rasen :)
Gast #6372045
Interrupt bei Overflow und dann einen Zaehler hochzaehlen. Aber beim 
Ausrechnen der Zeit aufpassen, dass nicht gerade der Overflow-Interrupt 
waehrend dem Lesen reinhaut.
Gast #6372048
Dr.Med.Den.Rasen schrieb:
> Zeit = alter Timerwert - neuer Timerwert. Soweit klappt das auch,
> allerdings nur, so lange dieser nicht überläuft.

Ich korrigiere mal, du meintest sicher: Zeit = neuer Timerwert - alter 
Timerwert

Das funktioniert auch nach einem Überlauf. Nur nicht nach zweien. Du 
musst nur darauf achten, dass deine Variablen unsigned integer sind, und 
genau so viele Bits haben, wie der Timer.
Gast #6372137
Stefan ⛄ F. schrieb:
> Das funktioniert auch nach einem Überlauf.

Und wenn Du  2, 5 oder 10 Überläufe haben kannst, dann verlangsamen 
lieber die Zeitbasis als da selber was zu basteln. Das wird kaum 
genauer. Zumindest nicht, wenn Du nicht 100%ig fit bist mit 
Interruptlevel und konkurrierende Tasks.
Gast #6372184
Dr.Med.Den.Rasen schrieb:
> Ich vermute es gibt
> da einen bereits etablierten "Königsweg"?

Den gibt es. Du mußt in der Capture-ISR beachten, ob gerade ein Überlauf 
stattgefunden hat und diesen berücksichtigen. Man erkennt dies am 
Timerwert und am OVF-flag.
Sehr wichtig dabei ist, daß Capture-ISR und OVF-ISR die gleiche 
Priorität haben und sich nicht gegenseitig unterbrechen können.
Welchen µC verwendest Du?
Gast #6372548
Dr.Med.Den.Rasen schrieb:

> Zeit = alter Timerwert - neuer Timerwert
> Soweit klappt das auch

Das würde mich doch sehr wundern, denn das ist schonmal grundfalsch. 
Muss natürlich heissen:

Zeit = neuer Timerwert - alter Timerwert

> allerdings nur, so lange dieser nicht überläuft.

Wenn du es richtig machst, brauchst du dich für den Überlauf überhaupt 
nicht zu interessieren, jedenfalls solange sichergestellt ist, dass 
zwischen zwei Captures immer weniger Zeit vergeht, als der vollständige 
Durchlauf des Timerzählers dauert.

Nur, wenn das nicht sichergestellt werden kann, dann muss man sich auch 
um den Overflow kümmern.
Gast #6372553
c-hater schrieb:
> Muss natürlich heissen:
>
> Zeit = neuer Timerwert - alter Timerwert
> ...
> Nur, wenn das nicht sichergestellt werden kann, dann muss man sich auch
> um den Overflow kümmern.

Guten Morgen, das hatten wir aber schon alles geklärt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.