/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/bootloader/bloader.PJT
0,0 → 1,56
[Directories]
Include=C:\Program Files\PICC\Devices;C:\Program Files\PICC\Drivers;
Library=
LinkerScript=
[defines]
enabled=0
D1=
V1=
[fileformats]
forcecoff=0
debug=4
error=2
object=0
list=0
scratch=0
sta=1
tre=1
allerrors=1
allwarnings=1
stayupne=3
stayupoe=0
[PROJECT]
Target=bloader.hex
Development_Mode=
Processor=0x688F
Processor_Text=PIC16F88
ToolSuite=CCS
[Target Data]
BuildTool=C-COMPILER
OptionString=+FM
AdditionalOptionString=
BuildRequired=1
[bloader.c]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
[mru-list]
1=bloader.c
[Windows]
0=0000 %S 0 0 796 451 3 0
[Units]
Link=0
Count=1
1=bloader.c
[Opened Files]
1=bloader.c
2=bloader.h
3=C:\Program Files\PICC\devices\16F88.h
4=C:\Program Files\PICC\drivers\string.h
5=C:\Program Files\PICC\drivers\stddef.h
6=C:\Program Files\PICC\drivers\ctype.h
7=..\main.h
8=
/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/bootloader/bloader.c
0,0 → 1,262
/**** BootLoader ****/
#define VERSION "1.2"
#define ID "$Id: bloader.c 1881 2011-02-24 17:27:37Z kakl $"
 
#CASE // Case sensitive compiler
 
#define FLASH_BLOCK_SIZE 32
#define BLOADER_MAIN_LENGTH 139 // Rezervovane misto pro main BootLoaderu
#define RESERVED_BLOCKS 24 // Pocet rezervovanych bloku Flash pro BootLoader
#define LOADER_RESERVED getenv("PROGRAM_MEMORY")-RESERVED_BLOCKS*FLASH_BLOCK_SIZE
#define BUFFER_LEN_LOD 46
#if FLASH_BLOCK_SIZE != getenv("FLASH_ERASE_SIZE")/2
#error Wrong length of the Flash Block Size. getenv("FLASH_ERASE_SIZE")/getenv("FLASH_WRITE_SIZE")
#endif
 
#include "bloader.h"
#include <string.h>
 
#bit CREN = 0x18.4 // USART registers
#bit SPEN = 0x18.7
#bit OERR = 0x18.1
#bit FERR = 0x18.2
 
 
#INT_RDA
void rs232_handler()
{
putchar(getc());
}
 
void welcome(void) // Welcome message
{
char REV[50]=ID; // Buffer for concatenate of a version string
char VER[4]=VERSION; // Buffer for concatenate of a version string
 
if (REV[strlen(REV)-1]=='$') REV[strlen(REV)-1]=0;
printf("\r\n\r\n# BLoader %s (C) 2007 KAKL\r\n",VER); // Welcome message
printf("#%s\r\n",&REV[4]);
}
 
 
/*-------------------------------- MAIN --------------------------------------*/
#SEPARATE
void real_main()
{
int8 i=0;
 
welcome();
 
printf("# Reserved: %Lu\r\n", RESERVED_BLOCKS*FLASH_BLOCK_SIZE);
printf("# Boot Loader Test >>>\r\n# ");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
printf("%u|",i++);
delay_ms(100);
}
}
 
 
/*------------------- BOOT LOADER --------------------------------------------*/
 
