Forum: Mikrocontroller und Digitale Elektronik LED-Matrix mit light_ws2812-library; Ansteuerungsgeschwindigkeit


von clautsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebes Forum!

Ich steuere eine 24x24 RGBW-Matrix an, realisiert mit einem 
6812-RGBW-Strip. Als Controller nutze ich einen Atmega1284P, getaktet 
auf 8MHZ. Ich komme eher aus der Hobby-Ecke, deswegen fehlt mir jetzt 
etwas Wissen, um mit folgendem Problem umzugehen:
Ich steuere meine Matrix mit Hilfe der light_ws2812-lib an.
(https://github.com/cpldcpu/light_ws2812)
oder
https://www.mikrocontroller.net/articles/WS2812_Ansteuerung
Prinzipiell klappt das auch,jedoch ist meine "Animation" ganz schön 
langsam.
Laut Dokumentation sollte die Übertragung eines Bits an den Strip 1,25us 
dauern;
also ein Byte 10us; sollte doch dann für 576 * 4 Werte insgesamt ~23ms 
brauchen, plus 50us Resettime und der restliche Programmablauf, aber der 
is ja quasi vernachlässigbar, sagen wir mal 25ms.

Meine "Testanimation" (Streifen läuft von unten nach oben) läuft aber 
viel langsamer ab: Nach obiger Rechnung sollte die Darstellung von 24 
Bildern ca. 0,6s brauchen, ich stoppe deutlich über 2s. Was mach ich 
denn da falsch?
Bin über jede Hilfe und Tip dankbar!
Jetzt erstmal gut Nacht,
Claudia

von Teo D. (teoderix)


Lesenswert?

Is nich meine Baustelle, aber schmeiß mal das bei dir sicher unnötige 
Delay aus der Lib raus.
1
void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
2
{
3
  ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(ws2812_pin));
4
  _delay_us(ws2812_resettime); 
5
}

von Thomas W. (diddl)


Lesenswert?

Hmmm, 0,6 Sekunden zu 2 Sekunden ...

Faktor, sagen wir mal 4 ...



Bist du sicher dass der atmega mit 8MHz läuft?

Wie sind die fuses eingestellt?

Ist womöglich das Div8 ein?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Teo D. schrieb:
> Is nich meine Baustelle, aber schmeiß mal das bei dir sicher unnötige
> Delay aus der Lib raus.

 Delay ist bestimmt nicht unnötig - erst dadurch werden die neu
 empfangenen Daten angezeigt.

von clautsch (Gast)


Lesenswert?

Thomas W. schrieb:
> Ist womöglich das Div8 ein?

Nee, die is wirklich aus. Und wenn ich die lib richtig verstehe, sollte 
das ja auch keinen so großen Unterschied machen, weil das Schreiben der 
Daten ist 800kHz, egal ob der Controller mit 1Mhz oder 8 arbeitet... War 
auch mein erster Gedanke, mir einen Prozessor zu besorgen, der 16MHz 
kann, aber das bringt ja mit der Lib gar nichts...

Teo D. schrieb:
> aber schmeiß mal das bei dir sicher unnötige
> Delay aus der Lib raus.

Ich habs nicht rausgeschmissen, aber die resettime auch testweise mal 
auf 10us gesetzt, macht keinen Unterschied (was im übrigen auch 
problemlos funktioniert und in den Tiefen des Netzes sogar auch 
empfohlen wird). Und da dieses Delay ja auch nur einmal am Ende der 
Übertragung aufgerufen wird, sollte das den Braten nicht fett machen...

von Mex (Gast)


Lesenswert?

Unter der Voraussetzung, dass die ~ 24 ms pro stimmen, muss das Problem 
zwischen den Frames liegen.

Was mach ich denn da falsch?

Keine aussagekräftigen Kommentare im Programm, damit man deine Gedanken 
nachvollziehen kann.

von Thomas W. (diddl)


Lesenswert?

clautsch schrieb:
> Nee, die is wirklich aus. Und wenn ich die lib richtig verstehe, sollte
> das ja auch keinen so großen Unterschied machen, weil das Schreiben der
> Daten ist 800kHz, egal ob der Controller mit 1Mhz oder 8 arbeitet... War
> auch mein erster Gedanke, mir einen Prozessor zu besorgen, der 16MHz
> kann, aber das bringt ja mit der Lib gar nichts...

Da bist du im Irrtum.
Hab mir gerade das Git Repository angeguckt.

Da steht ganz klar, dass es abhängig von der Frequenz ist.

Es muss die korrekte Frequenz in F_CPU definiert sein.

von clautsch (Gast)


Angehängte Dateien:

Lesenswert?

Thomas W. schrieb:
> Es muss die korrekte Frequenz in F_CPU definiert sein.

Ich hab F_CPU=8000000UL als defined Symbol angelegt; (in Atmel Studio 
unter -->ToolChain --> Symbols)


Mex schrieb:
> Keine aussagekräftigen Kommentare im Programm, damit man deine Gedanken
> nachvollziehen kann.

Im Anhang nochmal übersichtlicherer und kommentierter Code, hatte ich 
vorm posten schon überarbeitet aber nicht gespeichert vorm Hochladen...
Sorry...

Mir fällt nichts auf, was so lange dauern könnte...

von Teo D. (teoderix)


Lesenswert?

Arbeitet "ws2812_setleds_rgbw(led,ANZAHL_LEDS)" nicht mit einer Kopie 
von "led", anstatt nur mit einer Reverenz.
Das würde die Zeitverschwendung zumindest erklären.

von Thomas W. (diddl)


Lesenswert?

clautsch schrieb:
> Ich hab F_CPU=8000000UL als defined Symbol angelegt; (in Atmel Studio
> unter -->ToolChain --> Symbols)

Das ist schon mal prima.

Aber verwendest du es als Lib, also vor kompiliert oder als Source??


Denn Symbols funktionieren nur, wenn der Code kompiliert wird ...

von Mex (Gast)


Lesenswert?

Teo D. schrieb:
> Arbeitet "ws2812_setleds_rgbw(led,ANZAHL_LEDS)" nicht mit einer /Kopie/
> von "led", anstatt nur mit einer Reverenz.

Referenz.

> Das würde die Zeitverschwendung zumindest erklären.

Inwiefern?

von aldesser (Gast)


Lesenswert?

Implementiere doch mal eine Zeitmessung, wie lange die verschiedenen 
Teile des Codes tatsächlich brauchen. Dazu am besten einen Timer nutzen, 
und nach den verschiedenen Schritten den aktuellen Wert in einen Buffer 
abspeichern. Den kannst du anschließend im Debugger auslesen.
Damit liese sich herausfinden wo das Timing Problem wirklich liegt.

von J. S. (engineer) Benutzerseite


Lesenswert?

Zu der Funktion dieser speziellen LIB kann ich wenig sagen, aber der 
WS2812 lässt sich um einiges schneller ansteuern. Man muss aber ein 
wenig am timing drehen und ausprobieren, weil die SPEC je nach Quelle 
unterschiedliche Werte hergibt. Gfs ist es so, dass die LIB die realen 
Möglichkeiten nicht auslastet und sehr konservativ mit dem Timing 
umgeht.

von Teo D. (teoderix)


Lesenswert?

Mex schrieb:
> Inwiefern?

Es muss erst mal Kopiert werden, das dauert halt und das bei jedem 
Aufruf.
In die WS-Light Lib hab ich mich aber nich reingefuchst, hab nich vor 
die jemals zu verwenden. So aufgerufen müsste das "Call by Value" 
sein, is doch ne Struct.

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.