PC / AT-Tastatur Routine

Gast #371387
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
Angehängte Dateien:
Gast #371389
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
Angehängte Dateien:
Gast #371390
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
Angehängte Dateien:
Gast #371392
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.
Gast #371395
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.
Gast #371396
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.
Gast #371397
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.
Gast #371398
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.
Gast #371403
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
Gast #371405
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren