Hallo Leute! Ich habe folgende Probleme: Problem 1: Ich lese Daten von einer PS/2 Tastatur ein zu einem Atmega32, anschließend werden die Daten auf einem LCD ausgegeben. Das ganze funktioniert auch, aber ich habe hin und wieder irgendwelche Zeichen die ich nicht eingegeben habe (w, _, U usw.) mit in der Anzeige und kann die auch nicht löschen. Kann mir jemand sagen, woran das liegt? Problem 2: Ich möchte nun noch eine Tastatur mit einem Befehl Sperren und Entsperren können, was durch 2 Taster am STK500 geschehen soll (Enable: 0xf4, Disable: 0xf5). An die Tastatur kann ich über die Funktion kbd_send() senden. So wie ich das versucht habe, klappt es leider nicht, da ich nicht genau weiß, wie ich diese Enable/Disable - Befehle übergeben muss. Kann mir da jemand weiterhelfen? Der Code befindet sich im Anhang. LG
PS/2 ist ein gruselig schlecht definiertes Protokoll und viele auf dem Markt befindliche Tastaturen haben dann noch freie Interpretationen davon. Mal eine andere Tastatur probieren…
Ich meinte damit eine andere PS/2 Tastatur probieren. Da hat jeder Hersteller etwas anderes Verhalten. Das Handshaking mit dem der Host die Tastatur ausbremsen kann ist bei vielen Tastaturen grottig implementiert. Da im PC ja ein separater Microcontroller ist der sich um die Tastatur kümmert wird da selten ausgebremst. Wenn dann nur nach dem Prinzip "rumprobieren bis es läuft" entwickelt wird, dann kann das in die Hose gehen wenn sich ein Host anders verhält als der Entwickler der Tastatur getestet hat.
Dein Problem "könnte" hier liegen:
1 | if(kbd_bit_n > 0 && kbd_bit_n < 10) // Ignore start, parity & stop bit |
2 | {
|
3 | if(!bit_is_clear(KBD_DATA_PIN, KBD_DATA_BIT)) |
4 | kbd_buffer |= (1 << (kbd_bit_n - 2)); |
5 | } else if(kbd_bit_n == 11) |
6 | {
|
7 | kbd_queue_scancode(kbd_buffer); |
8 | kbd_buffer = 0; |
9 | kbd_bit_n = 0; |
10 | }
|
Die "Nutzdaten" sind in Bit 3 bis Bit 10?! Wenn ihr aber wirklich die Parity, Start und Stop Bits ignorieren wollt, dann müsste es heißen:
1 | if(kbd_bit_n > 1 && kbd_bit_n < 10) |
:
Bearbeitet durch User
Habe den Fehler zu problem 1 gefunden, war ein einfaches "i=0" was ich an einer Stelle vergessen habe...... Aber Problem 2 mit dem Taster bleibt noch, wäre dankbar für jede Idee :)
Programmierer schrieb: > Habe den Fehler zu problem 1 gefunden, war ein einfaches "i=0" was ich > an einer Stelle vergessen habe...... Sicher? Weiter oben steht auch noch
1 | volatile uint8_t kbd_bit_n = 1; |
Bei AVR gibt es eine Applikation für so eine Tastatur. Der Scan-Code ist aber sicher und ich glaube nicht an "schlechte" Tastaturen. Die würden ja auch am PC Probleme machen.
Ja sicher @bülent in die ganzen case anweisungen musste ein i=0 rein, vorher hat das Programm mit dem i weitergemacht, was bei der allerersten Eingabe zustande gekommen ist Kann mir jemand sagen, was ich der Funktion kbd_send() übergeben muss, damit die Tastatur gesperrt bzw entsperrt wird (sperren 0xf5, entsperren 0xf4)?
Programmierer schrieb: > Kann mir jemand sagen, was ich der Funktion kbd_send() übergeben muss Anbei Auszug aus dem AT-Manual. Du musst aber nicht unbedingt das KB abschalten, du könntest auch den Empfänger einfach im "Inhibit Status" stehen lassen. Georg
Danke für die Antwort, aber wie übergebe ich denn nun den sperr- bzw. entsperrbefehl? irgendwie muss ich dem keyboard ja mitteilen, dass es nicht mehr senden darf, wenn ich eine eingabe gemacht habe
Georg hats schon geschrieben, setze einfach auf ‚Inhibit‘. D.h. Clk = low Data = high, dann wird/darf das PS/2-Device nichts senden.
Habe es nun so probiert: void init_SWITCH(void) { uint8_t count; for (count=0; count<SWITCH_NUMBER; count++) { SWITCH_DDR &= ~(1<<count); //Deklarieren der Taster als EIngang } } temp=SWITCH_PIN; //Speicherung des Tasterstatus if (temp == 254) //Überprüfung, ob Taster zum Freischalten betätigt wurde (SW0) { KBD_CLOCK_PORT &= ~(1<<KBD_CLOCK_BIT); //Bit wird zurückgesetzt, LOW KBD_DATA_PORT |= (1<<KBD_DATA_BIT); //Bit wird gesetzt, HIGH } if (temp == 253) //Überprüfung, ob Taster zum Sperren betätigt wurde (SW1) { KBD_CLOCK_PORT |= (1<<KBD_CLOCK_BIT); //Bit wird gesetzt, HIGH KBD_DATA_PORT &= ~(1<<KBD_DATA_BIT); //Bit wird zurückgesetzt, LOW } Jedoch funktioniert das ganze nicht so wie es soll, ich kann immer noch Tastatureingaben machen...
Zusatz: die kommentare passen nicht bei sw0 und sw1, aber ist auch egal, bei keinem tasterdruck passiert etwas
Programmierer schrieb: > Jedoch funktioniert das ganze nicht so wie es soll, ich kann immer noch > Tastatureingaben machen... Das kannst du während Inhibit ja auch, sie werden aber nicht an den PC weitergegeben. Ein Oszilloskop an der PS/2-Schnittstelle wäre sicher hilfreich. Georg
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.