mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Entprellung Taster - Software stromsparend


Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winfried M. (win)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pin-Change-Interrupt zum Aufwachen
Timer-Interrupt zum Entprellen
Sleep zum wieder schlafen legen.

Beispiel:
http://www.avrfreaks.net/index.php?module=Freaks%2...


Peter

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Sleep Mode

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besityer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Danke im Vorraus

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.