Forum: Mikrocontroller und Digitale Elektronik Matrix-Tastatur


von boris (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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

von Jonas Diemer (Gast)


Lesenswert?

toller anhang! :-)

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

Lesenswert?

LOL ;-)
Na jetzt aber.

von sascha wuest (Gast)


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

von willy (Gast)


Lesenswert?

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

von Peter Dannegger (Gast)


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

von Peter Dannegger (Gast)


Lesenswert?

P.S.:

fürn AVR:

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

und statt reg51.h eben io.h


Peter

von Markus (Gast)


Angehängte Dateien:

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.....

von Markus (Gast)


Lesenswert?

Kann das vielleicht auch was mit der Version vom AVR Studio zu tun
haben?

von johnny.m (Gast)


Lesenswert?

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

von Markus (Gast)


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'

von Peter D. (peda)


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

von Markus (Gast)


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....

von Karl heinz B. (kbucheg)


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.

von Markus (Gast)


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?

von Sonic (Gast)


Angehängte Dateien:

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!

von Sven (Gast)


Lesenswert?

Danke!

von Sven (Gast)


Lesenswert?

So was in der Art hab ich gesucht

von Markus (Gast)


Lesenswert?

Cool, danke.....

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

von Sonic (Gast)


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.

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.