So ich habe mich nochmal an das Problem mit der SPI-Übertragung rangesetzt. Zu folgender Erkenntnis bin ich gekommen:
- Ich kann über die Schnittstelle des Arduinos mit der Pixy-Cam kommunizieren, dies aber nur in eine Richtung (Von Pixy-Cam zu Arduino).
- Ich erhalte einen 16 bit Wert mit dem niederwertigsten Byte als erstes.
- Die Sync-Bytes sind das einzig sinnvolle was ich bekomme (Checksum stimmt vom Rest nicht).
hier der link zu der Seite wo das alles beschrieben ist:
http://www.cmucam.org/projects/cmuca.../Porting_Guide
Und im Anschluss nochmal der überarbeitete Code.
Meine Probleme sind:
- Daten über SPI von Arduino zu Pixy schicken.
- Vernünftige Daten erhalten nach den Sync-Bytes (Checksum)
Ich hoffe ihr könnt mir helfen.
Danke im Voraus
Code:
#define F_CPU 16000000UL
#define UARTaktiv //Auskommentieren, um UART zu deaktivieren
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void TimerInit ()
{
TCCR1A=0b10100001;
TCCR1B=0b00000011;
DDRB=(1<<PINB6) | (1<<PINB5);
}
void USART_init(uint8_t baud)
{
/*Setzen der Baudrate (Übertragungsrate)*/
UBRR1H = (unsigned char) (baud>>8);
UBRR1L = (unsigned char) baud;
/*Aktivieren von Empfänger(RX) und Sender(TX)*/
UCSR1B = (1<<RXEN1) | (1<<TXEN1);
/*Setzen des Formates: 8bit Groß, 2bits zum Stoppen*/
UCSR1C = (1<<USBS1) | (3<<UCSZ10);
}
void USARTTransmit (unsigned char data)
{
/*Auf leeren Übertragungspuffer warten*/
while (!(UCSR1A & (1<<UDRE1)) );
/*Packe die Daten in den Puffer und sende diese*/
UDR1 = data;
}
void USART_Recieve()
{
/*Warte auf Empfangen von Daten*/
while (!(UCSR1A &(1<<RXC1)) );
/*Bekomme die Daten vom Puffe und gebe sie zurück*/
return UDR1;
}
void SPIinit(void)
{
DDRB = (1<<PINB1)|(1<<PINB2)|(1<<PINB0);
SPCR = 0b01110001;
SPSR= 0;
}
unsigned char SPI_start(unsigned char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
uint8_t SensorArray()
{
[...]
}
void PullupSet()
{
PORTB = (1<<PINB7);
PORTC = (1<<PINC6);
PORTD = (1<<PIND4);
PORTF = (1<<PINF7) | (1<<PINF5) | (1<<PINF4);
}
int main(void)
{
uint16_t ObjectBlock;
uint16_t Checksum;
uint16_t signatureNr;
uint16_t xposition;
uint16_t yposition;
uint16_t width;
uint16_t height;
uint16_t count;
uint8_t buffer;
uint8_t sig1;
uint8_t sig2;
TimerInit();
USART_init(103);
PullupSet();
SPIinit();
while(1)
{
count++;
buffer=SPI_start(0xFF);
if(buffer==0xAA )
{
count=0;
sig1 =(buffer);
}
else if (count==1)
sig2 =(buffer);
else if (count==2)
Checksum=buffer;
else if (count==3)
Checksum=Checksum+buffer<<8;
else if (count==4)
signatureNr = buffer;
else if (count==5)
signatureNr+= buffer<<8;
else if (count==6)
xposition=buffer;
else if (count==7)
xposition+=buffer<<8;
else if (count==8)
yposition=buffer;
else if (count==9)
yposition=yposition+buffer<<8;
else if (count==10)
width=buffer;
else if (count==11)
width=width+buffer<<8;
else if (count==12)
height=buffer;
else if (count==13)
height=height+buffer<<8;
if ((sig1==0xAA) && (sig2==0x55))
{
USARTTransmit((uint8_t)((xposition & 0xff00)>>8));
USARTTransmit((uint8_t)(xposition & 0x00ff));
USARTTransmit(sig1);
USARTTransmit(sig2);
USARTTransmit((uint8_t)((Checksum & 0xff00)>>8));
USARTTransmit((uint8_t)(Checksum & 0x00ff));
USARTTransmit((uint8_t)((signatureNr & 0xff00)>>8));
USARTTransmit((uint8_t)(signatureNr & 0x00ff));
USARTTransmit((uint8_t)((xposition & 0xff00)>>8));
USARTTransmit((uint8_t)(xposition & 0x00ff));
USARTTransmit((uint8_t)((yposition & 0xff00)>>8));
USARTTransmit((uint8_t)(yposition & 0x00ff));
USARTTransmit((uint8_t)((width & 0xff00)>>8));
USARTTransmit((uint8_t)(width & 0x00ff));
USARTTransmit((uint8_t)((height & 0xff00)>>8));
USARTTransmit((uint8_t)(height & 0x00ff));
USARTTransmit(13);
}
}
}
Lesezeichen