|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 11:51 pm
|
Страница 1 от 1
|
[ 8 мнения ] |
|
| Автор |
Съобщение |
|
gdh
Ранг: Минаващ
Регистриран на: Нед Окт 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 |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Последно кое от двете ти е проблема - че тръгва application или че нещо не тръгва ?
Bootloader-а е направен така, че след качването на целия код, процесора се рестартира, след което почва да се изпълнява това, което си качил.
|
| Вто Ное 28, 2006 3:26 am |
|
 |
|
gdh
Ранг: Минаващ
Регистриран на: Нед Окт 15, 2006 8:01 pm Мнения: 46
|
Проблема е че след ресет отново зацикля безкрайния цикъл на application() вместо да тръгне новата програма. Странното е че ПИК-а не се ресетва сам след записа. В терминала се получава поредица от 11 06 13 11 .... като 06-иците отговарят на броя на редовете в hex-а на програмата. Тъй че си мисля че записа стига до края. Къде ли бъркам?[/quote]
|
| Вто Ное 28, 2006 11:15 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами нали това е идеята, поставяш си кода в application() (вместо в main() ) и след като се зареди програмата зацикля там 
|
| Вто Ное 28, 2006 2:21 pm |
|
 |
|
gdh
Ранг: Минаващ
Регистриран на: Нед Окт 15, 2006 8:01 pm Мнения: 46
|
Сигурно аз не се изразявам правилно ...
Става въпрос за ето този цикъл
Какъв е смисъла да зареждам програми с лоадера ако всеки път ще се изпълнява безкрайния цикъл на application() ?
|
| Вто Ное 28, 2006 3:32 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 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 |
|
 |
|
gdh
Ранг: Минаващ
Регистриран на: Нед Окт 15, 2006 8:01 pm Мнения: 46
|
Благодаря за търпението и помоща!
От тези примери не успявам да схвана програмната реализация на лоадера. Като концепция ми е ясно. С всичките loader.c, ex_bootloader.c, ex_bootload.c, bootloader.c, bootloader.h единствено се обърквам повече.
Ако програмата ми е наред в такъв случай би трябвало мейна и извикването на bootloader-a да бъде презаписано от новия мейн който да прави това
Това обаче не се случва.
|
| Вто Ное 28, 2006 5:00 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Main() вероятно не се презаписва защото bootloader-а не пише върху себе си....в такъв случай каквото и да сложиш в main() ще се изпълнява main() от bootloader-а, а не това което ти си написал и си вкарал чрез bootloader-а. Затова, просто слагаш кода си в application():
|
| Вто Ное 28, 2006 6:30 pm |
|
|
|
Страница 1 от 1
|
[ 8 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 9 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|