Forum: Mikrocontroller und Digitale Elektronik Problem mit Tastaturmatrix 3x4


von Michael O. (michi26206)


Lesenswert?

Hi,

ich habe eine Tastaturmatrix. Diese funktioniert auch. (Mit Multimater 
nachgemessen) Die Schaltung die am uC funktioniert ebenfalls. Wenn ich 
Taste 1 drücke kommt +5V am Ts1 (Pc.0) an.

Nun möchte ich abfragen welche Taste gedrückt wurde.
Hier mal mein Code für Reihe 1 (Tr1):
1
   If Ts1 = 1 Then
2
      'Taste 1 wurde gedrückt
3
      Cls
4
      Locate 1 , 1
5
      Lcd "Taste 1"
6
      Sound Summer , Pulses , Periods
7
   End If
8
   If Ts2 = 1 Then
9
      'Taste 2 wurde gedrückt
10
   End If
11
   If Ts3 = 1 Then
12
      'Taste 3 wurde gedrückt
13
   End If

Hier noch ein Schema meiner Tastatur (T enspricht einer Taste):

Tr1 = Pa.3
Tr2 = Pa.2
Tr3 = Pa.1
Tr4 = Pa.0
Ts1 = Pc.0
Ts2 = Pc.1
Ts3 = Pc.2

        Ts1   Ts2   Ts3
         |     |     |
Tr1 -----T-----T-----T
         |     |     |
Tr2 -----T-----T-----T
         |     |     |
Tr3 -----T-----T-----T
         |     |     |
Tr4 -----T-----T-----T

Kann mir wer helfen? Wo liegt mein Fehler?

PS: Ich verwende nen Atmega16 mit 16MHz Quarz

Gruß Michi26206

von Peter D. (peda)


Lesenswert?

Michael O. schrieb:
> Wenn ich
> Taste 1 drücke kommt +5V am Ts1 (Pc.0) an.

Und was, wenn Du nicht drückst?

Deshalb ist high ungünstig, man benötigt ja externe Pulldowns.
Man legt die Ausgänge auf low und schaltet an den Eingängen die internen 
Pullups ein.

Und man legt immer nur einen Ausgang auf low und alle anderen auf 
tristate. Sonst kommt es zu Datenkämpfen, wenn jemand 2 Tasten drückt.


> Wo liegt mein Fehler?

Welcher Fehler?

Du mußt schon den Fehler beschreiben, also:
- was soll wie funktionieren?
- was erwartest Du bei welcher Aktion?
- was passiert stattdessen?


Peter

von Michael O. (michi26206)


Lesenswert?

Wenn ich nichts drücke liegen 0V an.

Ich verwende die internen Pullups. Allerdings für die Ausgänge^^

Was ich erwarte:

wenn ich Taste 1 drücke soll auf dem LCD die Nachricht kommen und der 
Summer "summen". Passieren tut nichts.

von Michael O. (michi26206)


Lesenswert?

> Man legt die Ausgänge auf low und schaltet an den Eingängen die internen
> Pullups ein.
>
> Und man legt immer nur einen Ausgang auf low und alle anderen auf
> tristate. Sonst kommt es zu Datenkämpfen, wenn jemand 2 Tasten drückt.

verstehe das jetzt nicht ganz, ich muss ja die Spannung der Matrix 
schalten. Also wenn ich Ts1, Ts2 und Ts3 abfragen will, schalte ich im 
Moment dern Pullup des Ports/Pins ein, welcher an Tr1 hängt. Wie müsst 
eich das genze vershclaten damit es so funktioniert wie du meinst. Bin 
im Moment mehr als verwirrt.

Gruß

PS: Musste neuen Post aufmachen da ich den alten nicht editieren konnte.

von Peter D. (peda)


Lesenswert?

Michael O. schrieb:
> Wenn ich nichts drücke liegen 0V an.

Und woher kommen die (Schaltplan)?

Strom braucht immer nen Weg (Draht).
Von nichts kommt nur Mist (kapazitive Einkopplung).

