Der Eisvogel
27.03.2013, 12: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
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