Hey Leute hatte gerade den Durchbruch auch dank Jangos Basic Code

Ich habe den Code mit einem PAN3101 getestet.
Der PAN3101 ist quasi der kleine Bruder vom PAN101. er hat nur 8 PINs und nur eine Serielle Schnittstelle(ohne Quadratur Ausgänge) aber ansonsten hat er sogar mehr Register zum beschreiben als der PAN101.

Sehr nützlich ist da zB ein Register in dem ein Byte werd liegt der die Untergrundbeschaffenheit bewertet (0 schleecht - 255 guut). aber ansonsten sind da viele sachen doppelt drin ^^

Naja ich will damit nur sagen, dass wenn jemand meinen Code mit dem PAN101 verwenden will, er die Registeradressen noch auf den PAN101 umschreiben muss (das gilt vor allem für pan_init !)
Aber anosnten sollte das Hinhaun!

Nachfolgender Code ist hat auf meinem ATMega 32 mit 14,7456Mhz super funktioniert.
Die LCD Routinen sind nur zur Ausgabe gedacht. An die Stellen soll sich jeder seinen eigenen Code zur Ausgabe der Daten setzen

Code:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include <util/delay.h>

//#include <mouse.c>
#include <lcd.h>
#include <lcd.c>


//hier kann die PINconfiguration angepasst werden

#define DDR_SCK 	DDRB			/*!< DDR fuer Maus-SCLK */
#define DDR_SDA 	DDRA			/*!< DDR fuer Maus-SDA  */

#define PORT_SCK	PORTB			/*!< PORT fuer Maus-SCK  */
#define PORT_SDA	PORTA			/*!< PORT fuer Maus-SDA  */
#define PIN_SDA		PINA			/*!< PIN fuer Maus-SDA  */

#define SCK_PIN		(1<<PB0)		/*!< PIN nummer fuer Maus-SCK  */
#define SDA_PIN		(1<<PA0)		/*!< PIN nummer fuer Maus-SDA  */


/*!
 * Uebertraegt ein Byte an den Sensor
 * @param data das Byte
 */
void pan_writeByte(unsigned char data){
	signed char i;
	
	DDR_SDA|= SDA_PIN; 		// SDA auf Output
	
	for (i=7; i>=0; i--){
	
		PORT_SCK &= ~SCK_PIN;		// SCK auf Low, daten vorbereiten
		
		if(data&(1<<i)){			//BIT rausschieben
			PORT_SDA|=SDA_PIN;
		}else{
			PORT_SDA&=~SDA_PIN;		
		}
		
		PORT_SCK |= SCK_PIN;		// SCK =1 Sensor uebernimmt auf steigender Flanke
		
		_delay_us(1);				//sensor Zeit lassen um Bit zu holen
	}

	DDR_SDA &=~ SDA_PIN;			//HI-Z state
	PORT_SDA &=~ SDA_PIN;
		
}

/*!
 * Liest ein Byte vom Sensor
 * @return das Byte
 */
unsigned char pan_readByte(void){
signed char i;
unsigned char data=0;
	
	_delay_us(3);					//Sensor Zeit lassen um die Daten aus dem Register zu holen

	for (i=7; i>-1; i--){
		PORT_SCK &= ~SCK_PIN;		// SCK =0 Sensor bereitet Daten auf fallender Flanke vor !
			
		_delay_us(1);				//Sensor kurz zeit lassen
		
		
		PORT_SCK |= SCK_PIN;		// SCK =1 Daten lesen  auf steigender Flanke		
		
		if(PIN_SDA&SDA_PIN){ 		//BIT einlesen
			data |= (1<<i);			
		}else{
			data &=~ (1<<i);			
		}			

	}
	return data;
}

/*!
 * Uebertraegt ein write-Kommando an den Sensor
 * @param adr Adresse
 * @param data zu schreibendes byte
 */
void pan_write(unsigned char adr, unsigned char data){
	adr|=(1<<7);
	pan_writeByte(adr);  //rl MSB muss 1 sein Datenblatt S.12 Write Operation
	pan_writeByte(data);
	//_delay_ms(4);
}



/*!
 * Schickt ein Lesekommando an den Sensor
 * und liest ein Byte zurueck
 * @param adr die Adresse
 * @return der registerwert
 */
unsigned char pan_read(unsigned char adr){

	pan_writeByte(adr);
	return pan_readByte();
}


/*! 
 * Initialisiere PAN3101
 
 !! Muss unbedingt ganz am ANFANG von main stehen, sonst gibts FEHLER !!
 
 */ 
void pan_init(void){

	DDR_SCK  |= SCK_PIN; 	// SCK auf Output
	DDR_SDA |= SDA_PIN;		//SDA auf output

	PORT_SCK |= SCK_PIN;	// SCK auf high	
	PORT_SDA|= SDA_PIN;		//SDA auf high


//Reset PAN3101
	pan_write(0x00,0x80);
// kein Sleep modus
	pan_write(0x00,0x01);	
}


int main(void){
unsigned char ino;
signed char x,y;

pan_init();
lcd_init(LCD_DISP_ON);
lcd_clrscr();

//bisschen warten bevors losgeht ;)
for(ino=0;ino<20;ino++){_delay_ms(255);}

while(1){

ino=pan_read(0x16);

if(ino&(1<<7)){				//wenn 7tes bit gesetzt ist wurde die Maus bewegt => bewegungsdaten abfragen
	x=pan_read(0x17);

	y=pan_read(0x18);
	
	lcd_ausgabe_int(0,2,x);
	lcd_ausgabe_int(4,2,y);
}

_delay_ms(250);
_delay_ms(250);

}


return 0;
}
ansonsten bin ich für Kritik offen und freue mich über Fragen

Grüße Javik