LED Streifen mit light_ws2812

Gast #4390389
Lesenswert?

Hi,


bin dabei mir einen LED Streifen auszusuchen, gibt ja mittlerweile 
einige Libraris dafür.

Da das Timing ziemlich kritisch ist würde ich gerne Wissen wie weit man 
gehen kann mit den Farb Experimenten.

Das Library light_ws2812_AVR (unter anderem auch hier vorgestellt) sieht 
interessant aus.
Die Erklärung wie es funktioniert gibt es hier:
https://cpldcpu.wordpress.com/2014/01/14/light_ws2812-library-v2-0-part-i-understanding-the-ws2812/

In diesem Auszug:
1
After reset, each device reads the first 24 bit (GRB 8:8:8) of data into an internal buffer. All consecutive bits after the first 24 are forwarded to the next device go through internal data reshaping and are then forwarded via “Dout” to the next device. The internal buffer is written to the PWM controller during the next reset.


steht ja das die erste LED/chip sich die ersten 24bit nehmen und den 
Rest der Daten weiterleiten an die nächste LED.
Vermutlich muss man jedesmal wenn etwas geändert wird das gesamte Signal 
für alle LED's mit der kleien Änderung senden. ist das richtig?

Gibt es dadurch eine Längenbeschränkung des LED Streifens weil alle 
LED's von Zeitpunkt 0 an die Daten haben wollen und man irgendwann nur 
zu langsam senden kann?
Funktioniert ein 1m Streifen mit 60 LED's?
#4390402
Lesenswert?

Sollte im Datenblatt zu den WS2812 alles zu finden sein. 60 Leds sind 
kein Problem. Die Leds funktionieren nach dem DaisyChain Prinzip. Die 
Leds geben, sobald ein neues Byte ankommt, das letzte Byte wieder 
heraus. Es wird solange alles weitergeschoben, bis einmal 50µs nichts 
weiteres kommt. Dann werden die Werte im IC übernommen.

Es muss jedes Mal alles geschickt werden. Das geht nicht anders. 
Vorallem müssen die Daten vor dem Senden bereits vorhanden sein (im 
struct), da Berechnungen während der Übertragung nicht gehen. Dann würde 
er das Timing nicht mehr einhalten können.
(Firma: Vescomp) #4390557
Lesenswert?

julius schrieb:
> Gibt es dadurch eine Längenbeschränkung des LED Streifens weil alle
> LED's von Zeitpunkt 0 an die Daten haben wollen und man irgendwann nur
> zu langsam senden kann?

 Bei 800KHz braucht man 30us fur R-G-B (3Byt).
 Wenn du deine WS2812 mit 100Hz auffrischst, hast du 10ms, um alle
 Daten zu senden.
 Das ergibt gute 5m oder 300 LEDs - und falls du mit 50Hz zufrieden
 bist, sind es 10m oder 600 LEDs - mehr geht ja auch nicht, da 328p
 nur 2KB RAM hat.
Gast #4391731
Lesenswert?

die ws28xx controller sind ja alle mit rgb leds und daraus ein schönes 
warm weiß zu produzieren soll wohl auch nicht so einfach sein.

kann das jemand bestätigen?

gibt es sowas wie den ws28xx für warm weiße stripes um die leds einzeln 
an/aus zu schalten?
finde nichts schlüssiges dazu.

der avr muss in meinem projekt nur die lichterkette und einen 
bewegungsmelder verarbeiten, das packt der schon.
#4391752
Lesenswert?

julius schrieb:
> die ws28xx controller sind ja alle mit rgb leds und daraus ein schönes
> warm weiß zu produzieren soll wohl auch nicht so einfach sein.

sagt wer?

man muss doch "nur" weiss wählen und blau rausnehmen oder blau und grün

kann alles bestellt werden, aber wenn man 1-2 Farben runter dreht 
verschiebt es zu rot aber volle Helligkeit gibt es dann nicht mehr.
Gast #4391924
Lesenswert?

Thomas E. schrieb:
> Danke für die Ratschläge, aber nein, ich selbst brauche weder so eine
> Lib, noch bin ich aus der Suche nach einem geeigneten Controller! Das
> war nur so ein Gedanke aus der Beobachtung heraus, da das Thema ja immer
> mal wieder aufkommt!

