Forum: Mikrocontroller und Digitale Elektronik WS2812B Matrix zeigt nur weiß an


von M. W. (rallini94)


Lesenswert?

Hey,

nach einer Stunde, großer Verzweifelung und dem Gefühl mal wieder selbst 
die einfachsten Dinge nicht auf die Reihe zu bekommen, hoffe ich, dass 
mir hier jemand einen Rat geben kann.

Ich habe mir eine WS2812B Matrix gekauft (1)
Sie an ein Arduino Uno R3 gehangen. Und das Blink Beispiel aus dem 
Forumartikel "WS2812 Ansteuerung" unter Light weight WS2812 Library (2) 
aufgespielt. Siehe da, die erste LED leuchtet. Aber in weiß. Dauerhaft. 
kein Blinken, kein Farbwechsel.

Schnell noch eine zweite LED definiert und überspielt -> zwei Weiße LEDs 
toll.

Ich bekomme einfach keine einzelnen Farben angesprochen. Ich nehme 
eigentlich an, dass die Bibliothek korrekt ist und irgendwas schein die 
Matrix ja auch zu erhalten. Aber ich verstehe nicht, wieso nur weiß.


Habt ihr Ratschläge für einen Verzweifelten?



1) 
https://www.amazon.de/Longruner-Digitales-Flexibles-Integriertes-Traumfarbenbeleuchtung/dp/B07KT1H481/ref=sr_1_1?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=longruner+32x8&qid=1567621275&s=ce-de&sr=1-1-catcorr

2) 
https://www.mikrocontroller.net/articles/WS2812_Ansteuerung#Ansteuerung_per_Software_auf_AVR

von Falk B. (falk)


Lesenswert?

M. W. schrieb:
> Habt ihr Ratschläge für einen Verzweifelten?

Naja, erstmal muss EINE LED korrekt leuchten. Da kann man einiges falsch 
machen. Ist F_CPU korrekt definiert? Für das gesamte Projekt?

Hast du einen Logicanalyzer oder gar Oszi, um das Signal anzuschauen?

von M. W. (rallini94)


Lesenswert?

Falk B. schrieb:
> M. W. schrieb:
>> Habt ihr Ratschläge für einen Verzweifelten?
>
> Naja, erstmal muss EINE LED korrekt leuchten. Da kann man einiges falsch
> machen. Ist F_CPU korrekt definiert? Für das gesamte Projekt?
>
> Hast du einen Logicanalyzer oder gar Oszi, um das Signal anzuschauen?

Peinlich.. war wohl doch die F_CPU. Habe diese am Anfang von main.c 
definiert. Das war bisher immer ausreichend. Aber die light_ws2812.c hat 
das wohl überschrieben.

Ich weiß schon warum ich lieber bei Hardware bleibe :D.

Danke. Und nochmal Entschuldigung für meine Trotteligkeit

von Wolfgang (Gast)


Lesenswert?

M. W. schrieb:
> Habt ihr Ratschläge für einen Verzweifelten?

Entspricht der als F_CPU eingetragene Wert der tatsächlichen 
Taktfrequenz deines Arduino?
Ein Widerstand zwischen Ausgang des Arduino und Dateneingang der ersten 
LED ist auch zu empfehlen.

von Falk B. (falk)


Lesenswert?

M. W. schrieb:
> Danke. Und nochmal Entschuldigung für meine Trotteligkeit

Was soll der Unsinn? Nur wer nichts macht, macht nichts falsch.

Wenn man einen Weisen auf einen Fehler hinweist, bedankt er sich.
Wenn man einen Narren auf einen Fehler hinweist, wird er wütend.

Konfuzius

Was bist du?


P.S Wenn man F_CPU in den Projekteinstellungen oder (für die harten 
Jungs) im Makefile einträgt, sehen ALLE Quelldateien im Projekt den 
gleichen Wert.

von Falk B. (falk)


Lesenswert?

M. W. schrieb:
> Aber die light_ws2812.c hat
> das wohl überschrieben.

Wenn diese "Lib" was taugt, würde sie bei einer fehlenden Definition 
einen Fehler beim Compilieren erzeugen. Allerdings kann sie 
prinzipbedingt keine falsche Definition von F_CPU erkennen 8-0
Überschrieben wird da rein gar nichts. Wozu auch? Diese Information MUSS 
von außen, sprich vom Compiler oder dem Headerfile kommen!

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

M. W. schrieb:
> Sie an ein Arduino Uno R3 gehangen. Und das Blink Beispiel aus dem
> Forumartikel "WS2812 Ansteuerung" unter Light weight WS2812 Library (2)
> aufgespielt. Siehe da, die erste LED leuchtet. Aber in weiß. Dauerhaft.
> kein Blinken, kein Farbwechsel.
>
> Schnell noch eine zweite LED definiert und überspielt -> zwei Weiße LEDs
> toll.
>
> Ich bekomme einfach keine einzelnen Farben angesprochen.

