Go Down

Topic: testbericht zum WS2812 (Read 34143 times) previous topic - next topic

Eisebaer

hi,


frage an uwe:
ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann, habe aber keine möglichkeit (chip), das hier auszuprobieren. hast Du sowas herumliegen?

ich baue gerade für einen freund so einen streifen mit atmega328P und quarz auf 16MHZ. wär praktisch, diesen quarz nicht verbauen zu müssen. muß mir gleich attiny85er bestellen, nur blöd, daß guloshop nicht nach ö liefert.

gruß stefan

Eisebaer

noch eingefallen:

wenn ich diese biblothek richtig verstehe, kann man auch bis zu 8 streifen unabhängig ansteuern. ist zwar momentan nicht mehr interessant, die idee von oben hab' ich verworfen, aber prinzipiell natürlich paktisch.

noch ein gruß, noch ein stefan

uwefed

#32
Feb 22, 2013, 06:20 pm Last Edit: Feb 22, 2013, 06:22 pm by uwefed Reason: 1

hi,


frage an uwe:
ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann, habe aber keine möglichkeit (chip), das hier auszuprobieren. hast Du sowas herumliegen?

ich baue gerade für einen freund so einen streifen mit atmega328P und quarz auf 16MHZ. wär praktisch, diesen quarz nicht verbauen zu müssen. muß mir gleich attiny85er bestellen, nur blöd, daß guloshop nicht nach ö liefert.

gruß stefan


Hallo Stefan.
Soweit ich das Datenblatt studiert habe, gibt es 2 Betriebsmodi beim 2811 wobei beim 2812 nur der langsamere möglich ist da das Pin zur auswahl nicht herausgeführt ist und fix verschaltet ist.
http://www.nooelec.com/files/WS2811.pdf

* When the refresh rate is 30fps, low speedmodelc
ascade number are not less than 512 points, high
speed mode not less than1024 points.
* Send data at speeds of up to 400 Kbps and 800
Kbps two patterns

Ein Bit ist immer 2,5µS bzw 1,25µS lang. Da Verhältnis im langsamen Modus von H zu L ist für ein 1-Bit 0,5 zu 2,0 und für ein 0-Bit 1,2 zu 1,3µS. Alle Zeiten auf eine Genauigkeit von 0,15µS.

Da kann ich mir nicht vorstellen wie den WS2811/12 schneller ansteuern zu können.

Quote
ich hab' eine bibliothek gefunden, die diese streifen mit 8MHz ansteuern kann,

Welche Bibiothek ist das?

Grüße Uwe

dischneider

Ähm, wenn der PIN nicht herausgeführt ist und fix verschaltet, dann gehen nur die 800 kbaud, oder?
Und ob der uC mit 8 oder 16 MHz läuft dürfte doch nur für das Timing spannend werden, arbeiten die Bibliotheken mit Zeiten oder Taktzyklen?
Bei ersterem sollte der Takt doch egal sein?
Nur wie empfindlich gegen Taktschwankungen ist das Ganze, wenn man einen ATTiny mit internem Takt fährt?
Wollte auch testen, bin noch nicht zum bestellen gekommen ...

Liebe Grüße

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

Eisebaer

hi, uwe,