Und Du bist Dir sicher, dass das von Dir gewünschte überhaupt in einer 
sinnvollen Weise technisch möglich ist?
#4391959
Lesenswert?

Wenn

Thomas E. schrieb:
> Kann sich denn nicht mal einer erbarmen und eine ordentliche
> WS2812-Lib
> für AVRs schreiben, die nicht den ganzen Controller blockiert?

Bei den AVRs mit nichten. Da wird nicht wirklich was anderes möglich 
sein, ausser Atmel würde jetzt AVRs mit einer deutlich höheren CLK auf 
dem Markt bringen. Faktor ~10 nach oben.

Wenn du Leds nutzen möchtest, die weitesgehend nicht den Controller 
blockieren, schau dir die WS2801 oder APA102 an.
#4392094
Lesenswert?

Stefan S. schrieb:
> Bei den AVRs mit nichten. Da wird nicht wirklich was anderes möglich
> sein, ausser Atmel würde jetzt AVRs mit einer deutlich höheren CLK auf
> dem Markt bringen. Faktor ~10 nach oben.

warum?
Die Atmel machen bis 20(22)MHz
Der WS2812b kann nur 800kHz (ein Bit braucht 1,25µs) das sieht auf den 
ersten Blick mal wie ein riesiger Unterschied aus -> 25-facher Clock.

Ich denke an eine IRQ parallel ein Bit rausschickt, weiss aber gerade 
nicht wielange der Einsprung in die IRQ dauert und bis sie wieder 
rauskommt, bei 62,5ns pro Takt sollte es eigendlich möglich sein, 25 
Takte.

Aber OK selbst IRMP verbleibt 1-2 µs im IRQ, das ist etwas lang für eine 
Bitschieberei.

Ich glaube nun verstehe ich den Wunsch nach >=10-fachen Takt.
Moderator Persönliche Seite #4392105
Lesenswert?

Joachim B. schrieb:
> Aber OK selbst IRMP verbleibt 1-2 µs im IRQ, das ist etwas lang für eine
> Bitschieberei.

Du könntest für die Zeit der WS2812-Übertragung speziell den 
IRMP-Timer-Interrupt abschalten. Dann stellt sich dieses Problem nicht 
mehr. Kann aber sein, dass man dann einen IR-Frame mal verpasst. Wie 
hoch dafür die Wahrscheinlichkeit ist, hängt von der Häufigkeit der 
WS2812-Übertragungen ab.

> Ich glaube nun verstehe ich den Wunsch nach >=10-fachen Takt.

Nimm einfach den richtigen µC. Ein STM32 ist einfach geil, da braucht 
man über solche Probleme erst gar nicht nachzudenken.
#4392172
Lesenswert?

Das Problem ist einfach das Protokoll der WS2812.

Es ist weder ein normales asynchrones Protokoll noch ein sychrones. 
Deswegen ist zum einen etwas Rechnerei in Software notwendig um die 
Daten aufzubereiten und zum anderen ist die Datenübertragungsrate so 
hoch, das mangels DMA oder ausreichend großem FIFO die Implementierung 
eigentlich nur "zu Fuß" möglich ist.

Mit DMA (XMega oder anderer Controller) ist das alles garkein Problem 
mehr.

Dafür sind eben die LEDs selbst sehr günstig. Da gebe ich lieber ein 
paar EURonen mehr für einen besseren Controller aus.
Gast #4392199
Lesenswert?

An dieser Stelle hat ein AVR nichts mehr zu suchen. Ist jedenfalls meine 
Meinung. Hier haben die Cortexe mit DMA nun mal ihre Vorteile. 8 Kanäle 
parallel auzugeben schaffen die locker und die CPU hat 99,9..% frei. Da 
scheitert es dann auch nicht am RAM. Durch die Bitbandtechnik bei den 
Cortexen wird auch die Aufbereitung der Daten sehr einfach und schnell, 
da die sonst übliche Bitschieberei nicht nötig ist.
#4392318
Lesenswert?

Frank M. schrieb:
> Nimm einfach den richtigen µC. Ein STM32 ist einfach geil, da braucht
> man über solche Probleme erst gar nicht nachzudenken.

