|
|
View previous topic :: View next topic |
Author |
Message |
ednspace
Joined: 08 Aug 2007 Posts: 10
|
DSPIC33FJ PCD Bootloader help and direction |
Posted: Fri Dec 01, 2017 6:51 pm |
|
|
I have spent enough time fighting with this and realize that I really need some help.
First I am using PCWHD IDE and PCD Version 5.075
Target is a DSPIC dsPIC33FJ128GP306A
Here is the goal.
I would like a standalone bootloader that I can program into the chip. I want it to live in the Boot Segment Access Area of the chip. According to the data sheet I have set the fuses like this in the example bootloader.c.
Eventually I would like to write protect this bootloader but for now I'll be happy if I can get everything in the right place. I am not using the push button and have basically commented out the loader section. For now I am just trying to see an RS32 response from the bootloader and then the main program.
Code: |
//The setup for 6 different chips, one from each of these chip families,
//is listed below.
#define DSPIC33FJ
//#define DSPIC30F
//#define PIC24FJ
//#define PIC24FJ_REV2
//#define PIC24HJ
//#define PIC24EP
#if defined(DSPIC33FJ)
#include <33FJ128GP306A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES BSSSL //Boot Segment Code Protect Standard Security, Large Boot Segment
#FUSES RBS1024 //Boot RAM is 1024 bytes
#use delay(clock=22110000, internal) // works with baud
#use rs232(UART2, baud=115200, errors, stream=COM_PORT) // works at internal=40MHZ and xtal=22118400 and internal=2211000 w/o BRGH1OK)
#define PUSH_BUTTON PIN_B2
#elif defined(DSPIC30F)
#include <30F4012.h>
#fuses NOWDT
#use delay(crystal=20M)
#use rs232(BAUD=9600,UART1A,errors)
#define PUSH_BUTTON PIN_B1
#elif defined(PIC24FJ)
#include <24FJ128GA006.h>
#fuses NOWDT
#use delay(crystal=20MHz)
#use rs232(BAUD=9600,UART1,errors)
#define PUSH_BUTTON PIN_F6
#elif defined(PIC24FJ_REV2)
#include <24FJ256GA106.h>
#fuses NOWDT
#use delay(crystal=20MHz)
#pin_select U1TX = PIN_F3
#pin_select U1RX = PIN_F2
#use rs232(BAUD=9600,UART1,errors)
#define PUSH_BUTTON PIN_F6
#elif defined(PIC24HJ)
#include <24HJ128GP306.h>
#fuses NOWDT
#use delay(crystal=20MHz)
#use rs232(Baud=9600,UART1,errors)
#define PUSH_BUTTON PIN_F6
#elif defined(PIC24EP)
#include <24ep256gp206.h>
#fuses NOWDT
#use delay(crystal=20MHz)
#pin_select U1TX = PIN_A4
#pin_select U1RX = PIN_A9
#use rs232(Baud=9600,UART1,errors)
#define PUSH_BUTTON PIN_C3
#endif
#define _bootloader
//#define BOOTLOADER_MODE2X
#include <pcd_bootloader.h>
#include <loader_pcd.c>
#org APPLICATION_START
void application(void)
{
while(TRUE);
}
void main(void)
{
printf("\r\nBootLoader Version 1.0\r\n");
//! if(!input(PUSH_BUTTON))
//! {
//! delay_ms(140); // wait for PLL
//!
//! printf("\r\nBootloader Version 1.0\r\n");
//!
//! // Let the user know it is ready to accept a download
//! printf("\r\nWaiting for download...");
//!
//! // Load the program
//! load_program();
//! }
//!
application();
}
#int_default
void isr(void)
{
jump_to_isr(LOADER_END+5);
} |
I also include the standard the pcd_bootloader.h and flash it to the chip and it works. I can see output from the Serial Port etc... I really can't try to actually bootload until I replace the loader_pcd.c on the hardware I am using the RS232 is not standard protocol, using FTDI D2xx library but still I have working code for that later, for now on with the show.
So now I make a new build file for the payload application as a test.
Code: |
#define DSPIC33FJ
#if defined(DSPIC33FJ)
#include <33FJ128GP306A.h>
#Fuses NONE
#use delay(clock=22110000, internal) // works with baud
#use rs232(UART2, baud=115200, errors, stream=COM_PORT) // works at internal=40MHZ and xtal=22118400 and internal=2211000 w/o BRGH1OK)
#define PUSH_BUTTON PIN_B2
#endif
//#define BOOTLOADER_MODE2X
//This is a necessary include file. It reserves space so that the
//bootloader is not overwritten.
//#include <pcd_bootloader.h>
// START OF bootloader definition
// According to data sheet Boot Segment ends at 0x003FFF with the Fuse settings I selected
#define LOADER_END 0x003FFF
#build(reset=LOADER_END+2, interrupt=LOADER_END+6)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
// END OF bootloader definition
// Variable definitions, interrupt service routines, main, etc. below here
rom char version[] = "Application Version 1.0";
void main()
{
delay_ms(100);
printf("\r\n%s\r\n", version);
printf("You can put whatever code you want here.\r\n");
printf("So enjoy!\r\n");
while(TRUE)
{
}
}
|
Notice I have commented out the pcd_bootloader.h and just added my own build and org lines. Hopefully this is OK.
So, problems / questions. I can not seem to test this. My plan was to use the programmer erase and flash the bootloader and then flash the application on top of that, sort of merge them together as they would be if properly bootloaded. However the programmer PICKIT3 and MPLABX IPE don't seem to want to let that fly. Bootloader is fine but if I don't erase the part entirely the application fails to program. Ideally I can develop the main application somehow without having to actually bootload each time.
The other part of this is I do not understand the pcd_bootlader.h at all. Seems like I really could just build the bootloader normally since it lives right after the Reset/Interrupt Vector Space and then use the build and org commands for my main app.
Also do I need to define fuses in both the bootloader and the main app?
Also do I really need to be moving the interrupt vectors around if I am not using them for the bootload process?
Also would the bootload option for #Build be advisable in this situation?
To Summarize:
Ideally Bootloader lives in protected space from Reset Vector to 0x003FF.
Bootloader loads every time, looks for PC communication if does not get it, then times out and passes it over to main app.
Main App never knows bootloader exists.
It would be nice if there was some way to work on main app without having to bootload every time, not sure how to accomplish this.
Any help would be greatly appreciated,
its taking me a long while to get to this point and while I feel like I am close, I still feel very far away from the goal...
thanks
Eric
Last edited by ednspace on Wed Dec 13, 2017 10:11 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Dec 01, 2017 7:11 pm |
|
|
Quote: |
My plan was to use the programmer erase and flash the bootloader and
then flash the application on top of that, sort of merge them together as
they would be if properly bootloaded.
|
See Ttelmah's answer in this thread, about how to create a combined
Hex file of the bootloader and the application:
http://www.ccsinfo.com/forum/viewtopic.php?t=55676 |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 01, 2017 7:27 pm |
|
|
Thanks PCM programmer for that!!!
I will give it a go and see if I can get it working.
Any comments on the other parts of this mystery are more than welcome... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19544
|
|
Posted: Sat Dec 02, 2017 1:05 pm |
|
|
The normal way to not have the bootloader wait, is to use a jumper. That is why it is there.
However you can do the same thing with the RS232.
Depending on the hardware used, if you design it so that you see 'break' (RS232 input low to the PIC), when the cable is disconnected, all the bootloader needs to do is check if the line is high. If it isn't jump straight to the main code. |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Thu Dec 14, 2017 3:21 pm |
|
|
Thanks to Ttelmah and PCM programmer for responding to my previous post.
I almost have everything working at this point.
I am programming the bootloader with the programmer as and bootloading the main app for now just to keep confusion down for now and to keep testing and working with my PC application.
The decision to go into bootloader mode is being made by an RS232 timeout. If the bootloader does not receive its bootloader character soon after a reboot then it jumps to the main app. This all works great. I have an FTDI running in D2XX library mode and one of its pins can turn the power supply on and off to the DSPIC so... I can reboot the DSPIC with my PC side bootloader application send the character and bing, into bootloader mode. My PC app also can send the main app very quickly now and its almost a treat to use over the programmer.
Only two more questions remain. How can I tell where the Interrupt vectors are being moved and if they are in the right place? Can I see this in the list file somehow or can I decode it from the HEX file? All my interrupts are working fine, I just want to know how to ease any doubt and convince myself that all is well. I think the line that moves the vectors is, jump_to_isr(LOADER_END+5); Is this correct for my part, 33FJ128GP306A?
I would also like to turn on the code config protection bits that make it so the bootloader can not be written over. I am setting fuses in the bootloader code and using #FUSES NONE in the main application.
The fuses would be something like this
#FUSES BSSSL //Boot Segment Code Protect Standard Security, Large Boot Segment
#FUSES RBS128 //Boot RAM is 128 bytes
My question is how can I tell how big this bootloader block is? I know its done by pages but I can not quite decipher it. Not sure how to correlate this with the datasheet but some help would be appreciated. I can decode the HEX file at this point but the overall addressing of the DSPIC is still a little daunting. I have to choose small, medium or large and I think they break on pages??? I also don't want to screw up the addressing already being done by the bootloader.h file or change it if I don't have to. I am using stock pcd example bootloader.h and its all working well, if the vectors are right that is...
The bootloader reports these variable settings when I print them out as a test.
LOADER_END = 07FF
APPLICATION_START = 0800
APPLICATION_END = 15BFF
Thanks for any more help,
Eric
PS I have convinced myself that there is no need to erase the entire program memory space before bootloading each time. If I bootload a large app and then bootload a small one remnants of the first older one remain in memory. I assume this will not cause a problem and so far has not but it worries me a little. Is this a safe approach ;)
Here is the bootloader as it stands now...
Code: | #include <33FJ128GP306A.h>
//Define Fuses Here Not in Main Application Program
#FUSES NOWDT //No Watch Dog Timer
//#FUSES BSSSL //Boot Segment Code Protect Standard Security, Large Boot Segment
//#FUSES RBS1024 //Boot RAM is 1024 bytes
#use delay(clock=22110000, internal) // works with baud
#use rs232(UART2, baud=115200, stream=COM_PORT, ERRORS) // works at internal=40MHZ and xtal=22118400 and internal=2211000 w/o BRGH1OK)
//Tells the compiler this is the bootloader
#define _bootloader
#include <pcd_bootloader.h>
#include <loader_pcd.c> //Custom Loader Routine for this DSPIC and D2XX
#org APPLICATION_START
void application(void)
{
while(TRUE);
}
int inchar = 0;
void main(void)
{
//Signal that we are in the bootloader
fprintf(COM_PORT, "B\r\n");
//Now wait a short time for command
int16 delay_ctr;
for (delay_ctr=0;delay_ctr<5000;delay_ctr++)
{
if (kbhit(COM_PORT))
{
//Now there _is_ a character so you can call getc
inchar = fgetc(COM_PORT);
}
else
delay_us(10);
}
//Check the character if you got one
if(inchar == 'U')
{
// Enter upload program mode
// Load the program
load_program();
//spin here forevers
while (1){}
}
else
{
//Run the application...
application();
}
}
#int_default
void isr(void)
{
jump_to_isr(LOADER_END+5);
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19544
|
|
Posted: Fri Dec 15, 2017 1:48 am |
|
|
Select 'symbolic' in the build options, and compile the bootloader.
Then just look at the start of the assembler listing.
You'll find the table of vectors and where they all point.
You'll find that all the vectors, have been 're-targetted'. Assuming the #build is at 'LOADER_END+1', four locations above the start of the build range.
The 'jump to ISR' function is much overloaded. The original version did 'what it said', and was a simple long jump. Then with the PIC 18's, it was modified and generated two jumps. putting one at the location for high priority interrupts, and the second at the location for standard interrupts. On the PIC24/30/33, it instead loads the entire interrupt vector table, with the specified offset. |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 15, 2017 7:49 am |
|
|
I am sorry.
I should have included the #BUILD line for the included header file.
Code: | #build (reset=APPLICATION_START,interrupt=APPLICATION_ISR_START) |
Code: | #define APPLICATION_START 0 |
Code: | #define APPLICATION_ISR_START (LOADER_END + 5) |
I have not changed anything in the include file that came with the PCD example.
I am going to to see if I can select 'symbolic' in the compiler options. I am using the IDE. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19544
|
|
Posted: Fri Dec 15, 2017 8:31 am |
|
|
Options
Project
Output Files
List file
Tick SFR Names, Symbols, Interpret
You'll find the listing file is quite nicely documented once you re-compile. |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 15, 2017 8:42 am |
|
|
Alright just saw the suggestion above...
I guess you posted while I was typing ;)
let me try what you suggest for compiler options...
(Removed this text to avoid confusion for future reader)
Last edited by ednspace on Fri Dec 15, 2017 9:27 am; edited 2 times in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19544
|
|
Posted: Fri Dec 15, 2017 8:52 am |
|
|
With the naming/interpret options ticked, you get:
Code: |
00006: DATA 08,08,00 : Trap OSCFAIL at 000808
00008: DATA 0C,08,00 : Trap ADDRERR at 00080C
0000A: DATA 10,08,00 : Trap STACKERR at 000810
0000C: DATA 14,08,00 : Trap MATHERR at 000814
0000E: DATA 18,08,00 : Trap DMAERR at 000818
00010: DATA 1C,08,00 : Trap CRYPT_PROGRAM_DONE at 00081C
00012: DATA 20,08,00 : Trap CRYPT_PROGRAM_DONE at 000820
00014: DATA 24,08,00 : Int0 EXT0 at 000824
00016: DATA 28,08,00 : Int1 IC1 at 000828
00018: DATA 2C,08,00 : Int2 OC1 at 00082C
0001A: DATA 30,08,00 : Int3 TIMER1 at 000830
0001C: DATA 34,08,00 : Int4 DMA0 at 000834
0001E: DATA 38,08,00 : Int5 IC2 at 000838
00020: DATA 3C,08,00 : Int6 OC2 at 00083C
00022: DATA 40,08,00 : Int7 TIMER2 at 000840
00024: DATA 44,08,00 : Int8 TIMER3 at 000844
00026: DATA 48,08,00 : Int9 SPI1E at 000848
00028: DATA 4C,08,00 : Int10 SPI1 at 00084C
0002A: DATA 50,08,00 : Int11 RDA at 000850
0002C: DATA 54,08,00 : Int12 TBE at 000854
0002E: DATA 58,08,00 : Int13 ADC1 at 000858
00030: DATA 5C,08,00 : Int14 DMA1 at 00085C
00032: DATA 60,08,00 : Int15 CRYPT_PROGRAM_DONE at 000860
00034: DATA 64,08,00 : Int16 SI2C at 000864
00036: DATA 68,08,00 : Int17 MI2C at 000868
00038: DATA 6C,08,00 : Int18 CRYPT_PROGRAM_DONE at 00086C
0003A: DATA 70,08,00 : Int19 CNI at 000870
0003C: DATA 74,08,00 : Int20 EXT1 at 000874
0003E: DATA 78,08,00 : Int21 CRYPT_PROGRAM_DONE at 000878
00040: DATA 7C,08,00 : Int22 IC7 at 00087C
00042: DATA 80,08,00 : Int23 IC8 at 000880
00044: DATA 84,08,00 : Int24 DMA2 at 000884
00046: DATA 88,08,00 : Int25 OC3 at 000888
00048: DATA 8C,08,00 : Int26 OC4 at 00088C
0004A: DATA 90,08,00 : Int27 TIMER4 at 000890
0004C: DATA 94,08,00 : Int28 TIMER5 at 000894
0004E: DATA 98,08,00 : Int29 EXT2 at 000898
00050: DATA 9C,08,00 : Int30 RDA2 at 00089C
00052: DATA A0,08,00 : Int31 TBE2 at 0008A0
00054: DATA A4,08,00 : Int32 SPI2E at 0008A4
00056: DATA A8,08,00 : Int33 SPI2 at 0008A8
00058: DATA AC,08,00 : Int34 CRYPT_PROGRAM_DONE at 0008AC
0005A: DATA B0,08,00 : Int35 CRYPT_PROGRAM_DONE at 0008B0
0005C: DATA B4,08,00 : Int36 DMA3 at 0008B4
0005E: DATA B8,08,00 : Int37 IC3 at 0008B8
00060: DATA BC,08,00 : Int38 IC4 at 0008BC
00062: DATA C0,08,00 : Int39 IC5 at 0008C0
00064: DATA C4,08,00 : Int40 IC6 at 0008C4
00066: DATA C8,08,00 : Int41 OC5 at 0008C8
00068: DATA CC,08,00 : Int42 OC6 at 0008CC
0006A: DATA D0,08,00 : Int43 OC7 at 0008D0
0006C: DATA D4,08,00 : Int44 OC8 at 0008D4
0006E: DATA D8,08,00 : Int45 CRYPT_PROGRAM_DONE at 0008D8
00070: DATA DC,08,00 : Int46 DMA4 at 0008DC
00072: DATA E0,08,00 : Int47 TIMER6 at 0008E0
00074: DATA E4,08,00 : Int48 TIMER7 at 0008E4
00076: DATA E8,08,00 : Int49 SI2C2 at 0008E8
00078: DATA EC,08,00 : Int50 MI2C2 at 0008EC
0007A: DATA F0,08,00 : Int51 TIMER8 at 0008F0
0007C: DATA F4,08,00 : Int52 TIMER9 at 0008F4
0007E: DATA F8,08,00 : Int53 EXT3 at 0008F8
00080: DATA FC,08,00 : Int54 EXT4 at 0008FC
00082: DATA 00,09,00 : Int55 CRYPT_PROGRAM_DONE at 000900
00084: DATA 04,09,00 : Int56 CRYPT_PROGRAM_DONE at 000904
00086: DATA 08,09,00 : Int57 CRYPT_PROGRAM_DONE at 000908
00088: DATA 0C,09,00 : Int58 CRYPT_PROGRAM_DONE at 00090C
0008A: DATA 10,09,00 : Int59 CRYPT_PROGRAM_DONE at 000910
0008C: DATA 14,09,00 : Int60 CRYPT_PROGRAM_DONE at 000914
0008E: DATA 18,09,00 : Int61 DMA5 at 000918
00090: DATA 1C,09,00 : Int62 CRYPT_PROGRAM_DONE at 00091C
00092: DATA 20,09,00 : Int63 CRYPT_PROGRAM_DONE at 000920
00094: DATA 24,09,00 : Int64 CRYPT_PROGRAM_DONE at 000924
00096: DATA 28,09,00 : Int65 UART1E at 000928
00098: DATA 2C,09,00 : Int66 UART2E at 00092C
0009A: DATA 30,09,00 : Int67 CRYPT_PROGRAM_DONE at 000930
0009C: DATA 34,09,00 : Int68 DMA6 at 000934
0009E: DATA 38,09,00 : Int69 DMA7 at 000938
000A0: DATA 3C,09,00 : Int70 CRYPT_PROGRAM_DONE at 00093C
000A2: DATA 40,09,00 : Int71 CRYPT_PROGRAM_DONE at 000940
000A4: DATA 44,09,00 : Int72 CRYPT_PROGRAM_DONE at 000944
000A6: DATA 48,09,00 : Int73 CRYPT_PROGRAM_DONE at 000948
000A8: DATA 4C,09,00 : Int74 CRYPT_PROGRAM_DONE at 00094C
000AA: DATA 50,09,00 : Int75 CRYPT_PROGRAM_DONE at 000950
000AC: DATA 54,09,00 : Int76 CRYPT_PROGRAM_DONE at 000954
000AE: DATA 58,09,00 : Int77 CRYPT_PROGRAM_DONE at 000958
000B0: DATA 5C,09,00 : Int78 CRYPT_PROGRAM_DONE at 00095C
000B2: DATA 60,09,00 : Int79 CRYPT_PROGRAM_DONE at 000960
000B4: DATA 64,09,00 : Int80 CRYPT_PROGRAM_DONE at 000964
000B6: DATA 68,09,00 : Int81 CRYPT_PROGRAM_DONE at 000968
000B8: DATA 6C,09,00 : Int82 CRYPT_PROGRAM_DONE at 00096C
000BA: DATA 70,09,00 : Int83 CRYPT_PROGRAM_DONE at 000970
000BC: DATA 74,09,00 : Int84 CRYPT_PROGRAM_DONE at 000974
000BE: DATA 78,09,00 : Int85 CRYPT_PROGRAM_DONE at 000978
000C0: DATA 7C,09,00 : Int86 CRYPT_PROGRAM_DONE at 00097C
000C2: DATA 80,09,00 : Int87 CRYPT_PROGRAM_DONE at 000980
000C4: DATA 84,09,00 : Int88 CRYPT_PROGRAM_DONE at 000984
000C6: DATA 88,09,00 : Int89 CRYPT_PROGRAM_DONE at 000988
000C8: DATA 8C,09,00 : Int90 CRYPT_PROGRAM_DONE at 00098C
000CA: DATA 90,09,00 : Int91 CRYPT_PROGRAM_DONE at 000990
000CC: DATA 94,09,00 : Int92 CRYPT_PROGRAM_DONE at 000994
000CE: DATA 98,09,00 : Int93 CRYPT_PROGRAM_DONE at 000998
000D0: DATA 9C,09,00 : Int94 CRYPT_PROGRAM_DONE at 00099C
000D2: DATA A0,09,00 : Int95 CRYPT_PROGRAM_DONE at 0009A0
000D4: DATA A4,09,00 : Int96 CRYPT_PROGRAM_DONE at 0009A4
000D6: DATA A8,09,00 : Int97 CRYPT_PROGRAM_DONE at 0009A8
000D8: DATA AC,09,00 : Int98 CRYPT_PROGRAM_DONE at 0009AC
000DA: DATA B0,09,00 : Int99 CRYPT_PROGRAM_DONE at 0009B0
000DC: DATA B4,09,00 : Int100 CRYPT_PROGRAM_DONE at 0009B4
000DE: DATA B8,09,00 : Int101 CRYPT_PROGRAM_DONE at 0009B8
000E0: DATA BC,09,00 : Int102 CRYPT_PROGRAM_DONE at 0009BC
000E2: DATA C0,09,00 : Int103 CRYPT_PROGRAM_DONE at 0009C0
000E4: DATA C4,09,00 : Int104 CRYPT_PROGRAM_DONE at 0009C4
000E6: DATA C8,09,00 : Int105 CRYPT_PROGRAM_DONE at 0009C8
000E8: DATA CC,09,00 : Int106 CRYPT_PROGRAM_DONE at 0009CC
000EA: DATA D0,09,00 : Int107 CRYPT_PROGRAM_DONE at 0009D0
000EC: DATA D4,09,00 : Int108 CRYPT_PROGRAM_DONE at 0009D4
000EE: DATA D8,09,00 : Int109 CRYPT_PROGRAM_DONE at 0009D8
000F0: DATA DC,09,00 : Int110 CRYPT_PROGRAM_DONE at 0009DC
000F2: DATA E0,09,00 : Int111 CRYPT_PROGRAM_DONE at 0009E0
000F4: DATA E4,09,00 : Int112 CRYPT_PROGRAM_DONE at 0009E4
000F6: DATA E8,09,00 : Int113 CRYPT_PROGRAM_DONE at 0009E8
000F8: DATA EC,09,00 : Int114 CRYPT_PROGRAM_DONE at 0009EC
000FA: DATA F0,09,00 : Int115 CRYPT_PROGRAM_DONE at 0009F0
000FC: DATA F4,09,00 : Int116 CRYPT_PROGRAM_DONE at 0009F4
000FE: DATA F8,09,00 : Int117 CRYPT_PROGRAM_DONE at 0009F8
|
Telling you what they all do. |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 15, 2017 9:24 am |
|
|
AWESOME!!!
I see it now. Thanks! Thats a cool trick.
So is this telling me where they are being moved like.
00006 is the OSCFAIL ISR and its getting moved to 000808?
My main app list file is starting at...
Code: | 00800: GOTO 1EDE :
*
00830: GOTO BDA :
*
00840: GOTO C30 :
*
0089C: GOTO C80 :
008A0: GOTO D3C : |
and the first few lines show...
Code: | 00A0A: MOV W5,[W15++] : Push W5 to TOS
00A0C: MOV #C,W5 : W5 = C
00A0E: REPEAT #3 : Repeat next instruction (3 + 1) times
00A10: MOV [W5++],[W15++] : Push [W5++] to TOS
00A12: MOV #0,W9 : W9 = 0
00A14: BTSC.B 43.0 : Skip if SR.DC = 0
00A16: MOV #1,W9 : W9 = 1
00A18: MOV W9,[W15++] : Push W9 to TOS |
again I do not see any of the Interrupt Vectors being moved in the main list file which I am sure is correct.
I still wonder how to tell if I have overlap and if main is really able to see the vector space correctly?
When I read the device with the programmer after bootloading I can see my main app starting at 000800 and I can see the GOTOs from the list file like 1EDE they are in the right spot. For the life of me I do not see the ISRs unless they are FFFFFs and just in between. Shouldn't they show up at 000808.
It seems like there is some overlap like 000830 has a goto defined but is also the remapped location for the interrupt Timer1. Or is this just the way it shows up if I am using timer 1?
Thanks so much for your help, it would be nice to really feel like I understand this. |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 15, 2017 11:27 am |
|
|
Ok I can see the interrupt vectors being mapped in now at the top of program memory when I look at the Memory View from the programmer. They are starting at 00002 and have the remapped values from the list file. Hopefully I am good on vectors but still not quite positive
I am still trying to figure out code config, but it looks like according to the data sheet and http://ww1.microchip.com/downloads/en/DeviceDoc/70199B.pdf
For standard protection small size looks like the bootloader segment is defined as:
Standard Small 0x000200 0x0007FE
This seems to mesh very well with the way my bootloader is set up. It seems to be starting at 0000200 and the main code starts 000800.
Seems like all I have to do to protect it is turn on these fuses...
Code: | #FUSES WRTB //Boot block write protected
#FUSES BSSSS //Boot Segment Code Protect Standard Security, Small Boot Segment
#FUSES NORBS //No Boot RAM defined |
We shall see...
Thanks again for all the help |
|
|
ednspace
Joined: 08 Aug 2007 Posts: 10
|
|
Posted: Fri Dec 15, 2017 12:46 pm |
|
|
Well those fuse settings appear to work!!!
I can not read the bootloader area after programming, just get zeros for that section.
Bootloading still works and after bootloading and reading with the programmer I can see the main code that I bootloaded and the boot bootloader segment is still read as zeroes.
The zero section matches my bootloader size EXACTLY!
So, I think I am home free on the code config protection front.
If anyone still feels like humoring me with more info on the Reset Vectors I am all ears.
Or if you spot anything else I may be doing wrong from the above please chime in.
Thanks again all for all your time...
Eric |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|