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