Hallo Leute,
Hab im moment vor während meiner Programmlaufzeit, Daten in das EEPROM des ATmega 128 zu schreiben und wieder herauszulesen.
Dazu habe ich mir folgendes angelegt:
Folgende Funktionen hab ich mir überlegt um die Daten zu speichern und wieder zu lesen. Nur leider geht das nicht so wie ich mir das vorstelleCode:unsigned char EEPROM config1, config2, config3, checksum;
Schon mal tausend Dank für euere HilfeCode:/**********************************************************************\ * Funktionsname:loadconfig * * Kurzbeschreibung: * Funktion vom Einlesen der letzten Konfiguration aus dem EEPROM * \**********************************************************************/ void loadconfig(void) { if (!((config1 + config2 + checksum) & 0xFF)) { SPCR = config1; // laden der Einstellungen des SPCR Registers SPSR = config2; // laden der Einstellungen des SPSR Registers // flags = config3; // laden der Einstellungen der globalen Flag variablen USART0_TransmitStrin_p(config); } else USART0_TransmitStrin_p(noconfig); } /**********************************************************************\ * Funktionsname:writeconfig * * Kurzbeschreibung: * Funktion vom Einlesen der letzten Konfiguration aus dem EEPROM * \**********************************************************************/ void writeconfig(void) { cli(); // Abschalten aller Interrupts während des EEPROM schreibens config1 = SPCR; // Schreiben der SPCR Daten in das EEPROM config2 = SPSR; // Schreiben der SPSR Daten in das EEPROM //config3 = flags;// Schreiben der globalen Flags in das EEPROM checksum = 0-(config1 + config2); // erstellen und speichern der Checksumme sei(); // Aktivieren der Interrupts USART0_TransmitStrin_p(cfgwrite); }
Holger
So wird config1 etc als SRAM-Adresse interpretiert. Zum Schreiben/Lesen ins EEPROM gibt's Routinen wie eeprom_read_byte(), Zugriff ähnlich wie in PGMSPACE.
Doku in avr-libc-Doku und header avr/eeprom.h
Daten ins EEPROM lokatieren:
#define EEPROM __attribute__((section(".eeprom")))
const char c EEPROM = 'A';
Code:#define eeprom_is_ready() ... extern uint8_t eeprom_read_byte (const uint8_t *addr); extern uint16_t eeprom_read_word (const uint16_t *addr); extern void eeprom_read_block (void *buf, const void *addr, size_t n); extern void eeprom_write_byte (uint8_t *addr, uint8_t val); extern void eeprom_write_word (uint16_t *addr, uint16_t val); extern void eeprom_write_block (const void *buf, void *addr, size_t n);
Disclaimer: none. Sue me.
Lesezeichen