Autor Thema: Programmierung WS2812  (Gelesen 23849 mal)

Offline Stephan

  • Full Member
  • ***
  • Beiträge: 109
    • Profil anzeigen
Programmierung WS2812
« am: Januar 12, 2013, 16:59:28 Nachmittag »
Ich möchte den WS2812 http://www.nooelec.com/files/WS2812.pdf für Lichteffekte einsetzen, dieser Chip beinhaltet RGB-LEDs sowie den Controller WS2811 in einem 5x5mm SMD-Gehäuse. Angesteuert wird er nur über eine einzige Leitung DIN: für die 3 Farben R-G-B werden je 8 Bits übertragen und jedes Bit besteht aus einer steigenden Flanke, einer bestimmten HI-Zeit, einer fallenden Flanke und einer bestimmten LO-Zeit (siehe Anhang, die Zeiten können laut Datenblatt um bis zu 150ns abweichen). Dass nur eine einzige Datenleitung benötigt wird, schreit ja eigentlich nach einem der PICs im kleinen Gehäuse, das Problem dabei: der Takt für DIN liegt bei 800 kHz, sodass jedes der 24 Datenbits nur 1,25 µs lang ist. Man kann also selbst mit einen 12F1822 der bis 32 MHz läuft, den Controller nicht steuern, weil er einfach zu langsam ist.

Bevor ich jetzt auf einen 16-Bit-Controller umsteige meine Frage, ob man nicht die PIC-Hardware für die Ansteuerung umfunktionieren könnte, evtl. per PWM-Modul, das ja dazu gemacht ist, variable HI- und LO-Phasen zu erzeugen. Nur: wie schaffe ich es, für jedes Datenbit ein anderes Timing zu erzeigen?

Oder hat einer von Euch noch eine bessere Idee?

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Programmierung WS2812
« Antwort #1 am: Januar 13, 2013, 13:40:48 Nachmittag »
Hallo,

habe nur wenig darüber nachgedacht, aber mal 2 Ideen:

1. Rein in Software, in Assembler mit bsf bcf und nops die gewünschten Bits zusammenbauen.
2. Manche neuen PICs haben interessante Peripherie (Logik, CLC, NCO). Vielleicht kannst du damit was basteln:
zB.
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en552977
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en559942

Grüße
Stefan

