Kann mit Light WS2812 nicht mehr als 128 LEDs ansteuern

Gast #4819670
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
Angehängte Dateien:
#4819684
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...
Gast #4820002
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.
Gast #4820012
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...
#4820045
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.
#4820058
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)
Gast #4820062
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.
Gast #4820065
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!
Gast #4820407
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.
Angehängte Dateien:

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