PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastenmatrix - Verstärkerschaltung



Der Eisvogel
27.03.2013, 11:54
Hallo,

für mein derzeitiges Schulprojekt brauche ich eine RGB-LED-Matrix mit Tastern unter den LED's. Dazu verwende ich das Sparkfun ButtonPad 4x4 (https://www.sparkfun.com/products/7835) mit der entsprechenden Platine (https://www.sparkfun.com/products/8033). Leider haben die Taster einen Widerstand von ca. 100K, was dazu führt, dass mein Controller AT89C5131A-S3SUM das Signal nicht mehr erkennt, da zu wenig Strom fließt. Daher habe ich mir eine Verstärkerschaltung gebastelt:
24967

Die Anschlüsse P0.4 bis P0.7 führen auf den Controller. Die Anschlüsse Row0 bis Row3 führen auf die Zeilen meiner Tastermatrix (https://www.sparkfun.com/datasheets/Components/Buttons/Button_Pad_Breakout.pdf). Das ganze funktioniert auch soweit, der Controller erkennt die Signale. Solange der Controller eine 1 auf der der entsprechenden Spalte ausgibt, kommen die Zeilensignale an. Jetzt muss ich ja um alle Taster zu erkennen quasi wie beim Multiplexen vorgehen, eine Spalte nach der anderen freigeben und die Zeilensignale auslesen. Das Problem ist jetzt, dass ich manchmal wieder falsche Signale erhalte. Beim loslassen des Tasters, erkennt der Controller plötzlich ein Signal auf allen Spalten und den unteren drei Zeilen, egal welchen Taster ich drücke.

Folgenden Code verwende ich zum auslesen, wobei BUTTON_MATRIX dem Port entspricht, an dem die Matrix angeschlossen ist:

buttonGet: push PSW ;PSW retten
clr RS1 ;Registerbank 0 wählen
clr RS0
push AR0
push AR1
push AR2

mov R0,#4
mov R1,#11111110b

bGLoop: mov BUTTON_MATRIX,R1
mov A,BUTTON_MATRIX
anl A,#11110000b
cjne A,#0,bGLoopP
sjmp bGLoopC

bGLoopP: mov R2,BUTTON_MATRIX
xch A,R2
cpl A
anl A,#00001111b
orl A,R2
sjmp bGRet

bGLoopC: mov A,R1
rl A
mov R1,A
djnz R0,bGLoop

bGRet: mov BUTTON_MATRIX,#11110000b ;Zeilen freigeben, Spalten aktivieren
pop AR2
pop AR1
pop AR0
pop PSW ;PSW wiederherstellen
ret

Als Rückgabewert erhalte ich manchmal als falschen Rückgabewert im Akku 11101111b. Habe ich jetzt etwas im Code falsch gemacht, oder ist meine Hardware mal wieder suboptimal, wäre ja nicht das erste Mal.

Vielen Dank für jede Hilfe.

MfG
Der Eisvogel

Der Eisvogel
27.03.2013, 14:50
Hallo,

also ich habe das Problem ebens selbst lösen können. Die Verstärkerschaltung ist doch hinfällig. In der Tastenmatrix befinden sich Dioden um Rückkopplungen zu verhindern, diese sollte man nach Möglichkeit immer in Durchlassrichtung verwenden und nicht umgekehrt, ich musste nur Spalten- und Zeilensignale tauschen und schön hat der Controller es erkannt.

Danke an alle die sich mit dem Thema auseinandergesetzt hatten.

MfG
Der Eisvogel