Hi,
Für die Erkennung von "wurde gedrückt" oder "wurde losgelassen" benötigst du ein weiteres Bit als Flag in dem du den letzten Zustand der Entprellung lagerst. Ist jetzt etwas schlecht zu erklären
Du benötigst für jede Taste zwei Bits für die Erkennung ob gedrückt oder losgelassen wurde (also Flankenerkennung)
Also sagen wir mal der Taster schaltet nach GND ...
- Der Inhalt des Schieberegisters ist 01101001 => Taste prellt noch - undefinierter Tastenzustand
- Der Inhalt des Schieberegisters ist 00000000 => Taste wurde gedrückt und prellt nicht mehr => tast=0
- Der Inhalt des Schieberegisters ist 11111111 => Taste wurde losgelassen und prellt nicht mehr => tast=1
- tast ist der aktuelle Zustand der Taste
- last_tast ist der beim letzten Durchlauf als stabiler/definierter Zustand erkannte
nun also ...
tast=0 und last_tast=0 => Taste war gedrückt und ist immer noch gedrückt
tast=1 und last_tast=1 => Taste war losgelassen und ist immer noch losgelassen
tast=0 und last_tast=1 => Taste war gedrückt und ist jetzt losgelassen (Tastenänderung)
tast=1 und last_tast=0 => Taste war losgelassen und ist jetzt gedrückt (Tastenänderung)
Sieh mal hier wie ich die Statusänderungen für einen Incrementalgeber erkannt habe ...
ATmega32-Board für Steueraufgaben und Experimente
- Im Beitrag #2 sind eingescannte Zettel mit Gedanken für den Incrementalgeber
- Im Beitrag #5 müßte (hoffentlich) der Quellcode in einer Zip drin sein.
An dem Incrementalgeber hab ich echt lange gebrütet aber es läuft
Das war ne Menge Bitpopelei mit viel Geschiebe und Bitgewechsel.
Gruß
Dino
Das Schieberegister ist lediglich fürs entprellen da.Ich habe gerade ein einfaches Schieberegister implementiert, für einen Taster. Dabei kam ich ein wenig ins grübeln.
Im Prinzip sind es ja 5 Zustände, die man auseinander halten will:
1. undefinierter Zustand (Prellen)
2. Taste gedrückt (0xff), unabhängig vom vorherigen Zustand
3. Taste nicht gedrückt (0x00), unabhängig vom vorherigen Zustand
4. Taste erstmalig gedrückt, letzter definierter Zustand war: 'nicht gedrückt'
5. Taste gerade losgelassen, letzter definierter Zustand war: 'gedrückt'
...
Gibt es da schon Lösungen, die sich bewährt haben? Was habt Ihr dazu für Gedanken?
Für die Erkennung von "wurde gedrückt" oder "wurde losgelassen" benötigst du ein weiteres Bit als Flag in dem du den letzten Zustand der Entprellung lagerst. Ist jetzt etwas schlecht zu erklären
Du benötigst für jede Taste zwei Bits für die Erkennung ob gedrückt oder losgelassen wurde (also Flankenerkennung)
Also sagen wir mal der Taster schaltet nach GND ...
- Der Inhalt des Schieberegisters ist 01101001 => Taste prellt noch - undefinierter Tastenzustand
- Der Inhalt des Schieberegisters ist 00000000 => Taste wurde gedrückt und prellt nicht mehr => tast=0
- Der Inhalt des Schieberegisters ist 11111111 => Taste wurde losgelassen und prellt nicht mehr => tast=1
- tast ist der aktuelle Zustand der Taste
- last_tast ist der beim letzten Durchlauf als stabiler/definierter Zustand erkannte
nun also ...
tast=0 und last_tast=0 => Taste war gedrückt und ist immer noch gedrückt
tast=1 und last_tast=1 => Taste war losgelassen und ist immer noch losgelassen
tast=0 und last_tast=1 => Taste war gedrückt und ist jetzt losgelassen (Tastenänderung)
tast=1 und last_tast=0 => Taste war losgelassen und ist jetzt gedrückt (Tastenänderung)
Sieh mal hier wie ich die Statusänderungen für einen Incrementalgeber erkannt habe ...
ATmega32-Board für Steueraufgaben und Experimente
- Im Beitrag #2 sind eingescannte Zettel mit Gedanken für den Incrementalgeber
- Im Beitrag #5 müßte (hoffentlich) der Quellcode in einer Zip drin sein.
An dem Incrementalgeber hab ich echt lange gebrütet aber es läuft
Das war ne Menge Bitpopelei mit viel Geschiebe und Bitgewechsel.
Gruß
Dino