Цитата(defunct @ Aug 11 2008, 14:34)

А как он тогда пишет long переменные? (они же 4 байта и проверку перед каждым вручную не вставишь)..
асм листинг можете привести?
По моему, компилятор CVAVR все делает правильно. Вот поигрался,
CodeVisinAVR Version 1.25.8a Evaluation
Простейший пример кода Си
Код
#include <mega16.h>
long x,y=0x12345678;
eeprom long eex;
main()
{
x=PINB;
x *=y;
eex=x;
while (1);
}
сгенерированный код ассемблера
Код
; 21 eex=x;
LDS R30,_x
LDS R31,_x+1
LDS R22,_x+2
LDS R23,_x+3
LDI R26,LOW(_eex)
LDI R27,HIGH(_eex)
CALL __EEPROMWRD
...
...
...
__EEPROMWRD:
...
RCALL __EEPROMWRW
...
RET
__EEPROMWRW:
...
RCALL __EEPROMWRB
...
RET
### Вот блок ожидания доступности EEPROM. Как указано в даташите:
"When the write access time has elapsed, the EEWE bit is cleared by hardware. The
user software can poll this bit and wait for a zero before writing the next byte. When
EEWE has been set, the CPU is halted for two cycles before the next instruction is
executed. (ATmega16, doc2466.pdf page 20)"
__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
При записи первого байта, командой
SBI EECR,EEWE
флаг EEWE ставится в единицу.
А затем при следующей попытке записи будет вертется в
__EEPROMWRB:
пока флаг EEWE не обнулится (в даташите пишуть - через 8.5 мсек).