Цитата(Serega Doc @ Nov 22 2005, 18:49)

Процедуры записи и чтения EEPROM
void EPROM_W(int ADDR, char DATA)
{
unsigned char savedSREG;
while (EECR & (1<<EEWE) ) ; // wait bit EEWE
EEAR = ADDR; // set address
EEDR = DATA; // set data
savedSREG = SREG; // keep setting so it can be restored
CLI(); // disable interrupts
Цитата(Serega Doc @ Nov 22 2005, 18:49)

EECR |= BIT(EEMWE); // set "write enable" bit
EECR |= BIT(EEWE); // set "write" bit
while(EECR&(1<<EEWE));//wait for EEWE -> 0
EEAR=0;//to prevent EEPROM corruption
Цитата(Serega Doc @ Nov 22 2005, 18:49)

SREG = savedSREG; // restore SREG
}
char EPROM_R(int ADDR)
{
while (EECR & (1<<EEWE));
CLI(); // disable interrupts
EEAR = ADDR; // set address
EECR |= BIT(EERE); // set "read enable" bit
EEAR=0;//to prevent EEPROM corruption
Цитата(Serega Doc @ Nov 22 2005, 18:49)

SEI(); //re-enable interrupts
return (EEDR);
}
Я подправил, как считаю нужным. Т.е. суть в том, чтобы не использовать нулевую ячейку вообще. В ней будет мусор, вызванный сбоем проца при нарушении питания.
Может у тебя происходит повторный вход в обработчик прерывания?
Вот тема, где обсуждалась работа с EEPROM:
http://forum.electronix.ru/index.php?showtopic=7607