Hallo liebes Forum! Mein Problem ist grad folgendes: Ich möchte eine 25x25 rgbw-Matrix (realisiert mit ws6812-Strip) ansteuern. Prinzipiell funktioniert das auch, allerdings werden meine Daten zu groß oder das Speicherregister zu klein. Atmel Studio 6.2 sagt mir: Error4 Program Memory Usage : 446 bytes 1,4 % Full Data Memory Usage: 2100 bytes 102,5 % Full (Memory Overflow) Die Daten sind in der Form struct cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;}; angelegt, mein Testprogramm ist angehängt. Ich nutze die light_ws2812-library zum ansteuern. Also ich hab 2kbyte SRAM, die sind halt jetzt schon mehr als voll. Im Datenblatt steht ja aber, man hätte 2K x 8. Ist es jetzt einfach so, dass ich ein Register komplett voll schreibe? Und könnte ich meine Daten dann nicht einfach aufteilen? Aber wie kann ich auf den anderen Adressen schreiben? Ich werde aus dem Datenblatt nicht schlau und im Netz find ich auch nicht wirklich was... Hab ich nun 2k oder 2k x 8 Arbeitsspeicher? Es gibt ja noch die Möglichkeit den Programmspeicher zu nutzen, aber geht das irgenwie einfacher? Ich hab keinen anderen AVR-Controller im DIP format gefunden, der mehr SRAM hat. Und die Daten irgendwie "dynamisch" zu speichern geht glaub ich auch nicht, weil die Ansteuerung des Strips diese struct-Matrix haben möchte... Wie kann ich dieses Problem denn wohl lösen? Über Tips freue ich mich sehr und sage jetzt schonmal danke!
:
Verschoben durch Moderator
claudia k. schrieb: > Es gibt ja noch die Möglichkeit den Programmspeicher zu nutzen, aber > geht das irgenwie einfacher? Was heißt "einfacher"? Es ist auf jeden Fall die sinnvollste Variante, gemessen daran, dass du im Moment nur ein paar hundert Byte an Programmspeicher benutzt. > Ich hab keinen anderen AVR-Controller im DIP format gefunden, der mehr > SRAM hat. ATmega1284P gibt's auch in DIP (und hat 16 KiB SRAM), aber wäre pure Verschwendung.
Beitrag #5640434 wurde von einem Moderator gelöscht.
> Im Datenblatt steht ja aber, man hätte 2K x 8. Korrekt. Das sind 2kiB. Sparsamere LED-Ansteuerung (z.B. nur RGBW4444), oder einen größeren Mikrocontroller nehmen. > Ist es jetzt einfach so, dass ich ein Register komplett voll schreibe? ??
claudia k. schrieb: > Hab ich nun 2k oder 2k x 8 > Arbeitsspeicher? Du hast 2kByte entsprechend 2k x 8Bit. Und da passen nicht 25 x 25 x 4 Byte = 2500 Bytes rein, noch dazu der AVR vom SRam selbst ein wenig benötigt, um "atmen" zu können, siehe "Stack". Wieso sind 25 x 25 = 525? > #define ANZAHL_LEDS 525
MWS schrieb: > Wieso sind 25 x 25 = 525? >> #define ANZAHL_LEDS 525 Vielleicht sollte man ja das Rechnen besser den Computern überlassen …
1 | #define ANZAHL_LEDS (25 * 25)
|
Jörg W. schrieb: > Vielleicht sollte man ja das Rechnen besser den Computern überlassen … > #define ANZAHL_LEDS (25 * 25) Das hilft auch nichts, der TE benötigt die Funktion Multiply.Memory(SRam, 2).
Jörg W. schrieb: > Vielleicht sollte man ja das Rechnen besser den Computern überlassen … Jaja, ihr habt ja recht, das war jetzt schnell mal hingeklatscht zum probieren... Ach so, 2k mal 8bit, na gut, so ist das gemeint... Ich nehm dann wohl einfach den 1284, der is halt oversized, meine Kenntnisse aber eher undersized, deswegen ist das wohl das beste. Aber solange der nicht da ist: Ich hatte vorhin beim Stöbern einen Beitrag gefunden, in dem Beschrieben wurde, wie mit einem Bootloader von (ich glaube) Peter D. Daten im Programmspeicher geschrieben werden können. Ist es dieser Bootloader? https://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger Ich finde den Beitrag nicht mehr, aber hätte da jemand zufällig noch einen Link für mich, wie die Adressierung funktionieren würde?
Nee, ein Bootloader ist nur für das Einspielen der Firmware, machmal auch einer EEpromdaten, zuständig. Alles andere definiert man im Quellcode. Stichwort Flash-Speicher Nutzung für Daten, suche mal nach PROGMEM. Und ja dies ist die einzige Referenz für den avr gcc! https://www.nongnu.org/avr-libc/user-manual/pgmspace.html
wenn ich den Beitrag vorhin noch richtig im Kopf hab, hieß es da, mit PROGMEM geht kein speichern im Programm sondern nur am Anfang. Was man eben mit einem bestimmten Bootloader umgehen könnte...
claudia k. schrieb: > wenn ich den Beitrag vorhin noch richtig im Kopf hab, hieß es da, > mit > PROGMEM geht kein speichern im Programm sondern nur am Anfang. Was man > eben mit einem bestimmten Bootloader umgehen könnte... Die Daten die im Flashspeicher liegen sind von Type Konstant und nicht änderbar: PROGMEM const <datentype> <name> ...
Mein Beitrag soll nur ein Hinweis sein, dass man Konstante Daten in den Flashspeicher auslagern kann. Der Zugriff darauf ändert sich dann entsprechend der verlinkten Beschreibung. Für sich im Programm änderte Daten kann man nur den Speicherbereich im SRAM sinnvoll nutzen. Wenn der nicht ausreicht, dann muss man sein Projekt, resp. das Programm, kleiner gestalten und weniger Daten im SRAM anlegen!
claudia k. schrieb: > Ich nehm dann wohl einfach den 1284, der is halt oversized, meine > Kenntnisse aber eher undersized, deswegen ist das wohl das beste. > Aber solange der nicht da ist: > Ich hatte vorhin beim Stöbern einen Beitrag gefunden, in dem Beschrieben > wurde, wie mit einem Bootloader von (ich glaube) Peter D. Daten im > Programmspeicher geschrieben werden können. > Ist es dieser Bootloader? man kann den Arduino Bootloader raufbringen und einen Arduino clone daraus machen oder man bestellt sich Leerplatinen von ODH Park und baut seine eigenen mighty mini 1284p Arduino clones (so fing ich an, dann kaufte ich fertige Module) https://github.com/JChristensen/mini1284 https://www.instructables.com/id/ATmega-DIP40-in-Arduino-IDE-164/ http://www.technoblogy.com/show?19OV https://forum.arduino.cc/index.php?topic=178107.0 https://forum.arduino.cc/index.php?topic=277260.15 https://uge-one.com/arduino-board-based-on-atmega1284p.html https://www.geeky-gadgets.com/mini-duino-open-source-ardunio-board-based-on-atmega-1284p-21-08-2014/ aus USA wurden auch mal fertige mighty mini 1284p bei ebay angeboten zur Zeit das hier https://www.ebay.com/itm/EWS-ATmega1284P-Development-Board/251229528887?hash=item3a7e726337:m:mZDx9DF1uXbd8_o8p5Yi53g:rk:9:pf:0 leider aktuell nur mit 11.0592 MHz also runter mit dem und 16 MHz einlöten und per ISP neu flashen mit passendem Optiboot. g457 schrieb: > Korrekt. Das sind 2kiB. Sparsamere LED-Ansteuerung (z.B. nur RGBW4444), > oder einen größeren Mikrocontroller nehmen. das reicht für 16x16x16x16 Farben (16 Stufen pro LED) mit 1250 Byte für das Array falls ich richtig gerechnet habe 25x25 = 625 LEDs *2 für 16 Bit (4x4)
:
Bearbeitet durch User
Peter D. schrieb: > Bei 625 LEDs dürfte der RAM die kleinste Sorge sein. > Ich komme bei 60mA/LED auf ~40A Stromaufnahme. och die LEDs können ja extra gespeist werden, optimal aus einem 24V Netzteil und alle 36 LEDs einspeisen per kleinen stepdown 24V/5V 2A(3A) so wie ich das bei meiner wordclock24h gemacht hatte.
Joachim B. schrieb: > das reicht für 16x16x16x16 Farben (16 Stufen pro LED) mit 1250 Byte für > das Array Da zieht sich der Farbraum bei geringer Helligkeit auf hässlich wenig Punkte zusammen.
Peter D. schrieb: > Ich komme bei 60mA/LED auf ~40A Stromaufnahme. Hab viel Geld für ein 5V-60A Netzteil ausgegeben. Sind sogar 80mA/Led, die werden aber (planmäßig) nie alle zusammen laufen... und 6mm^2 Zuleitung, dann Verteilung auf 0,75mm^2 alle 50 LEDs eingespeist Hab gerade schon den 1284 bestellt, macht den Braten jetzt auch nicht mehr fett... Danke für alle Hinweise soweit..
Sonst gibt es auch noch Datenkompressoren. Die druecken die Daten zusammen. Du scheinst ja noch ueppig Programmspeicher zu haben. Mit 4 Kompressoren hintereinander werden die Daten hübsch klein.
MWS schrieb: > Du hast 2kByte entsprechend 2k x 8Bit. > Und da passen nicht 25 x 25 x 4 Byte = 2500 Bytes rein, noch dazu der > AVR vom SRam selbst ein wenig benötigt, um "atmen" zu können, siehe > "Stack". ist leider so Clonozett schrieb: > Sonst gibt es auch noch Datenkompressoren. Die druecken die Daten > zusammen. das geht nicht, er braucht die Daten nicht gespeichert, sondern im Ram um sie übergeben zu können. ich kenn deine Lib nicht, aber wäre es möglich, den Streifen aufzuteilen? wenn du z.b. das ganze in 5 teilst, hast du nur noch 500 Bytes, dann brauchst du aber auch 5 Streifen an 5 Pins. ich seh nur nirgends, wo der pin/port dafür definiert wird, eventuell die lib leicht erweitern damit das geht, das sollten aber nur einige zeilen sein. Einzige Alternative wäre µC mit mehr RAM, oder ganz gewagt die Lib so umschreiben dass sie die Daten aus nem Ringbuffer nimmt und den dynamisch füllen, aber das wird etwas komplexer weil es kein multithreading gibt, eventuell an eine Generatorfunktion wie es sie in python gibt anlehnen, das ist aber mehr wirre spekulation.
claudia k. schrieb: > Peter D. schrieb: >> Ich komme bei 60mA/LED auf ~40A Stromaufnahme. > > Hab viel Geld für ein 5V-60A Netzteil ausgegeben. Sind sogar 80mA/Led, > die werden aber (planmäßig) nie alle zusammen laufen... und 6mm^2 > Zuleitung, dann Verteilung auf 0,75mm^2 alle 50 LEDs eingespeist Klingt schon mal nach dem richtigen Ansatz. Beitrag "Re: Frage zu IR-Remote+LED-Strips an AVR"
Falk B. schrieb: > claudia k. schrieb: >> Hab viel Geld für ein 5V-60A Netzteil ausgegeben. Sind sogar 80mA/Led, >> die werden aber (planmäßig) nie alle zusammen laufen... und 6mm^2 >> Zuleitung, dann Verteilung auf 0,75mm^2 alle 50 LEDs eingespeist > > Klingt schon mal nach dem richtigen Ansatz. na ja 6mm²und 0,75mm² sind aber heftige Kabelgewichte das wird schwer die einzuspeisen ohne die Kontakte zu beleidigen oder abzureissen. Mit 24V Netzteil entschärft sich der Strom und an den LEDs kleine stepdown zu 5V und es reicht bei kurzen Strecken 0,25mm² zu den Stripes.
Joachim B. schrieb: > Falk B. schrieb: >> claudia k. schrieb: >>> Hab viel Geld für ein 5V-60A Netzteil ausgegeben. Sind sogar 80mA/Led, >>> die werden aber (planmäßig) nie alle zusammen laufen... und 6mm^2 >>> Zuleitung, dann Verteilung auf 0,75mm^2 alle 50 LEDs eingespeist >> >> Klingt schon mal nach dem richtigen Ansatz. > > na ja 6mm²und 0,75mm² sind aber heftige Kabelgewichte Bitte? Das hängt doch nicht in der Luft. > das wird schwer > die einzuspeisen ohne die Kontakte zu beleidigen oder abzureissen. Unsinn. Man sollte natürlich ein Minimum an Feinmotorik haben. Und keiner behauptet, daß du 6mm^2 Kabel direkt an die LED-Streifen anlöten sollst. > Mit 24V Netzteil entschärft sich der Strom und an den LEDs kleine > stepdown zu 5V und es reicht bei kurzen Strecken 0,25mm² zu den Stripes. Kann es sein, daß du da einen gewissen Tunnelblick entwickelt hast? Das ist EINE Lösung, aber weder die Einzige noch die Beste. Selbst 6mm^2 könnte man an die LED-Streifen anlöten, wenn man einfach die letzen 5mm soweit verjüngt, daß es paßt.
Falk B. schrieb: > Keiner behauptet, daß du 6mm^2 Kabel direkt an die LED-Streifen anlöten > sollst. Nicht? Joachim schweißt seine Kabel vermutlich direkt an die Halbleiter an, um die Verluste an den Bonding Drähten zu vermeiden. Sorry Joachim, war nicht ernst gemeint.
Falk B. schrieb: > Kann es sein, daß du da einen gewissen Tunnelblick entwickelt hast? Das > ist EINE Lösung, aber weder die Einzige noch die Beste. > > Selbst 6mm^2 könnte man an die LED-Streifen anlöten, wenn man einfach > die letzen 5mm soweit verjüngt, daß es paßt. wer hat denn den Tnnelblick? Auch deine Lösung ist nicht die Einzige, also ehrlich 60A 5V unnötig über Kupfer zu jagen und dann mit 6mm², na ja jeder wie er es tun muss hast du was schlechtes gegessen? klar kann man auch Unsinn verteidigen! 60A auf 6mm² um 5V zu transportieren, also wirklich.....
Joachim B. schrieb: > wer hat denn den Tnnelblick? Ich nicht ;-) > Auch deine Lösung ist nicht die Einzige, Hab ich das behauptet? > also ehrlich 60A 5V unnötig > über Kupfer zu jagen Der Op hat schon das Netzteil. Die Entfernung zur Matrix ist klein, er wird es ja nicht 10m weiter weg einbauen. Kupfer ist auch bezahlbar. >und dann mit 6mm², na ja jeder wie er es tun muss Genau. > hast du was schlechtes gegessen? > klar kann man auch Unsinn verteidigen! Aha. > 60A auf 6mm² um 5V zu transportieren, also wirklich..... Warum nicht? Wir reden nicht von mehreren Metern sondern bestenfalls von 50cm, eher weniger, wenn man das Netzteil mittig hinter die Matrix baut. Da braucht man auch keine 6mm^2 Kabel sondern geht mit einer ausreichenden Anzahl ^mm^2 oder so direkt vom Netzteil weg.
claudia k. schrieb: > Mein Problem ist grad folgendes: Ich möchte eine 25x25 rgbw-Matrix > (realisiert mit ws6812-Strip) ansteuern. Prinzipiell funktioniert das > auch, allerdings werden meine Daten zu groß oder das Speicherregister zu > klein. Du schreibst wirr, so daß ich dein Problem zuerst gar nicht verstanden habe. Also, ich versuche mal meine Interpretation: Du hast ein Brettl, wo du ein Quadrat aus 25x25 LEDS drauf hast, die allerdings auf irgendwelchen LED-Streifen montiert sind. Stromversorgung ist deine Sache. Dieses Quadrat willst du im Halbsekunden-Takt rot, dann grün, dann blau, dann weiß leuchten lassen. Und ich dachte schon, du wolltest dort echte Bilder, z.B. Logos oder so bunt leuchten lassen. Aber könnte ja sein. Und da du deine Farben als struct farbe { byte g; byte r; byte g; byte w; }; definiert hast, kommst du nun nicht mehr damit zu Potte, weil du ein Array aus 25*25 derartiger structs im RAM aufbauen willst. Mit dem Kopf durch die Wand. Immer wieder. Warum willst du zuerst eine Farbtiefe von 32 Bit erzeugen? Ich schätze mal, daß deine LED-Ansteuerung bestenfalls 8 Bit an Farben, also 256 Farben sinnvoll darstellen kann. Und für Logos reichen fast immer noch viel weniger Farben aus. Mit 25x25 Pixeln wirst du die Mona Lisa garantiert nicht originalgetreu darstellen können. Siehe Bild. Also hättest du dir zu allererst eine sinnvolle Farbtiefe und Darstellung deiner eventuellen Bilder ausdenken sollen. Nicht zuerst drauflos programmieren und dann vor die Wand rennen, sondern zuvörderst NACHDENKEN. Vielleicht ist dein Versuch, den ganzen Schmonzes komplett im RAM aufzubauen, dem Interface deines ws2812_setleds_rgbw(..) geschuldet, das offenbar ein für dich unbrauchbares Interface hat. Ich vermute das jedenfalls - und da wären wir wieder mal beim Thema der Lowlevel-Treiber - insbesondere wirklich brauchbaren LL-Treibern. Offenbar sollte man den von dir benutzten Treiber beiseite lassen und einen LL-Treiber selber schreiben, der etwas vernünftiger funktioniert. Nochwas: Ich hatte hier vor langer Zeit schon mal ein Komprimierverfahren für Bilder gepostet, das mit einer sehr einfachen Dekompimier-Routine auskommt und bei Beschränkung auf z.B. 48 Farben bei Landkarten eine recht gute Kompression hat. Und was für Landkarten geht, reicht auch für Logos aus. Mit sowas kannst du dir deine Bildchen im Flash ablegen. Alles nähere mußt du schon selber machen, denn die AVR's sind nicht meine Sache. Tip: Grafiken kleinrastern und deren Farbtiefe nach eigenem Gusto reduzieren kann man auch mit IrfanView machen. W.S.
Beitrag #5641499 wurde von einem Moderator gelöscht.
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.