Hallo,
Erstens, du solltest genau die Schaltung ankucken.
Meine eigene Experimente zeigen: in Ruhestand sollte Eingang von WS2812 
"low" sein. Wenn "high" (so wie bei mir, da WS2812 von 74HC138 getaktet 
wird), dann kann helfen, wenn man Reset vor UND nach der Sendung macht.

Zweitens, du solltest genau kucken, was du hast: WS2812 oder WS2812B: 
die haben unterschiedliche Timing. Die Zeiten sollten stimmen. Meine 
Experimente zeigen: wenn Reset-Dauer nur um 10% gekürzt wird, kommt ein 
Problem.

> Ich nehme eigentlich an, dass die Bibliothek korrekt ist

Und drittens, vertraue niemals einer Bibliothek von Dritten, ohne selber 
durch Code zu gehen. Sonst riskierst du, wenn auch zuerst alles zu 
funktionieren scheint, daß später schwer zu findende Fehler kommen.

Gruß.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Was für ein Geschwätz!

von Maxim B. (max182)


Lesenswert?

Falk B. schrieb:
> Was für ein Geschwätz!

Auch wenn du mir nicht glaubst: so ähnlich wie bei TO hatte ich bei zu 
kurzem Reset. Ich habe Toleranzgrenzen geprüft. Davon diese Zahl, 10%.

von Wolfgang (Gast)


Lesenswert?

Maxim B. schrieb:
> Meine Experimente zeigen: wenn Reset-Dauer nur um 10% gekürzt wird,
> kommt ein Problem.

Was erwartest du?
Wenn im Datenblatt steht "above 50 µs" dann ist damit gemeint ">50 µs" 
und nicht "> 45 µs".

von Maxim B. (max182)


Lesenswert?

Ich habe zu größeren Toleranzen bei IC gewöhnt, es sei denn, es geht um 
Quarz. Hier ist das aber nicht der Fall. +-20% oder gar +-30% sind 
normal, manchmal auch +-50%.

von M. W. (rallini94)


Lesenswert?

Falk B. schrieb:
> M. W. schrieb:
>> Danke. Und nochmal Entschuldigung für meine Trotteligkeit
>
> Was soll der Unsinn? Nur wer nichts macht, macht nichts falsch.
>
> Wenn man einen Weisen auf einen Fehler hinweist, bedankt er sich.
> Wenn man einen Narren auf einen Fehler hinweist, wird er wütend.
>
> Konfuzius
>
> Was bist du?
>
> P.S Wenn man F_CPU in den Projekteinstellungen oder (für die harten
> Jungs) im Makefile einträgt, sehen ALLE Quelldateien im Projekt den
> gleichen Wert.

Nun, meine main.c beginnt wie folgt
1
#define F_CPU 16000000UL
2
3
#include <util/delay.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include "light_ws2812.h"

Die light_ws2812.c mit
1
#include "light_ws2812.h"
2
#include <avr/interrupt.h>
3
#include <util/delay.h>

In main waren die Zeiten ok (Blinkende LED im Sekundentakt). In nahm an, 
dass F_CPU dann auch für alle weiteren includes bekannt sei mit 16 MHz.
Und dementsprechend das
1
#ifndef F_CPU
2
# define F_CPU 1000000UL
3
#endif
 in delay.h für die light_ws2812.c nicht zum tragen kommt. Wie es 
aussieht irre ich mich und muss mich wohl mal mit den entsprechenden 
Definitionen in den Projekteinstellungen beschäftigen

von Maxim B. (max182)


Lesenswert?

M. W. schrieb:
> in delay.h für die light_ws2812.c nicht zum tragen kommt. Wie es
> aussieht irre ich mich und muss mich wohl mal mit den entsprechenden
> Definitionen in den Projekteinstellungen beschäftigen

Das ist eine gute Frage...
Genau gesagt, in delay.h steht so:
1
#ifndef F_CPU
2
/* prevent compiler error by supplying a default */
3
# warning "F_CPU not defined for <util/delay.h>"
4
/** \ingroup util_delay
5
    \def F_CPU
6
    \brief CPU frequency in Hz
7
8
   ......
9
 */
10
# define F_CPU 1000000UL
11
#endif
D.h. wenn Warning nicht kommt, so wird auch # define F_CPU 1000000UL 
ohne Wirkung.

D.h. eigene Def für F_CPU sollte vor #include <util/delay.h> stehen...
Bei mir aber steht zuerst #include <util/delay.h> und erst später 
#include "main.h", wo F_CPU definiert wird, dabei wirkt meine 
Definition. Keine Ahnung, warum. Wahrscheinlich ist irgendwas auch mit 
Makefile verbunden. Trotzdem sollte für normale Compilat mit Atmel 
Studio beides stehen: in Projekteigenschaften UND in *.h-File. Sonst 
kommen Warnungen.

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.