Функции записи/чтения:
void EEPROM_write(unsigned int uiAddress, uint8_t ucData)
{
while(EECR & (1<<EEWE)) // Wait for completion of previous write
{}
EEAR = uiAddress; //Set up address register
EEDR = ucData; //Set up data register
EECR |= (1<<EEMWE); //Write logical one to EEMWE
CLI;
EECR |= (1<<EEWE); //Start eeprom write by setting EEWE
SEI;
}
uint8_t EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE)) // Wait for completion of previous write
{}
EEAR = uiAddress; //Set up address register
CLI;
EECR |= (1<<EERE); //Start eeprom read by writing EERE
SEI;
return EEDR; //Return data from data register
}
Функции записи/чтения 16 битных переменных:
void EEPROM_write_int(uint16_t uiAddress, uint16_t ucData)
{
uint8_t temp = ucData >> 8;
EEPROM_write(uiAddress, (uint8_t) ucData); //high 8 bites will be cut
EEPROM_write(uiAddress +1, temp); //low 8 bites in next memory cell
}
uint16_t EEPROM_read_int(uint16_t uiAddress)
{
uint16_t temp = EEPROM_read(uiAddress+1);
NOP;
NOP;
temp = temp << 8;
temp += EEPROM_read(uiAddress);
return temp;
}
Адресация памяти начинается с 0. Конечный адрес можно узнать, выгрузив содержимое EEPROM из чипа или заглянув в datasheet.
По дефолту при стирании памяти RAM очищается и EEPROM. Чтобы этого не происходило, надо активировать (установить в ноль (!)) FUSE бит EESAVE.
Прочитать фьюзы из atmega8 (в файлы пишутся hex; предпочтительно):
sudo avrdude -c usbasp -p m8 -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h
Прочитать фьюзы из atmega8 (в файл пишутся bin):
sudo avrdude -c usbasp -p m8 -U hfuse:r:hfuse.txt:b -U lfuse:r:lfuse.txt:b
Считаем новое значение на пальцах, если программируем в лесу, или через онлайн калькулятор:
http://www.engbedded.com/fusecalc/
Смотрим текущее состояние по слитым с чипа данным и рассчитываем необходимое значение. После этого прошиваем откорректированные фьюзы примерно следующей командой:
sudo avrdude -c usbasp -p m8 -U lfuse:w:0xEF:m -U lfuse:w:0xD1:m
+