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