Hi, ich hab da mal ne frage und würde mich freuen, wenn mir jemand helfen könnte:) folgendes: (proz. atmega48) ich möchte gerne zu einem bestimmten zeitpunkt in einer interruptroutine einen timer starten, d.h. ich habe ein int-event und möchte exakt nach einer gewissen zeit t eine andere aktion ausführen (zu dem zeitpunkt ist das programm garantiert nicht mehr in dieser int routine). mein problem ist, dass ich nicht genau weiss mit welchem register ich z.b. den 16bit timer auf "0" setze um später einen compare-int auslösen zu können. heisst z.b. ein TIMSK1 = _BV(OCIE1A) -> counter starten von "0", oder muss ich TCNT1H und TCNT1L auf "0" setzen und dann die clocksource auswählen (um den timer zu starten)?
Es reicht zu, wenn Du den laufenden Timerstand einliest, Deine "Verzögerung" dazu addierst und damit das Compare-Register fütterst und dann (nach Löschen des Compare-Interrupt-Flags) den Compare-Interrupt freischaltest. Im Compare-Interrupt machst Du dann den beabsichtigten Job und deaktivierst den Compare-Interrupt. Diese Vorgehensweise hat den Vorteil, dass der Timer frei durchlaufen kann, Du also quasi gleichzeitig noch den ICP-Interrupt (z.B. Impulsbreitenmessung), den anderen Compare-Interrupt und den Überlauf-Interrupt benutzen, ohne dass die sich gegenseitig stören. ...
das könnte aber ja ungünstig sein, wenn ich noch nen "überlauf" mit berechnen müsste, oder nicht ?! könnte es denn auch so funktionieren : -timer stoppen (also no clock source) -TCNT1H und TCNT1L auf "0" -timer starten (clocksource wählen) - interrupt aktivieren ?
>muss ich TCNT1H und TCNT1L auf "0" setzen und dann die >clocksource auswählen (um den timer zu starten)? In diesem Fall: ja.
danke schonmal für die antworten, dein vorschlag hat auf jeden fall viele vorteile, vllt. muss ich das später sogar so machen :)
> das könnte aber ja ungünstig sein, wenn ich noch nen "überlauf" mit > berechnen müsste, oder nicht ?! Da der Timer mit begrenztem Zählumfang (16 Bit) arbeitet, kompensieren sich die Überläufe und Überträge der Rechnerei. Wenn Du also durch das Addieren einen kleineren Wert (+ Übertrag) erhältst, dann erreicht der Timer diesen kleineren Wert erst in seiner nächsten Runde (also nach seinem Überlauf). Denn in der aktuellen Runde hat er diesen Wert ja schon "verpasst". Das ist der gleiche Effekt, als wenn Du dezimal zählst und rechnest, Dir aber nur die letzten zwei Ziffern anzeigen lässt und auch nur mit denen weiter rechnest. ...
>Das ist der gleiche Effekt, als wenn Du dezimal zählst und rechnest, >Dir aber nur die letzten zwei Ziffern anzeigen lässt und auch nur mit >denen weiter rechnest. Schön erklärt! ;)
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.