ICP überlauf?

Gast #1395579
Lesenswert?

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
Gast #1395595
Lesenswert?

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.
Gast #1395597
Lesenswert?

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.
#1395604
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren