Der Atmega644 hat ein 2KB großes EEPROM. Wenn ich folgende Definition kompilieren will bekomme ich keine Fehlermeldung. uint16_t eprom[4095] EEMEM = {0}; Kann ja irgendwie nicht in das EPROM passen 2 Byte mal 4096 gleich 8192 KBytes. Erst wenn ich über 16383 komme bekomme ich die Fehlermelung "size of array 'eprom' is too large". Was passiert den wenn ich eprom[4000] adressiere ? Sollte man sowas nicht in der AVR-LIBC abfangen? Im Prinzip ist dem Preprozessor bekannt wie gross die EPROMS der Atmegas sind !? Folgendes müsste doch funktionieren : uint16_t eprom[1023] EEMEM = {0};
Dem Kompiler ist es egal welche größe du dort angeben tust :-), der weis iegentlich nix vom EEprom und deren größe. Und die Fehlermelung das du keine Werte größer 16383 angeben kannst ist auch richtig. Denn AVR-GCC kann keine Arrays größer 32Kb verwalten da er mit einen signed int16 verwaltet wird der nur von -16383 bis +16384 als Wertbereich hat, und da du uint16 angeben hast macht 2 x 16383 halt ca 32Kbyte an Speicher. CA Dirk
Hmmm, danke ! Naja, eprom.h lädt ja noch 644-spezifische header-files. Dort könnte man eine entsprechende Warnug ausgeben ?! Egal.... Wenn mein Array nun Speicher adressiert der garnicht vorhanden ist, was bekomme ich da für einen Wert zurückgeliefert ?
frischling wrote:
> Was passiert den wenn ich eprom[4000] adressiere ?
Die oberen Bits werden einfach abgeschnitten. Nach dem letzen Byte
greifst Du also wieder auf Byte0 zu.
Generell sollte man auf den EEPROM möglichst wenig zugreifen. Das Lesen
dauert länger und das Schreiben dauert viel viel länger als im SRAM.
Ich habe gute Erfahrungen damit gemacht, daß ich die Daten immer im SRAM
ablege.
Beim Einschalten wird ein Datensatz vom EEPROM in den SRAM kopiert und
dann damit gearbeitet bzw. geändert.
Und erst, wenn man z.B. durch Tastendruck bestätigt, daß die neuen Daten
gespeichert werden sollen, wird vom SRAM zurück in den EEPROM
geschrieben.
Es gibt aber auch Anwendungen wo mehrere Bytes schreiben mit vielen ms
Zeitverbrauch zuviel Verzögerung ist. Dann erfolgt das Rückschreiben in
den EEPROM im Hintergrund im Timerinterrupt.
Insbesondere wenn man im EEPROM mehrere Datensätze ablegt, ist das
Bearbeiten des gerade aktiven Datensatzes im SRAM sehr effektiv.
Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.