PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitabstände messen



Spongebob85
21.09.2007, 21:38
Moin!

Ich habe vor mit meinem ATMega32 in bestimmten Zeitabständen Aktionen ausführen lassen, beispielsweise eine Variable höchzählen lassen und nebenbei noch auf einem Pin einen Takt rausgeben welcher sich von dem Variablen-Zähl-Takt unterscheidet.
Bis jetzt hab ich sowas mit Delays gemacht. Man muss doch sowas wie einen Interrupt festlegen können, der alle 100 Takte der Prozessorfrequenz erfolgt oder so was. Leider hab ich bis jetzt nirgendwo gefunden wie man sowas realisiert. Nur wenn man einen Ausgang als PWM verwendet, aber es muss ja noch mehr möglichkeiten geben.

MfG Jan

uwegw
21.09.2007, 21:40
Man muss doch sowas wie einen Interrupt festlegen können, der alle 100 Takte der Prozessorfrequenz erfolgt oder so was.
Dafür sind die Timer da. Neben der PWM-Funktion können sie auch einfach nur Interrupts auslösen, wenn sie einen gewissen Zählerstand erreichen oder überlaufen.

Spongebob85
21.09.2007, 21:49
So schnell hatte ich ja noch nie ne Antwort.
Aber ich hab im Datenblatt gesehen das der ATMega32 3 Timer hat. Kann man dann nur 3 Interrups festlegen? Das kann ich mir nicht vorstellen. Ich hab da im Datenblatt irgendwie nicht so wirklich was zu gefunden. Nur halt das mit dem Interrupt setzen und überlaufen. Was wenn ich jetzt für 10 verschiedene sachen Zeiten messen will?

MfG Jan

recycle
21.09.2007, 22:42
Aber ich hab im Datenblatt gesehen das der ATMega32 3 Timer hat. Kann man dann nur 3 Interrups festlegen?

Wenn du nur 3 Timer hast, können wohl auch nur 3 Timer überlaufen und dabei einen Interrupt erzeugen.



Was wenn ich jetzt für 10 verschiedene sachen Zeiten messen will?


Zehn Zeiten kann man auch mit einer einzelnen Uhr stoppen, man muss halt nur entsprechend oft drauf gucken.

Ein Timer zählt bei jedem Controllertakt eins hoch (oder runter, da bin ich mir nicht sicher).
Den "Zählerstand" des Timers kannst du jederzeit abfragen und weisst dann wieviel Takte seit dem Start des Timers vergangen sind. Den Controllertakt kennst du und kannst daher ausrechnen wieviel Zeit vergangen ist.
Das klappt allerdings nur, bis der Timer überläuft und wieder von vorne zu zählen anfängt. Beim Überlauf des Timers erzeugt er einen Interrupt. Über eine entsprechende Interruptroutine kannst du eine Zählervariable hochlaufen lassen. Die sagt dir dann wie oft der Timer "rum" ist.

Über den Prescaler und einen Vorgabewert für den Timer kannst du dir die ganze Geschichte eventuell noch ein bischen handlicher machen, indem du dir den Timer z.B. so konfigurierst, dass er jede mS überläuft und du dann in der Interruptroutine die mS mitzählst.

In Bascom gibt es auch den Befehl "Time". Damit kannst du glaube ich fast genauso arbeiten wie mit einer normalen Uhr, allerdings auch nur auf die Sekunde genau.

Spongebob85
22.09.2007, 10:59
hab irgendwie nirgendwo gefunden, wie man den aktuellen Zählerstand jederzeit auslesen kann. Aber dann muss ich mir wohl das datenblatt nochmal in ruhe durchlesen. Sonst melde ich mich nochmal.
Bis dann.

MfG Jan