Ich habe doch schon am Atmel und Arduino genug Probleme die ich so nach 
und nach in den Griff bekomme, da halse ich mir keinen anderen µC auf.

Rainer U. schrieb:
> Nur mal so - solange man die Anzeige nicht dauernd ändern will, hat der
> AVR zwischendurch auch nichts zu tun.. :-)

na ja für unsere wordclock (alt und neu) ist auch der AVR noch geeignet, 
das wird ja keine Videoausgabe, nur das ich bei der wordclock1 massig 
Zeit habe mit 119 LEDs zwischen 2 Aktualisierungen, IRMP läuft mit 15000 
IRQ, ein Counter zählt bis 10ms für meine Zeitbasis, alle 250ms wird das 
LCD refeshed und der ws Stripe refeshed, dauert rund 3,6ms stört also 
nicht.

Bei wc24h denke ich an 20ms Zeitbasis mit 9ms Ausgabe der 293 LEDs.

Die IRMP IRQ wurd aber trotzdem enabled, während er in der 10/20ms IRQ 
sich tummelt, das klappt schon, obwohl ich das mit dem ATOMIC noch nicht 
ganz verstanden habe.
(Firma: Vescomp) #4392350
Lesenswert?

Joachim B. schrieb:
> Marc V. schrieb:
>> Bei 800KHz braucht man 30us fur R-G-B (3Byt).
>>  Wenn du deine WS2812 mit 100Hz auffrischst, hast du 10ms, um alle
>>  Daten zu senden.
>>  Das ergibt gute 5m oder 300 LEDs
>
> dann macht der Atmel aber nix anderes mehr 300LEDs a 30µs gibt 9ms und
> das 100 x pro  Sekunde bleibt kaum was übrig für anderes.

 Hatten wir schon mal.
 Es geht auch parallel, also bis zu 8x schneller.
 Das ergibt 1.25ms fur 320 LEDs (8 Stripes a 40 LEDs), bleiben 8.75ms
 fur andere Aufgaben - ist dir das schnell genug ?
 Es geht hier nicht um HD-Video in Echtzeit, sondern um ganz normale
 LED-Ansteuerung mit 100-200 LEDs - nicht ubertreiben, bitte.

 Wir haben kurzlich eine Leuchtreklame mit 260 WS2812 gemacht, mit
 328p. Sequenzen werden von der SD-Card gelesen (3.5ms fur 2 Sectoren),
 7.8ms fur senden, sind 11ms, Refresh mit 30Hz, da langweilt sich der
 m328p ganze 22ms.
 Und fur 1.5 Euro pro Arduino, 0.7 Euro pro SD-Modul, nehme ich halt
 noch 3 oder 4 Arduinos mit SD-Modul, vernetze die und kann machen was
 ich will.
#4392456
Lesenswert?

Marc V. schrieb:
> Hatten wir schon mal.
>  Es geht auch parallel, also bis zu 8x schneller.

nun ja bin immer offen für anderes, nur nutze ich eine alte fastLED LIB 
weil ich der nun meinen atmega 1284p beigebracht hatte und weil ich die 
Dimmfunktion und LED fading einigermassen im Griff habe, sowie den WA 
(weissabgleich), mit welcher LIB kann ich die Stripes auf mehr Ports 
aufteilen und parallel fahren? mit der fastLED so nicht.

Bei der Fastled würde es mir schon genügen wenn ich 2 Stripes einen 
kurzen mit 5 LEDs für Statusmeldungen schnell betreiben könnte, der 
lange mit 288 LEDs für die Minutenumschaltung kann sich Zeit lassen..
#4392487
Lesenswert?

Marc V. schrieb:
> Das ergibt 1.25ms fur 320 LEDs (8 Stripes a 40 LEDs), bleiben 8.75ms
>  fur andere Aufgaben - ist dir das schnell genug ?

Je nach Aufgabe nicht.
Wenn die Daten z.B. seriell reinkommen - als Beispiel über DMX, dann 
muss der UART deutlich schneller bedient werden.
Als einziger Ausweg bleibt dann, zwischen den einzelnen Bitausgaben an 
den WS2812 den Status des UARTs abzufragen. Das geht, wird aber RICHTIG 
hässlich.

