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?
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
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.
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.
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!
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ß.
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%.
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".
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%.
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
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.