Zápis a čtení na EEPROM ATmega32A

ú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 :slight_smile: