Hallo, ich lese seit kurzer Zeit dieses Forum und habe einiges über Tastenentprellung gelesen. Ich bin mir aber nicht ganz sicher, welche Methode ich in meinem Fall anwenden soll, der da wäre: Ein Taster an INT1 soll ausgewertet werden. Dieser weckt einen ATMEGA48 lowlevel (ISC11, 10 = 0) aus dem Powerdown mode (SM(2..0) = 010). Den Interrupt enable setze ich kurz vorm einschlafen (INT1 im EIMSK) und lösche ihn nach dem Aufwachen sofort wieder. So kann ich so viel Strom wie möglich sparen, meine Schaltung mit aktivem Linearregler (LT3010) zieht im PowerDown modus 85 µA. So weit so gut. Es steht kein Uhrenquarz an Timer 2 zur Verfügung (kostensensitv!). Ein Flankeninterrupt mit laufendem Clock scheidet aus Ruhestromtechnischen Gründen somit leider aus. In Abhängigkeit vom Taster (lowaktiv mit externem pullup auf 3V auf ext. INT1) soll etwas eingeschaltet werden, eine Zeit läuft ab und wenn erneut ein Tastendruck festgestellt wird, wird die Zeit zurückgesetzt, Ausgänge alle ausgeschaltet und der MC legt sich wieder schlafen. Zusätzlich soll festgestellt werden, ob der Taster ständig gedrückt ist (Key stuck). Hierfür steht eine Schaltung zur Verfügung, die den Strom durch den Taster reduzieren kann, ohne ihn jedoch komplett abzuschalten (da einzigstes Eingabemittel). Im Moment mache ich das entprellen schnöde über delays, was unbefriedigend ist, zumal der Wert erst beim loslassen übernommen wird. Welche Methode der Entprellung sollte ich einsetzten? Ich habe gedacht das ein Zustandsautomat das beste wäre, aber wie sieht es hier mit dem Interrupt aus? Die Methode darf ruhig über delays etc gemacht werden, denn die CPU macht sonst nicht viel anderes. Der angehängte Code ist ein erster Entwurf, der bis auf die Button Stuck geschichte eigentlich prinzipiell funktioniert, allerdings eben mit besagtem Nachteil, das die Entprellung mit delays passiert und erst nach dem loslassen des Tasters reagiert..... Ich hoffe ich finde Hilfe :) Gruss und Glückwunsch zu diesem Forum hier, ich werde wohl öfters hier lesen! Christian
Meine Kristallkugel sagt mir, dass es um einen AVR geht. Entprellen mache ich üblicherweise über eine ISR, die alle 10ms auf den Tasten-Port schaut. In einer Anwendung mit ähnlichen Rahmenbedingungen wie Deiner hatte das aber zu Problemen geführt. Taster sollen zum einen den µC aufwecken und zum anderen auch schlafen legen können. Wenn man schlafen geht und ein Taster prellt, wird man u.U. direkt wieder wach. Jedenfalls hab ich es dann über ein delay gelöst, obwohl die Taster über die 10ms-Methode abgefragt werden. Konkret geht es dabei um die main.c von und die Taster-Abfrage wird erledigt in taster.c Beitrag "Eieruhr mit ATtiny24V/ATtiny2313V"
Hallo Johann, danke für den Link! ich werde mir die EierUhr :) mal ansehen. Auch ja: Richtig, es geht um AVR's Im Text ist der ATMEga48 beschrieben, leider habe ich ihn im topic vergessen..... Ich bin mal gespannt wie ich den Tastenklemmer zum Schluss erkennen kann..... Über den Taster fliessen dafaultmässig etwa 20mA um die Kontakte frei zu halten. Bei einem Klemmer kann dieser Strom mit einem laufenden MC und einer FET Schaltung auf 2mA plus MC-Strom runtergeschaltet werden. Dieser produziert dann laufend Interrupts, sofern ich die Tastenerkenneung mit einer ISR mache. Aber jetzt schaue ich erstmal in die Eieruhr orakel Gruss, Christian
Christian wrote: > In Abhängigkeit vom Taster (lowaktiv mit externem pullup auf 3V auf ext. > INT1) soll etwas eingeschaltet werden, eine Zeit läuft ab und wenn > erneut ein Tastendruck festgestellt wird, wird die Zeit zurückgesetzt, > Ausgänge alle ausgeschaltet und der MC legt sich wieder schlafen. > Zusätzlich soll festgestellt werden, ob der Taster ständig gedrückt ist > (Key stuck). Dann nimm doch besser den Pin-Change Interrupt zum Aufwachen bei jedem Wechsel. > Welche Methode der Entprellung sollte ich einsetzten? Ich habe gedacht > das ein Zustandsautomat das beste wäre, aber wie sieht es hier mit dem > Interrupt aus? Die übliche Methode mit Timerinterrupt und 4-fach Entprellung. Und wenn sich der Tastenzustand über ~10 Abtastungen nicht ändert und auch sonst nichts zu tun ist, gehst Du in Sleep (vorher PCI enablen). > Die Methode darf ruhig über delays etc gemacht werden, denn die CPU > macht sonst nicht viel anderes. Oben sagst Du doch, daß sich mit Delays schlecht programmiert (was ja auch stimmt), also weg damit. Peter
Hallo Peter, das mit den delays ist schon nicht wirklich toll, das ist richtig. Einen Flankeninterrupt werde ich wg. der abwesenheit eines externen Quarzes nicht verwenden können. Es sei denn ich kann die gewünschte Funktion NUR damit erfüllen, dann kann ich die Extrakosten vor dem Kunden rechtfertigen. Mir wäre ein Quarz auch lieber gewesen. Meine Bedenken bei der Flankenerkennung sind aber auch noch anderer Natur: - Der Lowlevel Interrupt, der den Prozessor aus dem PowerDown holt ist ja der Taster. Sogesehen sollte ich doch eigentlich in der ISR debouncen, oder? Gruss, Christian
Christian, der PinChange Interrupt neuerer AVRs kann diese auch ohne Takt ausm Schlaf erwecken. Der detektiert keine Flanke, sondern nur ob sich der Zustand am Pin ändert. Ich habs das letzte mal so gemcht, dass ich über den Int den Controller aufgeweckt habe und dann ganz normal die Entprellung über Pedas Tastenentprellroutine im Timer-int hab laufen lassen...die Verzögerung konnte ich nicht störend wahrnehmen...und ich bin da sonst recht kritisch. Gruß Fabian
Die meisten meiner Programme fallen am Ende der Mainloop in den Sleep. Bei normal laufendem Programm ist das der IDLE-Mode. Will man (nach Ablauf eines "Nix los"-Timeouts oder per Menüpunkt) in den Tiefschlaf, so stellt man den Sleep-Mode auf Power-Down um und aktiviert den Weck-Interrupt (Low-Level-Ext-Int oder PCI). Der AVR fällt daraufhin am Ende der Mainloop in den Tiefschlaf und schaltet damit auch den Takt seiner Timer aus. Er kann nur noch vom Weck-Interrupt (kann neben Taste auch TWI sein) aufgeweckt werden. In dessen ISR deaktiviert man den Weck-Interrupt und schaltet den Sleep-Mode wieder auf Idle um, nun laufen die Timer wieder mit und es kann mit Peters Bulletproof-Entprellung im Timer-Interrupt entprellt werden. ...
>Der Lowlevel Interrupt, der den Prozessor aus dem PowerDown holt ist >ja der Taster. Sogesehen sollte ich doch eigentlich in der ISR >debouncen Ich empfehle Dir Hannes' Beitrag. So wie er dort schreibt macht man es richtig.
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.