Dagegen kann ein STM32 sowohl die WS2812-Kette als auch den UART per DMA 
bedienen, und die CPU muß alle paar ms gerade mal ein paar Pointer 
aktualisieren.

Frank M. schrieb:
> Die "ordentliche" Lib kann ich Dir auch direkt
> mitliefern. ;-)

Hallo Frank, da habe ich starkes Interesse dran!

Gruß, Stefan
(Firma: Vescomp) #4392530
Lesenswert?

Stefan K. schrieb:
> Wenn die Daten z.B. seriell reinkommen - als Beispiel über DMX, dann
> muss der UART deutlich schneller bedient werden.
> Als einziger Ausweg bleibt dann, zwischen den einzelnen Bitausgaben an
> den WS2812 den Status des UARTs abzufragen. Das geht, wird aber RICHTIG
> hässlich.

 Hatten wir auch schon:
Marc V. schrieb:
> Mega328p hat in UCSR0A einen bit (RxC0), den kann man zwischendurch
>  mal gemutlich abfragen, anstatt mit ISR zu arbeiten, etwa so:
1
Byt2WS2812:
2
 ...                   ;*** DataPin fur WS2812 auf High, bit holen  (shift) 7 Takte
3
 ...                   ;*** DataPin entsprechend dem Bitwert setzen         7 Takte
4
 ...                   ;*** DataPin fur WS2812 wieder auf LOW  (PORT )      1 Takt
5
    lds   r16, UCSR0A  ;                                                    2
6
    dec  BitCnt        ;                                                    1
7
    brne Byt2WS2812    ;                                                    2
8
;=================================================================================
9
;                                                                          20 Takte
10
;*** R-G-B gesendet, jetzt wird UART abgefragt...
11
    lds   r17, UDR0         ; 2   /   2
12
    sbrs  r16, RXC0         ; 1   /   2
13
    rjmp  NoUart            ; 2
14
    st    X+, r17           ;         2
15
    ret
16
 NoUart:
17
    nop                     ; 1
18
    ret                     ;===========
19
                            ; 6   /   6 Takte
>  Das sind 6 Takte zusatzlich, bei 328p mit 16MHz brauchst du zwischen
>  16 und 24 Takte fur einen bit beim WS2812-Bitbanging (20 Takte +/- 4
>  Takte), da kann man sogar zwischen den einzelnen bits UART abfragen,
>  nur darf die Pause zwischen den einzelnen Bytes nicht langer als 10us
>  sein, ansonsten wird Reset ausgelost (WS2812 ist da zickig, nichts mit
>  50us wie im DaBla).
>  UART braucht beim 250Kb 40us pro Byt, WS2812 aber nur 30us fur R-G-B,
>  da konnen auch keine Bytes verloren gehen.

 Wenn man mit VGA (256 fest definierte Farben) arbeitet, kann es sogar
 mit DMX richtig schnell werden.
Moderator Persönliche Seite #4392615
Lesenswert?

Stefan K. schrieb:
> Frank M. schrieb:
>> Die "ordentliche" Lib kann ich Dir auch direkt
>> mitliefern. ;-)
>
> Hallo Frank, da habe ich starkes Interesse dran!

Findest Du hier:

  https://www.mikrocontroller.net/articles/WordClock24h#STM32F4xx_Projekt

(siehe Download)

Darin enthalten sind Libs für

  - WS2812
  - DS18(S)20
  - MCURSES
  - IRMP
  - DS3231-RTC
  - I2C-EEPROM
  - UART
  - DCF77 (sehr rudimentär)
  - ESP8266-AT-Anbindung
    (noch nicht auf die letzte AT-Version aktualisiert)

Die Libs laufen auf STM32F4xx und STM32F10x, also z.B. auf den 
STM32F4xx-Nucleo Boards als auch auf dem STM32F103C8T6 
Mini-Development-Board, was man für ca. 4 EUR beim Chinesen bekommt.

Wenn Du Fragen dazu hast, einfach melden.
#4392754
Lesenswert?

Marc V. schrieb:
> Beitrag "UART-Zeichenempfang wenn ISR gesperrt ist, möglich?"

das ist ja mal ein toller Link und so hilfreich

