Forum: Mikrocontroller und Digitale Elektronik Viele "Daten" in einen µC?


von Sebastian B. (Gast)


Lesenswert?

Hallo!

Leider eine Anfängerfrage; wäre trotzdem nett, wenn der ein oder andere 
eine Antwort parat hätte.
Ich habe vor kurzem angefangen mich für Microcontrollertechnic etc. zu 
interessieren, und nachdem ich zwei Projekte "nachgebaut" habe, wollte 
ich mich an mein erstes Eigenes wagen. Für den Geburtstag einer Freundin 
wollte ich ein kleines Modul bauen, das von einer 9V-Batterie gespeist 
wird, und auf einem 2x16-Zeichen LCD auf Knopfdruck einen Spruch mit 
ihrem Namen anzeigt. (Im Stil von sloganizer.net) Jetzt habe ich 120 
Sprüche zusammengetragen, und stehe vor einem Problem: Der Speicher 
reicht hinten und vorne nicht. GCC meldet nach dem kompillieren:
1
Data:       3842 bytes (3001.6% Full)

Bei "Program" ist allerdings noch eine Menge Platz.
Gibt es irgendeine Möglichkeit, die Daten beim "Program" (also im 
Flash?) zu speichern? Wo will GCC sie eigentlich hinspeichern? Im 
EEPROM? Oder im RAM? Bzw. was bedeutet dieses "Data" auf Hardwareebene?
Oder hab ich das ganze Konzept der Speicher nicht verstanden?

Wäre lieb, wenn mir jemand einen Tipp oder Denkanstoß geben könnte :)

Liebe Grüße,
Sebastian

von Jean P. (fubu1000)


Lesenswert?

Sebastian B. schrieb:
> Hallo!
Hi, ich gehe davon aus du benutzt nen Atmega oder Attiny.
Wenn nit sage uns bitte welchen µC du benutzt!!!

> das von einer 9V-Batterie gespeist
Oje darüber würde ich nochmal nachdenken!

> Data:       3842 bytes (3001.6% Full)
> Bei "Program" ist allerdings noch eine Menge Platz.
> Gibt es irgendeine Möglichkeit, die Daten beim "Program" (also im
> Flash?) zu speichern?
Stichwort PROGMEM, den rest kriegst du dann schon hin.

> Wäre lieb, wenn mir jemand einen Tipp oder Denkanstoß geben könnte :)
Joar Schubs!

> Liebe Grüße,
> Sebastian

73

von Schowiedanixgwonnen (Gast)


Lesenswert?

>Bei "Program" ist allerdings noch eine Menge Platz.
>Gibt es irgendeine Möglichkeit, die Daten beim "Program" (also im
>Flash?) zu speichern? Wo will GCC sie eigentlich hinspeichern?

Es wird ALLES im Flash gespeichert. Der Compiler sagt dir mit dieser 
Fehlermeldung lediglich, wieviel vom Flash für Daten und wieviel für das 
ausführbare Programm benötigt wird.

Das EEPROM ist in aller Regel wesentlich kleiner als der Flash-Speicher, 
bringt also nix.

Abhilfe:
Anderen µC mit größerem Flash verwenden, oder deine String-Konstanten in 
einen externen Speicher (z.B. SD-Karte) auslagern.

von Jean P. (fubu1000)


Lesenswert?

Schowiedanixgwonnen schrieb:
> Es wird ALLES im Flash gespeichert. Der Compiler sagt dir mit dieser
> Fehlermeldung lediglich, wieviel vom Flash für Daten und wieviel für das
> ausführbare Programm benötigt wird.

Das ist gelinde gesagt humbug.
Die von mir oben genannten µC(Atmega, Attiny,..) sind 
Harvard-Architekturen und der AVR-GCC muss darauf hin gewiesen werden 
die Daten nicht ins RAM sondern in den FLASH abzulegen !!!
Bei anderen Architekturen wie dem Cortex sieht das anders aus !!!

