Forum: Compiler & IDEs Pixy Pet - Probleme SPI


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von cnc13 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich bin neu hier und dachte ihr könnt mir bei meinem Problem helfen.

Ich habe folgendes Problem. Und zwar arbeite ich an einem Roboter, der 
Objekten folgen soll.
Nun möchte ich, dass der Atmega32u4 auf dem Arduino Leonardo Rev. 3 über 
den SPI bus mit der Pixy Cam (CMUcam5) kommuniziert, was nicht ganz 
funktioniert wie ich unten weiter beschreibe.

Während meiner auseinandersetzung mit dem Problem habe ich folgende 
Erkenntnis bin ich gemacht:
- 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 :)
#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);
    }
   }
}

von Moin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich gehe mal davon aus, dass du dir die Daten nur über den Uart 
anschaust. Der sendet aber jedes mal wenn du ein Byte von deiner Kamera 
bekommen hast, nachdem die SYNC Bytes 1x angekommen sind.

Das Senden
if ((sig1==0xAA) && (sig2==0x55))
{
    ....
}
könnte z.b. so aussehen:
if ((sig1==0xAA) && (sig2==0x55) && (count>=13))
{
    .....
    sig1=0x00;
    sig2=0x00;
}

von cnc13 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also ich hab das jetzt so gemacht und danach bekomme ich garnix mehr 
über uart rein
if ((sig1==0xAA) && (sig2==0x55) && (count>=13))
    {
    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);
    }

von Moin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Porting Guide:
> All values in the object block are 16-bit words, sent least-signifcant
> byte first (little endian). So, for example, when sending the sync word
> 0xaa55, Pixy sends 0x55 (first byte) then 0xaa (second byte).

Du liest die Signatur falsch herum ein. Erst 0x55, dann 0xAA.

Also:
if (0x55 == buffer)
{
    count = 0;
    sig1 = buffer;
}

und
if ((0xAA == sig2) && (0x55 == sig1) && (count>=13))
{ ... }

von cnc13 (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also ich hab mir jetzt die signature nummer ausgeben lassen und frage 
mich ob das nicht durchgehend 1 sein muss, sobald er was bekommt.

oder sucht der innerhalb von einer sekunde ca 50 mal die signatur neu?

müsste ich dafür ein mittel aus 50 bildern in 1 sekunde ziehen?

von Jeremias E. (Firma: Privat) (cnc13)


Bewertung
0 lesenswert
nicht lesenswert
ich meinte oben den width wert nicht die signature nr sorry

von Moin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
cnc13 schrieb:
> also ich hab mir jetzt die signature nummer ausgeben lassen und frage
> mich ob das nicht durchgehend 1 sein muss, sobald er was bekommt.
>
> oder sucht der innerhalb von einer sekunde ca 50 mal die signatur neu?
>
> müsste ich dafür ein mittel aus 50 bildern in 1 sekunde ziehen?

Ich kann weder mit dem Bild noch mit deinem Text was anfangen. 
Funktioniert die Kommunikation mit der Kamera jetzt richtig?

Falls sich weitere Probleme mit der Kommunikation auftuen kann ich gerne 
versuchen zu helfen, zum Auswerten der Daten der Kamera kann ich nicht 
helfen. Da müsste ich genauso wie du das Manual genauer lesen.

von Jeremias E. (Firma: Privat) (cnc13)


Bewertung
0 lesenswert
nicht lesenswert
Generell bin ich nun ein stück weiter gekommen, aber wenn ich mir nur 
die SigantureNr ausgeben lasse habe ich durchgehend 0x8000 was nicht 
stimmen kann. Keine Ahnung warum. Denn eig müsste dort ne 1 stehen, was 
es aber nicht tut.
Eine 1 deshalb, weil ich der PixyCam nur eine signature eingelesen habe.

von Moin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jeremias Esser schrieb:
> Generell bin ich nun ein stück weiter gekommen, aber wenn ich mir
> nur
> die SigantureNr ausgeben lasse habe ich durchgehend 0x8000 was nicht
> stimmen kann. Keine Ahnung warum. Denn eig müsste dort ne 1 stehen, was
> es aber nicht tut.
> Eine 1 deshalb, weil ich der PixyCam nur eine signature eingelesen habe.

0x8000 Bitgespiegelt ist 0x0001. Schau mal ob überall die Bitreihenfolge 
richtig eingestellt ist. Zum Ausschließen von Fehlern einfach mal den 
SPI abklemmen und eine bekannte Information über den UART schicken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.