hallo, ich habe schon mal unter anderem Thema mein Problem geschrieben, leider habe ich keine richtige Antwort bekommen, deswegen möchte ein neues Thema erstellen, es geht darum: ich habe ein Maussensor mit der Platine von einem Logitech Maus ausgeschlachtet, ich habe die rote LED entfernt und durch ein Laserpointer ersetzt auch die µc von PS2 entfernt, ich habe nur den Sensorchip und die Lense behalten. An dem Sensor habe ich die Pin 3(SDA) und 4(SCK) an Pb0 und Pc0 angeschlossen, und natürlich Pin 6 und 7 an GND und 5V angeschlossen.
und im Code Programm laut mein Datenblatt habe ich die Registern geändert:
0x16 -------> 0x01(Status)
0x17-------->0x03(DeltaX)
0x18-------->0x02(DeltaY)
aber leider ich bekomme kommische Werte, manchmal gar nicht.
und hier ist meine Code:
Code:
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
//#include <USART.h>

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

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

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

#define FOSC 3686400 // Clock Speed
#define BAUD 9600
#define UBRR_VAL FOSC/16/BAUD-1

// Inizialisierung des Microcontrolers
void uart_init(void)
{
	UCSR0B |= (1<<RXEN0)|(1<<TXEN0);  // UART RX, TX und RX Interrupt einschalten
	UBRR0H = UBRR_VAL >> 8;
	UBRR0L = UBRR_VAL & 0xFF;
}

// Eine Funktion zum Senden von Zeichen über Seriellen Port
int uart_putc(unsigned char c)
{
    while (!(UCSR0A & (1<<UDRE0)))  //warten bis Senden moeglich 
    {
    }                             
 
    UDR0 = c;                      // sende Zeichen 
    return 0;
}

/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

/*!
 * 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 für Write Operation
	pan_writeByte(data);
}



/*!
 * 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 A2610
 
 !! Muss unbedingt ganz am ANFANG von main stehen, sonst gibts FEHLER !!
 (wenn der A2610 sich initialisiert hat, bevor der Controler SCK und 
 SDA auf Output gestellt hat)
 Deshalb kann es auch sinnvoll sein die Powerup Zeit in den Config Bits 
 auf 4ms zu stellen oder noch besser mit Boden zu arbeiten.
 
 */ 
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

// hier muessen bei Umstellung auf PAN101 die entsprechenden Register gesetzt werden
//Reset A2610
	pan_write(0x00,0x80);
// kein Sleep modus
	pan_write(0x00,0x01);	
}
int main(void)
{

	char s[15];
	unsigned char ino;
	signed char x,y;
	signed short posx=0,posy=0;

//ganz an den Anfang damit der Controller schneller asl der PAN ist um Fehler zu vermeiden
	pan_init();
//Individuelle Port Configuration und Initialisierung
	uart_init(); // USART initialisieren
	uart_puts("\r\n\n\n"); // sendet einen kleinen Begrüßungstext. 
	uart_puts("**** Hallo! Dies ist ein ADNS2610 Test ****\r\n");
	uart_puts("\r\n");
	uart_puts("Koord: ");
	uart_puts("\r\n");





	while(1)
	{

        //Endlosschleife

		ino=pan_read(0x01);

	//wenn 7tes bit vom Register 0x16 gesetzt ist wurde die Maus bewegt => Bewegungsdaten abfragen
		if(ino&(1<<7)){		
		//Deltax Register auslesen
			x=pan_read(0x03);
                //und zu der Positionvariable addieren
			posx=posx+x;
	        
                /* Nachschaun ob das Ueberlauf-Bit im Register 0x16 gesetzt ist 
                   wenn das der Fall ist muss je nach Vorzeichen der Deltax Variable x
                   noch 128 (Ueberlauf nach oben) dazugezaehlt oder eben 128 abgezogen werden
                */
		if(ino&(1<<3))
		{
			if(x<0)
			{
				posx-=128;
			}else
			{
				posx+=128;
			}
		}
		
                //ab hier nochmal das Gleiche fuer die yRichtung

		y=pan_read(0x02);
		posy=posy+y;
		
		if(ino&(1<<4))
		{
			if(y<0)
			{
				posy-=128;
			}else
			{
				posy+=128;
			}
		}
	
	}
	
                //hier kann jeder seine Ausgabevariante selber waehlen ;) 
                
		
		uart_puts("X= ");
		uart_puts( itoa( posx, s, 10 ) );
		uart_puts("     ");
		uart_puts("Y= ");
		//dtostrf(posy,6,3,s); 
		uart_puts( itoa( posy, s, 10 ) );
		uart_puts("\r\n");

			
}

return 0;
}