73

von Sebastian B. (Gast)


Lesenswert?

Jean Player schrieb:
> Sebastian B. schrieb:
>> Hallo!
> Hi, ich gehe davon aus du benutzt nen Atmega oder Attiny.
> Wenn nit sage uns bitte welchen µC du benutzt!!!

Ja, ich hatte vor einen Atmega zu benutzen. Die endgültige Wahl, 
welchen, will ich natürlich davon abhängig machen, ob die ganzen Sprüche 
da überhaupt reinpassen.

>> das von einer 9V-Batterie gespeist
> Oje darüber würde ich nochmal nachdenken!

Wieso? Zu wenig Leistung? Ich würde natürlich einen 5V Spannungswandler 
davorsetzen :)

> Stichwort PROGMEM, den rest kriegst du dann schon hin.

Danke, das klingt schonmal sehr gut, scheint nur (bei all den 
Forenproblemen) recht kompliziert zu adressieren sein, im Endeffekt.. 
Aber mal sehen.

Schowiedanixgwonnen schrieb:
> Es wird ALLES im Flash gespeichert. Der Compiler sagt dir mit dieser
> Fehlermeldung lediglich, wieviel vom Flash für Daten und wieviel für das
> ausführbare Programm benötigt wird.

Okay, so dachte ich es mir eigentlich auch. Aber warum benutzt der 
Compiler dann nicht den (reichlich freien) Platz den er für das Programm 
angedacht hat, für die Daten?

> Abhilfe:
> Anderen µC mit größerem Flash verwenden, oder deine String-Konstanten in
> einen externen Speicher (z.B. SD-Karte) auslagern.

Das traue ich mir leider noch nicht zu. :\ Hab da zwar schon ein wenig 
was drüber gelesen, aber dann Softwaremäßig ein Dateisystem zu 
implementieren ist mir noch zu ungeheuer.

Aber Danke euch beiden schonmal für die Antwort :)

von Schowiedanixgwonnen (Gast)


Lesenswert?

>as ist gelinde gesagt humbug.
>Die von mir oben genannten µC(Atmega, Attiny,..) sind
>Harvard-Architekturen und der AVR-GCC muss darauf hin gewiesen werden
>die Daten nicht ins RAM sondern in den FLASH abzulegen !!!

Ah ja. Der Compiler speichert die Daten also beim Flashen ins RAM.

Woher soll der µC dann zur Laufzeit die Daten herzaubern, wenn die "im 
RAM abgelegt werden"?

Selbstverständlich werden String-Konstanten, die zur Entwurfszeit 
festgelegt werden, zuerst mal im Flash gespeichert, wo sollen die denn 
sonst sein? Das RAM verliert alle Daten, sobald die Versorgungsspannung 
abgeschaltet wird.

Der AVR GCC kopiert die Daten dann während der Laufzeit vom Flash ins 
RAM, was  völliger Käse ist. Bei vernünftigen Compilern, wie z.B. 
CodevisionAVR passiert das nicht, der greift direkt auf den Flash zu und 
verbrät nicht unnotig RAM.

>>"VERY EFFICIENT USE OF RAM: Constant character strings are stored only in 
>>FLASH memory and aren't copied to RAM and accessed from there, like in >>other 
compilers for the AVR "

http://www.hpinfotech.ro/html/cvavr_features.htm

von Jean P. (fubu1000)


Lesenswert?

Sebastian B. schrieb:
> Ja, ich hatte vor einen Atmega zu benutzen. Die endgültige Wahl,
> welchen, will ich natürlich davon abhängig machen, ob die ganzen Sprüche
> da überhaupt reinpassen.
 Welchen benutzt du denn nun oder ist das geheim ?!?