ich wußte nicht, ob's Dich interessiert, und ich muß da noch was dazu erklären.
erstmal:
http://rurandom.org/justintime/index.php?title=Controlling_WS2811_led_strings_at_800kbit/s_without_external_oscillator
hab die ws2811_8.h-datei in die libraries gelegt und in einem leeren sketch includiert.
fehlermeldung: no _delay_us declared in this scope oder so ähnlich. diese funktion hab ich in einer delay.h im arduino-verzeichnis gefunden (gibt 2). die delay.h ins sketch-verzeichnis gelegt und auch includiert (mit " -zeichen). jetzt läßt es sich kompilieren, aber wie gesagt, kein chip zur hand. außerdem muß ich mir noch ansehen, ob dieses struct CRGB dort genauso funkt wie in der fast_SPI.

gruß stefan

Eisebaer

#35
Feb 22, 2013, 06:35 pm Last Edit: Feb 23, 2013, 12:07 am by uwefed Reason: 1
jetzt wo ich's nochmal lese, uwe. ich meinte einen 8MHz chip verwenden, die Ansteuerung muß natürlich gleich schnell bleiben.

gruß stefan

uwefed


Ähm, wenn der PIN nicht herausgeführt ist und fix verschaltet, dann gehen nur die 800 kbaud, oder?
Und ob der uC mit 8 oder 16 MHz läuft dürfte doch nur für das Timing spannend werden, arbeiten die Bibliotheken mit Zeiten oder Taktzyklen?
Bei ersterem sollte der Takt doch egal sein?
Nur wie empfindlich gegen Taktschwankungen ist das Ganze, wenn man einen ATTiny mit internem Takt fährt?
Wollte auch testen, bin noch nicht zum bestellen gekommen ...

Liebe Grüße

Dirk

Ich glaube mich zu erinnern daß es 400kBaud sind.
Grüße Uwe

uwefed


hi, uwe,

ich wußte nicht, ob's Dich interessiert, und ich muß da noch was dazu erklären.
erstmal:
http://rurandom.org/justintime/index.php?title=Controlling_WS2811_led_strings_at_800kbit/s_without_external_oscillator
hab die ws2811_8.h-datei in die libraries gelegt und in einem leeren sketch includiert.
fehlermeldung: no _delay_us declared in this scope oder so ähnlich. diese funktion hab ich in einer delay.h im arduino-verzeichnis gefunden (gibt 2). die delay.h ins sketch-verzeichnis gelegt und auch includiert (mit " -zeichen). jetzt läßt es sich kompilieren, aber wie gesagt, kein chip zur hand. außerdem muß ich mir noch ansehen, ob dieses struct CRGB dort genauso funkt wie in der fast_SPI.

gruß stefan

Heute (Nacht) interssiert es mich nicht mehr; nach dem Wochenende geren.
Grüße Uwe

uwefed

#38
Feb 23, 2013, 12:05 am Last Edit: Feb 23, 2013, 12:07 am by uwefed Reason: 1

jetzt wo ich's nochmal lese, uwe. ich meinte einen 8MHz chip verwenden, die ansteuerung muß natürlich gleich schnell bleiben.

gruß stefan

Da habe ich Dich wirklich falsch verstanden.

Ich weiß nicht wie kritisch der WS2811/12 auf Timingungenaugikeiten reagiert. Ein interner RC-Taktgenerator ist viel ungenauer als ein Resonator oder ein Quarz.

Grüße Uwe

Eisebaer

uwe, Du treibst gerade Deine (natürlich immer noch lächerlich geringe) fehlerquote hoch. die 2812er laufen mit 800.

ich hab' mir jetzt 20 attiny85 bestellt, schlimmstenfalls nehm' ich sie als streusel für kekse.
bestenfalls verwende ich einen für meinen arbeitskollegen, dann bleiben mir immer noch 19 für die kekse. ich kann einfach nicht einen um 2€ kaufen, wenn ich 20 um 22€ krieg'. Ihr solltet mich mal im puff erleben...

gruß stefan


uwefed


uwe, Du treibst gerade Deine (natürlich immer noch lächerlich geringe) fehlerquote hoch. die 2812er laufen mit 800.


auch wenn ichs so unbestimmt formuliere?
Quote
Ich glaube mich zu erinnern daß es 400kBaud sind.


Kann man den ATtiny85 wenns sein muß nicht auch mit externen 16 Mega Quarz betreiben?

Gute Nacht nach Wien.

dischneider

Ist ganz klar mein Fehler, nicht Uwes!
Ich hätte ja dazuschreiben können, dass ich dein vage formulierten Einwand 800kbaud aus dem Datenblatt entnommen habe und mir daher eigentlich ziemlich sicher war ...

Liebe Grüße

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

AgentTil

Hallo zusammen,

erstmal vorweg, vielen Dank für diesen hilfreichen Thread.
Habe mir ebenfalls 2m WS2812 Strips bestellt also 120 LEDs.

Will diese mit dem Arduino Due verbinden. Hab dazu schon extrem viele Seiten gelesen, Interesannt ist für mich das Thema ob ich nicht mehrere Pins für verschiedene Strips verwenden kann.
Für mein Projekt "Wohnzimmerbeleuchtung" brauch ich über 40m Strips. Was dann folglich über 2400 LEDs sind.
Diese an einem Pin zu betreiben erscheint mir ein Ding der Unmöglichkeit. Da ich mit dem Due eine höhere Taktrate habe, müsste ich die Strips doch bei 800kHz auf mehreren Pins parallel betreiben können, oder sehe ich das falsch?

Ich bin ein absoluter Anfänger in Sachen Mircocontroller. Und würde mich echt freuen, wenn Ihr mir bei dem Projekt unter die Arme greift.

Lieben Gruß

Til

There are only 10 types of people in the world: Those who understand binary, and those who don't.

Eisebaer

hi,

kein problem, du mußt dann nur das:
Code: [Select]
         LD __tmp_reg__, %a[dataptr]+" "\n"
"            LSL __tmp_reg__" "\n"
"            LDI %[bits], 4"    "\n"
"            BRCC L13" "\n"
"            RJMP L5" "\n"
"    H1:     NOP" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            NOP" "\n"
"            RJMP END" "\n"
"    L1:     SUBI %[bits], 1" "\n"
"            BREQ M2" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            LSL __tmp_reg__" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            BRCC L8" "\n"
"            NOP" "\n"
"    L15:    NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            RJMP L9" "\n"
"    M4:     LDI %[bits], 4" "\n"
"            LD __tmp_reg__, %a[dataptr]+" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            SUBI %[bytes], 1" "\n"
"            BREQ H1" "\n"
"            LSL __tmp_reg__" "\n"
"            BRCS L9" "\n"
"            NOP" "\n"
"    L16:    OUT %[portout], %[downreg]" "\n"
"            NOP" "\n"
"    L13:    OUT %[portout], %[upreg]" "\n"
"            LSL __tmp_reg__" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            BRCC L10" "\n"
"            SUBI %[bits], 1" "\n"
"            BREQ M4" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            LSL __tmp_reg__" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            BRCS L15" "\n"
"            NOP" "\n"
"    L8:     NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            RJMP L16" "\n"
"    M2:     LDI %[bits], 4" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            NOP" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            LD __tmp_reg__, %a[dataptr]+" "\n"
"            SUBI %[bytes], 1" "\n"
"            BREQ H1" "\n"
"            LSL __tmp_reg__" "\n"
"            BRCC L16" "\n"
"            NOP" "\n"
"    L9:     OUT %[portout], %[downreg]" "\n"
"            NOP" "\n"
"    L5:     OUT %[portout], %[upreg]" "\n"
"            LSL __tmp_reg__" "\n"
"            BRCS L1" "\n"
"            SUBI %[bits], 1" "\n"
"            BREQ M1" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            LSL __tmp_reg__" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            BRCC L4" "\n"
"            NOP" "\n"
"    L12:    NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            RJMP L5" "\n"
"    M3:     LD __tmp_reg__, %a[dataptr]+" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            LDI %[bits], 4" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            SUBI %[bytes], 1" "\n"
"            BREQ H2" "\n"
"            LSL __tmp_reg__" "\n"
"            BRCC L16" "\n"
"            NOP" "\n"
"            RJMP L5" "\n"
"    L10:    SUBI %[bits], 1" "\n"
"            BREQ M3" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            LSL __tmp_reg__" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            BRCS L12" "\n"
"            NOP" "\n"
"    L4:     NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            RJMP L13" "\n"
"    M1:     LD __tmp_reg__, %a[dataptr]+" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            LDI %[bits], 4" "\n"
"            OUT %[portout], %[upreg]" "\n"
"            NOP" "\n"
"            OUT %[portout], %[downreg]" "\n"
"            SUBI %[bytes], 1" "\n"
"            BREQ H2" "\n"
"            LSL __tmp_reg__" "\n"
"            BRCS L9" "\n"
"            NOP" "\n"
"            RJMP L13" "\n"
"    H2:     NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"            NOP" "\n"
"    END:    NOP" "\n"

so umschreiben, daß es zur taktfrequenz des DUE paßt, und dann natürlich auch noch an die anzahl der verwendeten strips anpassen.
was ich damit sagen will:
das ist KEINE sache, die Du mit einem sketch lösen kannst, und Du wirst hier im (deutschsprachigen) forum niemanden finden, der das kann. nimm Dir zwei UNOs, lass die beiden miteinander reden und zwei streifen steuern. einer davon ist der "master". dann nimm den anderen, den "slave", aus dem UNO raus, steckst ihn auf ein breadboard, und einen neuen ATMega328 mit bootloader um 3€ in den sockel des uno. dann kannst Du drei miteinander reden lassen. wenn Du dann, sagen wir mal, fünf hast, bist Du fertig. fünf chips, die zusammen 2400 rgbLEDs steuern können. anders wirst Du das nicht lösen können.

gruß stefan

uwefed


Hallo zusammen,

erstmal vorweg, vielen Dank für diesen hilfreichen Thread.
Habe mir ebenfalls 2m WS2812 Strips bestellt also 120 LEDs.

Will diese mit dem Arduino Due verbinden. Hab dazu schon extrem viele Seiten gelesen, Interesannt ist für mich das Thema ob ich nicht mehrere Pins für verschiedene Strips verwenden kann.
Für mein Projekt "Wohnzimmerbeleuchtung" brauch ich über 40m Strips. Was dann folglich über 2400 LEDs sind.
Diese an einem Pin zu betreiben erscheint mir ein Ding der Unmöglichkeit. Da ich mit dem Due eine höhere Taktrate habe, müsste ich die Strips doch bei 800kHz auf mehreren Pins parallel betreiben können, oder sehe ich das falsch?

Ich bin ein absoluter Anfänger in Sachen Mircocontroller. Und würde mich echt freuen, wenn Ihr mir bei dem Projekt unter die Arme greift.

Lieben Gruß

Til

Ich glaube nicht, daß die Bibliothek zur Ansteuerung des WS2812 mit dem Arduino DUE funktioniert.
Du mußt Dir wahrscheinlich eine Ansteuerung selbst schreiben. Auf alle Fälle mußt Du den 3,3V Ausgang des DUE auf 5V bringen.

Die Max mögliche Länge des Strips hängt einzig von der gewollten Wiederholrate ab. Bei 30 neuen Daten pro Sekunde sind ca 1000 LEDs möglich. Wenn Du 2400 in einem Strang verwendest dann kannst Du ca alle 80mSec neue Daten auf die Strips schreiben. Bei einer Wohnzimmerbeleuchtung ist ein dynamische Lichtgestaltung mit schnellen Wechseln eigentlich nicht erforderlich.

Du weißt schon, daß 2400 Stück WS2812 144A brauchen und das bei 5V 720W sind wenn alle LED weiß leuchten. Es sind natürlich weniger wenn nur ein Teil oder nur bestimmte Farben leuchten.
Dir ist schon bewußt, das das eine Stadion-Tageslicht-Beleuchtung in Deinem Wohnzimmer wird?

Grüße Uwe

Go Up