Forum: Mikrocontroller und Digitale Elektronik atmega328; data memory voll, wie umlagern


von claudia k. (Gast)


Angehängte Dateien:

Lesenswert?

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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.
von g457 (Gast)


Lesenswert?

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

??

von MWS (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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)

von MWS (Gast)


Lesenswert?

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

von claudia k. (Gast)


Lesenswert?

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?

von Karl M. (Gast)


Lesenswert?

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

von claudia k. (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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!

von Joachim B. (jar)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

Bei 625 LEDs dürfte der RAM die kleinste Sorge sein.
Ich komme bei 60mA/LED auf ~40A Stromaufnahme.

von Joachim B. (jar)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von claudia k. (Gast)


Lesenswert?

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

von Clonozett (Gast)


Lesenswert?

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.

von the_yrr (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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"

von Joachim B. (jar)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.