Forum: Mikrocontroller und Digitale Elektronik PS/2-Maus mit ATMega/Arduino auslesen -> 0xF4 schlägt fehlt


von Stefan T. (tommie)


Lesenswert?

Hallo,

ich versuche momentan, eine Logitech PS/2-Maus (RX250, also USB und 
PS/2) mit meinem Arduino auszulesen.

Die Kommunikation mit der Maus scheint nach einigem Probieren zu gehen, 
leider weigert sich das kleine Nagetier beharrlich, Bewegungs-Reports zu 
vermelden. Reset, Konfiguration etc. funktioniert alles wunderbar, nur 
beim entscheidenen Kommando 0xF4 (Enable Reports) liefert die Maus kein 
0xFA (ACK), sondern 0xFE (NACK). Hier ist der dazugehörige init-Code - 
er ist größtenteils von https://www.youtube.com/watch?v=awYNxfDK7fg 
inspiriert und auf den ATMega328 angepasst (andere Interrupts):
1
void MouseInit(void) {
2
        stream_mode = 0;
3
        status = INIT;
4
5
        //low level initialisation
6
        PS2_Init();
7
8
        //enable Global interrupt
9
        sei();
10
        Serial.println("Resetting...");
11
        PS2_SendToDevice(0xFF);
12
        Serial.println("Waiting for ACK...");
13
        while( status != ACK);
14
        Serial.println("Waiting for BAT_PASSED...");
15
        //wait until we receive self-test result and mouse id
16
        while( status != BAT_PASSED);
17
        Serial.println("Waiting for ID_OK...");
18
        while( status != ID_OK);
19
20
        Serial.println("Setting resolution...");
21
        status = INIT;
22
        PS2_SendToDevice(0xE8);
23
        Serial.println("Waiting for ACK...");
24
        while(status != ACK) ;
25
        status = INIT;
26
        PS2_SendToDevice(0x03);
27
        Serial.println("Waiting for ACK...");
28
        while(status != ACK);
29
30
        Serial.println("Setting sample rate...");
31
        status = INIT;
32
        PS2_SendToDevice(0xF3);
33
        Serial.println("Waiting for ACK...");
34
        while(status != ACK) ;
35
        status = INIT;
36
        PS2_SendToDevice(10);
37
        Serial.println("Waiting for ACK...");
38
        while(status != ACK);
39
40
        Serial.println("Enabling reporting...");
41
        status = INIT;
42
        PS2_SendToDevice(0xF4);
43
        Serial.println("Waiting for ACK...");
44
        //wait for acknowledgement(0xFA) from device
45
        while(status != ACK);
46
47
        //set mouse in stream mode
48
        stream_mode = 1;
49
        buffcnt = 0;
50
        Serial.println("DONE");
51
}
Das letzte "ACK" wird leider nie empfangen, einfach weil die Maus 0xF4 
nicht schluckt. Hat jemand schonmal Erfahrungen mit dem Problem 
gesammelt?

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.