Hallo,
ich schreibe gerade an einem kleinen Programm welches 4 Analogsensoren abfragt und daraus verschiedene Messwerte generieren und anzeigen soll... Verwende einen Uno mit 4x20lcd..
Habe das ganze Programm bisher schrittweise aufgebaut und immer wieder die neuen Sachen sofort getestet. Hat bisher immer prima so funktioniert.. Am Uno ist ein Encoder verbaut mit welchem ich ein einfaches Menü steuern kann welches dann in div. Funktionsblöcke springt...
Das Programm hat bislang 12700Bytes, nun hab ich heute ein weiteres Menü hinzugefügt welches insgesamt 9 verschieden LCD-Texte ausgibt. Beim Testen musste ich dann jedoch feststellen dass da irgendetwas nicht mehr stimmt..
Funktionen die vorher einwandfrei gingen brechen plötzlich ab, ...
Das ganze funktioniert wieder wenn ich 4 der 9 Menütexte inkl. der if (Menue==5) lösche..
daher meine Frage, gibt es eine Begrenzung von z.B. lcd.print ?
Programmcode sind bislang 12700 Bytes,
es werden 14 Float-Werte berechnet,
lcd.print kommt ca. 60mal im Code vor....
Vielen Dank!
Wahrscheinlich geht dir das RAM aus. Denn alle String Konstanten landen auf dem AVR dank Harvard Architektur standardmäßig in am Anfang im RAM.
Testen kannst du das hiermit (wenn das Programm noch lauffähig ist):
int getFreeRAM()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Erste Abhilfe schafft hier das F() Makro bei print()/println():
.println(F("String im Flash"));
Dadurch wird der String nicht vom Flash ins RAM kopiert. Das geht mit allen Klassen die von Print/Stream abgeleitet sind, wie LCD, Serial, SD oder Ethernet.
Bei Texten außerhalb von print() wird es aber komplizierter und die Methoden deiner Libraries werden andere Optionen zur Speicheroptimierung nicht unbedingt unterstützten.
Hallo, das habe ich fast befürchtet...
dann muss ich sämtliche Menüfunktionen auf Flash-Speicher umschreiben und von den 32kb Flash etwa 2kb für die Displayausgaben opfern...
hoffe ich bring das Programm noch unter, sollte aber noch gehen.
Danke für die schnelle Antwort!
Die Strings sind so oder so im Flash. Egal was man macht. Irgendwo her müssen sie ja kommen. Ohne spezielle Maßnahmen werden sie aber beim Start des Controllers ins RAM kopiert. Einfach weil durch die getrennten Addressräume von ROM and RAM die Standard Assembler Befehle nur auf Daten im RAM zugreifen können. Mit speziellen Makros und Funktionen kann man das dann so hinbiegen, dass man die Strings Byte-weise aus dem Flash ausliest.
Und wie gesagt, das F()-Makro geht nur für Strings die mit print()/println() ausgegeben werden!