Forum: Mikrocontroller und Digitale Elektronik Timer gezielt starten bei ATmega


von Andre B. (anorukke)


Lesenswert?

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)?

von Hannes L. (hannes)


Lesenswert?

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.

...

von Andre B. (anorukke)


Lesenswert?

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 ?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>muss ich TCNT1H und TCNT1L auf "0" setzen und dann die
>clocksource auswählen (um den timer zu starten)?

In diesem Fall: ja.

von Andre B. (anorukke)


Lesenswert?

danke schonmal für die antworten, dein vorschlag hat auf jeden fall
viele vorteile, vllt. muss ich das später sogar so machen :)

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.