Forum: Mikrocontroller und Digitale Elektronik Treiber für WS2812: Dedizierte Logik?


von Ludwig B. (ludwig_b90)


Lesenswert?

Hallo,
auch ich bin auf den WS2812 und das ungünstige Timing getroffen.
Alle Lösungen, die ich hier gefunden habe, bezogen sich rein auf 
Software oder Hardware im µC. Einen Versuch, einen rein hardwareseitigen 
Treiber dafür zu bauen, gab es noch nicht, liege ich damit richtig?

Meine Idee war es, ein '8 Bit parallel -> seriell Shiftregister' zu 
verwenden.

Man könnte immer für eine Farbe die Werte mit 8 I/Os ins Register laden, 
so müsste der µC nur alle 10µs (1,25µs*8) die Pins neu beschreiben, was 
bei einem 48MHz STM z.B. alle 480 Takte wäre.

Das Weiterschieben der Werte im Register und anschließende Generieren 
und Timen der 0 und 1 "Codes" müsste also durch Gatter und Delaylines 
erfolgen. Der µC würde des Weiteren einen Befehl (ein weiterer I/O) 
bekommen, wenn er ein neues Byte auf seinen Output schreiben muss (alle 
10µS).

Also kurz ausgedrückt: Der µC schreibt alle 10µS, augelöst durch einen 
Pin Change Interrupt, immer 8 Bit aus einem Array mit den Farben für die 
LEDs auf einen seiner Ports, der Treiber macht den Rest.

Nun meine Frage: Haltet ihr diese Variante der Ansteuerung für sinnvoll? 
Oder habe ich etwas übersehen?
Bei Bedarf kann ich gerne eine Übersicht der Schaltung (1x 8Bit 
Register, 1x 4Bit Counter und ein paar Gatter) bereitstellen.

Mit freundlichen Grüßen, Ludwig.

von holger (Gast)


Lesenswert?

>Meine Idee war es, ein '8 Bit parallel -> seriell Shiftregister' zu
>verwenden.

Dann kannst du auch gleich Leds mit APA102 nehmen.
Ansteuerung über 2 Wire SPI ohne zeitliche Krücken.

von Ludwig B. (ludwig_b90)


Lesenswert?

holger schrieb:
> Dann kannst du auch gleich Leds mit APA102 nehmen.
> Ansteuerung über 2 Wire SPI ohne zeitliche Krücken.

Hallo,

ich habe die APAs für 50 Euro/5Meter und die WS2812 für 35 Euro/5Meter 
gefunden, bei der von mir benötigten Länge war das ein Unterschied von 
75 Euro.

Gruß, Ludwig.

von Axel R. (Gast)


Lesenswert?

Habe es mir gerade angesehen:
Mein Rat - nimm die 75 Euro in die Hand und mach es mit den APA102.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> Alle Lösungen, die ich hier gefunden habe, bezogen sich rein auf
> Software oder Hardware im µC.

Neu erfundene Lösungen, haben gegenüber bestehenden nur Nachteile. Das 
Optimum ist erreicht. Nutze eine dieser gefunden Lösungen.

Oder mach es, wie Axel R. bereits schrieb: APA102.

Den APA102 kannte ich bis eben noch nicht.

@cpldcpu: Danke für den Blog-Post!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ludwig B. schrieb:
> Nun meine Frage: Haltet ihr diese Variante der Ansteuerung für sinnvoll?
> Oder habe ich etwas übersehen?

 LPD6803 hat auch SPI, geht locker bis 25MHz.

von Ludwig B. (ludwig_b90)


Lesenswert?

Axel R. schrieb:
> Habe es mir gerade angesehen:
> Mein Rat - nimm die 75 Euro in die Hand und mach es mit den APA102.

Marc Vesely schrieb:
> LPD6803 hat auch SPI, geht locker bis 25MHz.

Torsten C. schrieb:
> Neu erfundene Lösungen, haben gegenüber bestehenden nur Nachteile. Das
> Optimum ist erreicht. Nutze eine dieser gefunden Lösungen.

Hallo,

ich selbst bin Student und möchte ein Projekt haben, bei dem ich auch 
etwas lerne und nicht einfach nur ne Clock und ne Data Line passend zu 
einander toggle.

