Forum: Compiler & IDEs Probleme PS2-Protokoll <-> µC


von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

Hallo,

ich versuche derzeit eine PS2-Maus mit einem AT90CAN auszulesen. Ich 
habe derzeit einen externen clk mit 12MHz am µC.
Nachfolgend habe ich mal einen Teil meines Programmcodes reingestellt. 
Der Code hat noch kein Parity-Bit und was danach folgt als Inhalt.
1
[...]
2
3
#define sbit(sPort,sPin) sPort |= (1 << sPin)  // setzt den Pin x bei Port x
4
#define cbit(cPort,cPin)  cPort &= ~(1 << cPin)  // löscht den Pin x bei Port x
5
#define RESET   0xFF    //  1111 1111
6
#define SW_clk  PE4
7
#define SW_SD  PE5
8
9
[...]
10
11
void sende_befehl(void)
12
{
13
  char send_cnt=0;
14
  int  loop=0;
15
16
  clk_low;                      // Clk auf Low
17
  
18
  for(loop=0;loop < 3; loop++)  // ... für ca.100µs warten
19
      {NOP;}
20
        data_low;               // DAtenleitung auf Low
21
  
22
  for(loop=0;loop < 3; loop++)  // ... für ca.100µs warten
23
      {NOP;}
24
  
25
  clk_high;      // Clk wieder auf High 
26
  
27
  for(send_cnt=0;send_cnt < 8; send_cnt++) // Daten raussenden
28
    {
29
      while(PINE & (1<<SW_clk)) // warten solange Maus_clk noch nicht auf Low ist
30
31
        
32
      if(RESET & (1 << send_cnt))  // Wenn Bitstelle von Befehl "RESET" eine 1 ist  
33
         {            
34
           sbit(SW_PORT,SW_SD);  // ... dann Datenleitung auf 1
35
         }
36
      else
37
         {         
38
           cbit(SW_PORT,SW_SD);  // ... ansonsten Datenleitung auf 0
39
         }
40
       
41
      while(!PINE & (1<<SW_clk)) // Warten solange Maus_clk noch Low ist
42
        
43
      }
44
}

 Mit dem versuche ich einen Befehl an die Maus zu senden. Die Maus 
sendet ihren clk mit einer Frequenz von ca. 13 kHz.
Ich habe mir die Übertragung mal am Pin mit dem Gerät DigiView 
angeschaut. Nach Zuschalten der Betriebsspannung hab ich gleich meine 
Übertragungsports initialisiert, also clk und data auf high. danach 
sendet die Maus AAh. soweit alles ok.

Nun zu meinem eigentlichen Problem:

Sobald ich die Routine ausführe kommt folgendes Phänomen. Nach der 
Startbedingung ( clk low, data low, clk high) sendet die Maus ihren clk. 
Mein Controller sendet jedoch erst beim zweiten Low level des Maus_clk 
eine 1, obwohl es schon beim 1. Low_level des Maus_clk gesendet werden 
müsste.

Sind denn die 12Mhz zur Abarbeitung meines for-, while-, if- codes in 
miener Routine zu langsam??? Hat jemand Erfahrung damit oder einen 
Verbesserungsvorschlag?

Gruß
Robert

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
      while(PINE & (1<<SW_clk)) // warten solange Maus_clk noch nicht auf Low ist
2
3
  // ...      
4
       
5
      while(!PINE & (1<<SW_clk)) // Warten solange Maus_clk noch Low ist

Da fehlen IMHO ; oder {} bei den while!

von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

unabhängig von den Klammern klappt es trotzdem nicht.

im Forum stehen ein paar Beispiele und alle freuen sich dass es klappt. 
könnte mir bitte jemand sagen mit welchen Frequenzen gearbeitet wird?

Gruß
Robert

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.