Forum: Compiler & IDEs timer/interrupt im interrupt ein/ausschalten?


von duundich (Gast)


Lesenswert?

Es sollen zwei Taster an einer batteriebetriebenen Fernbedienung
entprellt und ausgewertet werden.

Wie stelle ich das elegant an?

Insbesondere das Zusammenspiel der einzelnen Interruptquellen ist mir
nicht ganz klar; ich möchte die Tasten zuersteinmal mit Peter D.s Code
entprellen, und auch seine Zeitauswertung benutzen. Außerdem soll
geprüft werden, ob beide Tasten gleichzeitig gedrückt werden.

Ich habe mir das so vorgestellt:

sleep
pcint! (durch taste)

pcint ausschalten
timerint einschalten

timerinterrupt läuft 4 mal (variable):
wenn negativ -> timerint 0; pcint 1; sleep
sonst:

ist eine oder beide tasten gedrückt.

beide -> code senden; timerint 0; pcint 1; sleep

eine:

feststellen, ob vor <zeit> losgelassen.

code senden; timerint 0; pcint 1; sleep


nach <zeit> gedrückt:

code senden bis losgelassen. ende..


Wie ich das jetzt aber in Code umsetze, ist mir leider nicht klar -
Könnte mir da bitte jemand helfen? Speziell was das Timing der
Überprüfung betrifft, habe ich keine Vorstellung zur Umsetzung.

Ist es üblich, die Interrupts / Timer einfach nach Belieben ein und
auszuschalten? Über das Interruptregister oder im Falle des Timers
durch Ausschalten des Prescalers?

von Karl H. (kbuchegg)


Lesenswert?

Der Timer läuft ständig durch, auch wenn nichts an den
Tasten passiert.
Im main() hockt der µC in der obligaten while-Schleife.
Ganz konkret hockt der dort in einem sleep. Aus diesem
sleep wird der µC alle heiligen Zeiten durch den Timer
erlöst, der dann seine ISR abarbeitet und die Tasten-
entprellung bzw. auswertung macht. Danach geht es im
main() nach dem sleep weiter. Der Code dort prüft ob
mit dem Tastendruck irgendwas anzufangen ist. Wenn ja
macht er das, wenn nein eben nicht. Danach beginnt
die while-Schleife wieder von vorne und der µC stösst
auf den sleep() und legt sich wieder schlafen. Solange
bis der nächste Timer-Interrupt ....

von duundich (Gast)


Lesenswert?

danke, nee, das geht ja nicht so einfach, ich möchte energie sparen.
deshalb ja die ganze geschichte mit pcint. der schlaf ist also eher
winterschlaf.

die timergeschichte kommt, wenn er aus dem winterschlaf erwacht ist.
ich könnte natürlich erstmal die timergeschichte nehmen, und dann den
winterschlaf einbauen.

von Karl H. (kbuchegg)


Lesenswert?

nun, es steht dir natürlich frei, nach n Durchläufen
durch die Timer-ISR ohne Aktion, den 'Schlafstatus' soweit zu
verschärfen, dass er nur mehr mit einem Pin change Interrupt wieder
erwacht. Das ändert aber am Prinzip nicht viel.

von duundich (Gast)


Lesenswert?

hast recht :-) sorum gedacht, ist es nicht mehr so kompliziert

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.