Добрый день. Кажется, нашел:
1. Использовал cvavr, atmelStudio+avrispmk2, atmega8535. Где-то на форуме была эта связка. Код для записи и считывании, код вывода на индикатор не приведен
Код: Выделить всё
unsigned int minuteADREEP2 = 165;
eeprom_write_byte(minuteADREEP2, 55);
delay_us(10);
for(z=0;z<10;z++)
{
masDebug[z*2] = eeprom_read_byte(z+minuteADREEP2);// EEPROMReadChar(z);//записываем через адрес
delay_us(10);
}
Результат ошибки подтвердился считанным файлом.
Код: Выделить всё
:1000A000 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 E0
:1000B000 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 D0
Такое ощущение, что запись идет какими-то страницами.
2. Ошибка формируется сразу после записи кристалла, если после программирования записать файл *.eep с 0-ми, то далее проблем не будет. Вот пример:
Код: Выделить всё
:1000A000 00 00 00 00 00 37 00 00 00 00 00 00 00 00 00 00 19
Если я не ошибаюсь, то это можно избежать сбросом кристалла в промежутке "после программирования кристалла - до записи в eeprom".
Могут быть еще какие-то подобные проблемы при использовании cvavr, atmelStudio+avrispmk2, atmega8535?
3. Изначально хотел использовать все 1кбайт-е пространство EEPROM, для этого использовал метод из вашей документации, на asm и С:
Код: Выделить всё
//#asm
//EEPROM_write:
// ; Wait for completion of previous write
// sbic EECR, EEWE
// rjmp EEPROM_write
// ; Set up address (r18: r17) in address register
// mov
// out EEARH, r18
// out EEARL, r17
// ; Write data (r16) to Data Register
// out EEDR, r16
// ; Write logical one to EEMWE
// sbi EECR, EEMWE
// ; Start eeprom write by setting EEWE
// sbi EECR, EEWE
// ret
//#endasm
while(EECR & (1 << EEWE)); /* Wait for completion of previous write */
EEAR = uiAddress;/* Set up Address and Data Registers */
EEDR = ucData;
EECR |= (1 << EEMWE); /* Write logical one to EEMWE */
EECR |= (1 << EEWE); /* Start eeprom write by setting EEWE */
А это библиотечная функция записи cvavr на asm.
Код: Выделить всё
__EEPROMWRB:
SBIS EECR,EEWE
RJMP __EEPROMWRB1
WDR
RJMP __EEPROMWRB
__EEPROMWRB1:
IN R25,SREG
CLI
OUT EEARL,R26
OUT EEARH,R27
SBI EECR,EERE
IN R24,EEDR
CP R30,R24
BREQ __EEPROMWRB0
OUT EEDR,R30
SBI EECR,EEMWE
SBI EECR,EEWE
__EEPROMWRB0:
OUT SREG,R25
RET
Как видно в вашей документации отсутствует сохранение SREG, CLI и восстановление SREG. Отсюда вопрос, нужно ли делать CLI, например, появление нескольких NOP-ов в методе записи в EEPROM, приводит к отказу записи по соотв. адресу. Если все-таки CLI нужен, можете поделиться кодом метода записи/чтения на С.
Заранее благодарен.