Ich baue gerade ein Gerät, das ein Signal an eine Schaltung geben soll,
wenn man eine "Num"(Zahlen)-Taste einer an den PC angeschlossenen
Tastatur betätigt. Das UART dient mir aber derweil für Debug-Zwecke.
Die Scancodes der Tastatur werden auch richtig empfangen, aber es
mischen sich auch Host -> KB-Kommandos dazu, zumindest nach einem
ACK(FA) der Tastatur. Kann es sein, dass ein Kommandoparameter ohne
vorheriges "loslassen"(High) der Clock-Leitung gesendet wird?
Wenn ich auf der Tastatur keine Taste betätige sendet sie in
regelmäßigen Intervallen(1sec) FE == Resend. Es könnt aber auch vom
Computer kommen.
Ansonsten funktioniert die Tastatur einwandfrei. Ich teste das Ganze
aber auf einem Laptop, kann das der Grund sein?
Hier ein paar Links, die mir als Infirmationsquelle dienten:
http://www.computer-engineering.orghttp://www.beyondlogic.org/keyboard/keybrd.htmhttp://elektronik-kompendium.de/public/arnerossius/schaltungen/avr/kdbleds.htm
Danke schon mal im Voraus,
Bei euch weiß sicher einer den Fehler :)
MisterMime
Hallo,
Kann mir bitte Jemand mit einem Oszi so ein Bild machen?
http://www.computer-engineering.org/index.php?title=Image:Waveform2.jpg
Zumindest an der Stelle, wenn die Tastatur eine Antwort (FA) geschickt
hat und der Host einen Parameter schickt. Den Übergang zumindest. Werden
da beide Leitungen kurz High?
Bei dem Einschalten einer Tastaturled wird ja:
zuerst E0 vom Host gesendet
FA von der Tastatur
eine Bitmaske für den Ledstatus
und noch ein FA
Wäre sehr nett.
Du mußt mit Deinem Gerät prüfen, ob der PS2-port gerade frei ist, also
die interne Computertastatur gerade nicht ´rumdödelt. Dazu mußt Du den
idle Zustand der Clock und Datenleitung, direkt bevor das Gerät senden
will, nochmals überprüfen (beide müssen "High" sein). Es werden Timings
in den Spezifikationen genannt, die einzuhalten sind, sonst gibt es
Datensalat. Ist der Bus gerade nicht frei, muß Dein Gerät die Scancodes
solange speichern können, bis der Bus wieder frei ist. Guck mal auch bei
www.marjorie.de, da gibt´s ´ne schön kompakte Beschreibung.
Die interne Tastatur gibt nix an dem Keyboard-Anschluss aus. Ich seh da
nur Teile der Initialisierungsdaten wenn ich die externe anstecke. Es
wird nur z.B. ein "Numlock-led-ein"-Signal gesendet wenn ich auf der
internen was drücke sonst nix.
Aber dass ich auf HIGH bei beiden Leitungen warten muss kann schon sein,
ich schau mir das gleich nochmal an.
Wenn ich zusätlich noch ein wait für das andere beim Ende von Discard
und Process einfüge kommen nur falsche Werte heraus. Es muss irgendwie
an dem Übergang zum nächsten Byte liegen. Wenn der Host zusätzlich zum
Kommando noch einen Parameter sendet.
am Ende von Process einfügt dann wir bei dem Einschalten der Num-Led das
zweite FA durch ein E9(06 wird vom Host gesendet) oder FF ersetzt(wenn
00 ges wird.)...
So:
(ein)FA E9 (aus)FA FF
so sollte es sein:
FA FA FA FA
Die Parameter sollten nicht empfangen werden.
Mit denen:
FA 06 FA FA 00 FA
Da rutschen dann die Parameter in das zweite ACK (FA) ??
Ich versteh nur Bahnhof... Bei meinem Joystick-Adapter, den ich mal
gebaut habe, habe ich einen externen Tastaturanschluß angefügt, um das
Teil zwischen die PS/2 Leine hängen zu können. Was mein Adapter tut, ist
diesen externen Anschluß zu kontrollieren, ob da beide Leitungen High
sind. Die Tastatur hat als Vorrang vor den Joysticks. Wenn Die Leitungen
Datenverkehr anzeigen, darf nichts vom Gerät auf den Bus gegeben werden,
solange bis für mindestens eine Bytelänge Ruhe ist. Irgendwo stand
dieser Mindestabstand mal beschrieben. Die Tastatur selbst kontrolliert
auch den Idlezustand, wenn das Gerät sendet, muß sie die Daten
speichern, bis der Bus wieder frei ist und darf dann erst wieder senden.
Das funktioniert eigentlich sehr zuverlässig.
Ich will mit meinem Gerät ja keine Daten senden sondern nur auf eine
Übertragung von der Tastatur reagieren. Wenn man eine Taste am
Ziffernblock drückt.
Bei meiner Routine kommen aber seltsamerweise Kommandos von der Tastatur
zum Keyboard an.
Hier mal ein Beispiel: (Bei Betätigen der Caps-Lock Taste,
großschreiben)
Erstmal ohne herausfiltern der Host -> KB- Kommandos.+
Tastatur:
58 - Betätigung der Capslock-Taste/Scancode
PC:
ED - Set Status Leds
Tastatur:
FA - Acknowledge/Verstanden
PC:
04 = 0b00000100 - Bitmaske für eingeschaltete Numlockled
Tastatur:
FA - -||-
Die Leitung ist kurz Idle
Tastatur: (Taste wird losgelassen)
F0 - "Loslass"-Code
58 - Der Scancode der Capslocktaste, wie oben
Fertig
Mein Code empfängt aber folgenes:
58 FA 04 FA F0 58
Das ED ist, wie es sollte nicht da, aber 04 sehrwohl, obwohl es vom PC
gesendet wird.
Es sollte so sein:
58 FA FA F0 58
FA kann ich ja ignorieren und den auf F0 folgenden Scancode, dann hab
ich nur mehr 58 -- So wie es sein soll, aber das wird ja später gemacht.
Kann es sein, dass (die Tastatur gibt ja CLK vor!) nach einem ACK von
einem Befehl der einen Parameter hat, die Leitung zwischen ACK und
Parameter nicht im Idle-Zustand ist?
Die Timings sind ja nicht wichtig, da der µC ja nur "lauscht" und nicht
senden will.
Das war jetzt zwar lang, aber ich hoffe, dass es verständlich ist :)
Ich dachte mir schon, der Thread wird zum Selbstgespräch...
Danke, dass du mir helfen willst TravelRec.
...,
MM
Ja nöö, das Timing ist schon wichtig, wenn der Controller alles
mitbekommen soll. Außerdem muß der Controller schnell genug den Bus
scannen und immer den Idle-Zustand checken. Daß das Gerät nichts senden
soll, ist erstmal hilfreich. Vom Prinzip her kann Dein Gerät doch aber
genau feststellen, was der PC sendet und was von der Tastatur kommt
(siehe hier: http://www.marjorie.de/ps2/ps2_protocol.htm die Diagramme
unten). Demzufolge ist das Ausmaskieren nichtrelevanter Bytes doch kein
Problem, oder?
Ja, bei den Kommandos ist es ja kein Problem, bei den Kommandos
funktioniert es ja.
Aber nachdem ein FA von der Tastatur(ACK für das Kommando) kommt, wie es
sollte sendet ja der PC eine Antwort. Diese Antwort bekommt mein Code
auch, obwohl er ihn, indem er in der Hauptschleife wartet bis CLK oder
DATA Low wird verwerfen.
Aber anscheinend ist die Leitung zwischen dem FA und dem Parameter nicht
frei.
Übrigends ist die Seite die gleiche wie www.computer-engineering.org ,
nur halt übersetzt...
Die Links hab ich ja ganz oben schon gepostet.
Eigentlich sollten die Hostkommandos gar nicht stimmen, weil der Zustand
bei CLK=High statt Low gelesen wird.(zumindest ist es nicht garantiert)
Najaaa, aber bevor der PC etwas sendet, MUSS er doch einen langen
Clock-Low Puls geben, der seine Daten quasi einleitet und die Tastatur
zum Senden der Clocks animiert. Wenn dieser lange Puls von Deinem Code
wahrgenommen wird, kann doch das kommende Gelaber getrost verworfen
werden, bis der PC dann mal wieder fertig ist.
Beim langen brauch ich doch wieder einen Timer oder zumindest eine
Zählschleife...
Könntest du mal kurz in einen Chat mit mir gehen, dann können wir das
schneller besprechen :)
Schau mal bei der Überschrift Protokoll, beim Punkt 4:
Zuerst zieht die Tastatur Data auf low (Startbit), um den Beginn eines
zu übertragenden Bytes zu kennzeichnen. Danach wird von der Tastatur
Clock für eine Weile auf low gezogen.
Beim "Daten vom PC"-Bild ist CLK ja am Ende Low, kann es sein, dass es
nicht HIGH geht sondern der Parameter( 02 ) ohne "Einleitung"(fallende
Flanke an CLK) gesendet wird?
Auch unter der Überschrift Protokoll, ganz zu Anfang steht für den
Zustand CLK=0 "PC ist beschäftigt" bzw. "PC wird resettet". Und dann
"Grundsätzlich kommt der Takt von der Tastatur, sowohl zum Senden von
Daten an den PC, als auch zum Empfang von Daten vom PC."
Also muss der Clock für jedes Zeichen erst wieder auf HIGH gehen, um das
Startbit der nächsten Sendung zu übertragen. Allenfalls könnte der PC
nach Erkennen des Acknowledge-Bits auf sein Busy verzichten und das
DATA-Low übergangslos fortsetzen, aber ob das Praxis ist, weiß ich
nicht.
Hallo Maierhofer! (MisterMime)
Dun schreibtst so wirres Zeug das ich Kopfweh davon bekomm, hast du
sonst nichts zu tun?
@ alle anderen:
Ihr seid genauso schlimm ;D
Hat irgendwer ein Speicheroszi, und kann er mir eine Aufnahme von der
Tastaturkommunikation machen?
Im ersten Post sind Links gepostet, auf denen die Pinbelegungen sind.
Einfach die eingänge an DATA und CLK hängen, sind
Opencollector/drain-Ausgänge(0-5V)
...
Das weiß ich eigentlich schon, ich versteh aber nicht warum mein
"Programm" auch die Kommandoparameter empfängt und warum ein mal pro
Sekunde Resend gesendet wird...
Vielleicht, eine "Überwachung", damit der Laptop weiß, dass die Tastatur
nicht abgesteckt wurde.
Die CLK-Leitung wird seltsamerweise auch getoggelt, wenn keine Daten
gesendet werden.
Wenn nur jemand mal versuchen würde den Code "nachzuvollziehen"......
...,
Mistermime
Um das zu verifizieren, nimm einfach mal ´nen anderen Computer,
meinethalben einen normalen Tower-PC. Und die Clock-Leitung kann NUR die
Tastatur toggeln, niemand sonst (höchstens Dein Gerät....).
Es ist offenbar doch noch das Protokoll, wo Dein Verständnis klemmt.
Also fangen wir noch einmal ganz von hinten an :-)
Dass die CLK-Leitung auch getoggelt wird, wenn keine Daten gesendet
werden, ist alles andere als seltsam, sondern das ganz normale "Busy"
vom PC, das jederzeit und auch rein prophylaktisch vorkommen kann, da
die Tastatur ja den Takt erzeugt und von sich aus halt nicht ahnen kann,
wann der PC empfangen kann und wann nicht. Das ist wie mit dem berühmten
"Bitte nicht stören"-Schild an der Hotelzimmertür: Das hängt man ja auch
nicht erst dann auf, wenn das Zimmermädchen schon am (doppelt belegten)
Bett steht...
Dann die zyklische "Rückversicherung" per Resend - ich denke, mit Deiner
Vermutung liegst Du nicht daneben. Derlei hat übrigens einen eigenen
Namen: Phantom.
Und schließlich ist die Sache mit den Kommandoparametern "in der
Literatur" vielleicht nicht völlig klar beschrieben, aber doch streng
logisch: Wenn ein bestimmtes Kommando ein Parameterbyte braucht, weiß
das sowohl der Sender als auch der Empfänger. Von daher ist es
überflüssig, die Sendung des Parameterbytes per RTS-Prozedur erneut
anzumelden, sondern es reicht, wenn der Sender (PC) von sich aus nur
erneut das Startbit vorgibt.
Im übrigen hab ich Deinen Code zwar nicht bis ins Letzte
"nachvollzogen", aber immerhin soweit, um noch anzumerken, dass der
AVR-DEC-Befehl durchaus mehr kann, als Du ihm zutraust. Ansonsten finde
ich ihn etwas zu sehr "klein in klein" formuliert. Konkret ist er nicht
in der Lage, mehrere Bytes zu überblicken - was zum Ausblenden der
fraglichen Sendungen vom PC aber unbedingt nötig ist.
Ich hoffe, mal ein bisschen geholfen zu haben.
Gruß Johannes
Falls es noch interresse besteht, folgt hier ist mein Code.
Kommunikation in beide Richtungen möglich. Getestet mit Terminalprogramm
Docklight.
Viel Spaß damit Gruß Daniel
Ein bischen sehr spät aber doch noch, die funktionierende Version vo dem
ganzen. Danke für eure Hilfe, Leute! Schade, dass mir keiner eine
Logikanalysator-"Aufnahme" gemacht hat... Aber ich habe sie dann mit
einem Playstation SingStar-Mikrophonadapter, der Stereo hat aufnehmen
können.