Soo, ich habe jetzt ein wenig mehr gefunden, doch funktioniert es noch nicht so recht
Ich habe so weit ich es herausfinden konnte alle Register Geändert:Code:#include "nibobee.h" #include <stdlib.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <util/delay.h> #define DDR_SCK DDRA /*!< DDR fuer Maus-SCLK */ #define DDR_SDA DDRC /*!< DDR fuer Maus-SDA */ #define PORT_SCK PORTA /*!< PORT fuer Maus-SCK */ #define PORT_SDA PORTC /*!< PORT fuer Maus-SDA */ #define PIN_SDA PINC /*!< PIN fuer Maus-SDA */ #define SCK_PIN (1<<PA3) /*!< PIN nummer fuer Maus-SCK */ #define SDA_PIN (1<<PC3) /*!< 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(0x0a,0x80); // kein Sleep modus pan_write(0x0a,0x01); } int main(void){ unsigned char ino; signed char x,y; signed short posx=0,posy=0; pan_init(); //Platz für andere Initialiesierungen while(1){ ino=pan_read(0x02); if(ino&(1<<7)){ //wenn 7tes bit gesetzt ist wurde die Maus bewegt => bewegungsdaten abfragen x=pan_read(0x03); posx=posx+x; y=pan_read(0x04); posy=posy+y; SerPrint("X-Pos: "); PrintInt(x); SerPrint(" | Y-Pos: "); PrintInt(y); SerPrint("\n\r"); } _delay_ms(250); _delay_ms(250); } return 0; }
0x0a Configuration_bits
0x02 Motion
0x03 Delta_X
0x04 Delta_Y
Auch die beiden Sensoren in der neuen Maus habe ich gerennt, wie es im Wiki steht. Die Spannung hab ich zwar nicht direkt am Sensor dran gelötet, dafür aber an die USB-Buchse.







Zitieren
*** fail faster to succeed sooner ***

Lesezeichen