www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Matrix-Tastatur


Autor: boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
hat schon mal jemand eine Matrixtastatur mit dem AVR aufgebaut?
Es sollen 8x4 Tasten gelesen werden. Der Controller soll dann die Daten 
so Umsetzen, daß sie von einem PC am Keyboardanschluß gelesen werden.
Hat jemand die Spezifikation für die Datenübertragung zum PC?

Vielen Dank
Gruß
Boris

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Infos zum Aufbau einer Matrixtastatur gibt's im Anhang.
Wie das PC-Tastaturprotokoll funktioniert erfährst du auf 
http://www.beyondlogic.org.

Gruß
Andreas

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
toller anhang! :-)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
LOL ;-)
Na jetzt aber.

Autor: sascha wuest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

an dieser Stelle eine "Xtreme Newbie" Bitte:
Hat jemand eine kurze Routine in C auf seiner Platte mit der man die in 
Matrix.txt genannte Methode der Abfrage testen kann?
Ich habe hier ein STK 500 (benutze die internen 10k Pull-Ups anstatt der 
genannten 10k Widerstände) und eine 3x4 Matrix Tastatur.

Der Anleitung zu Matrix.txt bin ich gefolgt (Vorher natürlich AVR-GCC 
Tutorial absolviert). Leider klappt hier mit der Matrix Tastatur gar 
nix. Ich erhalte dauernd 3-4 gleichzeitig aktive Tastendruecke (nein es 
liegt nicht am Prellen) oder auch mal überhaupt keine Rückmeldung. Ich 
habe alles zig Mal überprüft. Deswegen wäre ein kurze Testroutine klasse 
um sicherzugehen, dass mein Code nicht Murks ist.

Danke
Sascha

Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab noch eine frage zu der matrix.. wie sind die Taster miteinander
verbunden? oder hat jemand einen kontaktplan der schaltung?
mfg willy

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Hat jemand eine kurze Routine in C "

Klar doch:

http://www.mikrocontroller.net/forum/read-4-20511.html#new


Das Aufbohren von 3*8 auf 4*8 sollte kein Problem darstellen.


Peter

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:

fürn AVR:

#define idata
#define code
#define P0 PORTA
#define P2 PINB

und statt reg51.h eben io.h


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Hi,

versuch gerade den Code von Peter zu verstehen. Nur kann ich ihn gar
nicht erst kompilieren.

Krieg immer die Fehlermeldung das PORTA nicht deklariert ist.

Hab meinen Code mal angehängt.....

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann das vielleicht auch was mit der Version vom AVR Studio zu tun
haben?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für einen Controller verwendest Du? Der Mega8 hat z.B. gar keinen
Port A...

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh,

bin ich blöd. Hab den mega88, der hat auch keinen PortA.

Jetzt kann ich es zwar ohne Fehler kompilieren, aber sobald ich auf
Build&Run gehe bekomme ich folgenden Fehler:

../../../../../avr-libc-1.4.3/crt1/gcrt1.S:51: undefined reference to
`main'

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja nur die Ausleseroutine.

Du brauchst noch Dein Programm, was die Funktion aufruft und dann mit
den Tastencodes irgendwas anfängt.


Wenn Du Reifen kaufst, brauchst Du eben auch ein Auto, um damit fahren
zu können.


Peter

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

dann werd ich mich mal dranmachen und versuchen deinen Code zu
verstehen. Die erste Teil ist soweit klar, nur hier gehts dann schon
los:

uchar code ROW[] = { ~0x01, ~0x02, ~0x04 };  // low active

  for( i = 0; i < 3;  ++i ){

    P0 |= ~0x07;
    P0 &= ROW[i];        // set rows
    column = P2;        // readcolumn

Versteh ich noch nicht ganz....

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte, bitte, bitte. Besorg dir ein Einführungsbuch in C.
Du wirst es brauchen.


~ macht eine bitweise Negierung.
| ist das Symbol für bitweises ODER
& bedeutet bitweises UND

Die Schreibweise   a |= b   ist die Kurzform für  a = a | b;

Und 0x  leitet eine Hexadealzahl ein.

> uchar code ROW[] = { ~0x01, ~0x02, ~0x04 };  // low active

0x01  ist also die Hexadezimalzahl 1, bitweise also  00000001
~ negiert das ganze, also                            11111110

selbiges für all die anderen Konstanten.

> P0 |= ~0x07;

bedeutet also  P0 = P0 | ~0x07;

Da wird also P0 hergenommen und mit etwas verodert. Womit?
Mit ~0x07   0x07 ist wieder die hex Schreibweise für 00000111
Die Tilde ~ macht daraus 11111000. Und wenn man das mit einem
anderen Wert verodert, dann werden genau die Bits auf jeden Fall
gesetzt, die in 11111000 auch 1 sind. Denn gemäß der ODER
Tabelle:

     OR   A   B   Ergebnis
        --------------------
          0   0      0
          1   0      1
          0   1      1
          1   1      1

Ist das Ergebnis genau dann eine 1, wenn entweder A oder B oder
beide 1 sind.

> P0 &= ROW[i];
Selbiges hier:   P0 = P0 & ROW[i];

Mittels Und werden meistens Bits gelöscht. Da das Ergebnis einer
UND Verknüfung nur dann 1 ist, wenn beide beteiligten Bits eine
1 aufweisen. Mann benutzt daher gerne binäre Masken wie zb 00011000,
damit im Ergebnis auf jeden Fall an der Bitposition eine 0 auftaucht,
wo auch in der Maske eine 0 ist.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versteh das nicht!

Habe jetzt nen paar mal versucht nachzuvollziehen, was in diesem Code
passiert.

Kann mir denn vielleicht einer mal das Grundprinzip erklären? Schalte
jetzt mit einem Taster einen bestimmten Port auf high. Wie kann ich
z.B. einen Port der gesetzt ist in diesen Code einfügen?

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

Bewertung
0 lesenswert
nicht lesenswert
Ich poste dir mal ein älteres Projekt von mir. Da wird eine 4x4 Tastatur
ausgelesen und per USART zum PC getrommelt. Villeicht hilft's dir
weiter!

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So was in der Art hab ich gesucht

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool, danke.....

Wo genau wird denn die entprellung gemacht? in scankey, oder?

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gleich nach der Auswertung. Damals hatte ich aber das _delay - Makro
noch nicht richtig verstanden, deshalb stimmt die Zeit nicht. Sind noch
ein paar andere Kleinigkeiten die verbesserungswürdig sind, also bitte
um Nachsicht.

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.