mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Tastaturmatrix 3x4


Autor: Michael O. (michi26206)
Datum:

Bewertung
0 lesenswert
nicht 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):
   If Ts1 = 1 Then
      'Taste 1 wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "Taste 1"
      Sound Summer , Pulses , Periods
   End If
   If Ts2 = 1 Then
      'Taste 2 wurde gedrückt
   End If
   If Ts3 = 1 Then
      'Taste 3 wurde gedrückt
   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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael O. (michi26206)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael O. (michi26206)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael O. (michi26206)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael O. (michi26206)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Morgen zusammen,

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

aktualliesiertes Programm:
   If Tr1 = 0 Then
      'Taste 1 Wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "Taste 1"
      Sound Summer , Pulses , Periods
   End If
   If Tr2 = 0 Then
      'Taste 4 Wurde gedrückt
   End If
   If Tr3 = 0 Then
      'Taste 7 Wurde gedrückt
   End If
   If Tr4 = 0 Then
      'Taste * Wurde gedrückt
   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ß

Autor: Michael O. (michi26206)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael O. (michi26206)
Datum:

Bewertung
0 lesenswert
nicht 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:
   If Tr1 = 0 Then
      'Taste 1 Wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "moep 1"
      Sound Summer , Pulses , Periods
   End If
   If Tr2 = 0 Then
      'Taste 4 Wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "4"
   End If
   If Tr3 = 0 Then
      'Taste 7 Wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "Taste 7"
   End If
   If Tr4 = 0 Then
      'Taste * Wurde gedrückt
      Cls
      Locate 1 , 1
      Lcd "Taste *"
   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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.