PS/2 Keyboard

Gast #3966382
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
Angehängte Dateien:
Gast #3966530
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.
#3966589
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)
Gast #3967420
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)?
Gast #3968033
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...

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