Forum: Mikrocontroller und Digitale Elektronik Behandeln von Timeroverflow


von Dr.Med.Den.Rasen (Gast)


Lesenswert?

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 :)

von Maxe (Gast)


Lesenswert?

Interrupt bei Overflow und dann einen Zaehler hochzaehlen. Aber beim 
Ausrechnen der Zeit aufpassen, dass nicht gerade der Overflow-Interrupt 
waehrend dem Lesen reinhaut.

von Stefan F. (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Dr.Med.Den.Rasen (Gast)


Lesenswert?

Oh man, es kann so einfach sein. Danke!

von Stefan F. (Gast)


Lesenswert?

A. S. schrieb:
> Das wird kaum
> genauer. Zumindest nicht, wenn Du nicht 100%ig fit bist mit
> Interruptlevel und konkurrierende Tasks.

Der Klaus stolpert gerade darüber: 
Beitrag "Abstand zwischen zwei Flanken wird nicht korrekt ermittelt"

von m.n. (Gast)


Lesenswert?

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?

von Dr.Med.Den.Rasen (Gast)


Lesenswert?

Ein STM32F1... BluePill Board.

von m.n. (Gast)


Lesenswert?

Dr.Med.Den.Rasen schrieb:
> Ein STM32F1... BluePill Board.

Da kommt es noch darauf an, ob Capture-ISR und OVF-ISR einen gemeinsamen 
Vektor haben oder nicht. Bei gemeinsamen Vektor muß man zunächst das 
Capture-Ereignis auswerten und danach den Überlauf.

von c-hater (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

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

So what? Zweimal richtig ergibt nicht falsch, oder?

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.