Цитата(Len_OK @ Feb 15 2008, 12:44)

2 KRS
Значит еепром надёжней чем флешка?
Да тут много факторов.
У Атмела флешь может слетать если супервизора на ресете нет и начнет глючить питание или помехи путсить по питанию и ресету. Бывало такое.
В еепром циклов записи намного больше.
Цитата(Len_OK @ Feb 15 2008, 12:44)

В том то и дело, что процедуры записи размещаю в бутлоадере.Во флешку данные записываются, но после я не могу ничего больше выполнить, на некоторое время МК подвисает.
А вы не забвываете потом разрешить RWW секцию
Код
;re-enable the RWW section
ldi spmcsrval, (1<<RWWSRE) | (1<<SPMEN)
call Do_spm
Но у меня в коде бутлоадера стоит вообще в цикле пока не разрешится.
Почему я так делал не помню.
Код
; enable RWW section
Enable:
ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
rcall Do_spm
#ifdef SPMCRN
in r16, SPMCR
#else
lds r16, SPMCSR
#endif
sbrc r16, RWWSB
rjmp Enable
Цитата(Len_OK @ Feb 15 2008, 12:49)

#pragma location = "loader"
void erase_flash_page(unsigned char NumPage)
{
unsigned const char __flash *flash_adr;
flash_adr=&flash_buf_read[NumPage][0];
_ENABLE_RWW_SECTION();
_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
}
#pragma location = "loader"
void update_flash_page(unsigned char *temp_buf,unsigned char NumPage)
{
unsigned const char __flash *flash_adr;
unsigned char Buf_Adres = 0;
flash_adr=&flash_buf_read[NumPage][0];
do
{ fl_data=*(temp_buf+Buf_Adres+1);
fl_data<<=8;
fl_data|=*(temp_buf+Buf_Adres);
_FILL_TEMP_WORD(Buf_Adres,fl_data);
Buf_Adres+=2;
} while (Buf_Adres<64);
_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
_WAIT_FOR_SPM();
_PAGE_WRITE(flash_adr);
}
У меня _ENABLE_RWW_SECTION();
стоит в цикле только в конце после стирания и записи
Код
PUBLIC PageWrite
PageWrite:
; page erase
ldi spmcrval, (1<<PGERS) | (1<<SPMEN)
rcall Do_spm
; fill page buffer
ldi ......
ldi ......
Fill:
ld r0, ..........
ld r1, ...........
ldi spmcrval, (1<<SPMEN)
rcall Do_spm
..........
subi ...., 2
brne Fill
; write page
..........
ldi spmcrval, (1<<PGWRT) | (1<<SPMEN)
rcall Do_spm
; enable RWW section
Enable:
ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
rcall Do_spm
#ifdef SPMCRN
in r16, SPMCR
#else
lds r16, SPMCSR
#endif
sbrc r16, RWWSB
rjmp Enable
; check porgrammed page
.................................
ret