Mir geht es nicht (nur) um die 75 Euro, da ich Nachrichtentechnik (also 
auch viel Digital und HF-Technik) studiere (2. Semester), kann ich mir 
so evtl auch etwas meines Studieninhaltes "vorwegarbeiten" -> Vorteil.

Also so lange mein Projekt (wenn auch mit viel Aufwand) umsetzbar ist, 
wäre ich über jede Hilfe und jeden Ratschlag dankbar!

Gruß, Ludwig.

: Bearbeitet durch User
von einer (Gast)


Lesenswert?

Dann benutze mal die Forum Suchfunktion um zu wissen, wie man die Leds 
mit
HW SPI betrieben werden.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> Also so lange mein Projekt (wenn auch mit viel Aufwand) umsetzbar ist,
> wäre ich über jede Hilfe und jeden Ratschlag dankbar!

Verstehe. Ich weiss nicht, ob es den Anderen auch so geht, aber ich habe 
keinen Spass daran, das Rad neu zu erfinden.

> '8 Bit parallel -> seriell Shiftregister'

Genau das ist in fast jedem µC schon drin und nennt sich SPI oder UART.

Ich habe das WS2812-Problem u.A. per UART + DMA gelöst:

Hardware: Ein Inverter, weil Start-Bit = 0 und Stop-Bit = 1.

Alles andere kann man machen, um zu lernen, wie man das Problem 
normalerweise nicht lösen würde.

von Axel R. (Gast)


Lesenswert?

Dann musst Du die 3x8Bit latchen, einen Referenztakt erzeugen und die 
Daten rausschieben und mit XOR verknüpfen.

EDIT mit dem Takt verknüpfen

von Ludwig B. (ludwig_b90)


Lesenswert?

einer schrieb:
> Dann benutze mal die Forum Suchfunktion um zu wissen, wie man die Leds
> mit
> HW SPI betrieben werden.

Hallo,
inwiefern bringt mich HW SPI denn weiter?

Wie das Timing und die Codes funktionieren ist mir bewusst, ich würde 
gerne einen Controller mit einem parallelen Input und dem Output für die 
Strips herstellen, was hat das denn mit einem im µC implementierten 
Protokoll zu tun?

Gruß, Ludwig.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ludwig B. schrieb:
> Also so lange mein Projekt (wenn auch mit viel Aufwand) umsetzbar ist,
> wäre ich über jede Hilfe und jeden Ratschlag dankbar!

 Mein Ratschlag ist:
 Nicht immer das Rad neu erfinden.
 Wenn es etwas schon gibt, ist billig und funktioniert, wozu dann das
 Ganze ?

 WS2812 kann maximal 800KHz, wenn du schon einen Treiber dafur brauchst,
 nimm doch einen 328p auf 16MHz.
 Und die Daten kann der ARM in Blocks per DMA rausschicken, nix "alle
 10us..." und so.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Marc Vesely schrieb:
> Nicht immer das Rad neu erfinden.

Das war fast gleichzeitig! :-) Wir sind uns einig.

>  Wenn es etwas schon gibt, ist billig und funktioniert, wozu dann das
>  Ganze ?

Noch ein Hinweis: Die Variante mit Timern statt UART gibt es auch noch, 
kostet aber bei DMA mehr Speicher. Dafür ist die variante ohne 
Inverter-Hardware.

: Bearbeitet durch User
von Ludwig B. (ludwig_b90)


Lesenswert?

Axel R. schrieb:
> Dann musst Du die 3x8Bit latchen, einen Referenztakt erzeugen und die
> Daten rausschieben und mit XOR verknüpfen.

Genau das war meine Idee!

Torsten C. schrieb:
> Ludwig B. schrieb:
>> Also so lange mein Projekt (wenn auch mit viel Aufwand) umsetzbar ist,
>> wäre ich über jede Hilfe und jeden Ratschlag dankbar!
>
> Verstehe. Ich weiss nicht, ob es den Anderen auch so geht, aber ich habe
> keinen Spass daran, das Rad neu zu erfinden.

Ich hingegen schon. Man kann eigentlich immer etwas optimieren. Und 
selbst wenn nicht, lernt man dabei etwas.

>> '8 Bit parallel -> seriell Shiftregister'
>
> Genau das ist in fast jedem µC schon drin und nennt sich SPI oder UART.
>
> Ich habe das WS2812-Problem u.A. per UART + DMA gelöst:

