Forum: Mikrocontroller und Digitale Elektronik Matrix Tastatur sicher abfragen


von Philipp S. (pschaefer)


Lesenswert?

Hallo,

ich versuche eine Matrix Folientastatur abzufragen und laufe dabei in 
ein paar Probleme.

1. Sobald ich 2 Tasten drücke, kann ich diese entweder nur vertikal oder 
horizontal erkennen (je nachdem ob ich Spalten oder Zeilen abfrage).

2. Ab 3 gedrückten Tasten sind, wie bekannt, Fehler möglich. Diese kann 
man natürlich Hardwareseitig durch Dioden beheben, leider ist dies dem 
Hersteller der Folientastatur aber nicht möglich. In diversen Quellen 
wird dann von einer "Fehlererkennung mittels intelligenter Software" 
geredet. Leider komme ich da nicht auf den richtigen Zweig. Vielleicht 
hat einer von euch ein paar Tips.

Zur Beschaltung: Die gesammte 4x4 Tastatur hängt am PORTB. Hierbei hat 
jeder PIN (also auch die treibenden Pins) einen 10k Pulldown bekommen 
(soll, sofern nicht eine bidirektionale Abfrage nötig ist später 
geändert werden).

Vielen Dank schoneinmal

Philipp

von Falk B. (falk)


Lesenswert?

@  Philipp Schaefer (pschaefer)

>1. Sobald ich 2 Tasten drücke, kann ich diese entweder nur vertikal oder
>horizontal erkennen (je nachdem ob ich Spalten oder Zeilen abfrage).

Dann muss man halt immer zweimal abfragen.

>Zur Beschaltung: Die gesammte 4x4 Tastatur hängt am PORTB. Hierbei hat
>jeder PIN (also auch die treibenden Pins) einen 10k Pulldown bekommen

Ist OK, wenn gleich ich Pull-Ups nehmen würde, weil der AVR auch intern 
Pull-Ups hat.

>(soll, sofern nicht eine bidirektionale Abfrage nötig ist später
>geändert werden).

Lass es so, die zwei Widertände treiben dich nicht in den Ruin.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Welche "diversen Quellen" reden da immer von "intelligenter Software"?

Prinzipiell hast du da nämlich erst mal keine Chance. Bestenfalls 
durch gleichzeitige Auswertung sowohl der Zeilen und der Spalten kannst 
du versuchen, da mehr herauszufinden....

Und wenn du dir mal überlegst, wieviele Kombinationen von 
Mehrfachbetätigung bei 16 Tasten möglich sind, dann solltest du einfach 
sagen: Mehrfachbetätigung = Fehler

BTW: Pullups sind üblicher...

von hdd (Gast)


Lesenswert?

Du könntest dir zur Fehlererkennung merken, ob bzw. welche Taster 
gedrückt und losgelassen wurden.
Niemand wir zwei oder mehr Taster genau gleichzeitig drücken. Das heißt 
du erkennst, dass ein Taster gedrückt wurde und kurz darauf wird noch 
einer gedrückt, ohne dass der vorherige losgelassen wurde -> Fehler

von Philipp S. (pschaefer)


Lesenswert?

Das Problem ist leider, dass es wichtig ist 2 Taster, die gleichzeitig 
gedrückt sind erkannt werden müssen. Das ganze ist ein Prototyp und soll 
nachher auf eine Matrix von bis zu 8x8 angewendet werden.

Und da dieses Feld für eine Steuerung angewendert werden soll, ist es 
etwas ungemütlich wenn dort Phantomtasten erscheinen, die dann 
Maschinenfunktionen steuern.

Mir erklärt sich noch nicht ganz warum 2 gleichzeitig gedrückte Taster 
und deren Erkennung abhängig von der Abfrage ist (also Spalten/Zeilen 
Abfrage). Kann dies damit zusammenhängen, dass dann ein als Ausgang und 
low eingestellter Port nach oben gezogen werden muss und der µC das 
nicht schafft?

Die Konfiguration sieht momentan so aus:

Am PORTB hängen an den Pins 0-3 die 4 Spalten, an Pin 4-7 die Zeilen 
(die ich auch abfrage). Das DDR B = 0xF0; Außerdem hängt an jedem Pin 
ein Pulldown.

Mit dieser Konfiguration kann ich nur horizontal und diagonal 2 Tasten 
erkennen. Nie vertikal.

