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
Infos zum Aufbau einer Matrixtastatur gibt's im Anhang. Wie das PC-Tastaturprotokoll funktioniert erfährst du auf http://www.beyondlogic.org. Gruß Andreas
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
hab noch eine frage zu der matrix.. wie sind die Taster miteinander verbunden? oder hat jemand einen kontaktplan der schaltung? mfg willy
"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
P.S.: fürn AVR: #define idata #define code #define P0 PORTA #define P2 PINB und statt reg51.h eben io.h Peter
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.....
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'
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
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....
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.
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.