Перейти к содержанию
    

Поделитесь господа опытом

Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример :) спасибо !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример :) спасибо !

На atmel.com найдите апнот AVR109. Там есть исходники на Си для IAR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:07: о откликнувшиеся ) неожидал ! спасибо ... вобщем что и как писать я знаю пример в даташите проштудировал ... пишу на Си в CVA и возникает такая проблема видимо при заполнении временного буфера при попытке записи страницы записываеца тока первое слово ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

или не заполняешь временный буфер до конца, или даёшь команду "Записать страницу" сразу после записи в буфер первого слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

затем записываем страницу ... так ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверняка кто то из вас писал загрузчик для AVR для ATMega например если не сложно поделитесь примером кода (желательно на Си) или киньте ссылку на таковой пример :) спасибо !

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотрел пример разобрался ) но возникла другая проблема ! не могу передать управление в область приложения ... т.е. после програмирования вызываю код меняющий положение таблици прерываний и делаю безусловный переход на адрес 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

 

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

 

может опять чего забыл ? :(

 

да в предыдущем сообщении в на асме вместо команд sts естественно out

да интересная особенность ! если после перепрошивки моим загрузчиком слить память программ МК программатором в HEX файл а затем прошить програматором этот HEX обратно в МК ... загрузчик передает управление основной программе без нареканий ! :07:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

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

....
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");
...

, оставив остальную часть своей программы без изменений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...