Soo, ich habe jetzt ein wenig mehr gefunden, doch funktioniert es noch nicht so recht
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;
}
Ich habe so weit ich es herausfinden konnte alle Register Geändert:
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.
Lesezeichen