Forum: Mikrocontroller und Digitale Elektronik PC/AT Keyboard verhält sich nicht wie erwartet


von Florian (Gast)


Lesenswert?

Hallo zusammen,

versuche gerade ein altes PC/AT Keyboard mit dem Atmel anzusteuern. 
Leider verhält sich das Keyboard nicht wie erwartet.

Ich habe das Clock Signal an INT0 und die Datenleitung an einem weiteren 
Portpin. Ich kann das Signal auch dekodieren. Einige Scancodes 
funktionieren (z.B. 0x29 für Space, 0x1c für A, etc.). Aber manche 
Sachen verhalten sich anders, als ich es gelesen habe.

Z.B. die Pfeiltasten oder die Home/Ende Tasten, etc. senden alle den 
Code 0xE0, aber danach kein weiteres Byte, was nachdem was ich gelesen 
habe aber bei Tasten mit "extended code" so sein müsste. Ausserdem wird 
beim loslassen einer Taste lediglich 0xF0 gesendet, aber nicht 
nocheinmal der Code der Taste die losgelassen wurde.

Ich habe das ganze mit zwei verschiedenen Tastaturen ausprobiert, daher 
denke ich, dass es an meiner Software liegen könnte.

Ausserdem habe ich gelesen, dass es verschiedene "Betriebsmodi" für 
solche älteren Tastaturen gibt. Bin ich eventuell im falschen? Wie änder 
ich den?

Danke schonmal!

Gruss
Florian

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Sehr alte Tastaturen haben u.U. einen anderen Scan-Code Satz. Die mit 
Mini-Din-Stecker (PS2) starten alle in dem Code-Satz, den Du beschrieben 
hast und es sollte keine Probleme geben, selbst wenn die Tastatur nicht 
initialisiert ist. In dem Fall liegt´s dann wirklich an Deinem Programm.

von Florian (Gast)


Lesenswert?

Hmm. Aber irgendwas stimmt doch hier nicht. Die Pfeil Hoch und Pfeil 
Runter Taster erzeugen exakt die gleichen gesendeten Bytes. Wie soll der 
PC denn da unterscheiden welche Taster gedrückt wurde?

von Klaus R. (klaus2)


Lesenswert?

...wie decodierst du das PS2 Signal denn?

Geht das evtl über Hyperterminal o.ä.?

Klaus.

von Florian (Gast)


Lesenswert?

Ich habe die Clock an einem Interrupt Pin. Ich lese die 11 Bits (Start, 
8 mal Payload, Parity, Stop) bei jedem Interrupt ein und schreib den 
Payload in eine Variable. Den Payload dekodieren mache ich garnicht, ich 
schicke einfach die empfangenen Bytes per UART an den PC um sie 
anzuzeigen. Und wenn ich Pfeil hoch oder Pfeil runter drücke auf der 
Tastatur, kommt das gleiche am PC an, etc..

Werd es nachher mal mit einer PS2 Tastatur testen. Im moment habe ich 
hier zwei alte Tastaturen mit dem größeren Stecker..

von Stefan S. (energizer)


Lesenswert?

Da ist auf jeden Fall ein Fehler in Deinem Code; bestimmte Tasten 
erzeugen beim Drücken einen Scancode, der aus mehr als einem Byte 
besteht, die Pfeil-nach-oben-Taste z.B. 0xE0 0x48. Scancodes die mehr 
als 1 Byte haben fangen immer mit 0xE0 an.
Scancodes der jeweiligen Taste findest Du z.B. hier:

http://www.marjorie.de/ps2/scancode-set1.htm

Gruß
Stefan

von Flo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe es jetzt nochmal probiert. Sieht schon etwas besser aus (z.B. wird 
bei den Pfeiltasten jetzt der korrekte Scancode gesendet). Aber 
irgendwas funktioniert hier immernoch nicht so wie es soll, habe ich das 
Gefühl.

Könnte jemand bitte mal meinen Code ansehen? (Anhang)

Danke!

Gruss
Flo

von Flo (Gast)


Lesenswert?

Ich habe das Gefühl, dass ich jedes zweite Byte verliere.

Z.B. sollte die "Pause" Taste ja den Scancode "E1 14 77 E1 F0 14 F0 77" 
generieren. Bei mir kommt aber nur "E1 77 F0 F0" an.

An der Tastatur liegt es definitiv nicht. Habe schon 4 verschiedene 
Tastaturen getestet.

Wäre schön, wenn jemand eine Idee hat, woran das liegen könnte!

Danke!

von Flo (Gast)


Lesenswert?

Okay, habe das Problem gelöst. Blockierende Aufrufe für langsame UART 
Routinen sollte man nicht in zeitkritischen ISRs aufrufen :-)

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.