Forum: Mikrocontroller und Digitale Elektronik Low-Level Interrupt (nicht Flanke) INT1: Entprellmethode?


von Christian (Gast)


Lesenswert?

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

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, hier noch der Code...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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"

von Christian (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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

von fabs (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von AVRFan (Gast)


Lesenswert?

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