Byt2WS2812:
...                   ;*** DataPin fur WS2812 auf High, bit holen 
(shift) 7 Takte
...                   ;*** DataPin entsprechend dem Bitwert setzen 
7 Takte
...                   ;*** DataPin fur WS2812 wieder auf LOW  (PORT ) 
1 Tak

ich frag mich gerade warum mit NIX 15 Takte verballert werden

achso das war ja nur gedacht:

Marc V. schrieb:
> etwa so:

hast du nix konkreteres?

lds   r16, UCSR0A  ;                                                   2
   dec  BitCnt        ; 
1
   brne Byt2WS2812    ; 
2

mit dec(rement) BitCnt und brne(branch not equal) Byt2WS2812 könnte ich 
ja noch was anfangen wenn dein gesamter Code nicht so geheim wäre.
(Firma: Vescomp) #4393215
Lesenswert?

Joachim B. schrieb:
> mit dec(rement) BitCnt und brne(branch not equal) Byt2WS2812 könnte ich
> ja noch was anfangen wenn dein gesamter Code nicht so geheim wäre.
 Glaube ich kaum, aber unwichtig.

> hast du nix konkreteres?
 Helfen tue ich umsonst, aber Programme werden verkauft.

Joachim B. schrieb:
> ich frag mich gerade warum mit NIX 15 Takte verballert werden
 Wenn du so etwas schreibst, dann weisst du erst mal gar nichts
 (oder sehr wenig) von Bitbanging.
 Also, benutze Arduino librarys, viele Leute tun es und es sind eine
 Menge gute Programme dabei herausgekommen.

 Oder schau mal hier:
 Beitrag "Re: ws2812 und andere zeitkritische Sachen"
#4393241
Lesenswert?

Marc V. schrieb:
>> mit dec(rement) BitCnt und brne(branch not equal) ..könnte ich
>  Glaube ich kaum, aber unwichtig.

habe ich brne falsch verstanden?, kam mir noch so bekannt vor aus meiner 
6502, Z80, LH5803 Zeit

Marc V. schrieb:
> weisst du erst mal gar nichts
>  (oder sehr wenig) von Bitbanging.

das mag sein aber wenn ich Bitbanging richtig verstanden hatte so 
steuere ich einen DAC an, ein Bit, ein Clock und immer so weiter, ich 
weiss ja nicht was du darunter verstehst, ich gestehe aber ich bin kein 
Profiprogger.

Marc V. schrieb:
> Joachim B. schrieb:
>> ich frag mich gerade warum mit NIX 15 Takte verballert werden
>  Wenn du so etwas schreibst, dann weisst du erst mal gar nichts
>  (oder sehr wenig) von Bitbanging.

das schrieb ich weil da nix stand

Marc V. schrieb:
> Oder schau mal hier:
>  Beitrag "Re: ws2812 und andere zeitkritische Sachen"

Danke das sieht besser aus, wenngleich auch nicht für mich gleich 
verständlich, sieht aber für mich nach einem Haufen Arbeit aus.
(Firma: Vescomp) #4393259
Lesenswert?

Joachim B. schrieb:
> Danke das sieht besser aus, wenngleich auch nicht für mich gleich
> verständlich, sieht aber für mich nach einem Haufen Arbeit aus.

 Versuche ich dir doch die ganze Zeit zu sagen.
 Wenn du keinen guten Grund hast, lass es lieber sein, benutze die
 fertigen Libs, es ist keine Schande Arduino-Libs zu benutzen.

 Irgendwo und irgendwann habe ich mal einen Arduino-Sketch runter-
 geladen und auf einen Mini-Pro aufgespielt.
 Es handelt sich um Feuersimulation, Sketch habe ich schon lange
 nicht mehr und da ich nicht glaubte, daß ich irgendetwas besser
 machen kann, habe ich (außer der Matrixgröße) auch nichts verandert.
 Jeder, der diese Simulation sieht, ist einfach begeistert.

 Was ich sagen will, ist folgendes:

 Man soll nicht mit Gewalt irgendetwas verändern oder neu schreiben,
 nur um sagen zu können "das ist mein Werk".
 Es wird Situationen geben, da muss man ganz einfach etwas von Anfang
 an neu schreiben, aber das ist selten und man sollte es zuerst mit
 erprobten Lösungen versuchen.
 Experimentieren und Lernen ist natürlich etwas anderes.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren