Moin zusammen, ich möchte einen Taster per Software entprellen, doch sollte dies möglichst stromsparend passieren. Die "Delay_µS"-Routine wäre dann hier wohl schlecht anwendbar. Hat jemand eine Idee - vllt. Den Interrupt für eine gewisse Zeit einfach ausschalten. Ist das ne denkbare Lösung? Merci beaucoup! Maik
Das gängige Verfahren für Tastenentprellung ist das pollen im Timerinterrrupt. Das ist zudem auch stromsparend, weil nur z.B. 100 mal pro Sekunde kurz getestet wird.
Pin-Change-Interrupt zum Aufwachen Timer-Interrupt zum Entprellen Sleep zum wieder schlafen legen. Beispiel: http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_type=project&item_id=2265 Peter
Hallo Maik, deine Frage ist ziemlich ungenau. Du hast noch nicht einmal angegeben, welchen µC du überhaupt einsetzt. Ich gehe einmal von 8-Bit AVR aus. Mir ist auch nicht klar, was du mit "stromsparend" meinst. Willst du den µC schlafen schicken bis eine Taste gedrückt wird? Schaue doch einmal nach, ob dein AVR eine Pin Change Interrupt hat. Dann könnte folgendes möglich sein. (Entprellroutine als Polling im Timerinterrupt, wie üblich) Vor dem Schlafenlegen wird der Timerinterrupt abgeschaltet, der Pin Change Interrupt für die Pins mit Tasten aktiviert. Eine Änderung bei einer Taste weckt den µC dann wieder auf, in der entsprechenden Interruptroutine wird der Timerinterrupt wieder aktiviert, der PCINT deaktiviert, das Programm weiter ausgeführt. Ich höffe, das war verständlich formuliert. Gruß, DetlevT
Detlev T. schrieb: > Du hast noch nicht einmal angegeben, > welchen µC du überhaupt einsetzt. Hi, sry das hatte ich in meiner "Denkphase" total vergessen :( Ich nutze den Atmega169P. Detlev T. schrieb: > Schaue doch einmal nach, ob dein AVR eine Pin Change Interrupt hat. Japp hat er, gleich 15 sogar. Detlev T. schrieb: > Vor dem Schlafenlegen wird der Timerinterrupt abgeschaltet, der Pin > Change Interrupt für die Pins mit Tasten aktiviert. Eine Änderung bei > einer Taste weckt den µC dann wieder auf, in der entsprechenden > Interruptroutine wird der Timerinterrupt wieder aktiviert, der PCINT > deaktiviert, das Programm weiter ausgeführt. Das ist ne gute Idee, doch habe ich in diesem Zusammenhang eine Frage: Wenn der µC im Sleep-Mode ist und er dann per Pin-Change Interrupt geweckt wird, so kann der Controller doch nicht sehen, wo der Pin-Change war, ist es zeitlich drinn den Controller schnell aufwachen zu lassen und dann noch in dem PCInt-Interrupt zu schauen, welche Taste in dem Moment vom Benutzer gedrückt wird. - Das Gute bei dem µC ist, dass XTAL und TOSC-Pins die Selben sind, wodurch der Uhrenquarz nicht noch extra anschwingen muss, da ich eine Software RTC verwende. Gilt das Gleiche auch für eine USART beispielsweise - oder wird die sich "verschlucken"? Danke für die schnellen Antworten! ☺ Maik
Falk Brunner schrieb:
> Siehe Sleep Mode
Dies kann ich leider nicht nutzen, da der Pin bereits anderweitig
benutzt wird (Segment-Line für LCD Ansteuerung).
Grüße Marcel
>Wenn der µC im Sleep-Mode ist und er dann per Pin-Change Interrupt >geweckt wird, so kann der Controller doch nicht sehen, wo der Pin-Change >war, ist es zeitlich drinn den Controller schnell aufwachen zu lassen >und dann noch in dem PCInt-Interrupt zu schauen, welche Taste in dem >Moment vom Benutzer gedrückt wird. Wie lange braucht der Controller um aufzuwachen? Wie lange braucht der Benutzer, um zu merken, dass sein Tastendruck etwas bewirkt hat? Das Verhältnis zwischen diesen beiden Zeiten dürfte im Bereich von 1:10 und höher liegen. Wenn der Benutzer die Taste 100ms lang betätigt, sollte der Controller wach sein und sich fast schon wieder schlafen gelegt haben. Einfach zum Beginn des Aufwachvorgangs den Zustand der Ports sichern, an denen sich die Tasten befinden. Das Signal muss ja eh erst mal eine gewisse Zeit stabil anliegen (deswegen entprellt man die Eingabe ja auch.
@ Maik (Gast) >Wenn der µC im Sleep-Mode ist und er dann per Pin-Change Interrupt >geweckt wird, so kann der Controller doch nicht sehen, wo der Pin-Change >war, Aber sicher kann er das, wäre ja sonst reichlich sinnfrei. Siehe Register PCMSKx. >- Das Gute bei dem µC ist, dass XTAL und TOSC-Pins die Selben sind, >wodurch der Uhrenquarz nicht noch extra anschwingen muss, da ich eine >Software RTC verwende. Das hat damit gar nix zu tun, siehe Sleep Mode. Das hat eher den Nachteil, Dass man nur den Uhrenquarz OdEr einen normalen Quarz nutzen kann, aber nicht beides gleichzeitig. >Gilt das Gleiche auch für eine USART beispielsweise - oder wird die sich >"verschlucken"? Nein. Aber bei UART-Nutzung kann man bestenfalls den Idle Mode nutzen. >Dies kann ich leider nicht nutzen, da der Pin bereits anderweitig >benutzt wird (Segment-Line für LCD Ansteuerung). ??? Der Taster hängt gleichzeitg an einem Augang? MFG Falk
Falk Brunner schrieb: > Der Taster hängt gleichzeitg an einem Augang? Nein, das nicht, aber INT0 kann hier nicht genutzt werden, da dieser PIN bereits als Segment fürs LCD benutzt wird. (Das war ein Vorschlag von: Falk Brunner schrieb: > Siehe Sleep Mode ) Nun zu dem PCMSKx-Register Falk Brunner schrieb: > Aber sicher kann er das, wäre ja sonst reichlich sinnfrei. Siehe > Register PCMSKx. Ich verstehe das im Manual so, dass du in diesem Register die einzelnen Pins auf Pin Change Interrupt Enable/Disable schalten kannst. Hier der Auszug von Atmel dazu: PCMSK0 – Pin Change Mask Register 0 >Each PCINT7:0 bit selects whether pin change interrupt is >enabled on the corresponding I/O pin. >If PCINT7:0 is set and the PCIE0 bit in EIMSK is set, pin change interrupt is >enabled on the corresponding I/O pin. >If PCINT7:0 is cleared, pin change interrupt on the corresponding I/O pin is >disabled. Außerdem gibt es auch nur einen Interrupt-Vektor auf den dann gesprungen wird. - doch wie detektiert man dann wo der Impuls genau herkam? Grüße Maik
@ Maik (Gast) >Nein, das nicht, aber INT0 kann hier nicht genutzt werden, da dieser PIN >bereits als Segment fürs LCD benutzt wird. Und was hat INT0 mit dem Thema Sleep Mode zu tun? >Ich verstehe das im Manual so, dass du in diesem Register die einzelnen >Pins auf Pin Change Interrupt Enable/Disable schalten kannst. Ja, jeweils 8 Bit in einem gemeinsamen Interrupt. >Außerdem gibt es auch nur einen Interrupt-Vektor auf den dann gesprungen >wird. - doch wie detektiert man dann wo der Impuls genau herkam? Man liest die PINx Register und vergleicht mit dem alten, gespeicherten Wert. MFg Falk
Falk Brunner schrieb:
> Und was hat INT0 mit dem Thema Sleep Mode zu tun?
In diesem Thema steht etwas zum Thema "Aufwachen per Tastendruck" - das
hattest du mir empfohlen. Doch wird hier der INT0 benutzt.
Aber ich habs verstanden! :)
Werd mich gleichmal ans Programmieren machen. Werd euch berichten wenn
es geht.
Vielen Dank euch allen
Grüße
Maik
Maik schrieb: > Werd mich gleichmal ans Programmieren machen. Hier hab ich nen Problem aus dem ich nicht schlau werde. Um den Pin-Change Interrupt zu aktivieren, muss ich im EIMSK-Register das PCIE1-Bit (Bit7) setzen. Wenn ich das mit folgender Routine mache: >EIMSK |= (1<<PCIE1); macht er jedoch nichts?! Wenn ich hingegen einfach aus Spaß das INT0-Bit (Bit1) setzen möchte, >EIMSK |= (1<<INT0); dann macht er das ohne Anstand. Ich versteh die Welt nicht mehr.... PS: Das Register ist wie folgt aufgebaut 7 6 5 4 3 2 1 0 R/W R/W R R R R R R/W ATMEL-Manual Seite 62: http://www.atmel.com/dyn/resources/prod_documents/doc8018.pdf Danke im Vorraus
Hab das Problem gefunden. Es scheint, dass das AVRStudio mit dem Simulieren nicht klar kommt, wenn man das wirklich auf nen Atmega schiebt und dann sich die Register-Werte ausgibt, dann wird das Bit trotzdem gesetzt....
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.