www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster entprellen funktion "get8key" ?


Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auch wenn das Thema schon schon sehr oft behandelt wurde habe ich 
trotzdem noch eine Verständnisfrage zur Tastenentprellroutine mit timer 
interrupt von Peter Dannegger:

Ich verstehe diesen (entscheidenden Teil) nicht so wirklich:

get8key:                       ;/old      state     iwr1      iwr0
    mov     iwr0, key_old      ;00110011  10101010            00110011
    in      key_old, key_pin   ;11110000
    eor     iwr0, key_old      ;                              11000011
    com     key_old            ;00001111
    mov     iwr1, key_state    ;                    10101010
    or      key_state, iwr0    ;          11101011
    and     iwr0, key_old      ;                              00000011
    eor     key_state, iwr0    ;          11101000
    and     iwr1, iwr0         ;                    00000010
    or      key_press, iwr1    ; gedrückte Taste merken


Zum Ablauf:

Ich habe irgendwo im Programm meinen Timer0-Interrupt aktiviert, so dass 
ca. alle 10ms ein Interrupt ausgelöst wird!
dann wird die ISR aufgerufen, die die Subroutine "get8key" enthält.
(Registersicherungen etc. habe ich weggelassen, die sind obligatorisch)
get8key speichert dann in "key_press" an welcher Stelle/ an welchen Bits 
Änderungen aufgetreten sind!

also einem anderen Thread konnte ich entnehmen, dass iwr0 und iwr1 
zusammen für jedes Bit des Eingangsbytes einen 2Bit-Zähler darstellen.
Wie funktioniert das mit diesem Zähler?
- Das heißt ich zähle irgendwo schon mal bis 4 ehe etwas passiert bzw. 
in das key_press register übernommen wird?



kann man die Funktion nicht mal an einem Beispiel durchgehen?

z.B.
Taster 1 wurde gedrückt
- beim ersten Durchlauf haben folgende Variable diesen Zustand etc.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Olli R. schrieb:
> - Das heißt ich zähle irgendwo schon mal bis 4 ehe etwas passiert bzw.

Nein, diese Routine vergleicht nur 2 Abtastungen auf Gleichheit.
Es gibt ja nur eine Variable "key_old".

"iwr0", "iwr1" sind nur temporäre Register 
(Interrupt_Working_Register_0/1).
Benutzt man für Main und Interrupts unterschiedliche temporäre Register, 
spart man sich das Push/Pop ein.

Die Variante mit 4 Abtastungen ist in C geschrieben.
Um bis 4 zu zählen, braucht man 2 Bits, die sind in den Variablen 
"key_ct0" und "key_ct1".


Peter

Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Nein, diese Routine vergleicht nur 2 Abtastungen auf Gleichheit.
> Es gibt ja nur eine Variable "key_old".

Ok nur ganz kurz!

was macht das register "key_state"?

Autor: Olli R. (downunderthunder42)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das noch nicht ganz verstanden.

Dazu habe ich den Programmcode nochmal angefügt.

Ich habe meine Kommentare eingefügt!
sind diese prinzipiell oder zumindest teilweise korrekt?

Also was mir besonders Kopfzerbrechen bereit ist der Befehl:

com key_old    ;
wieso wird das invertiert?

Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok mir ist jetzt nochmal was Grundsätzliches hängen geblieben.

Der eingelesene Wert ist im Beispiel ja
11110000
der vorhergehende liegt bei
00110011
und der vorvorgehende liegt bei
10101010


So die Routine wertet aus, dass Bit1 in
key_press gesetzt wird.

Also kann ich mir das so denken:

Bit 0 --> Taster gedrückt (wird auf GND gezogen)

also wurden die Taster
0,1,2,3 gedrückt.
Die Logik setzt aber nur Bit 1 auf "1", weil dieses
Bit (bzw. der Taster) die beiden Male zuvor nicht gedrückt war?

also
t = -2  101010"1"0
t = -1  001100"1"1
t = 0   111100"0"0

Bit1 stellt den Taster dar, der gerade gedrückt ist und als einziger 
mindestens zweimal nicht gedrückt war?

Da die ISR ca. alle 10ms aufgerufen wird, darf eine Taste also ca. 20ms 
nicht gedrückt sein ehe sie gedrückt wird?

Hmmh ich glaube ich hab da nen Logikfehler gemacht?

Ich hoffe ich habe hier jetzt nicht totalen Schwachsinn geschrieben!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Olli R. schrieb:
> Da die ISR ca. alle 10ms aufgerufen wird, darf eine Taste also ca. 20ms
> nicht gedrückt sein ehe sie gedrückt wird?

Stimmt, es wird beides entprellt, das Drücken und das Loslassen.
Damit können auch zittrige Leute das Gerät bedienen.


Peter

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.