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