Im allergünstigsten Fall bleibt die Schaltungskapazität (~100pF) auf den 
vorherigen Pegel aufgeladen.


Peter

von Michael O. (michi26206)


Angehängte Dateien:

Lesenswert?

vom AVR. Aber jetzt wo du´s sagst hab ich glaub nen Wurm in meiner 
Schaltung bin mir nicht sicher^^ Bin heute total neben der Kappe aber es 
soll fertig werden :(

Anbei die Schaltung (allerdings mit nem Atmega 32P da ich den 16er nicht 
gefunden habe) und die Kontaktbelegung der Matrix.

von Michael O. (michi26206)


Angehängte Dateien:

Lesenswert?

Morgen zusammen,

habe das ganze jetz umgebaut das ich beim Tastendruck Low am uC habe.

aktualliesiertes Programm:
1
   If Tr1 = 0 Then
2
      'Taste 1 Wurde gedrückt
3
      Cls
4
      Locate 1 , 1
5
      Lcd "Taste 1"
6
      Sound Summer , Pulses , Periods
7
   End If
8
   If Tr2 = 0 Then
9
      'Taste 4 Wurde gedrückt
10
   End If
11
   If Tr3 = 0 Then
12
      'Taste 7 Wurde gedrückt
13
   End If
14
   If Tr4 = 0 Then
15
      'Taste * Wurde gedrückt
16
   End If

Habe das ganze jetz mal manuell probiert, einfach an den Pin der der 
Eingang ist gnd angelegt. Da rührt sich nichts. Kann es sien das mein uC 
von rumleigen kaputt gegangen ist? Oder das die ISP ne macke hat. Das 
LCD funktioniert nämlich super.

Gruß

von Michael O. (michi26206)


Lesenswert?

So nach dem fast 500 Doppelpost. Naja nicht ganz ist mir mein Fehler 
aufgefallen. Der eine Pin liegt zwar auf +5V aber keiner dieser Pins 
liegt auf GND. Könnte mir jemand sagen, wie ich die Matrix verschalten 
muss?

von Michael O. (michi26206)


Lesenswert?

So nachner Pause und viel frishcer Luft habe ich es jetz in bekommen.

Allerdings habe ich das Problem, das wenn ich in Reihe 1 irgendeine 
Taste betätige kommt immer Taste 1 am LCD. D.h. es wird immer Taste 1 
erkannt obwohl z.B. Taste 4 gedrückt wurde.

Hier ist der aktuelle Programmcodeauschnitt:
1
   If Tr1 = 0 Then
2
      'Taste 1 Wurde gedrückt
3
      Cls
4
      Locate 1 , 1
5
      Lcd "moep 1"
6
      Sound Summer , Pulses , Periods
7
   End If
8
   If Tr2 = 0 Then
9
      'Taste 4 Wurde gedrückt
10
      Cls
11
      Locate 1 , 1
12
      Lcd "4"
13
   End If
14
   If Tr3 = 0 Then
15
      'Taste 7 Wurde gedrückt
16
      Cls
17
      Locate 1 , 1
18
      Lcd "Taste 7"
19
   End If
20
   If Tr4 = 0 Then
21
      'Taste * Wurde gedrückt
22
      Cls
23
      Locate 1 , 1
24
      Lcd "Taste *"
25
   End If

Gruß

edit: Ich verwende diese Tastatur: 
http://www.conrad.de/goto.php?artikel=709840

Und der Schaltpaln sieht im Moment wieder so aus: 
http://www.mikrocontroller.net/attachment/55488/matrix.jpg
Bei den Eingängen sind die Pullups ein. Und bei den Ausgängen die 
Pullups der Spalten, die nicht abgefragt werden.

Die hast du (Peter Dannegger) ja auch schon mal verwendet. Kann es sein 
das meine ne Macke hat? Denn wenn ich die Taste drücke, bleibt d3er 
Kontakt der Taste wohl noch ca. 1-5 Sekunden bestehen. Und manchmal wird 
sogar die richtige Taste erkannt.

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.