>>> das von einer 9V-Batterie gespeist
>> Oje darüber würde ich nochmal nachdenken!
>
> Wieso? Zu wenig Leistung? Ich würde natürlich einen 5V Spannungswandler
> davorsetzen :)
Hoffentlich nit nen 7805.
Du verbrätst einfach nur Energie. Zumal für deine Aufgabe locker 3.3 
Volt und nen 1Mhz Takt ausreichen. Also lieber ne Lion Zelle oder 3 AAA 
Zellen mit nem 3.3Volt Schaltregler.

>> Stichwort PROGMEM, den rest kriegst du dann schon hin.
>
> Danke, das klingt schonmal sehr gut, scheint nur (bei all den
> Forenproblemen) recht kompliziert zu adressieren sein, im Endeffekt..
> Aber mal sehen.
Nö, siehe z.B. http://www.mikrocontroller.net/articles/AVR-Tutorial und 
suche nach PROGMEM da wird dir alles vorgekaut.

> Schowiedanixgwonnen schrieb:
>> Es wird ALLES im Flash gespeichert. Der Compiler sagt dir mit dieser
>> Fehlermeldung lediglich, wieviel vom Flash für Daten und wieviel für das
>> ausführbare Programm benötigt wird.
Naja sieh oben.

> Okay, so dachte ich es mir eigentlich auch. Aber warum benutzt der
> Compiler dann nicht den (reichlich freien) Platz den er für das Programm
> angedacht hat, für die Daten?
siehe oben

>> Abhilfe:
>> Anderen µC mit größerem Flash verwenden, oder deine String-Konstanten in
>> einen externen Speicher (z.B. SD-Karte) auslagern.
Ja klar am besten nen PC benutzen OMG.

> Das traue ich mir leider noch nicht zu. :\ Hab da zwar schon ein wenig
> was drüber gelesen, aber dann Softwaremäßig ein Dateisystem zu
> implementieren ist mir noch zu ungeheuer.
Ist keine Hexen Kunst.

> Aber Danke euch beiden schonmal für die Antwort
np

von Jean P. (fubu1000)


Lesenswert?

Schowiedanixgwonnen schrieb:
> Der AVR GCC kopiert die Daten dann während der Laufzeit vom Flash ins
> RAM, was  völliger Käse ist. Bei vernünftigen Compilern, wie z.B.
> CodevisionAVR passiert das nicht, der greift direkt auf den Flash zu und
> verbrät nicht unnotig RAM.

Jo genauso ist das, aber das ist genau auch sein Problem gewesen worum 
es geht. Die Daten verbraten halt sein RAM ohne PROGMEM. Deswegen sagte 
ich, nehme mal AVR Studio an, das sein RAM zu SONSOVIEL% voll ist(im 
laufenden Betrieb).

von Rolf M. (rmagnus)


Lesenswert?

Schowiedanixgwonnen schrieb:
> Der AVR GCC kopiert die Daten dann während der Laufzeit vom Flash ins
> RAM, was  völliger Käse ist. Bei vernünftigen Compilern, wie z.B.
> CodevisionAVR passiert das nicht, der greift direkt auf den Flash zu und
> verbrät nicht unnotig RAM.

Das kann avr-gcc natürlich auch, wenn man ihm das sagt. Defaultmäßig 
kann er es durch das Prinzip der Harvard-Architektur nicht machen, 
zumindest nicht ohne Laufzeit und Programmgröße zu erhöhen.

von Peter S. (psavr)


Lesenswert?

Die Sache mit dem Progmem ist keine Hexerei, poste den Code oder sende 
ihn mir als PM, das sollte in ca 10 Minuten anzupassen sein...

von Sebastian B. (sebastian_b56)


Lesenswert?

Peter S. schrieb:
> Die Sache mit dem Progmem ist keine Hexerei, poste den Code oder sende
> ihn mir als PM, das sollte in ca 10 Minuten anzupassen sein...

Danke für das nette Angebot. :)
Ich probiers aber heute Nachmittag wenn ich zuhause bin erstmal selbst.
Wenns dann nicht klappt, komm ich gerne auf das Angebot zurück.

Danke nochmal an alle

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.