Offline Stephan

  • Full Member
  • ***
  • Beiträge: 109
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #2 am: Januar 13, 2013, 16:46:00 Nachmittag »
Assembler pur geht so gerade (DOUT ist der Output-Pin per #DEFINE):

Das 0-Bit bei 32 MHz:
bsf DOUT
nop
nop
bcf DOUT
nop
nop
nop
nop
nop
nop

Das 1-Bit bei 32 MHz:
bsf DOUT
nop
nop
nop
nop
nop
nop
bcf DOUT
nop
nop

Aber das wird natürlich grässlicher Code. Für GOTOs oder RETURNs muss man dann NOPs weglassen und für irgendwelche andere Software (Byte holen etc) erst recht und dann wird es eng. Mit den PIC24H habe ich noch nicht gearbeitet, der kleinste PIC24HJ12GP201 hat immerhin schon 18 Pins, aber statt 8 MIPS habe ich dann 40 MIPS. Bedeutet aber "einarbeiten"  :-\.

Offline Fraeo09

  • Newbie
  • *
  • Beiträge: 31
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #3 am: Januar 13, 2013, 20:00:16 Nachmittag »
Hallo Stephan,

als Leihe versuch ich mich trotzdem mal in dein Problem einzuarbein, vllt. kann ich nen neuen Gedankenanstoß geben (vllt. ist's auch Quatsch was ich erzähl).

Eine einfache do-while-Anweisung wie die folgende benötigt 37 Arbeitszyklen des Systems
(gemessen mit der "Stopwatch" in MPLABX v1.60):

GPIO-REG1  =  0xFF;
GPIO-REG2  =  0xFF;
GPIO-REG3  =  0xFF;

do
    {
        counter++;
    }
while (counter<1);

GPIO-REG1  =  0x00;
GPIO-REG2  =  0x00;
GPIO-REG3  =  0x00;
         

1,25µs/37= 33,783µs/Zyklus, was nach der Umrechnung in Frequenz ziemlich genau 29600000Hz=29,600000MHz ergibt.

Wenn du nun einen etwas größeren PIC nimmst als den 12er (etwa PIC18F25K80 mit 24 I/O Pins und max. Frequenz von 64MHz) dann kommst du doch damit super hin oder?

Ist auch erst mal nur ein Gedankenansatz, vllt. hab ich auch irgendeine Grundvoraussetzung nicht beachtet.

Grüße


Frank
« Letzte Änderung: Januar 13, 2013, 20:23:19 Nachmittag von Fraeo09 »
Verrückt!
Kaum macht mans richtig, schon funktionierts.

Offline Stephan

  • Full Member
  • ***
  • Beiträge: 109
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #4 am: Januar 13, 2013, 23:38:59 Nachmittag »
Ich werde mir mal den PIC18F14K22 besorgen (16 MIPS) und damit experimentieren, der läuft auch noch mit 5 Volt, wie der WS2812

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Programmierung WS2812
« Antwort #5 am: Januar 14, 2013, 09:48:46 Vormittag »
Hallo,

Zitat
Eine einfache do-while-Anweisung wie die folgende benötigt 37 Arbeitszyklen des Systems
(gemessen mit der "Stopwatch" in MPLABX v1.60):
Ok, das kommt vielleicht hin, aber was soll der Code? Und wie ist counter initialisiert?

Zitat
1,25µs/37= 33,783µs/Zyklus, was nach der Umrechnung in Frequenz ziemlich genau 29600000Hz=29,600000MHz ergibt.
Hä?!? 37 Zyklen auf einem PIC mit 64MHz (16MIPS intern) sind das dann 37 * 62,5ns = 2,3215 µs. Das entspricht ca. 432kHz.
Was aber hat das mit dem Problem zu tun? Damit kommt ja kein sinnvolles und auch schelles Pulspacket zustande.

Was mir allerdings nicht so recht klar ist: Warum sind die Zeiten für logisch 0 und logisch 1 unterschiedlich lang (1,15µs und 1,30 µs)?

Wenn du nicht mit dem 18F14k22 das Problem erschlagen bekommst, dann nimm einen PIC24.

Cheers,
Stefan

Offline Stephan

  • Full Member
  • ***
  • Beiträge: 109
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #6 am: Januar 14, 2013, 13:06:43 Nachmittag »
FRAEO09 ist wohl davon ausgegangen, dass die 3 Bytes parallel in den Chip kommen und nicht seriell.

Die Zeiten sind unterschiedlich, weil das Datenblatt Murks ist. Der WS2812 beinhaltet ja einen WS2811 plus LEDs und im Datenblatt für den WS2811 stehen wieder andere Zeiten. Allerdings stehen in den Datenblättern auch Toleranzzeiten von je 150ns und die kann man wohl tatsächlich ausnutzen.

Ich werde versuchen, mit dem PIC18 und 400 bzw. 800 ns zurechtzukommen, mit einer TTL-Schaltung habe ich das schon probiert, den PIC muss ich erst noch besorgen.
Die PIC24H laufen mit 3.3 Volt, da brauche ich wieder Spannungsregler und evtl. einen Levelshifter, weil der WS2812 5 Volt haben will. Mal sehen, das kann ich ja testen.

Offline Stephan

  • Full Member
  • ***
  • Beiträge: 109
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #7 am: Januar 18, 2013, 21:45:44 Nachmittag »
Ich habe eine interessante Lösung gefunden unter https://www.insomnialighting.com/products/rgbsmdws2811.html

Das Prinzip: man benutzt das SPI-Modul und schiebt aus SDO ein Bitmuster raus, welches in der Codierung des WS2812 eins (B'11110000') oder null (B'10000000') bedeutet. Ich habe gerade keinen 64-MHz-PIC da, werde das aber baldmöglichst probieren. Mit einem 32-MHz-PIC geht es nicht, das Bitmuster passt zwar, aber er ist zu langsam.

Offline Metalcrowe

  • Newbie
  • *
  • Beiträge: 2
    • Profil anzeigen
Re:Programmierung WS2812
« Antwort #8 am: Februar 26, 2013, 22:39:32 Nachmittag »
Hallo,

Ich versuche nun schon vergeblich den ganzen Abend eine LED anzusteuern.
Verwernden tue ich einen PIC18F25K80 mit dem internen Oszillator und der PLL.
Ich habe es mit dem SPI-Modul so wie auch per Bitbanging probiert. Schlussendlich aber blieb die Led nur aus oder leuchtete weiss.

Hat jemand einen Tipp für mich? Oder einen funktionierenden Code für den XC8 Compiler?

Grüsse

Anbei mein Code:

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #9 am: Januar 23, 2014, 03:14:06 Vormittag »
Servus zusammen,

habe zufällig diesen Thread gefunden und mich dann auch gleich mal hier registriert!
Falls das noch jemanden interessiert (das Thema ist hier ja nicht gerade aktuell):
In den letzten Tagen habe ich mich nämlich auch gerade nebenbei etwas mit den WS2812 LEDs beschäftigt und habe die Ansteuerung durch eine Vergewaltigung von verschiedenen On-Chip Peripherieeinheiten mit einem PIC12F1840 (32MHz Takt) hinbekommen.
Der Ansatz:
- SPI wandelt die Datenbytes in serielle Daten
- PWM erzeugt 250ns-Impulse mit 1,25µs Periodendauer
- Data Signal Modulator schaltet, durch SPI-Daten gesteuert, zwischen PWM (0-Bits) und SPI-Clock (1-Bits) um. Dazu müssem extern zwei Pins gebrückt werden, da der DSM den SPI-Clock nicht intern als Carier-Eingang nutzen kann.
- Der Comparator noch wird als Delay verwendet, da die Haltezeit der SPI-Daten zu klein ist.
Ausgang zu den LEDs ist der DSM-Out.
Die Zeiten sind dann:
0-Bit: 0.25µs high, 1µs low
1-bit: 0.625µs high, 0.625µs low
Leider ist das SPI-TX Register nicht gepuffert, so daß sich eine kleine Zusatz-Pause zwichen den einzelnen Bytes nicht vermeiden lässt. Die Low-Zeit zwischen zwei Bytes verlängert sich dadurch um 0.5µs, das scheint aber für die LEDs kein Problem zu sein.
Gesendet wird per Interrupt aus einem FIFO, der Prozessor ist dann etwa zu 30% ausgelastet.

Grüße,

Thomas


Offline Hartl192

  • Newbie
  • *
  • Beiträge: 2
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #10 am: Januar 31, 2014, 02:27:37 Vormittag »
Hier habe ich vor kurzem einen ASM-Code für PIC12F1840 und PIC18F45k22 mit 32MHz gepostet: http://www.mikrocontroller.net/topic/322375

« Letzte Änderung: Januar 31, 2014, 02:35:25 Vormittag von Hartl192 »

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #11 am: Februar 01, 2014, 12:59:18 Nachmittag »
Servus Max,

das ist eine schöne, kompakte Lösung! Meine hat da schon ein paar Zeilen mehr... ;)
Für kurze LED-Ketten oder einfaches Kopieren der fertigen Leuchtmuster aus dem ROM kann man die bitweise SPI-Methode sicher gut verwenden. Ich wollte aber eine Lösung finden, bei der der Controller nicht 100% mit der Datenausgabe beschäftigt ist. Es gibt von Microchip eine Application-Note, wo das SPI zusammen mit der Konfigurierbaren Logikzelle eines PIC16F1509 per Hardware die Impulse generiert (http://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf). Sowas in der Art wollte ich für einen 8-Beiner, den ich schon in der Bastelkiste liegen hatte. Und außerdem hat das einfache Übernehmen von fertigen Lösungen doch keinen Reiz...
 
 Im Moment bastele ich gerade (teilw. schon läuft's auch schon) an ein paar Routinen für ein einfaches "Applikations-Interface", also so Sachen wie:
- LED-Farbmuster an beliebiger Stelle des LED-Streifens erscheinen zu lassen,
- endlose autom. Wiederholung der LED-Muster,
- Zeitgesteuertes Verschieben der Muster (Lauflichteffekte)
- Nutzung verschiedener Ebenen, d.h. auf ein Grundmuster kann ein Muster durch ein 2. Muster darübergelegt (ersetzt), RGB addiert, subtrahiert oder gemixt (1:1 Mittelwert) werden.

Natürlich alles mit 16-Bit Zahlen und ohne Beschränkung der LED-Kettenlänge auf die RAM-Größe des Controllers. Mit dem 12F1840 könnte man sonst ja bloß max. 80 LEDs steuern :(
 


Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #12 am: November 08, 2014, 20:21:52 Nachmittag »
Hi,

wäre mal schön zu erfahren, wie denn der aktuelle Stand ist und ob es weiteren Fortschritt gegeben hat.
Im allgemeinen scheint das Ansteuern vom ws2811 nicht besonders einfach zu sein, wegen den Timings und der Auslastung.
SPI ist wohl auch etwas schwierig, wegen der doch recht hohen Taktung, die erforderlich ist.
UART soll wohl auch möglich sein, mit einem Inverter.
Die CLC Variante sieht da doch recht interessant aus.

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #13 am: November 08, 2014, 22:52:36 Nachmittag »
Servus Darkside,

habe schon lange nichts mehr an dem Projekt gemacht, u.a. auch, weil es da bei mir bislang keine konkrete Zielapplikation gab. Die Datenausgabe an die LEDs lief mit meiner SPI/DSM-Lösung jedoch von Anfang an ohne Probleme (PIC12F1840 ohne weitere Hardware). Der Controller ist während der LED-Ausgabe zu etwa 30% ausgelastet. Damit kann man z.B. praktisch beliebig lange Lauflichter realisieren, oder den PIC als einfachen Schnittstellen-Umsetzer (UART->WS2812) verwenden, indem man ihm per UART mit 1MBit/s die Daten für das LED-Band schickt (max. ~1500 LEDs). Bei kleineren Ketten bis 80 LEDs kann man auch einfach über simple 4-Byte Pakete (LED-Nr., R, G, B) mit beliebiger UART-Datenrate die LEDs einzeln ansprechen.

Edit:
Dateianhang hochladen geht wohl gerade nicht, daher hier als Link:
Blockschaltbild der Daten-Modulation
Projektdateien

 
« Letzte Änderung: November 08, 2014, 23:18:53 Nachmittag von picalic »

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #14 am: November 19, 2014, 22:20:31 Nachmittag »
Ah,
schön.
Sehr interessant.
Man braucht also einen PIC mit SPI, PWM, DSM (Data Signal Modulator), einem Comparator,
muss 2 Pins noch Brücken. Da der Comparator intern ist, braucht man da keinen Externen und keine Spannungsversorgung, muss aber 2,048V einstellen!?
Weitere Details wären interessant.
Wie schnell muss eigentlich der PIC getaktet werden?
Möchte man den LED-Controller wohl nur mit SPI ansteuern, muss man wohl einen 8MhZ SPI-Takt haben, so weit ich dass mitbekommen habe, bzw. einen Pic-Takt von 4*8Mhz, also 32Mhz...

Hab mir mal nen Pic zum probieren mit CLC bestellt.
Ist alles interessant, was am einfachsten ist, wäre zu schauen...

Hatte mir auch mal einen LED-Streifen mit paar LEDs besorgt. Ist allerdings alles nicht so schön, wenn man z.B. Bit banging benutzt. Volle auslastung vom Pic und schlecht mit C zu realisieren. Die hier vorgestelle Variante sollte ja auch sehr gut in C zu implementieren sein.

 


* Recent Topics