Und nochmals hallo
Es funktioniert! Zwar mit einem AVR, aber das sollte ein PIC auch können. Ich weiß allerdings nicht ob die PICs auch Tristatepins besitzen, ich gehe aber davon aus.
Das Problem: Entgegen den meisten Dokus muss man der PS/2-Maus wohl ein Kommando senden um sie zum Senden der Daten zu überreden. Alle meine Testmäuse wurden aktiv nachdem sie ein 0xf4 (enable) erhalten hatten:
Achtung! Auch beim Senden von Kommandos gibt die Maus den Takt vor! Das Protokoll stimmt zwar anscheinend immer noch nicht mit der Doku überein, aber die Maus sendet Daten die man jetzt mal dekodieren kann. Es gibt noch viel zu erforschen ;)Code:// PS/2-Schnittstelle am ATMega32 1.4.2009 mic // RP6 liest PS/2-Maus am I2C-Port // http://www.marjorie.de/ps2/ps2_protocol.htm // http://www.beyondlogic.org/keyboard/keybrd.htm // http://instruct1.cit.cornell.edu/cou...c72/index.html // Hihi: http://www.mikrocontroller.net/topic/130824 #include "RP6RobotBaseLib.h" #define Clock_Low {DDRC |=1; PORTC &=~1;} // clock low aktiv #define Data_Low {DDRC |=2; PORTC &=~2;} // data low aktiv #define Clock_High {DDRC &=~1; PORTC &=~1;}// Eingang mit externem 4K7-PullUp) #define Data_High {DDRC &=~2; PORTC &=~2;}// Eingang mit externem 4K7-PullUp) #define Data_Out {DDRC |=2; PORTC |=2;} // data high aktiv #define Clock_In (PINC & 1) // Eingang abfragen #define Data_In (PINC & 2) // Eingang abfragen void send(uint8_t kommando) { uint8_t i, parity; parity=0; Clock_Low; // Clock auf Low und kurz warten -> Bus übernehmen sleep(2); Data_Low; // Datenleitung auf Low Clock_High; // Clock auf high -> Takt wieder freigeben while(!Clock_In); // Warten bis Maus den Takt ausgibt for(i=0; i<8; i++) // 8 Bit Daten senden { while(Clock_In); // Warten bis schreiben erlaubt if(kommando & (1<<i)) { Data_Out; parity++; } else Data_Low while(!Clock_In); // Daten bereitgestellt, warten bis Maus liest } while(Clock_In); // Warten bis schreiben wieder erlaubt, dann Parity ausgeben if(!(parity & 1)) Data_Out else Data_Low // Parity richtig senden //if(parity & 1) Data_Out else Data_Low // Parityfehler erzwingen while(!Clock_In); // Maus liest Parity while(Clock_In); // Stopbit abwarten (wird scheinbar nicht geprüft) while(!Clock_In); // Maus liest Stopbit Data_High; // Datenleitung freigeben while(Data_In); // ack von Maus abwarten while(!Data_In); // Das war's } uint8_t read(void) { uint8_t i, scancode, parity; scancode=0; parity=0; while(Clock_In); // Warten auf Startbit while(!Clock_In); // Ende Startbit for(i=0; i<8; i++) // 8 Bits einlesen { while(Clock_In); // Maus bereitet die Daten vor if(Data_In) scancode |= (1<<i); // Bit einlesen while(!Clock_In); // gelesen, auf nächstes Bit warten } while(Clock_In); // Warten auf Paritybit if(Data_In) parity=1; // Parity einlesen while(!Clock_In); // Ende Paritybit while(Clock_In); // Warten auf Stopbit while(!Clock_In); // Ende Stopbit return(scancode); } int main(void) { initRobotBase(); Clock_High; Data_High; send(0xff); // reset writeInteger(read(), 16); writeChar('\n'); writeInteger(read(), 16); writeChar('\n'); send(0xff); // reset writeInteger(read(), 16); writeChar('\n'); writeInteger(read(), 16); writeChar('\n'); send(0xf4); // enable writeInteger(read(), 16); writeChar('\n'); mSleep(500); writeString_P("\nBitte Maus bewegen!\n\n"); while(1) { writeInteger(read(), 16); writeChar('\n'); } return(0); }
Gruß
mic
[Edit]
btw. sind Mäuse zur Wegerfassung nicht geeignet:
https://www.roboternetz.de/phpBB2/ze...=421528#421528
Der erste Absatz gilt auch für Kugelmäuse.







Zitieren

Lesezeichen