Forum: Mikrocontroller und Digitale Elektronik PS/2 Keyboard


von Programmierer (Gast)


Angehängte Dateien:

Lesenswert?

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

von Guido Körber (Gast)


Lesenswert?

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…

von Programmierer (Gast)


Lesenswert?

ich muss diese Tastatur leider verwenden mit diesem Protokoll

von Guido Körber (Gast)


Lesenswert?

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.

von Bülent C. (mirki)


Lesenswert?

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
von Programmierer (Gast)


Lesenswert?

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 :)

von Bülent C. (mirki)


Lesenswert?

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;

von michael_ (Gast)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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)?

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

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

von Marten W. (goldmomo) Benutzerseite


Lesenswert?

Georg hats schon geschrieben, setze einfach auf ‚Inhibit‘.
D.h. Clk = low Data = high, dann wird/darf das PS/2-Device nichts 
senden.

von Programmierer (Gast)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

Zusatz: die kommentare passen nicht bei sw0 und sw1, aber ist auch egal, 
bei keinem tasterdruck passiert etwas

von Georg (Gast)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

Doch alle Zeichen werden an das LCD gesendet und ausgegeben

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
Noch kein Account? Hier anmelden.