Benötige Programmierhilfe zum Auslesen eines Maussensors
Hallo Liebe Community,
ich würde gerne einen Maussensor ADNS2610 mit Hilfe eines ATMegas32 auslesen und die Info's per UART an den PC senden. Ich habe den Maussensors als Einzelteil mit nem 24MHZ Quarz, LED, 5V und MOSI und SCK vom ATmega32 bestückt. Der uC sitzt auf nem STK500 Programmierboard.
Die UART-Verbindung habe ich soweit schon zum laufen bekommen. Nun stockt es aber bei meinen Programmierkenntnissen zum Auslesen des Maussensors über die SPI Verbindung.
Beispielhaft habe ich schonmal ein Programmtext zum auslesen der delta x und y Werte geschrieben.
Ich weiß eben nur nicht wie mein Write und Read dazu aussehen muss. Ich hoffe mir kann da geholfen werden und das ich kein hoffnungsloser Fall bin :-s
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 4000000UL
#define ADNS_PORT PORTB
#define ADNS_DDR DDRB
#define ADNS_PIN PINB
#define ADNS_SCK 7 // Pinnumber für SCK vom ATMega32
#define ADNS_MISO 6 // Pinnumber für MISO vom ATMega32
#define ADNS_MOSI 5 // Pinnumber für MOSI vom ATMega32
#define ADNS_CONFIG 0x00
#define ADNS_STATUS 0x01
#define ADNS_DY 0x02
#define ADNS_DX 0x03
#define ADNS_SQUAL 0x04
#define ADNS_MAX_PIXEL 0x05
#define ADNS_MIN_PIXEL 0x06
#define ADNS_PIXEL_SUM 0x07
#define ADNS_PIXEL_DATA 0x08
#define START_OF_FRAME 0x80
#define VALID_DATA 0x40
void USART_Init (void) ;
void USART_Transmit (unsigned char data) ;
void ADNS_Init (void) ;
void ADNS_Transmit (unsigned char data1) ;
char ADNS_Receive(void);
void ADNS_Write (unsigned char adr, unsigned char data) ;
char ADNS_Read (unsigned char adr) ;
void ADNS_Pulse (void) ;
void Delay1ms (unsigned int time) ;
void Delay1us (unsigned int time) ;
//*********************Def's für die UART Verbindung
void USART_Init (void)
{
UBRRL = F_CPU / (16 * 9600UL) - 1;
UCSRB = (1<<RXEN) | (1<<TXEN) ;
UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0) ;
}
void USART_Transmit (unsigned char data0)
{
while ( !(UCSRA & (1<<UDRE)) ) ;
UDR = data0 ;
}
//*******************Def's für die SPI Verbindung zum ADNS
void ADNS_Init (void)
{
ADNS_DDR |= (1<<ADNS_SCK) | (1<<ADNS_MOSI); //Setzt PortB auf 0b10100000 also PB7 und PB5 als Ausgang => für Read?
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); //Müssen CPOL und CPHA gesetzt werden?
}
void ADNS_Transmit (unsigned char data1) // überträgt data1 per spi an den adns
{
SPDR = data1;
while(!(SPSR & (1<<SPIF)));
}
char ADNS_Receive (void)
{
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
void ADNS_Pulse (void)
{
ADNS_PORT &=~(1<<ADNS_SCK);
ADNS_PORT &=~(1<<ADNS_SCK);
ADNS_PORT |= (1<<ADNS_SCK);
ADNS_PORT |= (1<<ADNS_SCK);
}
void ADNS_Write (unsigned char adr, unsigned char data) // Hier weiß ich leider überhaupt nicht mehr weiter
{
}
char ADNS_Read (unsigned char adr)
{
char temp;
return temp;
}
void Delay1ms (unsigned int time)
{
while(time--) _delay_ms(1);
}
void Delay1us (unsigned int time)
{
while(time--) _delay_us(1);
}
int main (void)
{
char send;
USART_Init ();
Delay1ms(500);
ADNS_Init ();
Delay1ms(500);
ADNS_Write (ADNS_CONFIG , 0x80); //SOFT RESET
Delay1ms(200);
ADNS_Write (ADNS_CONFIG , 0x01); //Always AWAKE
Delay1ms(200);
while(1)
{
send = ADNS_Read (ADNS_DY);
USART_Transmit (send);
send = ADNS_Read (ADNS_DX);
USART_Transmit (send);
}
}