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.