Forum: Mikrocontroller und Digitale Elektronik Taster abfragen - Interrupt vs. Polling - Stromverbrauch


von Fragensteller2012 (Gast)


Lesenswert?

Hi,

ich bin gerade dabei eine kleine Schaltung zu planen. Im Endeffekt sind 
es nur einige LEDs, die über einen Schalter gesteuert verschiedene 
Muster anzeigen sollen. Prinzipiell also kein Problem.

Die Schaltung ist bzw. soll batteriebetrieben werden.

Jetzt frage ich mich gerade was wohl der bessere Ansatz ist. Nach Lesen 
des Tutorials, komme ich zu dem Schluss, dass Entprellung absolut 
essentiell ist. Insofern würde ich natürlich nicht darauf verzichten 
wollen.

Allerdings sehe ich da einen gewissen Konflikt zwischen der 
vorgestellten Lösung (welche im Wesentlichen "nur" wiederholt den 
Eingang abfragt) und der Lebensdauer der Batterie. Vermutlich kann man 
den Mikrocontroller zwischendurch immer wieder schlafen legen, dennoch 
frage ich mich, ob ein Interrupt-gesteuerter Ansatz nicht stromsparender 
wäre, weil dann der Mikrocontroller nur geweckt wird, wenn es wirklich 
nötig ist.

Nach meinem Verständnis kann es dann höchstens beim Betätigen des 
Tasters durch Prellung zu unnötigen Interrupts kommen. Ich frage mich 
gerade, ob sich diese durch "geschickte" Programmierung verhindern 
lassen würden.

Innerhalb der ISR würde ich dann zunächst weitere Interrupts 
deaktivieren, das entsprechende Interrupt-Flag auf 0 setzen, was 
verhindert, das ein weiterer angemeldeter Interrupt, welcher in der 
Zwischenzeit angekommen sein könnte, ausgeführt wird, und dann über ein 
paar Abfragen hinweg versuchen zu ermitteln, ob der Taster (lange genug) 
gedrückt worden ist.

So ganz durchdacht ist das Konzept vielleicht noch nicht, bzw. ich habe 
mich noch nicht an der Implementierung versucht, aber ich würde euch 
gerne um Erfahrungen fragen.

Wie handhabt ihr das, wenn der Mikrocontroller im Wesentlichen die 
meiste Zeit "schlafen" könnte? Gerade bei Batteriebetrieb würde ich halt 
nur ungern haufenweise unnötige Abfragen machen, zumindest erscheint mir 
das ein wenig unintuitiv. Habt ihr da bessere Vorschläge bzw. Ansätze?

Vielen Dank im Voraus!

von Peter D. (peda)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Ich seh das eigentlich als eine Frage der Relationen.

Solange da 'ein paar LED' ein Muster anzeigen, spielt es überhaupt keine 
Rolle, ob der µC alle paar Millisekunden für ein paar µs lang aufwacht 
und nachsieht ob sich an den Eingangspins etwas getan hat. Der 
kruzzeitige höhere Stromverbrauch ist gegenüber dem was man für die LED 
benötigt, komplett zu vernachlässigen. Ob die Batterie jetzt für 2 
Stunden oder für 2 Stunden und 1 Sekunde ausreicht, ist völlig 
unerheblich und wird hauptsächlich von den LED bestimmt.

