Wenn du ein Byte im "normalen" RAM hast, musst du die Adressverwaltung ja auch nicht übernehmen:
Code:
unsigned char ein_byte = 42;
...
ein_byte++;
...
Dir kann doch egal sein, wo ein_byte im Speicher liegt. Nachm RESET liegts doch immer noch an der selben Stelle...
Für den EEPROM sieht es so aus:
Code:
#include <avr/eeprom.h>
// EEMEM braucht bei neueren avr-gcc-Versionen nicht mehr extra definiert zu weden.
#define EEMEM __attribute__ ((section (".eeprom")))
const unsigned char ein_byte_EE EEMEM = 42;
...
ein_byte = eeprom_read_byte (& ein_byte_EE);
Falls du dich um die Adressen selber kümmern willst, kann es ratsam sein, den gesamte EEPROM in eine Struktur abzubilden. Die Komponente data in der Struktur unten enthält einfach 100 Bytes, die du lesen und schreiben kannst.
Code:
#define NUM_BYTES_EE 100
unsigned char data[10];
typedef struct
{
unsigned short address;
unsigned char data[NUM_BYTES_EE];
} eeprom_t;
// Initialisierung fuer eeprom, wird beschrieben beim Flashen (nicht beim RESET)
const eeprom_t eeprom EEMEM =
{
.address = 0,
.data = {0, 1, 2, 3 /* ... */ }
};
void foo()
{
unsigned short address;
// liest die letzte Adresse
eeprom_read_word ((void*) & eeprom.address);
// liest 10 Bytes vom EEPROM: eeprom.data[last_address]...eeprom.data[last_address+9] nach data
eeprom_read_block (data, & eeprom.data[address], 10);
// Adresse um 10 weiter
eeprom_write_word ((void*) & eeprom.address, address+10);
}
Lesezeichen