PS/2 Keyboard

Gast #3966382
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
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…
Gast
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)
Gast
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 :)
Gast
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.
Gast
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
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
Gast
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...
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.