hallo Leute, ich wollte mal fragen, wie man die überläufe beim freuqnezmessen mittels ICP handelt. Wenn der Timer fortlaufend ist und bei einer steigenden oder fallenden Flanke den CounterRegister abspeichere, passiert es ja irgendwann, dass der Timer überläuft. Wenn ich nun den n´ten Timerstand vom n-1´ten subtrahiere, laufe ich gefahr, dass ich den überlauf berücksichtigen muss. Wie macht man sowas? Danke und Gruß Karl
Wenn der Zähler nur einmal überläuft, gibts überhaupt kein Prob. Kann mehr als ein Überlauf zwischen zwei aufeinanderfolgenden Messungen stattfinden, stockt man ihn softwaremäßig auf, indem man im Timer-Overflow-Interrupt die Überläufe über irgendwelche Register zählt (8 oder 16 oder... Bit breit). Das ist ja der tiefere Sinn hinter dem Timer-Overflow-Interrupt.
In dem du dafür den Overflow Interrupt verwendest. Bei jedem Overflow zählt du eine Variable hoch und addierst das entsprechend beim ICP Interrupt zu deiner Differenz. Aber aufpassen: Der ICP Interrupt hat ein höhere Priorität als der der Overflow. Es kann also sein das zuerst der ICP und dann der Overflow Interrupt bearbeitet wird, obwohl die andersherum ausgelöst wurden.... Im ICP Interrupt also immer prüfen ob ein Overflow ansteht und ob er VOR dem ICP ausgelöst wurde (Zählerstand niedrig) oder DANACH (Zählerstand hoch). Im ersten Fall den Overflow Interrupt löschen und zählen, im 2. Fall ignorieren.
Karl schrieb: > Wenn ich nun den n´ten Timerstand > vom n-1´ten subtrahiere, laufe ich gefahr, dass ich den überlauf > berücksichtigen muss. Nein, musst du nicht, wenn es nur ein Überlauf ist, und die Variablen, in denen du die Timerstände speicherst, geeignet definiert sind (uint16_t). Dann nämlich wird der Überlauf bei der Subtraktion automatisch berücksichtigt. Beispiel: 100 (neu) - 65530 (alt) = 106 bei unsigned 16 Bit
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.