FastSPI Funktion (setRGBData)

Hallo zusammen,

da ich noch ziemlich am Anfang stehe mit C Programmierung bräuchte ich etwas Hilfe. Es geht um den Aufruf der setRGBData Funktion im FastSPI:

  // call this method whenever you want to output a block of rgb data.  It is assumed that 
  // rgbData is nNumLeds * 3 bytes long.
  void setRGBData(unsigned char *rgbData) { memcpy(m_pData,rgbData,m_nLeds); m_nDirty=1;}

Wie rufe ich die genau auf im sketch? "FastSPI_LED.setRGBData ..." ? oder muss ich zuvor noch den definierten struct aufrufen?

Falls die Info noch notwendig sein sollte, ich nutze derzeit die WS2801 ICs, jedoch muss ich auf die WS2811 für ein kleines Projekt umsteigen,da die günstiger sind und die Adafruit library kann das wohl nicht. Die LEDs laufen alle mit FastSPI, ich hänge wirklich nur an dem Aufruf der Funktion

Danke schonmal im Voraus

Die Frage hat sich soweit erledigt. Ich hab bereits eine Lösung gefunden/geschrieben.

Falls das noch jemand benötigen sollte, Poste ich die kleine Funktion mal. Ist nichts grosses, aber für meine Zwecke nützlich:

24 Bit RGB Werte für einzelne Pixel:

  void setColor(int pix, uint32_t c){
  leds[pix].r = (c >> 16) & 0xFF;
  leds[pix].g = (c >> 8) & 0xFF;
  leds[pix].b = c & 0xFF;
  }

Meines wissens ist der WS2811 nicht mit der SPI-Schnittstelle kompatibel. Er hat keine Takt-Pin. Grüße Uwe

Laut der FastSPI Projektseite soll dieser unterstützt werden und man findet einige Projekte die angeblich FastSPI und WS2811 nutzen?

http://code.google.com/p/fastspi/

Initial support:

595 style shift registers - http://www.usledsupply.com/shop/rgb-32-spi-dmx-decoder.html hl1606 based led strips - http://bliptronics.com/item.aspx?ItemID=83 lpd6803 based led pixels - http://bliptronics.com/item.aspx?ItemID=86 tm1809 based led strips tm1804 based pixels ws2801 based led strips and pixels lpd8806 based led strips - https://www.adafruit.com/products/306 ucs1903 based led strips sm16716 chipset support for the ws2811 chipset

Ich erwarte ein paar Test LEDs mit WS2811 diese Woche, aber falls ich irgendwas übersehen habe, wäre ich für jede Info dankbar.

Ja, im Internet wird die FastSPI Bibiothek für den WS2811 (WS2812) verwendet. Versuchs einfach mal wenn Du die LEDs bekommen hast. Grüße Uwe

zur Vollständigkeit vom Thread:

Ich hab grad mal eine LED mit einem ws2811 angeschlossen zum testen und es funktioniert ;)

Aufruf der FastSPI mit: FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2811);

rot und grün müssen getauscht werden, wenn man vorher die WS2801 genutzt hat und diese Zeile sollte dann auch entfernt werden: FastSPI_LED.setDataRate(2);

/edit

bei 10 Stück funktioniert das ganze auch einwandfrei

ich habe mittlerweile ziemlich viele ICs durchprobiert. Darunter WS2801/3, TM1804, HL1606, TLC5941, UCS5903/LPD6803 und natürlich den LPD8806.

Der HL1606 ist eine Katastrophe, dass er nicht so viel kann ist nicht mal das Problem, auch elektrisch ist er sehr störanfällig.

Der WS280/3 ist ok, allerdings ist die 500us “Latch”-Pause nervig. Das Tm1804-Protokoll hat sowieso ein vergleichsweise aufwendiges Timing, hat aber durch das 1-Draht Protokoll natürlich Vorteile bei der Verdrahtung. Da man Hardware-SPI eh nicht verwenden kann, kann man jeden Port eines uC nutzen und sogar relativ leicht einige Strips parallel ansprechen.

Der LPD8806 ist jedoch m.E. für den Programmierer das angenehmste IC, denn er ist nahezu unempfindlich gegenüber Timing. Da die PWM-Informationen immer mit einer Startsequenz aus einigen 0-Bytes eingeleitet wird und die Daten angezeigt werden, sobald der Chip alle Informationen hat, kann auf der einen Seite die volle Bitrate des Hardware-SPI reinjagen (bis zu 20MHz hat bei mir problemlos funktioniert), ohne irgendwelche Pausen einbauen zu müssen. Auf der anderen Seite kann man über einen Debugger die PWM-Informationen sogar per Einzelschritt dem Strip übergeben und werden LED für LED angezeigt. Das kann bei machen Animationen durchaus praktisch sein.

Dass die PWM nur 7-Bit sind ist zwar ein kleiner Wermutstropfen, aber wer mehr Stufen braucht kann dank der hohen Datenrate ein paar zusätzliche Bits simulieren.