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:
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);
}
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 ;)
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.
Lesezeichen