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?
julius schrieb:> Funktioniert ein 1m Streifen mit 60 LED's?
es funktioniert definitiv ein Streifen mit 293 LEDs aber in Stücken zu
18 LEDs mit jedem Streifen eine eigene Stromeinspeisung.
Bei 60 LEDs mit nur 1-2 Einspeisungen kann es im Streifen eng werden,
bei voller Helligkeit 60mA * 60 LEDs sind 3,6A aber sollte knapp gehen,
besser mehr Einspeisepunkte wählen.
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.
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.
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.
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?
Was bist Du denn für einer - Betriebswirt?
>Kann sich denn nicht mal einer erbarmen und eine ordentliche WS2812-Lib>für AVRs schreiben, die nicht den ganzen Controller blockiert?
Kauf dir halt vernünftige Stripes.
Nimm LPD8806 oder APA102. Dann hast du fast 100% CPU frei.
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?
Nimm einfach einen STM32 statt AVR. Da geht das per DMA und man hat 100%
für andere Aufgaben frei. Die "ordentliche" Lib kann ich Dir auch direkt
mitliefern. ;-)
dummy schrieb:> Kauf dir halt....
und
Frank M. schrieb:> Nimm einfach einen...
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!
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.
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.
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?
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.
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.
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.
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.
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.
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.
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.
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..
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
Hast Du schon einmal über einen Anschluß an die SPI-Schnittstelle
gedacht? Es gibt den Ansatz, das Bitmuster über den MOSI-Pin auszugeben.
Ein SPI-Datenbyte erzeugt dabei 2,7 WS2812-Datenbits. Dadurch ist das
Timing wesentlich unkritischer.
Gruß, Stefan
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:
> 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.
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.
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.
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"
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.
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.