Forum: Compiler & IDEs Timer auf Overflow prüfen


von Tommy (Gast)


Lesenswert?

Servus,
mein Problem in aller Kürze:
Ich möchte eine Frequenz mit der Capture-Unit des Timer 1 meines Mega32
messen. Das funktioniert auch, wenn ich in dem mich interessierenden
Frequenzbereich bin, aber ich muß nun noch prüfen, ob ich nicht eine
Periodendauer unterhalb meines Frequenzbereiches messe. Das bedeutet,
dass mein Timer zwischen Start und Capture Ereignis überläuft. Wie kann
ich einfach prüfen, ob vor dem Captrue eine Überlauf stattgefunden hat?
Hab versucht, das TOV1 Bit im TIFR Register auszuwerten und hab auch
den Overflow Interrupt ausprobiert und mir den Überlauf in einer
Variablen vermerkt, aber das funktioniert irgendwie nicht.
In vereinfachter weise stell ich mir das so vor:
Wenn TOV1 = 1, dann Frequenz auserhalb Messbereich
sonst Periodendauer gleich Zählerstand
Where is the problem??? Ich beginne ernsthaft an meinen Fähigkeiten zu
zweifeln (-;

von Peter D. (peda)


Lesenswert?

Ganz einfach.

Du liest nach dem Capture das TOV1-Bit, ist es gesetzt, so gab es einen
Überlauf. Alternativ kannst Du auch im Überlaufinterupt eine Variable
setzen, daß ein Überlauf stattgefunden hat.

Nun kann es aber sein, daß der Überlauf kurz nach dem Capturen
stattgefunden hat.
Auch kein Problem, teste einfach noch das höchstwertigste Bit des
Capture-Wertes. Ist der Capturewert FFFF oder so ähnlich, dann war der
Überlauf erst danach und das höchstwertigstige Bit ist gesetz.

Ist der Capturewert 0000 oder so ähnlich, dann war der Überlauf davor
und das höchstwertigste Bit ist 0. Dann entweder sagen "zu lang" oder
einfach 65536 addieren.


Peter

von Jörg Wunsch (Gast)


Lesenswert?

Wenn Du unsigned 16 bits als Variablen hast, ist das Addieren von
65536 natürlich das Addieren einer 0 und damit überflüssig.  Einen
einzelnen Überlauf kann man damit einfach und simpel ignorieren.
Allerdings muß man sich sicher sein, daß man nicht mehr als einen
Überlauf hatte.

von Peter D. (peda)


Lesenswert?

@Jörg,

ich setze natürlich voraus, daß man zur Berechnung von Zahlen >65535
auf  24 oder 32Bit erweitern muß.
Sonst macht ja das Mitzählen der Überläufe keine Sinn.

Mein Frequenzzähler in Assembler erweitert sogar bis auf 56 Bit, damit
die Berechnung im gesamten Meßbereich ohne Überlauf möglich ist.


Peter

von Tommy (Gast)


Lesenswert?

Mein Problem war ja das Feststellen, ob ich im, oder außerhalb meines
Messbereiches bin. Mich interessiert die genaue Frequenz eh nur im
Messbereich, da reicht mir die Information, ob ich noch unterhalb der
kleinstmöglichen Frequenz liege, also ob der Zähler übergelaufen ist
oder nicht, wie oft ist mir egal. Aber mein Problem stammt
wahrscheinlich aus einer ganz anderen Ecke. Das Prüfen des Überlaufs
funktioniert, zumindest mit einem Testaufbau. Wenn ich das ganze dann
an mein eigentliches Testobjekt anschließe messe ich wahrscheinlich
Stötimpulse mit, die aber nicht mal auf dem Oszi sichtbar sind. Bin
noch auf der Suche nach den Quellen und werd wohl mein Referenzsignal
noch tiefpassfiltern müssen. Ich werd als erstes mal die
"Rauchunterdrückung" im AVR aktivieren bevor ich wieder zum Lötkolben
greife, leider haben sowas aber nicht viele MCs...

have a nice and sunny sunday

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.