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