Die Lösung fand ich sehr elegant!
Auch ich hatte einen Ansatz mit einem Timer und DMA Controller, möchte 
mich aber nun der Hardware zuwenden, sodass man später auch mit 1MHz und 
ohne DMA und der gleichen einen solchen Strip ansteuern kann.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> Ansatz mit einem Timer und DMA Controller

Die Timer-Variante kommt ohne weitere "Hardware" (Inverter) aus, kostet 
aber einen größeren DMA-Block als die UART-Variante.

Ludwig B. schrieb:
> Man kann eigentlich immer etwas optimieren.

Wenn sich schon rund 5 Jahre lang alle Experten auf dieser Welt die 
Köpfe zerbrochen haben? Als ich sehr jung war, habe ich auch mal so 
gedacht. Einzig sinnvoller Ansatzpunkt: "Alte Zöpfe abschneiden.". Aber 
so alt ist die WS2812 noch nicht.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ludwig B. schrieb:
> Ich hingegen schon. Man kann eigentlich immer etwas optimieren. Und
> selbst wenn nicht, lernt man dabei etwas.

 Das mit lernen ist OK, aber mit optimieren bestimmt nicht.

Ludwig B. schrieb:
> Auch ich hatte einen Ansatz mit einem Timer und DMA Controller, möchte
> mich aber nun der Hardware zuwenden, sodass man später auch mit 1MHz und
> ohne DMA und der gleichen einen solchen Strip ansteuern kann.

 "ohne DMA und dergleichen" ?
 Das ist alles schon vorhanden, wo ist da "dergleichen" ?
 Im Gegensatz dazu deine "Losung" mit viel (unnotiger) Hardware. Ich
 steuere meine WS2812 (2 x 4m) mit ATTiny85 und selbst der ist mehr
 als genug.

von Ludwig B. (ludwig_b90)


Lesenswert?

Torsten C. schrieb:
> Als ich sehr jung war, habe ich auch mal so
> gedacht. Einzig sinnvoller Ansatzpunkt: "Alte Zöpfe abschneiden.". Aber
> so alt ist die WS2812 noch nicht.

Wenn ich auf die letzten Jahre und all meine Projekte und Basteleien im 
Bereich der ET und IT zurückschaue, habe ich NIE etwas neu erfunden oder 
verbessert. Ich habe immer an bestehenden und schon gelösten Problemen 
geforscht und mir selber eine Lösung einfallen lassen. Diese war im 
Endeffekt um ein vielfaches Teurer als die schon bestehende Lösung.
Rausgeschmissenes Geld?
Rausgeschmissene Zeit?
Aus meiner Sicht nicht. Das Wissen und die Erfahrungen, die ich dadurch 
gemacht habe, sind -mir selbst zumindest- viel mehr wert.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> später auch mit 1MHz und ohne DMA

Welche 1MHz? CPU-Takt einer 20 Jahre alten Z80?

Ludwig B. schrieb:
> Versuch, einen rein hardwareseitigen Treiber dafür zu bauen

Das hatte ich auch mal überlegt, mit einem CPLD:

Beitrag "ARM und WS2812 LEDs mit DMA und EPM3032A"

Aber wozu? Es macht keinen Sinn!

: Bearbeitet durch User
von Ludwig B. (ludwig_b90)


Lesenswert?

Marc Vesely schrieb:
> Ludwig B. schrieb:
>> Ich hingegen schon. Man kann eigentlich immer etwas optimieren. Und
>> selbst wenn nicht, lernt man dabei etwas.
>
>  Das mit lernen ist OK, aber mit optimieren bestimmt nicht.

Ich wollte mit meiner Aussage niemanden angreifen oder behaupten, dass 
ich als 'Amateur' "so kurz mal" alles besser machen könnte.
Aber ist es so schlimm, wenn man an einem Thema weiterforschen möchte? 
Zudem kann es ja sein, dass für spezielle Zwecke ein anderer Ansatz 
optimaler ist.
Wie dem auch sei, ich entschuldige mich, dass ich etwas verbessern 
wollte...

von holger (Gast)


Lesenswert?