von Fragensteller2012 (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Beitrag "AVR Sleep Mode / Knight Rider"
Das schaut recht interessant aus. Wobei ich zur Zeit mit Assembler 
arbeite. Aber die Grundidee(n) kann man sicherlich übernehmen.

Karl Heinz Buchegger schrieb:
> Solange da 'ein paar LED' ein Muster anzeigen, spielt es überhaupt keine
> Rolle, ob der µC alle paar Millisekunden für ein paar µs lang aufwacht
> und nachsieht ob sich an den Eingangspins etwas getan hat.
Ich habe mein "Problem" natürlich zu stark vereinfacht. Die LEDs sollen 
nach einer gewissen Zeit (z.B. 10 Sekunden) ausgehen und erst wieder 
aktiviert werden, wenn eine Taste gedrückt wird. Demnach würde nur der 
Controller laufen und eben alle x Millisekunden den Status der Tasten 
abfragen.

Das hört sich jetzt zumindest theoretisch schlimmer an, als wenn der 
Controller tief und fest schlafen könnte und durch einen "externen" 
Interrupt geweckt wird.

Deswegen wäre ich in erster Linie an Erfahrungen interessiert. Ich denke 
ein Mikrocontroller, welcher einen Großteil der Zeit über schläft (und 
100 Millisekunden sind ja für den Controller recht viel Zeit um zu 
Schlafen), sollte auch nicht allzu viel verbrauchen. Nur habe ich das 
noch nicht so ganz implementiert und kann das nicht wirklich messen. 
Außerdem bezweifle ich, dass ich das mit einem einfachen Multimeter 
überhaupt messen kann.

von Stone (Gast)


Lesenswert?

Sofern du einen modernen AVR(Atmega88, Attinys, ...) verwendest, würde 
ich das über die PCI(Pin Change Interrupt) machen, jeder Tastendruck 
(bzw. auch das loslassen) löst einen Interrupt aus. Der Lässt deinen 
Controller aufwachen, dann debounce Routine ausführen LED Muster 
ausgeben, x Sekunden warten und wieder schlafen legen.
Wenns du einen älteren Controller hast (Atmega8, 16, 32) dann muss der 
Taster an einen der INT Eingänge.
Du könntest auch über den Watchdog den Controller wecken, schauen ob die 
Taste gedrückt ist und ihr wieder schlafen legen wenn nix ist, aber das 
braucht mehr Strom (Power Down 0.1µA vs. Power Down + WD 5µA) und ist 
unnötig.
Habs bei nem Küchentimer Projekt über die Pin-Change-Interrupt Variante 
gemacht.

Ob der Taster prellt kann dir im Interrupt eigentlich egal sein ob der 
da ein oder fünfmal rein rennt ist egal der Interrupt ist nur da um den 
Controller zu wecken, das Debouncen kannst du mit Timer oder "Wait" 
machen(aber bitte nicht in der ISR sondern in der Main-Loop).

Stromverbrauch kannst du auch mit nem Multimeter messen. 
Strommessbereich 200µA, damit kannst du zu mindestens messen ob er im 
Sleep ist wenn du nichts mehr misst ;).


Gruß Matthias

von Fragensteller2012 (Gast)


Lesenswert?

Danke für deine Antwort. Ja, sind eigentlich durchweg "neuere" 
Controller, die ich einsetze. Insofern perfekt ;).

Stone schrieb:
> Stromverbrauch kannst du auch mit nem Multimeter messen.
> Strommessbereich 200µA, damit kannst du zu mindestens messen ob er im
> Sleep ist wenn du nichts mehr misst ;).
Ja, nur wird es schwierig festzustellen, ob bzw. wie oft er geweckt 
wird, wenn die Taste prellt, weil das ja vermutlich schneller passiert 
als mein Multimeter das anzeigen, bzw. ich es ablesen könnte ;).

Aber zum Einordnen, ob Sleep Mode oder nicht wird es wohl reichen.

Ist eigentlich auch ein guter Vorwand sich endlich mal ein Oszilloskop 
zu gönnen ;).

Danke jedenfalls!

von Verwirrter Anfänger (Gast)


Lesenswert?

Ich würd den µC so tief wie möglich schlafen legen, den Taster auf einen 
Interrupt. Innerhalb der Interrupt Routine wird der Interrupt 
deaktiviert, und falls danach noch Tasten abgefragt werden sollen, wird 
das über den debounce gemacht. kurz vor dem Schlafengehen wird der 
Interrupt wieder aktiviert.

*Anmerkung: wenn ein Timer Interrupt zum Entprellen verwendet wird, 
sollte man natürlich nur den spezifischen Interrupt deaktivieren, und 
nicht einfach alle.

von Stone (Gast)


Lesenswert?

>kurz vor dem Schlafengehen wird der
>Interrupt wieder aktiviert.

Am besten das Interruptflag auch gleich mit löschen sonst kann es 
passieren, dass er dir gleich wieder in die Routine läuft weil das flag 
noch gesetzt war.


Gruß Matthias

von Herr M. (herrmueller)


Lesenswert?

Wenn Du dich da durchkämpfen willst, schau Dir mal mein Lauflicht


Beitrag "Blinky61 - vielseitiges Blink- und Lauflicht - ATtiny13 mit 6 LEDs [ASM]"

an. Das ist allerdings mit einem Tiny13.

Nach einer einstellbaren Zeit, geht der Tiny in den Power down 
Mode.(Label Ausschalten: ). Int0 Interrupt (low Level) wird 
freigeschaltet und Power Down Mode. Danach SLEEP. Beim Aufwachen durch 
die Taste wird in der Interruptroutine sofort der Int0-IR wieder 
abgeschaltet (TastINT0: direkt darunter).
Dann läuft das Lauflicht wieder los.

Die Taste wird in einem Timerinterrupt augewertet, da zwischen kurz, 
lang, kurz-lang und sehr lang unterschieden wird.

Gruss HerrMueller

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.