реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поделитесь господа опытом, загрузчик для AVR
Fape
сообщение May 15 2007, 02:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-07-05
Пользователь №: 6 451



Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример smile.gif спасибо !
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 15 2007, 03:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



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

На atmel.com найдите апнот AVR109. Там есть исходники на Си для IAR
Go to the top of the page
 
+Quote Post
adnega
сообщение May 15 2007, 03:32
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Выдержки кода
Прикрепленные файлы
Прикрепленный файл  test_selfprog.zip ( 2.03 килобайт ) Кол-во скачиваний: 73
 
Go to the top of the page
 
+Quote Post
Fape
сообщение May 15 2007, 04:05
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-07-05
Пользователь №: 6 451



07.gif о откликнувшиеся ) неожидал ! спасибо ... вобщем что и как писать я знаю пример в даташите проштудировал ... пишу на Си в CVA и возникает такая проблема видимо при заполнении временного буфера при попытке записи страницы записываеца тока первое слово ...
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 15 2007, 04:39
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата
записываеца тока первое слово

или не заполняешь временный буфер до конца, или даёшь команду "Записать страницу" сразу после записи в буфер первого слова.
Go to the top of the page
 
+Quote Post
Fape
сообщение May 15 2007, 05:16
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-07-05
Пользователь №: 6 451



я видимо что то не понимаю ! этот временный буфер он реализован аппаратно ? или это место в 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 раз )

затем записываем страницу ... так ?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 15 2007, 05:20
Сообщение #7


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Уважаемый Fape! Тем, посвященных bootloader'у в этой ветке форума достаточно много. Воспользуйтесь поиском и рассмотрите примеры.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
bodja74
сообщение May 15 2007, 07:12
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Забыли флаг PGWRT проверять при записи страницы.
Go to the top of the page
 
+Quote Post
Fape
сообщение May 16 2007, 08:23
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-07-05
Пользователь №: 6 451



посмотрел пример разобрался ) но возникла другая проблема ! не могу передать управление в область приложения ... т.е. после програмирования вызываю код меняющий положение таблици прерываний и делаю безусловный переход на адрес 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
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 16 2007, 09:00
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Попробуйте передать управление вместо команды jmp 0x00, таким образом:

ldi r30,0x00
ldi r31,0x00
ijmp
Go to the top of the page
 
+Quote Post
Fape
сообщение May 16 2007, 09:18
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 1-07-05
Пользователь №: 6 451



спасибо Igor26 все заработало ! благодарю за участие a14.gif smile.gif smile.gif
Go to the top of the page
 
+Quote Post
Stas633
сообщение May 21 2007, 07:43
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(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");
...

, оставив остальную часть своей программы без изменений.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01647 секунд с 7
ELECTRONIX ©2004-2016