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
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?
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.
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...
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.
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.
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...
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.
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 ...
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?
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.
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.
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.