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


von Olli R. (downunderthunder42)


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.

von Peter D. (peda)


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

von Olli R. (downunderthunder42)


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"?

von Olli R. (downunderthunder42)


Angehängte Dateien:

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?

von Olli R. (downunderthunder42)


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!

von Peter D. (peda)


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

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.