- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 10

Thema: Probleme SPI ansteuerung Pixy Cam

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    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);
    		}
     	}
    }

  2. #2
    HaWe
    Gast
    der Standard-SPI-Modus verwendet keinen CS/SS pin,
    es gibt aber eine Pixy_SS lib, wo du Kabellitze 7 als CS/SS Pin verwenden kannst, d.h. aber: es geht nicht mehr mit dem Standard-SPI-Kabel.
    - kA ob das was du vorhast mit CS besser geht und ob dir das jetzt weiterhilft... :-/

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    Hi, danke für die Antwort!

    Ich weiß aber, dass es auch ohne CS Pin funktioniert, da es so in der Dokumentation steht und ich das mitgelieferte SPI Kabel verwende.
    Außerdem Empfange ich ja Daten, darunter auch die Korrekten Sync Bytes, daher denke ich, dass es so schon seine Richtigkeit hat.

    Das Problem ist nur, dass die Daten, die ich erhalte falsch sind, abgesehen von den Sync Bytes.

    mfg
    cnc 13

  4. #4
    HaWe
    Gast
    was hiervon hast du NICHT verstanden...?

    Zitat Zitat von HaWe Beitrag anzeigen
    der Standard-SPI-Modus verwendet keinen CS/SS pin,
    es gibt aber eine Pixy_SS lib, wo du Kabellitze 7 als CS/SS Pin verwenden kannst
    und es stimmt: Die Pixy Cam sendet häufig falsche Daten und abgebrochene Daten und hängt sich auf!
    das kannst du seitenweise im Pixy Forum nachlesen.
    Ich halte das Ding schlicht für unausgereift, darüberhinaus ist sie hundsmiserabel dokumentiert, es fehlen z.B. komplett die für die verschiedensten Funktionen notwendigen detaillierten Beispielprogramme insb. für Arduino.

    Code:
    Detected 3:
      block 0: sig: 1 x: 127 y: 100 width: 17 height: 32 angle 0
      block 1: sig: 1 x: 261 y: 125 width: 86 height: 19 angle 0
      block 2: sig: 2 x: 74 y: 165 width: 75 height: 20 angle 0
    reorder
    reorder
    reorder
    reorder
    reorder
    reorder
    Detected 1:
      block 0: sig: 2 x: 283 y: 180 width: 14 height: 3 angle 0
    reorder
    Detected 2:
      block 0: sig: 2 x: 108 y: 187 width: 7 height: 10 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 7 height: 9 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 109 y: 188 width: 8 height: 12 angle 0
      block 1: sig: 3 x: 97 y: 178 width: 8 height: 6 angle 0
    cs error
    reorder
    Detected 3:
      block 0: sig: 2 x: 109 y: 188 width: 8 height: 10 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 8 height: 10 angle 0
      block 2: sig: 3 x: 96 y: 176 width: 9 height: 8 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 108 y: 189 width: 7 height: 6 angle 0
      block 1: sig: 3 x: 97 y: 176 width: 8 height: 8 angle 0
    cs error
    Detected 3:
      block 0: sig: 2 x: 109 y: 187 width: 8 height: 9 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 8 height: 9 angle 0
      block 2: sig: 3 x: 97 y: 175 width: 8 height: 3 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 109 y: 187 width: 8 height: 10 angle 0
      block 1: sig: 3 x: 97 y: 176 width: 8 height: 9 angle 0
    cs error
    ich habe daher jetzt die Retoure innerhalb der Garantiezeit eingeleitet.
    Geändert von HaWe (26.03.2015 um 08:49 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    hmm kay, also meinst du ich sollte es mit der Kabellitze 7 als CS/SS-Pin versuchen und gucken ob ich dadurch was vernunftiges raus bekomme?

    Wie hast du das mit dem Retoure innerhalb der Garantiezeit hinbekommen?

  6. #6
    HaWe
    Gast
    wenn du erfahrener, möglichst berufsmäßiger embedded-C-Programmierer bist: probier's.
    Mach aber nichts kaputt, insb. kein Kabel etc.!
    Falls nicht - mein Tipp: lass dir vom Händler erklären wie es funktioniert.

    ps, edit: Laut Pixy-Hersteller machen die deutschen Vertriebspartner auch den Support, dazu gibt es eine entsprechende Vereinbarung!

    Falls es dir der Händler nicht erklären kann und es weiterhin nicht funktioniert: Händler Bescheid geben dass Funktion der Cam fehlerhaft ist und ordnungsgemäße Inbetriebnahme laut zugesagter Eigenschaften nicht möglich, er möchte dir bitte die Retouren-Modalitäten mitteilen.
    Viel Glück!

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 19.06.2018, 08:39
  2. Arduino Due mit Pixy-Cam und eigenem TFT-Monitor
    Von HaWe im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 0
    Letzter Beitrag: 28.01.2015, 19:42
  3. PGA2320 SPI Ansteuerung
    Von gesamtplan im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 05.08.2007, 12:40
  4. SPI - SD -MC Karten Ansteuerung
    Von Smi im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 03.04.2006, 15:57
  5. SPI ansteuerung
    Von BennoK im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 0
    Letzter Beitrag: 09.01.2006, 13:18

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen