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
Lesezeichen