mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastaturmatrix entprellen


Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine Tastaturmatrix mit 4*4 Tasten. Die Zeilen werden der Reihe 
nach auf "high" gelegt und dann jeweils die Spalten ausgelesen. 
Zusätzlich sind die Spalte über Dioden mit einem 9. Kabel verbunden, 
über welches ein ext. Interrupr ausgelöst wird.
Kann ich dieses Ding über Software entprellen oder funktioniert das 
nicht?
Die Interrupts schalte ich sofort nach dem Aufruf aus, was aber nur das 
setzten weiterer Int´s verhindert, nicht aber das Prellen der einzelnen 
Tasten.
Wie erledigt man diese Aufgabe korrekt?

Gruß,
Rudi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst einen Timerinterrupt und keinen externen Interrupt.
Und dann liest Du zyklisch ein und akzeptierst nur den Code, der 2-mal 
hintereinander erkannt wurde.

Da fast jedes Programm einen Timer braucht, kann man die Tastaturroutine 
einfach da mit rein hängen.

Hier meine Version:

http://www.specs.de/users/danni/appl/soft/keyscan/index.htm


Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rudi,
vielleicht hift Dir dieser Hinweis 
http://www.mikrocontroller.net/forum/read-4-16594.html.

Gruß Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael,

und was hat Dein Link mit einer Tastaturmatrix zu tun ?


@Rudi,

wenn Du zum Auslesen High anlegst, must Du ja an allen Eingängen noch 
extra Pull-Down-Widerständen haben !

Deshalb lege ich die Zeilen zum Auslesen auf Low und nehme die interen 
Pull-Ups.

Beim AVR muß man außerdem beachten, diesen Low-Pegel mit den 
DDRx-Registern zu erzeugen, d.h. nur zwischen Hochohmig und Low 
umzuschalten.
Sonst kommt es zu Datenkämpfen, wenn man mal mehrere Tasten gleichzeitig 
drückt.


Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:

Mein Link bezieht sich auf 'entprellen'. Anstelle PortA nach 'temp' zu 
laden, muß die Matrix in einen 16-Bit-Wert eingelesen werden. Damit alle 
Tasten entprellt werden ist 'temp' auf 'short' zu erweitern: max_bits = 
16.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für's Helfen!

@Peter: Auf Deiner Seite habe ich ein paar Fehlerteufel im Text 
entdeckt. Wenn Du möchtest, mail ich Dir eine überarbeitete Version.

Rudi

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens: Den extra Pin für den externen Int. habe ich mir für später 
geleistet - der war nicht für die Entprellung gedacht. Der AVR soll 
dadurch merken, wenn eine Taste gedrückt wird, und das "Keyboard" 
durchscannen.

Rudi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rudi,

Wenns zum Verstehen des Prinzips gut genug war, hat es ja seine 
Hauptaufgabe voll erfüllt.

Ist ja auch kein Fachbuch.
Leider findet man in Fachbüchern auch sehr oft Fehler. Dafür hat man 
jedoch was bezahlt.
Und wenn jemand damit Geld verdient, sollte er nicht zu faul sein, seine 
Beispielprogramme auf der Begleit-CD auch zu testen.


Bin für jede Verbesserung dankbar.


Peter

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ich bin neu hier und möchte gerne dein Programm für Matrixtastatur
verwenden. Leider stimmt der Link nicht mehr. Wäre nett von dir, wenn
du  den neuen Link mal posten würdest.
Vieken Dank im voraus.
Gruß
Rolf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder appnote 204 von Atmel.com...
Allerdings liefert die dort vorgestellte Routine nur eine der Taste
entsprechende Zahl, wobei es auch wieder Prioritäten gibt...

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe.
Gruß
Rolf

Autor: Amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo , ich habe ein 10*10 tastaturmatrix , das problem ich soll die 
tastatur durch Labview Programmieren das problem ich muss erkennen alle 
tasten die gleichzeitig gedrückt sind dun die können mehr als 30 Tasten.

       Danke

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amer wrote:
> hallo , ich habe ein 10*10 tastaturmatrix , das problem ich soll die
> tastatur durch Labview Programmieren das problem ich muss erkennen alle
> tasten die gleichzeitig gedrückt sind dun die können mehr als 30 Tasten.
>
>        Danke