Wenn ich das jetzt genau umdrehe, also DDRB auf 0x0F; und auf die Zeilen 
Strom gebe und die Spalten abfrage, dann kann ich vertikal und diagonal 
Tasten erkennen.

Dies erschließt sich mir überhaupt nicht.

von John B. (johnbauer)


Lesenswert?

Philipp Schaefer schrieb:
> Am PORTB hängen an den Pins 0-3 die 4 Spalten, an Pin 4-7 die Zeilen
> (die ich auch abfrage). Das DDR B = 0xF0; Außerdem hängt an jedem Pin
> ein Pulldown.

Wenn Du keine Dioden in der Tastatur verbaut hat, darfst Du nur jeweils 
einen Anschluss als Ausgang definieren. Alle anderen Anschlüsse des 
Ports müssen Eingänge sein. Sonst ist es möglich, dass bei zwei 
gleichzeitig gedrückten Tasten, zwei Ausgänge des µC kurzgeschlossen 
werden.
Zwei gedrückte Tasten kann man noch sicher erkennen. Drei gedrückte 
Tasten (je nach Kombination) nicht mehr.

Gruß
John

von Philipp S. (pschaefer)


Lesenswert?

John Bauer schrieb:
> Wenn Du keine Dioden in der Tastatur verbaut hat, darfst Du nur jeweils
> einen Anschluss als Ausgang definieren. Alle anderen Anschlüsse des
> Ports müssen Eingänge sein. Sonst ist es möglich, dass bei zwei
> gleichzeitig gedrückten Tasten, zwei Ausgänge des µC kurzgeschlossen
> werden.

Perfekt, dann weiß ich schonmal woher das Problem 1 herkommt und werde 
das gleich morgen mal austesteten.

John Bauer schrieb:
> Zwei gedrückte Tasten kann man noch sicher erkennen. Drei gedrückte
> Tasten (je nach Kombination) nicht mehr.

Wie kann ich denn erkennen, ob mehr als 2 Tasten gedrückt sind? Oder ist 
das auch gar nicht möglich. Ich brauche maximal 2 gleichzeitig drückbare

von Falk B. (falk)


Lesenswert?

@  Philipp Schaefer (pschaefer)


>> Wenn Du keine Dioden in der Tastatur verbaut hat, darfst Du nur jeweils
>> einen Anschluss als Ausgang definieren. Alle anderen Anschlüsse des
>> Ports müssen Eingänge sein. Sonst ist es möglich, dass bei zwei
>> gleichzeitig gedrückten Tasten, zwei Ausgänge des µC kurzgeschlossen
>> werden.

Das ist aber auch sonst so. Nur eine der Spalten wird aktiv auf (low) 
gezogen, die anderen per Pull Up auf High, snd also auch hochohmig. Wenn 
man dann die Zeilen ausliest, seht man, welche Taste gedrückt ist. 
Erkennt man mehr als 1 Low, sind mindestens zwei Tasten gedrückt. 
Erkennt man das bei mehreren Spalten, sind mehr als zwei Tasten 
gedrückt.

>Wie kann ich denn erkennen, ob mehr als 2 Tasten gedrückt sind?

Wenn du Phantomtasten erkennst. Das spuckt dir deine Routine aus, wenn 
sie denn richtig programmiert wurde.

> Oder ist das auch gar nicht möglich.

Doch.

> Ich brauche maximal 2 gleichzeitig drückbare

Das kann man, indem man zweimal scannt, einmal horizontal und einmal 
vertikal.

von John B. (johnbauer)


Lesenswert?

Falk Brunner schrieb:
> Das kann man, indem man zweimal scannt, einmal horizontal und einmal
> vertikal.

Reicht es nicht einmal zu scannen?
- erste Spalte auf Ausgang und auf high und die vier Zeilen abfragen
- zweite Spalte auf Ausgang und auf high und die vier Zeilen abfragen
- das gleiche mit der dritten und vierten Spalte

Wenn jetzt insgesamt mehr als zwei Bits bei der Zeilenabfrage auf high 
waren, dann waren mehr als zwei Tasten gedrückt.

von Falk B. (falk)


Lesenswert?

@  John Bauer (johnbauer)

>> Das kann man, indem man zweimal scannt, einmal horizontal und einmal
>> vertikal.

>Reicht es nicht einmal zu scannen?

Hmmm, kann sein.

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.