#BUILD(INTERRUPT=FLASH_BLOCK_SIZE) // Redirect Interrupt routine above first flash block
#ORG 4,5
void JumpToTheInterrupt() // Jump to the Interrupt Handler
{ #asm GOTO FLASH_BLOCK_SIZE #endasm }
#ORG 6,FLASH_BLOCK_SIZE-1 {} // First Flash block is reserved
 
 
#ORG LOADER_RESERVED,LOADER_RESERVED+FLASH_BLOCK_SIZE-1 auto=0
#SEPARATE
void dummy_main() // Main on the fix position
{
real_main();
}
 
#ORG LOADER_RESERVED+FLASH_BLOCK_SIZE,getenv("PROGRAM_MEMORY")-BLOADER_MAIN_LENGTH auto=0 default
 
unsigned int atoi_b16(char *s) // Convert two hex characters to an int8
{
unsigned int result = 0;
int i;
 
for (i=0; i<2; i++,s++) {
if (*s >= 'A')
result = 16*result + (*s) - 'A' + 10;
else
result = 16*result + (*s) - '0';
}
 
return(result);
}
 
void assert(int1 Condition, int8 ErrorCode)
{
if(Condition)
{
putchar('E');
putchar(ErrorCode+'1');
reset_cpu();
}
}
 
void pause()
{
int16 timeout;
 
for(timeout=0; timeout<65535; timeout++); // Delay cca 300ms
}
 
#SEPARATE
void boot_loader()
{
int buffidx;
char buffer[BUFFER_LEN_LOD];
 
int8 checksum, line_type;
int16 l_addr,h_addr=0;
int16 addr;
int32 next_addr;
 
int8 dataidx, i;
union program_data {
int8 i8[16];
int16 i16[8];
} data;
 
putchar('@');
 
//nesmaze obsluhu preruseni a jump na main
for(addr=getenv("FLASH_ERASE_SIZE")/2;addr<=LOADER_RESERVED;addr+=getenv("FLASH_ERASE_SIZE")/2)
{
erase_program_eeprom(addr);
putchar('.');
}
 
putchar('!');
 
while(!kbhit()) restart_wdt();
 
while(TRUE)
{
//---WDT
while (getc()!=':') restart_wdt(); // Only process data blocks that starts with ':'
 
buffidx = 0; // Read into the buffer until fill is received or buffer is full
do
{
buffer[buffidx] = getc();
} while ( (buffer[buffidx++] < 'g') && (buffidx < BUFFER_LEN_LOD) );
assert(buffidx == BUFFER_LEN_LOD,1); // Error 1 - Buffer Overrun
 
//---WDT
restart_wdt();
 
checksum = 0; // Sum the bytes to find the check sum value
for (i=0; i<(buffidx-3); i+=2)
checksum += atoi_b16 (&buffer[i]);
checksum = 0xFF - checksum + 1;
assert(checksum != atoi_b16 (&buffer[buffidx-3]),2); // Error 2 - Bad CheckSum
 
// count = atoi_b16 (&buffer[0]); // Get the number of bytes from the buffer
 
// Get the lower 16 bits of address
l_addr = make16(atoi_b16(&buffer[2]),atoi_b16(&buffer[4]));
 
line_type = atoi_b16 (&buffer[6]);
 
addr = make32(h_addr,l_addr);
 
addr /= 2; // PIC16 uses word addresses
 
// If the line type is 1, then data is done being sent
if (line_type == 1)
{
putchar('#');
reset_cpu();
}
 
assert (line_type == 4,4); // Error 4 - Line type 4
 
{
 
if (line_type == 0)
{
// Read old program memory content
for (i=0,next_addr=addr;i<8;i++)
data.i16[i]=read_program_eeprom(next_addr++);
// Loops through all of the data and stores it in data
// The last 2 bytes are the check sum, hence buffidx-3
for (i=8,dataidx=0; i < buffidx-3; i += 2)
data.i8[dataidx++]=atoi_b16(&buffer[i]);
 
if (addr == 0)
{
 
// Write 8 words to the Loader location
addr=LOADER_RESERVED;
for (i=0;i<8;i++)
write_program_eeprom(addr++, data.i16[i]);
putchar('%');
}
else
if (addr > 7 && addr < LOADER_RESERVED)
{
// Write 8 words
for (i=0;i<8;i++)
write_program_eeprom(addr++, data.i16[i]);
putchar('*');
}
else putchar('.');
//---WDT
restart_wdt();
CREN=0; CREN=1; // Reinitialise USART
}
}
}
}
 
#ORG default
 
#ORG getenv("PROGRAM_MEMORY")-BLOADER_MAIN_LENGTH+1,getenv("PROGRAM_MEMORY")-1 auto=0
void main()
{
int8 timeout;
 
disable_interrupts(GLOBAL);
setup_wdt(WDT_2304MS); // Setup Watch Dog
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(OSC_8MHZ|OSC_INTRC);
 
for(timeout=0; timeout<255; timeout++) //cca 50s
{
if (kbhit())
if (getc()=='u') // "uf" as Update Firmware
{
if (getc()=='f')
{
restart_wdt();
boot_loader(); // Update Firmware starter
}
}
else break;
putchar('u'); putchar('f'); putchar('?');
pause();
CREN=0; CREN=1; // Reinitialise USART
restart_wdt();
};
 
CREN=0; CREN=1; // Reinitialise USART
restart_wdt();
goto_address(LOADER_RESERVED); // Jump to the location where is the jump to the main
}
 
/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/bootloader/bloader.hex
0,0 → 1,186
:0C0000000F308A00762F00002028080036
:10004000FF00030E8301A1007F08A0000A08A7009B
:100050008A01A00E0408A2007708A3007808A40073
:100060007908A5007A08A600831383128C308400D7
:10007000801E3C288C1A4D28220884002308F70093
:100080002408F8002508F9002608FA0027088A0045
:10009000210E8300FF0E7F0E09008A114F288C1E4F
:1000A0004F281A080C1E522899008C128A113C28DD
:1000B0000D050D0523104226EF30E4327210A539EC
:1000C0002014C314201930183710CB204B260D05EF
:1000D00000002310D232F332723B65323A102526EB
:1000E000F5060A002310C2376F3A2026EF30E432BB
:1000F0007210D432733A201F3E1F0D0523100000EA
:100100006308E5006208E4006508FA0064088400FA
:1001100083137A188317800803199228E40A0319B5
:10012000E50A842862086402F7006508FA0063089B
:10013000031C630FFA027708F80008008316031700
:100140008C170C14000000000318CE2883120C0832
:100150007F390313E30003170D080313E4000317AB
:100160000F080313E50063080C1EB4289900640807
:1001700003178D000313650803178F0083168C1770
:100180000C140000000083120313E20BC828CB28D4
:1001900083160317CE28EE288316031783120C0D3F
:1001A0000E0D7F390313E30003170D080313E4005A
:1001B00003170F080313E50063080C1EDD289900E0
:1001C000640803178D000313650803178F008D0A59
:1001D00003198F0A03100313E20B9E2808008008FE
:1001E00003190529E3010408E2006310831B63146B
:1001F00000080C1EF9289900620884008313631814
:100200008317840A0319850AEF2808003008F801CB
:100210002F0203180E292F08F7001A29F7010830BA
:10022000B100AF0DF70D300877020318F700F80D95
:10023000B10B11290800AB012430AC004930AD00EE
:100240006430AE003A30AF002030B0006230B10010
:100250006C30B2006F30B3006130B4006430B50070
:100260006530B6007230B7002E30B8006330B90088
:100270002030BA003130BB003830BC00BD00313016
:10028000BE002030BF003230C0003030C1003130FD
:10029000C200C3002D30C4003030C5003230C6006B
:1002A0002D30C7003230C8003430C9002030CA00B9
:1002B0003130CB003730CC003A30CD003230CE0078
:1002C0003730CF003A30D0003330D1003730D20051
:1002D0005A30D3002030D4006B30D5006130D600C6
:1002E0006B30D7006C30D8002030D9002430DA00D1
:1002F000DB013130DE002E30DF003230E000E10182
:10030000E3012C30E2008020013078022C3E840092
:1003100083130008243C031D9729E3012C30E200DD
:100320008020013078022C3E8400831380015830F5
:1003300003178D0000308F0003100E300313E2000E
:100340009E205E3084008313EF20603003178D0001
:1003500000308F00031010300313E2009E20233082
:100360000C1EB0299900303084008313EF200D302B
:100370000C1EB82999000A300C1EBC29990069305E
:1003800003178D0000308F0003100C300313E200C0
:100390009E20103084000330AD00AC01B40104088D
:1003A000B3003410831B34142D0EF038AF00AF07A8
:1003B000E23EB000323EB2002D080F39B007B00760
:1003C000B207E93EB100B107B1072C0E0F39B107F2
:1003D000B207B10DB20DB209B20D2C080F39B20738
:1003E000AF0D0730AE000A30B207B103031CF42989
:1003F000B107B003031CF829B007AF03031CFC29A5
:10040000AF07AE03031C002A2E308400831307308D
:1004100033053313840732300402031933170008FD
:10042000F700031D1B2A331B1B2A331A232AB31977
:100430001B2A20301E2AB31533123030F7077708F5
:100440000C1E202A9900840A331F0B2A0D300C1E23
:10045000272A99000A300C1E2B2A990072300317A4
:100460008D0000308F0083168C170C1400000000E4
:1004700083120C087F390319762A0313AC00031783
:100480000D080313AD0003170F080313AE002C086B
:100490000C1E482A99002D0803178D0003132E08FF
:1004A00003178F0083168C170C14000000008312B2
:1004B0000C0D0E0D7F390319762A0313AC000317B8
:1004C0000D080313AD0003170F080313AE002C082B
:1004D0000C1E682A99002D0803178D0003132E089F
:1004E00003178F008D0A03198F0A332A831603130B
:1004F0008C16C03083128B042B08AB0AAC002C087E
:10050000AD001B30AE002D08AF006430B0000621F6
:100510007708AD0078083030031D952AAE1C9D2A5F
:10052000AE199D2A2E1A2030982AAE112E122E14A2
:10053000F80778080C1E9A2A99002D08AF000A3097
:10054000B00006217708AD0078083030031DAE2AD0
:10055000AE19B32A2E1CB32A2E1A2030F8077808B9
:100560000C1EB02A99003030AD072D080C1EB62A9B
:1005700099007C300C1EBA2A99006430AC002C30F3
:100580008400831300080319D22A0230F800F7010F
:10059000F70BC82AF80BC72A9730F700F70BCE2ABB
:0A05A000800BC52A7C2A8A15022D63
:081A00008A111B298A15080058
:101A40008316B1080319342D453083120C1E262D40
:101A50009900313083163207B30083120C1E2E2DED
:101A600099008A0100288316831208008316B601A4
:101A7000B7013708013C031C6A2D3508FA00340809
:101A8000840083137A1883170008403C0318572DED
:101A9000360EB800F030B8053408840083133518CA
:101AA000831700083807BF3E0A3EB600642D360E85
:101AB000B800F030B8053408840083133518831754
:101AC00000083807D03EB6003708B70AB40A031931
:101AD000B50A392D3608F800831208000B08840077
:101AE0008B13FC3003178D0583168C170C150430EF
:101AF000F70083120D087A020319842D83160C1443
:101B000000000000892D831278088C0079088E006F
:101B1000831655308D00AA308D008C140000000013
:101B20000000000083128D0AF70B7A2D83168C18A3
:101B3000972D0C110408831203138B040800E00195
:101B4000DF0140300C1EA22D9900E2012030E1009F
:101B500062080D3C031CE02D031DB22D6108003C02
:101B6000031CE02D610803178D000313620803179F
:101B70008F0083168C170C160C15831203130B0899
:101B8000F8008B138316031755308D00AA308D0093
:101B90008C14000000008C18CB2D0C1178088312D7
:101BA00003138B04831603170C122E3083120313B6
:101BB0000C1ED82D99002030E1070318E20AA82D49
:101BC00021300C1EE12D99008C1AE82D6400E42DC3
:101BD0008C1EE82D1A083A3C0319F02D6400E82DFC
:101BE000AC012D302C07840083138C1EF52D1A08B0
:101BF00080002C08AC0A2D3E840083130008663C4C
:101C0000031C062E2C082D3C0318F12D2C082E3C0D
:101C100003190C2E00300D2E0130E9008316B1009F
:101C20000130B200831220256400DB01E80103309B
:101C30002C0268020318302E2D306807E900EA01F3
:101C40000318EA0A6A088316B50083126908831626
:101C5000B400831236257808DB070230E807172E18
:101C60005B08FF3C013EDB0003302C022D3EE90007
:101C7000EA010318EA0A6A088316B50083126908A4
:101C80008316B4008312362578085B02031D4A2EA2
:101C900000304B2E0130E9008316B1000230B20053
:101CA000831220258316B5012F30B4008312362508
:101CB0007808E9008316B5013130B4008312362567
:101CC0006908DE007808DD008316B5013330B40002
:101CD000831236257808DC005D08E1005E08E2002A
:101CE0000310E20CE10C5C0B7B2E23300C1E762ED5
:101CF00099008A0100285C08043C0319812E0030F9
:101D0000822E0130E9008316B1000430B200831244
:101D10002025DC08031D662FE801E601E5016208C5
:101D2000E4006108E3006808073C031CC32E0310AD
:101D3000680DA03E840083136608FA006508F90068
:101D40006408F8006308F7000130E3070318E40AA9
:101D50000319E50A0319E60A7A08EE007708031763
:101D60008D000313780803178F0083168C170C144B
:101D70000000000083120C088000840A0E08800016
:101D80000313E80A932E0830E800E70103302C0221
:101D900068020318EF2E6708E70AA03EF800FA0170
:101DA0000318FA0A7808E9007A08EA002D30680773
:101DB000EB00EC010318EC0A6C088316B5008312E3
:101DC0006B088316B40083123625690884008313D8
:101DD0006A188317780880000230E807C62EE108E9
:101DE000031D262FE208031D262F0D30E200E1011E
:101DF000E8016808073C031C212F6208FA0061080B
:101E0000E10A0319E20AE9007A08EA000310680D02
:101E1000A03E84008313840A0008EC0084030008B9
:101E2000EB00690803178D00FA0003136A08031713
:101E30008F0003136B08F8006C08F9006E25E80AA0
:101E4000F92E25300C1E222F9900632FE208031D66
:101E50002D2F6108073C03185F2F62080C3C031C00
:101E60005F2FE8016808073C031C5A2F6208FA003C
:101E70006108E10A0319E20AE9007A08EA0003109E
:101E8000680DA03E84008313840A0008EC008403DC
:101E90000008EB00690803178D00FA0003136A08B5
:101EA00003178F0003136B08F8006C08F9006E2508
:101EB000E80A322F2A300C1E5B2F9900632F2E3038
:101EC0000C1E602F9900640018121816E82D0800E7
:101ED000AD01AC012C0F6F2F2D0F6F2F732FAC0A9C
:081EE0000319AD0A6A2F080086
:041EEC0084018313D7
:101EF0001F308305723083168F000F08333099002E
:101F0000A230980090308312980083161F129F12FF
:101F10001B0880399B0007309C008312A801A9018F
:101F20000B138B138B1B912F0930031785000F3078
:101F3000F700031381018130840083130008F03916
:101F40000738800064000008F739F719F039770482
:101F5000800083161F129F121B0880399B0083127A
:101F60001F1083160108C7390838810083129001B9
:101F70000030F800920000308316920007309C0079
:101F8000050885000630F700F70BC42F00001C0879
:101F900083120D1383169D0172308F000F08831278
:101FA000AB012B0FD42FF82F8C1EE62F8C1ED62FB3
:101FB0001A08753C031DE52F8C1EDC2F1A08663CA1
:101FC000031DE42F64009F25E62FF82F75300C1EAB
:101FD000E72F990066300C1EEB2F99003F300C1E46
:101FE000EF2F99006827181218166400AB0AD12F3A
:0E1FF0001812181664000D308A00820163007A
:04400E00142FFC3F30
:00000001FF
;PIC16F88
;CRC=7593 CREATED="24-II-13 21:22"