Цитата(Fape @ May 15 2007, 09:16)

...
вот участок кода который упорно не хочет работать как надо !!!
Код
....
void DoSPM(unsigned char arg)
{
while (SPMCSR & 0x01)
{ }
SPMCSR = arg;
#asm("spm");
}
...
Как я понял, Вы "решили" проблему использовав "куски" ASM-кода из предложенного
adnega примера.
Ошибка же заполнения буфера в приведенном Вами коде возникает из-за инструкции
while (SPMCSR & 0x01); в подпрограмме
DoSPM.
Компилятор CVAVR к качестве "временного" изпользует регистр
r30, и функция
while (SPMCSR & 0x01); компилируется в код:
Код
in r30,0x37
sbrc r30,0
rjmp pc-0x0002
, попрограмма DoSPM вызывается после записи каждого слова в буфер, следовательно r30 регулярно "портится".
Я заменил while() на
Код
...
#asm("Wait_spm:");
i=SPMCR;
#asm("sbrc _i,0");
#asm("rjmp Wait_spm");
...
, оставив остальную часть своей программы без изменений.