úspešne používam niečo takéto (úryvok z rozsiahlejšieho cylu):
#define DATA_READ 0
#define DATA_WRITE 1
#define DATA_COMPARE 2
// praca s EEPROM
#define EEPROM_ADR_REGISTER EEAR
#define EEPROM_MAX_ADR E2END
#define EEPROM_DATA_REGISTER EEDR
#define EEPROM_POVOL_PRERUSENIE SET(EECR,EERIE)
#define EEPROM_ZAKAZ_PRERUSENIE RES(EECR,EERIE)
#define EEPROM_WR_BYTE SET(EECR,EEMWE); \
SET(EECR,EEWE)
#define EEPROM_RD_BYTE SET(EECR,EERE)
#define EEPROM_BUSY TST(EECR,EEWE)
#define EEPROM_MASKA_ERASE_WRITE (EECR &= 0x0f)
// DATA_READ, DATA_WRITE, DATA_COMPARE
uint8_t fn_int_rd_wr_eeprom(uint8_t prikaz, uint16_t *p_ciel, uint16_t index, uint8_t pocet)
{
volatile LOCAL uint16_t data_eep[DATA_EEP_MAX] EEMEM;
volatile LOCAL uint8_t beh_programu = FALSE;
uint16_t eep_number;
uint8_t *p_pointer_eep_eep, *p_pointer_eep_ram;
if (beh_programu == TRUE) return(FALSE);
if (index >= DATA_EEP_MAX) return(FALSE);
beh_programu = TRUE;
// ******************** SPRACOVANIE PAMATOVEJ OBLASTI **************************************
if ((index + pocet) >= DATA_EEP_MAX) {
pocet = (uint8_t)(DATA_EEP_MAX - index);
}
eep_number = 2 * pocet;
p_pointer_eep_eep = (uint8_t *)&data_eep[index];
p_pointer_eep_ram = (uint8_t *)p_ciel;
// ******************** SPRACOVANIE PRIKAZU **************************************
switch (prikaz) {
case DATA_READ : {
while (eep_number) {
// cakaj na pripadne uvolnenie prace s EEPROM
while(EEPROM_BUSY);
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
EEPROM_RD_BYTE;
*p_pointer_eep_ram = EEPROM_DATA_REGISTER;
p_pointer_eep_eep++;
p_pointer_eep_ram++;
eep_number--;
}
break;
}
case DATA_COMPARE : {
while (eep_number) {
// cakaj na pripadne uvolnenie prace s EEPROM
while(EEPROM_BUSY);
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
EEPROM_RD_BYTE;
if (*p_pointer_eep_ram != EEPROM_DATA_REGISTER) return(FALSE);
p_pointer_eep_eep++;
p_pointer_eep_ram++;
eep_number--;
}
break;
}
case DATA_WRITE : {
while (eep_number) {
while(EEPROM_BUSY);
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
EEPROM_DATA_REGISTER = (uint8_t)*p_pointer_eep_ram;
EEPROM_WR_BYTE;
p_pointer_eep_ram++;
p_pointer_eep_eep++;
eep_number--;
}
break;
}
}
beh_programu = FALSE;
return(TRUE);
}
v zásade je to okopčené z datasheetu a fungovalo to na prvý šum.
Pravdepodobne robíš nejakú elementárnu chybu. Ale to nie si sám