Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

18f4580 bootloader
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3335
Страница 1 от 1

Автор:  gdh [ Вто Ное 28, 2006 2:00 am ]
Заглавие:  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);
}

Автор:  Predator_MF [ Вто Ное 28, 2006 3:26 am ]
Заглавие: 

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

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

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

Автор:  gdh [ Вто Ное 28, 2006 11:15 am ]
Заглавие: 

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

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



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

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

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

Автор:  Predator_MF [ Вто Ное 28, 2006 2:21 pm ]
Заглавие: 

Ами нали това е идеята, поставяш си кода в application() (вместо в main() ) и след като се зареди програмата зацикля там :D

Автор:  gdh [ Вто Ное 28, 2006 3:32 pm ]
Заглавие: 

Predator_MF написа:
Ами нали това е идеята, поставяш си кода в application() (вместо в main() ) и след като се зареди програмата зацикля там :D


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

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

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


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

Автор:  Predator_MF [ Вто Ное 28, 2006 4:29 pm ]
Заглавие: 

Идеята е да поставиш кода, който ще се изпълнява в Application()!

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

Автор:  gdh [ Вто Ное 28, 2006 5:00 pm ]
Заглавие: 

Благодаря за търпението и помоща!
От тези примери не успявам да схвана програмната реализация на лоадера. Като концепция ми е ясно. С всичките 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);


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

Автор:  Predator_MF [ Вто Ное 28, 2006 6:30 pm ]
Заглавие: 

Main() вероятно не се презаписва защото bootloader-а не пише върху себе си....в такъв случай каквото и да сложиш в main() ще се изпълнява main() от bootloader-а, а не това което ти си написал и си вкарал чрез bootloader-а. Затова, просто слагаш кода си в application():

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/