keiner der mir helfen kann? :/
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.
ich hoffe ihr könnt mir helfenCode:#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); } }
grüße im Vorraus
Geändert von cnc13 (09.02.2015 um 12:29 Uhr)
keiner der mir helfen kann? :/
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
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
deshalb verstehe ich das ja nicht ...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.
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); } } }
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... :-/
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
was hiervon hast du NICHT verstanden...?
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.
ich habe daher jetzt die Retoure innerhalb der Garantiezeit eingeleitet.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
Geändert von HaWe (26.03.2015 um 09:49 Uhr)
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?
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!
Lesezeichen