mit Flashspeicher arbeiten

Hallo zusammen,

ich werde demnächst mit dem Mega 2560 arbeiten und benötige auch den Flashspeicher. Allerdings kann ich nirgends - hab ca. 2 Stunden gegooglet und gefühlt 1000 Seiten durchsucht - etwas finden, wie man den Flashspeicher beschreibt, ausliest und wieder löscht. Kann mir da bitte jemand ein paar Info's geben?

LG

Fipsi

Den Flash Speicher kannst du nur beim Compilieren beschreiben.

Im Prinzip landet erst mal alles im Flash. Aber weil der AVR eine modifizierte Harvard Architektur hat - und daher Daten und Programm unterschiedliche Adressräume haben - können normale Funktionen nicht mit Adressen im Flash arbeiten. Deshalb werden nach dem Start automatisch alle Variablen vom Flash ins RAM kopiert.

Du kannst aber mit ein paar Makros sagen "Lass dass im Flash". Danach gibt es weitere Makros und spezielle Funktionen, die mit denen du mit Flash-Adressen arbeiten kannst.

Ist alles hier erklärt:

Die speziellen Datentypen (welche nur typedefs sind) sind allerdings laut AVR libc docu deprecated:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Der 100% korrekte Weg ist jetzt "const [Datentyp] [Variablenname] PROGMEM". z.B. für einen String:
const char string_0[] PROGMEM = "Arduino";

Okay, danke für die Info. Aber das von dir verlinkte übersteigt meine aktuellen Kenntnisse noch weit^^.

Was ich aktuell suche ist halt folgendes:

Beim ersten starten vom Arduino soll eine Variable 0 enthalten. Diese soll dann - über Tastenfuntionen - einen bis zu zweistelligen int-Wert erhalten. Dieser Wert soll auch nach dem abschalten und erneuten starten erhalten bleiben. Alle anderen Variablen müssen das nicht, nur diese eine. Gibt es ansonsten eine Möglichkeit dazu? Oder hab ich nur was falsch verstanden?

LG

Fipsi

Dafür ist der EEPROM gedacht ( oder ein batteriegepufferter externer RAM )

Dann schau ich mal, dass ich da was hinbekomm.

VIelen Dank :slight_smile:

Dafür gibt das EEPROM:

Da musst du allerdings aufpassen, dass du da nicht zu oft auf eine Zelle schreibst, da die Schreibzyklen auf 100.000 begrenzt sind. Bzw. das ist der Wert für den die Datenintegrität garantiert ist. Wenn du das nur über Taster machst wird das ok sein, da das relativ selten geschieht und du wohl nicht auf 100.000 kommst, aber wenn man automatisch Werte speichert, ist das problematischer.

Eine gute und billige Alternative ist hier eine DS1307 Real Time Clock. Die hat 56 Byte batteriegepuffertes SRAM.

oder eine etwas teurere Lösung die sich FRAM von RAMTRON nennt. zB FM25C160B-G (2kByte 5V SPI) oder FM24C16B-G (2kByte 5V I2C); Preis bei RS ca 2,5€ bzw 2€
Die können 10^12 Schreibzyklen und ohne Wartepausen. Pin-kopatibel zu vielen I2C oser SPI- EEPROMS
Grüße Uwe

Hey,

danke für die Antworten.

Da aber mein Projekt schon teuer genug wird und die eine Menge Arduinoboards und dann auch die extra Bauteile benötige, kann ich mir es nicht leisten, noch extrige zu verwenden. Ich bleibe bei der EEPROM-Lösung, da diese genügt.

Vielen Dank

Fipsi