Отговори на тема  [ 8 мнения ] 
18f4580 bootloader 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 18f4580 bootloader
Привет на всички,

Опитвам се да подкарам примерния лоадер на ЦЦС-то. Изглежда всичко си работи правилно само дето заредената програма не ще да тръгне.
зареждам я със SIOW.exe и във терминала се виждат потвържденията на ПИК-а при четенето. След това ресетвам и пак си се изпълнява application()

Малко насляпо го преписвам тоя пример. Във application ли трябва да направя безусловен преход към адреса на новата програма или тя би трябвало да се запише върху нея направо?

Или някакъв фюз съм пропуснал.

Или пък това: ...also, any buffer on the PC UART must be turned off, or to its lowest setting, otherwise it will miss data.

ето и кода

Лоадера:
Код:
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

#elif defined(__PCH__)
#include <18F4580.h>
#device adc=8
#FUSES NOWDT, WDT128, INTRC_IO, NOPROTECT, BROWNOUT, BORV21, PUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, FCMEN, NOPBADEN, BBSIZ2K, NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, LPT1OSC, MCLR, NOXINST
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif

#define _bootloader


#include <bootloader.h>
#include <loader.c>


#if defined(__PCM__)
#org LOADER_END+1,LOADER_END+10
#elif defined(__PCH__)
#org LOADER_END+2,LOADER_END+20
#endif
void application(void) {
  while(TRUE);
}

#if defined(__PCH__)
#org 0x40,0x7F
#else
#org 0x20,0x3F
#endif
void main(void) {
   if(!input(PIN_B6))
   {
      load_program();
   }

   application();
}

#ORG default

#int_global
void isr(void) {
   jump_to_isr(LOADER_END+5*(getenv("BITS_PER_INSTRUCTION")/8));
}


Програмата:
Код:
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#elif defined(__PCH__)
#include <18F4580.h>
#device adc=8
#FUSES NOWDT, WDT128, INTRC_IO, NOPROTECT, BROWNOUT, BORV21, PUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, FCMEN, NOPBADEN, BBSIZ2K, NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, LPT1OSC, MCLR, NOXINST
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif

#include <bootloader.h>

void main(void) {
   int i=0;

   printf("\r\nApplication program version 1.00 \r\n");

   while(TRUE)
     printf("%u ",++i);
}


Вто Ное 28, 2006 2:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Цитат:
Опитвам се да подкарам примерния лоадер на ЦЦС-то. Изглежда всичко си работи правилно само дето заредената програма не ще да тръгне.
зареждам я със SIOW.exe и във терминала се виждат потвържденията на ПИК-а при четенето. След това ресетвам и пак си се изпълнява application()

Последно кое от двете ти е проблема - че тръгва application или че нещо не тръгва ?

Bootloader-а е направен така, че след качването на целия код, процесора се рестартира, след което почва да се изпълнява това, което си качил.


Вто Ное 28, 2006 3:26 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 
Цитат:
Последно кое от двете ти е проблема - че тръгва application или че нещо не тръгва ?

Bootloader-а е направен така, че след качването на целия код, процесора се рестартира, след което почва да се изпълнява това, което си качил.



Проблема е че след ресет отново зацикля безкрайния цикъл на application() вместо да тръгне новата програма. Странното е че ПИК-а не се ресетва сам след записа.

В терминала се получава поредица от 11 06 13 11 .... като 06-иците отговарят на броя на редовете в hex-а на програмата. Тъй че си мисля че записа стига до края.

Къде ли бъркам?[/quote]


Вто Ное 28, 2006 11:15 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами нали това е идеята, поставяш си кода в application() (вместо в main() ) и след като се зареди програмата зацикля там :D


Вто Ное 28, 2006 2:21 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 
Predator_MF написа:
Ами нали това е идеята, поставяш си кода в application() (вместо в main() ) и след като се зареди програмата зацикля там :D


Сигурно аз не се изразявам правилно ...

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

Код:
void application()
{
while(TRUE) ;
}


Какъв е смисъла да зареждам програми с лоадера ако всеки път ще се изпълнява безкрайния цикъл на application() ?


Вто Ное 28, 2006 3:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Идеята е да поставиш кода, който ще се изпълнява в Application()!

Реализацията на този bootloader (специално за този на CCS говоря) е да стои "над" твоята програма, при ресет и инициализация на процесора се проверява наличието на джъмпер или окъсен пин (нямам спомен кой точно), при което вместо да се изпълни твоя код, процесора влиза в режим "bootloader". В този режим качваш HEX файла във FLASH-а, като този HEX се презаписва върху стария ти код, единственото нещо което не би трябвало да се презапише е самия bootloader. Ако HEX-а, който качваш в процесора няма bootloader, след презаписване на процесора веднъж, няма да можеш повече да влезеш в режим bootloader, а идеята е да можеш да ъпдейтваш по всяко време...затова поставяш твой код, или самата ти програма във функцията application()....а това "while(True)" е поставено там просто за да не се рестартира процесора постоянно ако качиш само празен bootloader. Махаш while(TRUE) и слагаш твоята програма там.


Вто Ное 28, 2006 4:29 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 
Благодаря за търпението и помоща!
От тези примери не успявам да схвана програмната реализация на лоадера. Като концепция ми е ясно. С всичките loader.c, ex_bootloader.c, ex_bootload.c, bootloader.c, bootloader.h единствено се обърквам повече.

Цитат:
В този режим качваш HEX файла във FLASH-а, като този HEX се презаписва върху стария ти код, единственото нещо което не би трябвало да се презапише е самия bootloader. Ако HEX-а, който качваш в процесора няма bootloader, след презаписване на процесора веднъж, няма да можеш повече да влезеш в режим bootloader, а идеята е да можеш да ъпдейтваш по всяко време


Ако програмата ми е наред в такъв случай би трябвало мейна и извикването на bootloader-a да бъде презаписано от новия мейн който да прави това
Код:
printf("\r\nApplication program version 1.00 \r\n");

   while(TRUE)
     printf("%u ",++i);


Това обаче не се случва.


Вто Ное 28, 2006 5:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Main() вероятно не се презаписва защото bootloader-а не пише върху себе си....в такъв случай каквото и да сложиш в main() ще се изпълнява main() от bootloader-а, а не това което ти си написал и си вкарал чрез bootloader-а. Затова, просто слагаш кода си в application():

Код:
void application()
{
printf("\r\nApplication program version 1.00 \r\n");

   while(TRUE)
     printf("%u ",++i);
}


Вто Ное 28, 2006 6:30 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 17 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни