PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten ins EEPROM des ATmega128 schreiben/lesen



Kornhaas.net
05.09.2005, 10:32
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:


unsigned char EEPROM config1, config2, config3, checksum;


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 vorstelle :-(



/************************************************** ********************\
* 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);
}


Schon mal tausend Dank für euere Hilfe

Holger

SprinterSB
05.09.2005, 11:11
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';



#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);