WS2812B Matrix zeigt nur weiß an

OP #5962370
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
OP #5962407
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
#5962411
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.
#5962413
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!
#5962815
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ß.
OP #5964033
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
#5965576
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.

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