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
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
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
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
such mal unter tastatur hier in der codesammlung jemand hat schonmal sowas geschrieben
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.
@FeeJai: Hast du pullups an den clock und data pins? Hatte genau das gleiche Problem :p
@FeeJai: Hier hast auch noch meinen Code dazu. Ganz unten die Routine void ps2Send(uint8_t byte);
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.
@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.
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.
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.
Sorry, vergessen den code anzuhaengen. Hier auch noch ne Seite wo ich mir das "abgeschaut" hab. http://www.computer-engineering.org/ps2protocol/
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.
hast du das mit meinem code gemacht? Bei mir funktioniert dies so auch nicht. Ich denke ich werd mir ma ein oszilloskop zulegen.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.