Приветствую, есть вопрос по AVR-контроллерам, конкретно запись в EEPROM. Имею следующий код: Код (Text): #include <avr/io.h> int main(void) { // Записать 10 байтов в EEPROM for (int i = 0; i < 10; i++) { // Ждать готовность к записи while ( EECR & 0x02 ); EEAR = i; // Адрес EEDR = i + 0x20; // Данные EECR = 0x04; // Разрешить запись EECR = 0x02; // Запись //asm( "sbi 0x1C, 1" ); (1) } // Читать 10 байтов из EEPROM for (int i = 0; i < 10; i++) { EEAR = i; // Адрес EECR = 0x01; // Чтение } // Спать while ( 1 ) { MCUCR = 0x20; asm( "sleep" ); } } При записи байта в EEPROM следует в регистре EECR сначала выставить 2-й бит (разрешение записи), а затем 1-й (собственно запись). Если отлаживать код в представленном виде, то запись не будет производиться. Если вместо "EECR = 0x02;" раскомментировать строку (1), то запись произойдёт. Почему так? Непонимаю, в чём отличие. Как можно записать байт, не используя в данном случае ассемблерный код? Использую для отладки AVR Studio v4.16, компилятор WinAVR.
А этот код не соответствует выше сказаному (написанному). Ты сначала устанавливаешь 2-й, а затем устанавливаешь 1-й, но сбрасываешь 2-й. А они должны быть оба "1". Доки читать нужно чуть-чуть по внимательней: Из PDF-ника: Код (Text): Assembly Code Example EEPROM_write: ; Wait for completion of previous write sbic EECR,EEPE rjmp EEPROM_write ; Set up address (r17) in address register out EEAR, r17 ; Write data (r16) to data register out EEDR,r16 ; Write logical one to EEMPE sbi EECR,EEMPE ; Start eeprom write by setting EEPE sbi EECR,EEPE ret C Code Example void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEPE)) ; /* Set up address and data registers */ EEAR = uiAddress; EEDR = ucData; /* Write logical one to EEMPE */ EECR |= (1<<EEMPE); /* Start eeprom write by setting EEPE */ EECR |= (1<<EEPE); }
Как это выполнится, Код (Text): /* Start eeprom write by setting EEPE */ EECR |= (1<<EEPE); то результата видно не будет. Результат работы будет виден после 4-х тактов ядра. Время выжидал?
Я прям вырезал команды записи из PDF и вставил вместо своих. Прогнал цикл с отрытым окном Memory EEPROM. Помоему значения должны были меняться.
Хорошо, тогда такой вопрос: можно ли надеяться что нижеследующий код будет писать байт в EEPROM (на реальной железке) ? Код (Text): EEAR = 0x10; EEDR = 0xAA; EECR = 0x04; EECR = 0x06; // 0x04 | 0x02 Не будут ли какие-то проблемы с установкой бита Write Master во второй раз? Можно ли убрать третью строку из данного кода? Т.е. сразу выставлять и Write Master и Write Enable ?
simpleX Нет, все работает, говорю как человек, измученый Atmel'ами Единственное, что - между ними не должно долбануть прерывание, ибо тогда запись не прокатит. Не получится. WE просто не установится.