[Edit]
Ähm, das ist die Anwort auf den von dir inzwischen wieder gelöschten Beitrag. Ich lasse es aber trotzdem mal so stehen
Ja Sry, kurz nach dem POST hatte ich einen großen Fehler schon entdeckt (das ich ja gar nicht mein MISO ein und ausschalte...das habe ich jetzt fix korrigiert und ich denke der WRITE ist jetzt so richtig (hoffentlich) an den Reead muss ich gefühlt nochmal ran...weil ich da auch immernoch nix bekomme.
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 SCK_High (void);
void SCK_Low (void);
void USART_Init (void) ;
void USART_Transmit (unsigned char data) ;
void ADNS_Init (void) ;
void ADNS_Transmit (unsigned char data1) ;
unsigned char ADNS_Receive(void);
void ADNS_Write (unsigned char adr, unsigned char data) ;
unsigned char ADNS_Read (unsigned char adr) ;
void ADNS_Pulse (void) ;
void Delay1ms (unsigned int time) ;
void Delay1us (unsigned int time) ;
void SCK_High (void)
{
ADNS_PORT |= (1<<ADNS_SCK);
}
void SCK_Low (void)
{
ADNS_PORT &=~ (1<<ADNS_SCK);
}
//*********************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))); //brauch ich angeblich gar nicht?
}
char ADNS_Receive (void)
{
while(!(SPSR & (1<<SPIF)));
return SPDR; //Stattdessen soll das so aussehen
}
*/
void ADNS_Transmit (unsigned char data1)
{
unsigned char i,mask;
mask=0b10000000;
for (i=0; i<8; i++)
{
SCK_Low(); // Clock Low= Sensor bereit zum beschreiben
Delay1us(2);
if (data1 & mask) // Wenn Datenbit und Datenstelle (mask) 1 wird MOSI auf High gesetzt
{ // Datenstelle startet mit bit 0 und läuft bis bit 7
ADNS_PORT |= (1<<ADNS_MOSI);
}
else
{
ADNS_PORT &=~ (1<<ADNS_MOSI);
}
SCK_High();
Delay1us(2);
mask >>= 1; // Datenstelle wird um 1 nach oben versschoben 0b00000001 wird zu 0b00000010
}
}
unsigned char ADNS_Receive (void)
{
unsigned char i,mask,result;
result = 0;
ADNS_PORT |= ADNS_MOSI; //Setzt Mosi port auf 1, aber ist das nicht sowieso von der Init auf 1??? brauch ich das?
mask = 0b10000000;
for (i=0; i<8; i++)
{
SCK_Low();
Delay1us(2);
SCK_High();
Delay1us(2);
if (bit_is_set(ADNS_PIN,ADNS_MOSI))
{
result |= mask;
}
mask>>=1;
}
Delay1us(1);
return result;
}
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)
{
ADNS_Transmit(adr | 0b10000000); //setzt bit 8 auf 1 zum schreiben zur adresse (bit0-3)
Delay1us(150);
ADNS_Transmit(data);
Delay1us(150);
}
unsigned char ADNS_Read (unsigned char adr)
{
char temp;
ADNS_Transmit(adr);
Delay1us(150);
temp = ADNS_Receive();
Delay1us(150);
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_Transmit('A');
USART_Init ();
USART_Transmit('B');
Delay1ms(500);
ADNS_Init ();
ADNS_Pulse ();
USART_Transmit('C');
Delay1ms(500);
ADNS_Write (ADNS_CONFIG , 0x80);
USART_Transmit('D'); //SOFT RESET
Delay1ms(1000);
ADNS_Write (ADNS_CONFIG , 0x01); //Always AWAKE
USART_Transmit('E');
Delay1ms(1000);
while(1)
{
USART_Transmit ('Y');
send = ADNS_Read (ADNS_DY);
USART_Transmit (send);
USART_Transmit ('X');
send = ADNS_Read (ADNS_DX);
USART_Transmit (send);
}
}
Lesezeichen