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.