Forum: Mikrocontroller und Digitale Elektronik Entprellung Taster - Software stromsparend


von Maik (Gast)


Lesenswert?

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

von Winfried M. (win)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Detlev T. (detlevt)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode

von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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

von STK500-Besityer (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Maik (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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