Hi I want to read and write to the internal eeprom in the at89c51ed2. In simulation it seams OK, but in target, the volatile memory is allways read as 0xffh. I use the same routines for same processor in a different project without problems. My test looks as follows:
IntTemp = 100; eep_write(0,IntTemp); i = eep_read(0); if ( i !=IntTemp ) { error(1); }
void eep_write(byte address, int wdata) { bit tmpEA = EA; //store EA state EA = 0; EECON = 0x02; // Enable EEPROM XWORD[address] = wdata; EECON = 0x50; //necessary for simulation to work, why? EECON = 0xa0; //same as above EECON &= ~0x02; EA = tmpEA; while(EECON & 1); }
int eep_read(byte address) { bit tmpEA = EA; int read_data; while(EECON & 1); EA = 0; EECON |= 2; // Map eeprom read_data = XWORD[address]; EECON &= ~2; // Unmap eeprom EA = tmpEA; return(read_data); }
Well, after all I have the way: unsigned char __api_rd_eeprom_byte(unsigned int adr) { unsigned char val; bit ea_save; while (EECON&1) {WDT_feed; //Watch dog,this "while" many be few mS when you W/R continously };//Eeprom_busy() ea_save=EA; EA=0; EECON |= 0x02;//Enable eeprom data; val=*(unsigned char xdata*)adr; EECON &= ~0x02;//Disable eeprom data; EA=ea_save; return val; } void __api_wr_eeprom_byte(unsigned int adr, unsigned char value) { bit ea_save; while(EECON & 0x01) {WDT_feed; //Watch dog,this "while" many be few mS when you W/R continously };// wait bit busy ea_save=EA; EA=0; EECON |= 0x02;//Enable eeprom data *(unsigned char xdata*)adr=value; EECON &= ~0x02;//Disable eeprom data EA=ea_save; } the api only support 1B's R/W, so you should do the managment of WORD/DWORD type's Read/Wrote... Michael Christensen 's problem is because his routine is for T89C51ED2, not AT89C51ED2, Atmel has a pdf told you the difference between these 2chip... and the routine in this post is for AT89C51ED2... Hope it can help the newer...