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
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
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.
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.
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