mikrocontroller.net

Forum: Projekte & Code PC / AT-Tastatur Routine


Autor: FeeJai (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FeeJai (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: FeeJai (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
such mal unter tastatur hier in der codesammlung jemand hat schonmal
sowas geschrieben

Autor: FeeJai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FeeJai:

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

Autor: Bastian Nagel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@FeeJai:

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

Autor: FeeJai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FeeJai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian Nagel (Gast)
Datum:
Angehängte Dateien:

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

Autor: Bastian Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FeeJai (Gast)
Datum:

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

Autor: Bastian Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, mit dem den ich dir schon oben angehaengt hab.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Felix Jankowski (feejai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich auch einen derartigen Fehler?

Autor: Werner B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: MisterMime (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.