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!
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.
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.
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
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!
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.
>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
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