>Aus meiner Sicht nicht. Das Wissen und die Erfahrungen, die ich dadurch
>gemacht habe, sind -mir selbst zumindest- viel mehr wert.

Dann mach halt und freu dich wenn es geht.
Erwarte aber keine Hilfe oder Beifall wenn es bereits elegantere
Lösungen gibt. Warum sollte jemand Zeit für dich verschwenden für eine
möglichst umständliche Lösung mit einem TTL Grab?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ludwig B. schrieb:
> Wie dem auch sei, ich entschuldige mich, dass ich etwas verbessern
> wollte...

 Nicht gleich beleidigt sein, war nicht bose gemeint...

 Ich sagte ja, dass es mit lernen OK ist. Aber was kann man da gross
 verbessern wenn der WS2812 max. 800KHz kann ?
 Da langweilt sich ein ARM zu Tode.


 EDIT:

 Was ich sagen wollte:
 24bit * 1.25us = 30us
 100Hz Refresh = 10ms
 10ms / 30us = 333 LEDs

 Deswegen werden die WS2812 in Modulen a 256 LEDs zusammengebaut.
 Anders macht es keinen Sinn, irgendeine animation uberhaupt zu
 versuchen.

: Bearbeitet durch User
von Ludwig B. (ludwig_b90)


Lesenswert?

holger schrieb:
> Dann mach halt und freu dich wenn es geht.
> Erwarte aber keine Hilfe oder Beifall wenn es bereits elegantere
> Lösungen gibt. Warum sollte jemand Zeit für dich verschwenden für eine
> möglichst umständliche Lösung mit einem TTL Grab?

Beifall erwarte ich gewiss keinen, wieso sollte ich auch?

Die Hilfe, die ich in diesem Beitrag bekommen habe, ist aus meiner Sicht 
eine sehr große. Auch wenn es hauptsächlich Ratschläge waren, es nicht 
so zu machen, wie ich es vorhabe, fand ich es hilfreich.

Die Aussage, niemand wolle Zeit für mich "verschwenden" finde ich in 
einem Forum allerdings unangebracht.

Marc Vesely schrieb:
> Nicht gleich beleidigt sein, war nicht bose gemeint...

Keine Angst, das bin ich gewiss nicht! :) Ich bin dankbar für die 
Meinungen!

von Ludwig B. (ludwig_b90)


Lesenswert?

Marc Vesely schrieb:
> EDIT:
>
>  Was ich sagen wollte:
>  24bit * 1.25us = 30us
>  100Hz Refresh = 10ms
>  10ms / 30us = 333 LEDs
>
>  Deswegen werden die WS2812 in Modulen a 256 LEDs zusammengebaut.
>  Anders macht es keinen Sinn, irgendeine animation uberhaupt zu
>  versuchen.

Ich werde - bedingt durch die Installation - 20 Strips mit je 40 LEDs 
parallel betreiben, ich könnte also deutlich schneller aktualisieren, 
alles über 100Hz macht für mich aber keinen Sinn.
Zudem werden die LEDs hinter diffusen Röhren verbaut, sodass man die 
einzelnen Pixel und somit auch fast alle Animationen abgesehen von 
Farbverläufen nicht mehr als solche erkennt.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> Die Aussage, niemand wolle Zeit für mich "verschwenden" finde ich in
> einem Forum allerdings unangebracht.

Vielleicht bin ich gar nicht gemeint, trotzdem: Das Forum hat mehr 
davon, wenn Du die vorhandenen 99%-Lösungen optimierst, als wenn Du 
versuchst, neue 30%-Lösungen zu diskutieren.

Ludwig B. schrieb:
> später auch mit 1MHz

Hat jemand die 1MHz verstanden?

: Bearbeitet durch User
von Ludwig B. (ludwig_b90)


Lesenswert?

Torsten C. schrieb:
> Vielleicht bin ich gar nicht gemeint, trotzdem: Das Forum hat mehr
> davon, wenn Du die vorhandenen 99%-Lösungen optimierst, als wenn Du
> versuchst, neue 30%-Lösungen zu diskutieren.

Bezog sich auf den Kommentar:
holger schrieb:
> Erwarte aber keine Hilfe oder Beifall wenn es bereits elegantere
> Lösungen gibt. Warum sollte jemand Zeit für dich verschwenden für eine
> möglichst umständliche Lösung mit einem TTL Grab?

