Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поделитесь господа опытом
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Fape
Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример smile.gif спасибо !
Igor26
Цитата(Fape @ May 15 2007, 05:34) *
Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример smile.gif спасибо !

На atmel.com найдите апнот AVR109. Там есть исходники на Си для IAR
adnega
Выдержки кода
Fape
07.gif о откликнувшиеся ) неожидал ! спасибо ... вобщем что и как писать я знаю пример в даташите проштудировал ... пишу на Си в CVA и возникает такая проблема видимо при заполнении временного буфера при попытке записи страницы записываеца тока первое слово ...
Igor26
Цитата
записываеца тока первое слово

или не заполняешь временный буфер до конца, или даёшь команду "Записать страницу" сразу после записи в буфер первого слова.
Fape
я видимо что то не понимаю ! этот временный буфер он реализован аппаратно ? или это место в SRAM которое я должен выделить и на которое должен указывать регистр Z ?

вот участок кода который упорно не хочет работать как надо !!!

переменная gate - регистр r8

void DoSPM(unsigned char arg)
{
while (SPMCSR & 0x01)
{ }
SPMCSR = arg;
#asm("spm");
}


// стираем страницу
gate = 0x00;
#asm("mov r30, r8");
gate = 0x00;
#asm("mov r31, r8");
DoSPM(0b00000011);
// разрешаем адресацию RWW
DoSPM(0b00010001);

// указатель Z на адресс 0x0000
gate = 0x00;
#asm("mov r30, r8");
gate = 0x00;
#asm("mov r31, r8");

// заполнаем буфер
for (i = 0; i < 128; ++i)
{
gate = 0xbb;
#asm("mov r1, r8");
gate = 0xcc;
#asm("mov r0, r8");
DoSPM(0b00000001);
#asm("adiw r30, 2");
}
// записываем странцу
gate = 0x00;
#asm("mov r30, r8");
gate = 0x00;
#asm("mov r31, r8");
DoSPM(0b00000101);


может кто увидит свежим глазом чде тут ошибка ?

еще вопрос про этому временному буферу и его заполнению ! как я понял порядок действий такой :
если заполнять буфер целиком все 128 слов

1) записываем в Z = 0x0000
2) записываем в r0 и r1 слово
3) даем команду spm запомнить байт
4) увеличиваем Z на 2
5) повторяем 2 - 4 п 128 раз )

затем записываем страницу ... так ?
haker_fox
Цитата(Fape @ May 15 2007, 11:34) *
Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример smile.gif спасибо !

Уважаемый Fape! Тем, посвященных bootloader'у в этой ветке форума достаточно много. Воспользуйтесь поиском и рассмотрите примеры.
bodja74
Забыли флаг PGWRT проверять при записи страницы.
Fape
посмотрел пример разобрался ) но возникла другая проблема ! не могу передать управление в область приложения ... т.е. после програмирования вызываю код меняющий положение таблици прерываний и делаю безусловный переход на адрес 0x0000
MCUCR = 0x01;
MCUCR = 0x00;
#asm("jmp 0x00");

или

#asm
push r16
ldi r16, 0x01
sts MCUCR, r16
ldi r16, 0x00
sts MCUCR, r16
pop r16
jmp 0x00
#endasm

эффект один и тотже происходит рестарт загрузчикаэ

может опять чего забыл ? sad.gif

да в предыдущем сообщении в на асме вместо команд sts естественно out
да интересная особенность ! если после перепрошивки моим загрузчиком слить память программ МК программатором в HEX файл а затем прошить програматором этот HEX обратно в МК ... загрузчик передает управление основной программе без нареканий ! 07.gif
Igor26
Попробуйте передать управление вместо команды jmp 0x00, таким образом:

ldi r30,0x00
ldi r31,0x00
ijmp
Fape
спасибо Igor26 все заработало ! благодарю за участие a14.gif smile.gif smile.gif
Stas633
Цитата(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");
...

, оставив остальную часть своей программы без изменений.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.