Texte im EEPROM speichern und lesen

Hallo,

für eine Anwendung möchte ich Texte auf einem OLED Display ausgeben. Wenn ich nun verschiedene Texte in der Form von

oled.println ("Dies ist ein Text");

in den Code schreibe, wird der Text im Flash gespeichert und belegt unnötig Speicherplatz.
Bei nur wenig Text ist das kein größeres Problem, benötige ich aber mehrere Texte, wird irgendwann der Programmspeicherplatz knapp. Die 1024Byte des EEPROM würden für die Texte aber (hoffentlich) ausreichen.

Daher wollte ich meine Texte im EEPROM ablegen und zur Laufzeit aus diesem auslesen und ausgeben.

Das Speichern würde ich mit einem zweiten Programm machen, welches einfach die Texte ins EEPROM speichert und anschließend das richtige Programm einspielen, welches die Texte nur ausliest. Allerdings habe ich noch nicht herausgefunden, wie ich strings im EEPROM ablegen und wieder aufrufen kann.

Ich würde der Einfachheit halber alle Texte auf 20 Zeichen begrenzen, so daß ich 51 verschiedene Texte speichern kann (mit Nullterminierung 48 Texte), was für meine Anwendung vollkommen ausreicht.

Kann ich strings direkt ins EEPROM schreiben und diese wieder auslesen oder bleibt mir nichts anderes übrig, als alles Byteweise zu speichern und auszulesen?

Und behält das EEPROM seinen Inhalt überhaupt, wenn man mit dem Bootloader einen neuen Sketch hochlädt?

Jain!
Dafür ist die EESAVE Fuse zuständig!

Speichern:
char test[] EEMEM {"Dies ist ein Text"};

Das geht auch in einem Rutsch!

Für die Ausgabe könntest du dir etwas mit EEPROM .get() bauen

Hallo nano555e

Hier kommt was zum Lesen:

https://www.baldengineer.com/arduino-f-macro.html#:~:text=What%20the%20F%20()%20macro%20Does%20The%20F,a%20small%20performance%20overhead%20for%20this%20extra%20work.

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Die Fuses und der Umgang damit sind mir schon bewusst. Aber die ändern sich ja nicht, wenn man über die IDE mit dem Bootloader ein Sketch hochlädt.
Die Frage bezog sich eher darauf, was in diesem Fall passiert. Das unterscheidet sich ja vollkommen vom Hochladen per ISP.

Wie soll das gehen? Wenn ich im selben Programm die Daten ins EEPROM speichere, belegen sie doch trotzdem Programmspeicher, den ich dadurch sparen will.

Sehe ich das richtig, daß die Texte, die ich über .println ausgebe, den Speicher vollmüllen?
Das würde einiges an seltsamen Abstürzen erklären.
Dann wäre es also das Beste, die Texte weiterhin direkt im Programm über .println (F("text")) ausgebe, weil das Arbeitsspeicher spart?

Ja, und das nur für Texte die nicht mehr geändert werden müssen, wie Überschriften und/oder Bezeichner für variable Größen.

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Danke für den Hinweis.
Im konkreten Fall geht es um Texte, die vor dem eigentlichen Programmstart als eine Art Anleitung ausgegeben werden.

Ich habe die Ausgaben angepasst und die Ausgabe über eine Funktion wieder herausgenommen und so tatsächlich etwas Programmspeicher eingespart. Und gelegentliche Abstürze, die ich hatte, sind auch weg.

Danke. :slight_smile:

und das Ganze heute mal wieder kosten- und gebührenfrei :slight_smile:

1 Like

Schön!

Habe ich das behauptet?

Das unterscheidet sich sogar von Arduino zu Arduino.
z.B. der Mega Bootloader sollte EEPROM Daten schreiben können. (ohne Gewähr)

Der String in dem von mir gepostetem Beispiel landet in der EEMEM Section. Nicht im Flash. Da hast du also evtl. noch eine Wissenslücke.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.