Bei mehr als 2 Tasten gleichzeitig, muß jede Taste mit ner Diode 
entkoppelt werden.

Das Beispiel in der Codesammlung (3*8 Tasten) kann man beliebig 
erweitern.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Amer (Gast)

>hallo , ich habe ein 10*10 tastaturmatrix , das problem ich soll die
>tastatur durch Labview Programmieren das problem ich muss erkennen alle
>tasten die gleichzeitig gedrückt sind dun die können mehr als 30 Tasten.

Das hast du doch nun schon ein halbes Dutzend mal gefragt, und du hast 
ne Menge gut Tips bekommen. Was hast du daraus bisher gemacht? Es wird 
dir keiner die fertige Lösung auf dem Silbertablett servieren.

MFG
Falk

Autor: amer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
danke Herr Peter ,
 ich habe schon die Diode eingestzt, mein problem ist jetzt in labview 
PROGRAMMIEREN , Die Platine muss ich mit einem NI usb 6501 anschliessen
ich habe schon die erste Schritte gemacht : usb konfigurieren(10 
Eingänge und10 Ausgänge)

 Danke

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo herr Falk .
 ich habe schon die Schaltunmg gemacht , und danke für deine Hilfe nur 
ich habe momeántane probleme beim programmieren (in Labview )
 ich finde einbischen Schwierigkeit

 MFG
 Amer

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Labview und irgendwelchen speziellen IO-Bausteinen kenne ich mich 
überhaupt nicht aus.

Welche Programmiersprachen unterstützt denn Labview?


Ich würde nen AVR nehmen, dort die Tastenabfrage in C schreiben und die 
Scancodes per RS232-USB Adapter an Labview senden.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Ich würde nen AVR nehmen, dort die Tastenabfrage in C schreiben und die
>Scancodes per RS232-USB Adapter an Labview senden.

Er hat ab nun mal LabView und die IO-Kiste.

http://sine.ni.com/nips/cds/view/p/lang/de/nid/201630

MfG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ amer (Gast)

>ich habe momeántane probleme beim programmieren (in Labview )
> ich finde einbischen Schwierigkeit

Nun, das Prinzip ist immer das gleiche. Man schaltet eine Spalte auf 
LOW, die anderen auf HIGH. Die Zeilen liegen alle über Pull-Up 
Widerstände auf HIGH. Wenn nun in der Spalte eine oder mehree Tasten 
gedrückt sind, dann liegen sie auf LOW. Nun leist man die erste Spalte 
ein und speichert das Ergebnis. Das Ganze wiederhlot man mit allen zehn 
SPalten). Aus den Ergebnissen kann man leicht die gedrückten Tasten 
dekodieren.

MFG
Falk

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja richtig, ich habe Digital I/O usb

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Er hat ab nun mal LabView und die IO-Kiste.

Die Probleme, die man sich mit dem sturen Festhalten an einer 
ungeeigneten Programmierumgebung einhandelt, können vielfältig sein:


Ich weiß nicht, ob Labview die elend langen USB Pollingzeiten nutzlos 
verwartet oder sinnvoll für anderes nutzt.


Ich weiß auch nicht, ob IO-Zugriffe garantiert ablaufrichtig erfolgen 
oder es zu einer Inversion kommen kann (Ausgabe erfolgt gleichzeitig 
oder nach dem Einlesen).
Vielleicht gibts da so eine Art Flush-Kommando, um die Ausgabe 
abzuschließen.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>> Er hat ab nun mal LabView und die IO-Kiste.

>Die Probleme, die man sich mit dem sturen Festhalten an einer
>ungeeigneten Programmierumgebung einhandelt, können vielfältig sein:

Mag sein, aber ich glaube dass der OP mit nem uC erst recht überfordert 
ist. Von der Einbindung in LabView, was sicher zur Steurung/Auswertung 
irgendwelcher Sachen verwendet wird, mal ganz abgesehen.

