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 :)
Interrupt bei Overflow und dann einen Zaehler hochzaehlen. Aber beim Ausrechnen der Zeit aufpassen, dass nicht gerade der Overflow-Interrupt waehrend dem Lesen reinhaut.
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.
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.
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"
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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.