Forum: Projekte & Code PC / AT-Tastatur Routine


von FeeJai (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Dies ist mein erstes lauffähiges AVR-C-Programm. Mittels eines
Interrupts erkennt es die Signale an der CLOCK Leitung der Tastatur und
speichert sie in eine Integer-Variable. Die letzten 3 Eingaben werden
auf einem LCD angezeigt. (Mitetels Ulrich Radigs Routine)

Später soll noch eine Funktion zum Senden von Befehlen an die Tastatur
hinzukommen (e.g. Num-Lock-LED).

Daten über die Scancodes und das Verfahren habe ich
http://www.beyondlogic.org/keyboard/keybrd.htm entnommen.

Die Interrupt Routine gefällt mir so wie sie momentan ist selbst noch
nicht, aber sie funktioniert fürs erste.

Bitte sagt mir was ich besser machen kann/muss, ich bin sowohl in
Sachen AVR/µC als auch in C ein absolouter Anfänger.

Felix

von Philipp Karbach (Gast)


Lesenswert?

sehr schön für den ersten code in C :). Aber benutz vielleicht mal die
kleine taste wo Tab draufsteht ein bisschen! Ansonsten nicht schlecht

von FeeJai (Gast)


Angehängte Dateien:

Lesenswert?

Hi!
Hier ist jetzt also die Alpha 2. Code ist wesentlich lesbarer, habe
jetzt statt if-Abfragen den switch()-Befehl verwendet. Eine
Sendefunktion ist ebenfalls implementiert, leider funktioniert sie aber
nicht :,-(. Hat vielleicht jemand von euch eine Idee? Sie hat bei mir
immer nur funktioniert, wenn das LSB eine 0 war, ansonsten hat die
Tastatur nach dem ersten Taktzyklus abgebrochen. Aber ich glaube dass
ich auch dies versaut habe, als ich mit dem Code rumgespielt hab. Würde
mich über positive oder auch negative Kritik sehr freuen.

Felix

von FeeJai (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Hier ist jetzt noch eine Version. Empfangen funktioniert jetzt
einwandfrei. Senden funktioniert bei 0xFF (Reset-Befehl). Ansonsten
kommt immer FE (=Resend, d.h. Fehler) zurück. Hat schonmal jemand von
euch sowas gemacht? Ich werde die Entwicklung nun frustriert
einstellen, falls keine weiteren Vorschläge kommen sollten.

Lg,
Felix

von Philipp Karbach (Gast)


Lesenswert?

such mal unter tastatur hier in der codesammlung jemand hat schonmal
sowas geschrieben

von FeeJai (Gast)


Lesenswert?

Danke! Ja, ich habs gefunden, allerding ist das nur eine
Empfangsroutine, leider wird dort auch ncihts an die Tastatur gesendet.
Schade, dass es für die Tastatur Routine kaum interessenten gibt.

von Bastian Nagel (Gast)


Lesenswert?

@FeeJai:

Hast du pullups an den clock und data pins? Hatte genau das gleiche
Problem :p

von Bastian Nagel (Gast)


Angehängte Dateien:

Lesenswert?

@FeeJai:

Hier hast auch noch meinen Code dazu. Ganz unten die Routine
void ps2Send(uint8_t byte);

von FeeJai (Gast)


Lesenswert?

Danke Bastian!

Nein, ich habe die Pullups rausgenommen, also PORTD = 0; , da es Open
Collector ist. So setze ich einfach DDRD |= (1<<PD4); für Ausgang, und
der Pin wird null. Ansonsten wenn ich es als Eingang setze wird er
eins, außer die Tastatur zieht ihn auf Null. Wenn ich es richtig
verstanden habe sind die Pullups sowieso bereits in der Tastatur
integriert. Sonst könnte ich ja auch nicht 0xFF senden? Komisch ist
nur, dass dieser Befehl als einziger funktioniert.

Deinen Code verstehe ich leider nicht.

von Bastian Nagel (Gast)


Lesenswert?

@FeeJai:
loete dir auf jeden fall mal zwei pullups an die Pins!
Ich hab auch fast nen ganzen Tag rumprobiert, ohne Erfolg.
Dann hab ich mal das Oszi angeschlossen und in ner Schleife immer das
gleiche byte zur tastatur/maus gesendet. Und siehe da, das parity &|
stopbit waren voellig hmmmm.... wie soll mann sagen, schief, verzerrt,
ueberlagert. Die internen Pullups vom Atmel helfen in diesem Fall
nicht.

von FeeJai (Gast)


Lesenswert?

Habs jetzt mal mit 2 10k Pullups versucht. Leider krieg ich wieder das
gleiche Ergebnis. Zum Glück gibts Steckbretter. Ich denke aber nicht
dass Pullups das Problem sind, schließlich kann ich ja was Empfangen
und auch 0xFF senden, was ja nur high-Pegel sind. Hat vielleicht schon
jemand mal meinen Code angeschaut? Schätze dass da der Bug im
Sendeverfahren drin ist.

von Bastian Nagel (Gast)


Lesenswert?

Nimm mal 4k7 als pullup wie auch auf deiner oben genannten Seite im
Beispiel.
Ich hab meinen code jetzt nochmal ein wenig mehr kommentiert. Ich mach
das ganze senden halt kommplett von hand. D.h. ich warte immer mit ner
while(...) darauf das die clock hi/lo geht.

von Bastian Nagel (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, vergessen den code anzuhaengen.
Hier auch noch ne Seite wo ich mir das "abgeschaut" hab.
http://www.computer-engineering.org/ps2protocol/

von Bastian Nagel (Gast)


Lesenswert?

So, nun hab ich mal noch schnell zwei Bilder gemacht.
http://ledrul.voiceteam.de/kbd_ohne.jpg
http://ledrul.voiceteam.de/kbd_mit.jpg
Ich sende in diesem Fall 0xAA.

von FeeJai (Gast)


Lesenswert?

hast du das mit meinem code gemacht? Bei mir funktioniert dies so auch
nicht. Ich denke ich werd mir ma ein oszilloskop zulegen.

von Bastian Nagel (Gast)


Lesenswert?

Nein, mit dem den ich dir schon oben angehaengt hab.

von Rick Dangerus (Gast)


Lesenswert?

at Bastian:

Ich glaube Du musst Dir nochmal anschauen wie man mit DDR und PORT
umgeht. Wenn man die Befehle so umschreibt, wie sie im Kommentar
gemeint sind, funktioniert die Senderoutine auch ohne PullUps. Und wenn
man nach dem Senden noch einen Moment (bei mir 1ms) wartet (bis die
Tastatur ihr ACK geschickt hat), kann man sogar die LEDs schalten.

Gruss
Rick

von Felix J. (feejai)


Lesenswert?

Hab ich auch einen derartigen Fehler?

von Werner B. (Gast)


Angehängte Dateien:

Lesenswert?

Wer das Senden von Kommandos an die Tastatur noch per Interrupt
durchführen will kann meinen angehängten Code noch als Referenz
verwenden. Ist etwas chaotisch da nur "proof of concept" mit einem
ATmega8.

Empfangen und Senden erfolgt über verschiedene Ports da meine Schaltung
noch eine simple Pegelwandlung Spannungsteiler von Tastatur (5V) auf AVR
(3,3V) und von 3V3 auf 5V per Transistor benötigt.

Werner

von MisterMime (Gast)


Lesenswert?

Hallo FreeJai und die anderen,

ihr kennt euch ja mit dem Tastaturprotokoll aus. Könntet ihr bitte mal 
den Code, der in dem Thread 
Beitrag "AT-Tastatur - PC - µC "einschleifen" -> RS232" gepostet wurde 
anschauen?/Vielleicht sogar testen? Ich hab nämlich keinen Logicanalyser 
oder so...

Danke

MisterMime

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.