>Ich weiß nicht, ob Labview die elend langen USB Pollingzeiten nutzlos
>verwartet oder sinnvoll für anderes nutzt.

Ist doch egal, ne SuperHighTec Lösung wird das sowieso nicht.

>Ich weiß auch nicht, ob IO-Zugriffe garantiert ablaufrichtig erfolgen
>oder es zu einer Inversion kommen kann (Ausgabe erfolgt gleichzeitig
>oder nach dem Einlesen).

Du bist GCC geschädigt ;-)

>Vielleicht gibts da so eine Art Flush-Kommando, um die Ausgabe
>abzuschließen.

Alles möglich, aber der OP braucht wohl erstmal einen Anfang. Uns selbst 
wenn dort dutzende böse Waits drin sind.

MFG
Falk

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke füe die Lösung , aber :( wie auf LOW oder Heigh einsetzen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ amer (Gast)

>Danke füe die Lösung , aber :( wie auf LOW oder Heigh einsetzen

Also wenn du DAS nicht mal alleine schaffst, dann sehe ich SCHWARZ!

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

 könnten Sie mir helfen , denn das ist meie erste praktische arbeit, an 
der FH es gab nur theorie (Blätter ) ich finde praktisch was anders 
deshalb sag ich ihnen könnten sie mir helfen ?
  danke im voraus

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ amer (Gast)

> könnten Sie mir helfen , denn das ist meie erste praktische arbeit, an
>der FH es gab nur theorie (Blätter ) ich finde praktisch was anders

Naja, auch wenn ich das schwer glauben kann und dazu eine andere Meinung 
habe . . . :-(

>deshalb sag ich ihnen könnten sie mir helfen ?

Fang erstmal klein an.

1.) IOs als Ausgangs programmieren. Eine LED mit 1kOHm Vorwiderstand 
dran hängen. LED ein und aus schalten.

LED

2.) IOs als Eingang programmieren. Wenn nötig einen Pull-Up dranhängen 
und EINEN Taster anschliessen. Den Taster auslesen und im Labview 
anzeigen lassen.

AVR-Tutorial: IO-Grundlagen (ist zwar für den AVR, zeigt aber 
wie man die Bauteile anschliesst.)

Wenn das klappt und du wirklich verstanden hast wie es geht, dann kannst 
du dich an die Matrix machen.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fange klein an:

1.eine Taste einlesen

2.eine Reihe von Tasten einlesen

3.eine Matrix einlesen

4.Mehrfachdruck auswerten.


Peter


P.S.:
Kann man nun unter Labview in C programmieren oder ist das ein ganz 
spezieller eigener Dialekt, zu keiner bekannten Programmiersprache 
kompatibel?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Kann man nun unter Labview in C programmieren oder ist das ein ganz
>spezieller eigener Dialekt, zu keiner bekannten Programmiersprache
>kompatibel?

Sowohl als auch. Wobei die C-Programmierung AFAIK etwas aufwändiger ist 
und mehr Wissen verlangt.

MfG
Falk

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich danke euch

Autor: amer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo guten Tag,

 Ich habe die erste Schritte jetzt gemacht , das problem wie kann ich 
die Spalte auf Low einstellen in LABVIEW
 danke

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ amer (Gast)

> Ich habe die erste Schritte jetzt gemacht , das problem wie kann ich

Wirklich? Leutet die LED? Kannst du den Taster auslesen?

>die Spalte auf Low einstellen in LABVIEW

Indem du das IO Pin auf LOW schaltest.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Indem du das IO Pin auf LOW schaltest.

Jein.

Wenn Du mehrere Tasten drückst, kann es zu Kurzschlüssen kommen.
Du must also einen Open-Drain Ausgang nachbilden.
Dazu brauchst Du Ausgänge mit Richtungsumschaltung (sollte der IO-Modul 
ja können).
Alle Ausgangspins werden als Eingänge geschaltet und einmalig auf Low 
gesetzt.
Für den Zeitraum, wo sie nun ein Low ausgeben sollen, wird nur die 
Richtung umgeschaltet, also auf Ausgang und danach wieder auf Eingang.


Peter

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.