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
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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.