- 3D-Druck Einstieg und Tipps         
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

    Probleme SPI ansteuerung Pixy Cam

    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.
    hier sind genaue details:
    https://learn.adafruit.com/pixy-pet-...-using-pixycam

    Nun möchte ich, dass der Atmega32u4 auf dem Arduino leonardo Rev. 3 über den SPI bus mit der Pixy Cam (CMUcam5) kommuniziert.

    Ich denke, dass ich die Register des Atmega32 richtig gesetzt habe, aber trotz allem kann ich die Kamera nicht ansprechen.
    Anbei habe ich meinen Code beigefügt und hoffe das ihr mir helfen könnt.

    Hinzu kommt das ich an der ICSP schnittstelle des Arduinos Keinen slave select habe und den nicht gezielt einstellen kann.

    Code:
    #define F_CPU 16000000UL
    
    #define UARTaktiv //Auskommentieren, um UART zu deaktivieren
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include "Header/Timer.h"
    #include "Header/ADC.h"
    #include "Header/USART.h"
    
    volatile uint8_t y=0;
    
    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;
    }
    
    int main(void)
    {
    	
    	TimerInit();
    	USARTInit();
    	ADCInit();
    	PullupSet();
    	timer_init_0();
    	//sei();
    	SPIinit();
    	
    	
    	uint8_t Sensoren =0;
    	uint8_t Zustand = 0;
    	
        while(1)
        {
    
    		_delay_ms(1);
    		SPI_start(0x00);
    		SPI_start(0xff);
    		SPI_start(0xff);
    		SPI_start(0xff);
    		
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(13);
    
    	}
    }
    ich hoffe ihr könnt mir helfen

    grüße im Vorraus
    Geändert von cnc13 (09.02.2015 um 12:29 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    keiner der mir helfen kann? :/

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    wenn ich dich richtig verstehe, hast du kein CS Signal? Dann wirds nicht funktionieren, SPI braucht dieses Signal. Entweder du nutzt ein anderes Protokoll, oder du stellst irgendwie einen Pin zur Verfügung.

    Gruß
    Chris

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    Also laut der cmucam.org Wiki brauche ich keinen Slave Select bei dem kameramodul und dem Arduino
    http://cmucam.org/projects/cmucam5/wiki/Porting_Guide

    ICSP SPI - this is the default port that uses 3 wires (pins 1, 3, and 4 of the I/O connector) and is used to communicate with Arduino through the ICSP connector. This version of SPI does not use a slave select signal.
    deshalb verstehe ich das ja nicht ...

  5. #5
    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);
    		}
     	}
    }

  6. #6
    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... :-/

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 19.06.2018, 09: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, 20:42
  3. PGA2320 SPI Ansteuerung
    Von gesamtplan im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 05.08.2007, 13:40
  4. SPI - SD -MC Karten Ansteuerung
    Von Smi im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 03.04.2006, 16:57
  5. SPI ansteuerung
    Von BennoK im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 0
    Letzter Beitrag: 09.01.2006, 14:18

Stichworte

Berechtigungen

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

Labornetzteil AliExpress