Forum: Mikrocontroller und Digitale Elektronik Kann mit Light WS2812 nicht mehr als 128 LEDs ansteuern


von Wolfsente (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

Ich verwende das was ich angehängt habe.
(Habe ich hier von https://github.com/cpldcpu/light_ws2812)

Setzte MAXPIX auf 128.
Alles gut. Es leuchtet ein schöner Regenbogen.

Setze ich allerdings MAXPIX auf 129 geht es nicht.
Der Streifen ist aus.

Möchte allerdings gerne 300 LEDs ansteuern.
Wieso funktioniert das nicht? Die Datentypen sind doch alle groß genug 
oder?

Weitere Infos:
Alle LEDs funktionieren, habe mit einer billigen Testfunktion alle 
ansteuern können.
Mir ist allerdings die Logik einen Regenbogen selbst zu machen noch zu 
hoch.... Deswegen wollte ich auf etwas fertiges zurück greifen.

Ich hoffe ihr könnt mir helfen.

Gruß
Wolfsente

von Johnny B. (johnnyb)


Lesenswert?

Auf die Schnelle sehe ich den Fehler nicht, aber ich sehe schon mal, 
dass MAXPIX nicht grösser als 255 sein darf, ansonsten überläuft eine 
Zählvariable in "Rainbow.c".

Am besten grenzt Du das Problem mal ein wenig ein mithilfe des 
Debuggers. Also ob z.B. der Regenbogen richtig generiert wird, oder ob 
irgendwo der Speicher (RAM) überläuft...

von Wolfsente (Gast)


Lesenswert?

Johnny B. schrieb:
> Auf die Schnelle sehe ich den Fehler nicht, aber ich sehe schon mal,
> dass MAXPIX nicht grösser als 255 sein darf, ansonsten überläuft eine
> Zählvariable in "Rainbow.c".

Das wäre ja nur die Varibale i. Die müsste dann ja nur auf uint16_t 
gemacht werden. Allerdings 2 mal, sie wird komischerweise 2 mal 
angelegt.

Aber bei 129 sollte ja noch nix sein.
Dachte erst das er bei #define ein signed Integer macht aber:
1
#include <avr/io.h>
2
#define maxpix 200
3
4
int main(void)
5
{
6
  uint8_t i,k;
7
    while(1)
8
    {
9
       for(i=maxpix;i>0;i--)
10
     {
11
       k++;
12
     }
13
     
14
    }
15
}

habe ich mir das i mit Watch im Simulator angeguckt, da steht das der 
Wert 200 ist und damit kein minus Wert ist.

von Wolfsente (Gast)


Lesenswert?

Aus versehen zu früh losgeschickt, nu werdens halt 2 Posts

Johnny B. schrieb:
> Am besten grenzt Du das Problem mal ein wenig ein mithilfe des
> Debuggers. Also ob z.B. der Regenbogen richtig generiert wird, oder ob
> irgendwo der Speicher (RAM) überläuft...

Habe dies auf ein Arduino Nano draufgespielt. Da kann ich leider nicht 
so wirklich debuggen...

von Michael .. (gismi)


Lesenswert?

Wolfsente schrieb:
> Habe dies auf ein Arduino Nano draufgespielt. Da kann ich leider nicht
> so wirklich debuggen...

Dan hast du trotzdem noch möglichkeiten um den Fehler einzukreisen:

Wolfsente schrieb:
> Setze ich allerdings MAXPIX auf 129 geht es nicht.
> Der Streifen ist aus.

Was funktioniert den noch? hast du einen KO oder LA um die Datenleitung 
anzuschauen?
ist dauerhaft ein zustand low/high? oder werden Daten geschrieben und es 
kommt nie zum reset (50us low).

ich kenne mich mit Arduino null aus, aber das Board hat bestimmt einen 
RS232 Ausgang. Überprüfe die Zählschlaufen in dem du dir die Werte über 
RS232 ausgiebst. Eine nach der anderen.
So kannst du eingrenzen, wo es hängt.

von Joachim S. (oyo)


Lesenswert?

Ich hätte an Deiner Stelle auch einfach das getan, was gismi 
vorgeschlagen hat: Mir zum debuggen einfach die Werte über USB bzw. den 
UART ausgeben. Auf diese Weise wärest Du recht schnell auf das Problem 
gestossen.

Das Problem liegt letztlich darin, dass der Wert "FADE" im jetzigen 
Zustand beim Übergang von 128 zu 129 von 1 zu 0 wechselt, und der Code 
schlicht nicht funktioniert, wenn FADE 0 ist.
Das scheint allerdings nur an dämlichen #defines zu liegen - denn im 
jetzigen Zustand wird FADE vom Präprozessor durch
256/129/2
ersetzt - und nicht, wie es eigentlich sein sollte, durch
256/(129/2)

Die Lösung liegt also einfach darin, die Definitionen von COLORLENGTH 
und FADE in Klammern zu setzen:
#define COLORLENGTH (MAXPIX/2)
#define FADE (256/COLORLENGTH)

von Wolfsente (Gast)


Lesenswert?

Michael .. schrieb:
> Was funktioniert den noch? hast du einen KO oder LA um die Datenleitung
> anzuschauen?
> ist dauerhaft ein zustand low/high? oder werden Daten geschrieben und es
> kommt nie zum reset (50us low).

Ich werde mir heute Abend ein Oszilloskop ausleihen, dann werde ich mir 
das angucken.
Weiss allerdings nicht was du mit KO meinst. LA meinst du ein 
Logikanalyzer?

Michael .. schrieb:
> ich kenne mich mit Arduino null aus, aber das Board hat bestimmt einen
> RS232 Ausgang. Überprüfe die Zählschlaufen in dem du dir die Werte über
> RS232 ausgiebst. Eine nach der anderen.
> So kannst du eingrenzen, wo es hängt.

Ich glaub das könnte ich hinkriegen. Ist ja per USB mit dem PC 
verbunden.

von Wolfsente (Gast)


Lesenswert?

Joachim S. schrieb:
> ...Auf diese Weise wärest Du recht schnell auf das Problem
> gestossen.
>
> Das Problem liegt letztlich darin, dass der Wert "FADE" im jetzigen
> Zustand beim Übergang von 128 zu 129 von 1 zu 0 wechselt, und der Code
> schlicht nicht funktioniert, wenn FADE 0 ist.
> Das scheint allerdings nur an dämlichen #defines zu liegen - denn im
> jetzigen Zustand wird FADE vom Präprozessor durch
> 256/129/2
> ersetzt - und nicht, wie es eigentlich sein sollte, durch
> 256/(129/2)
>
> Die Lösung liegt also einfach darin, die Definitionen von COLORLENGTH
> und FADE in Klammern zu setzen:
> #define COLORLENGTH (MAXPIX/2)
> #define FADE (256/COLORLENGTH)

Oha ich glaub das hätte ich nicht so schnell entdeckt wie du glaubst :D
Ich werde das heute Abend mal ausprobieren und falls es immer noch 
nicht geht, die Infos liefern wie du und gismi mir geschildert haben. 
Vllt. krieg ichs dann ja selbst raus.
Vielen Dank schonmal!

von Michael .. (gismi)


Lesenswert?

Wolfsente schrieb:
> Weiss allerdings nicht was du mit KO meinst. LA meinst du ein
> Logikanalyzer?

KO : Kathodenstrahloszilloskop oder Oszilloskop
LA hast du richtig verstanden

von Horst (Gast)


Lesenswert?

Welchen Prozessor benutzt Du und wie voll ist Dein Speicher nach dem 
compilieren?

von Wolfsente (Gast)


Angehängte Dateien:

Lesenswert?

Horst schrieb:
> Welchen Prozessor benutzt Du und wie voll ist Dein Speicher nach
> dem
> compilieren?

Program Memory Usage   :  816 bytes   2,5 % Full
Data Memory Usage   :  834 bytes   40,7 % Full

ATmega328

Aber das ist in Ordnung mehr soll das Ding gar nicht machen :D

Vielen Dank an alle! Hat so super funktioniert!
Habe den Code mal angehangen.

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.