Torsten C. schrieb:
> Hat jemand die 1MHz verstanden?

Ich wollte damit zum Ausdruck bringen, dass ich gerne unabhängig vom 
Prozessortakt und unabhängig von Hardware-Komponenten des µC die LEDs 
betreiben würde.
Mir ist klar, dass jeder zwiete µC auf dem Markt UART und DMA besitzt, 
womit deine Umsetzung einsatzbereit wäre und, dass die LEDs mit höheren 
Taktraten und/oder Inline-ASM auch per Bitbanging betrieben werden 
können.

Aber wenn ein Anfänger damit erstmal nicht umgehen möchte, ist die 
Lösung ohne jegliche Hardware-Komponenten eventuell eine Hilfe.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ludwig B. schrieb:
> Zudem werden die LEDs hinter diffusen Röhren verbaut, sodass man die
> einzelnen Pixel und somit auch fast alle Animationen abgesehen von
> Farbverläufen nicht mehr als solche erkennt.

 Ja, ich dachte an Video. Wie gesagt, ich habe 2 LED-Stripes je 4m
 (eigentlich 4m + 3m) und die schafft der Tiny85 ohne Probleme.
 Naturlich nicht mit 16 Mio Farben, aber 256 Farben sind eigentlich
 mehr als genug, vor allem, da ich diese dann auch nach einem bestimmten
 Schema verandern kann, die der Tiny von der SD liest.

 Mein Punkt ist:
 Lieber das, was man hat, maximal ausnutzen als unnotig versuchen, etwas
 zu verbessern, was schon an ihre Grenzen angelangt ist.
 WS2812 wird nicht schneller als 800KHz, also lieber versuchen diese
 800KHz auszureizen, als auf der anderen Seite (beim ARM) etwas zu
 verbessern, was gar keiner Verbesserung bedarf.

von Ludwig B. (ludwig_b90)


Lesenswert?

Marc Vesely schrieb:
> Mein Punkt ist:
>  Lieber das, was man hat, maximal ausnutzen als unnotig versuchen, etwas
>  zu verbessern, was schon an ihre Grenzen angelangt ist.
>  WS2812 wird nicht schneller als 800KHz, also lieber versuchen diese
>  800KHz auszureizen, als auf der anderen Seite (beim ARM) etwas zu
>  verbessern, was gar keiner Verbesserung bedarf.

Ich kann diesen Punkt voll und ganz verstehen! Mein Szenario war nur:

Ludwig B. schrieb:
> Mir ist klar, dass jeder zwiete µC auf dem Markt UART und DMA besitzt,
> womit deine Umsetzung einsatzbereit wäre und, dass die LEDs mit höheren
> Taktraten und/oder Inline-ASM auch per Bitbanging betrieben werden
> können.
>
> Aber wenn ein Anfänger damit erstmal nicht umgehen möchte, ist die
> Lösung ohne jegliche Hardware-Komponenten eventuell eine Hilfe.

Für das Grundkonzept werde ich 2,3 Gatter und ein Schieberegister 
verbraten, kein allzu großer Verlust. Danach kehre ich vielleicht zur 
Softwarelösung zurück, oder ich bleib bei meiner Version...

Bis dahin auf jeden Fall vielen Dank für die Ratschläge und die Zeit, 
die Sie/ihr sich/euch für mich genommen habt!

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ludwig B. schrieb:
> Für das Grundkonzept werde ich 2,3 Gatter und ein Schieberegister
> verbraten

Für das gleiche Geld bekommst Du einen kompletten µC!

Ludwig B. schrieb:
> Bis dahin auf jeden Fall vielen Dank für die Ratschläge und die Zeit,
> die Sie/ihr sich/euch für mich genommen habt!

Bitte, bis hierhin gern geschehen. Man nennt das auch 
"Beratungs-Resistent". Für mich ist hier Schluss
⇒ Thread nicht mehr beobachten.

Ludwig B. schrieb:
> Torsten C. schrieb:
>> ...
> Bezog sich auf den Kommentar: ...

Da weißt Du wohl mehr als ich. Oder auch nicht? Falls darauf noch eine 
Antwort kommt, werde ich sie nicht mehr wahrnehmen.
Falls es wichtig ist ➜ PN

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.