| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| joe2008 
 
 
 Joined: 19 Aug 2008
 Posts: 6
 
 
 
			    
 
 | 
			
				| problem of main application jump with bootload function |  
				|  Posted: Sun Nov 23, 2008 10:05 pm |   |  
				| 
 |  
				| Devcie:16F886 MPLAB:V8.10
 CCS C complier: V4.049
 Bootload area:0x0000-0x2FF.
 configure:#fuses  HS,NOPUT,BROWNOUT,NOLVP,NOCPD,NOPROTECT,NOWDT
 
 My project includes two C source files.
 
 One is bootload.C
 
 
  	  | Code: |  	  | #define CONST_USER_CODE_START_INTR_ADDR 0x300     //user code area start - interrupt vector #define CONST_USER_CODE_JUMP_ADDR       0x1200      //user code jump vector - allow max intr context save code
 #build ( reset = CONST_USER_CODE_JUMP_ADDR, interrupt = CONST_USER_CODE_START_INTR_ADDR )
 //#org CONST_RESET_VECTOR_START_ADDR,CONST_BTLDR_MAIN_END_ADDR {}
 //================================================================== (Bootloader Embedded - ROM Implementation)
 #rom   0x0000   =   {   0x3000,   0x008A,   0x2821,   0x0000,   0x00FF,   0x0E03,   0x0183,   0x00A1   }
 #rom   0x0008   =   {   0x080A,   0x00A0,   0x018A,   0x3003,   0x008A,   0x2B00,   0x0009,   0x3FFF   }
 #rom   0x0010   =   {   0x0041,   0x0041,   0x0032,   0x0035,   0x0034,   0x0032,   0x0030,   0x004C   }
 ........
 #rom   0x02F8   =   {   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF   }
 
 //==============================================================================
 #endif
 | 
 
 Another is main.C, including bootload.C and other header file.
 
  	  | Code: |  	  | void main()
 {
 sys_init();                  // Configure I/O ports, peripherals, interrupts, timers & buffers.
 
 epow_on = 1;
 inrush_en = 1;
 
 while(1)
 {
 main application();
 }
 }
 | 
 
 
 The problem is:
 If application is not so large, the main application vector jump is correct.
 Pls refer to below disassembly listing.
 
 1200    3000     MOVLW 0
 1201    008A     MOVWF 0xa
 1202    2EB7     GOTO 0x6b7
 1203    0000     NOP
 
 108:               void main()
 109:               	{
 06B7    0184     CLRF 0x4
 06B8    1383     BCF 0x3, 0x7
 06B9    301F     MOVLW 0x1f
 06BA    0583     ANDWF 0x3, F
 06BB    1683     BSF 0x3, 0x5
 ...
 }
 
 But if the application code is more larger, the main application vector
 jump will be not correct. Pls refer to below disassembly listing.
 
 1200    3000     MOVLW 0
 1201    008A     MOVWF 0xa
 1202    2800     GOTO 0
 1203    0000     NOP
 
 108:               void main()
 109:               	{
 0800    0184     CLRF 0x4
 0801    1383     BCF 0x3, 0x7
 0802    301F     MOVLW 0x1f
 0803    0583     ANDWF 0x3, F
 0804    1683     BSF 0x3, 0x5
 0805    1703     BSF 0x3, 0x6
 ...
 }
 Build result: Memory usage:   ROM=26%      RAM=38% - 42%
 0 Errors,  12 Warnings.
 
 
 
 I have bootloaded PIC18F4520 successfully with same method before, the application is more complex than this, and main application can jump correctly and runs no problem. Why is main application jump not correct with larger main application for PIC16886 ?
 |  |  
		|  |  
		| Ttelmah Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Mon Nov 24, 2008 4:33 am |   |  
				| 
 |  
				| It is very difficult to understand what you are doing from your description. You don't normally include the bootloader, in your application, which is what you seem to be showing. However the obvious 'guess', is that on your larger version, the interrupt handler code, which you are writing at address 300, has got larger than 3840 bytes, meaning it no longer fits in the area you are allocating for it.
 Normally, I'd suggest providing the 'default' layout for the interrupt handler, by placing its's code eight addresses above the main start location. This then allows the compiler to decide how much space it needs, and vector the initialisation jump to this.
 
 Best Wishes
 |  |  
		|  |  
		| joe2008 
 
 
 Joined: 19 Aug 2008
 Posts: 6
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Nov 24, 2008 9:11 am |   |  
				| 
 |  
				| Ttelmah, 
 Firstly thanks your reply.
 
 The part from #rom 0x0000 to 0x02FF are my bootloader. I has built my bootloader into hex file and don't list them out completely.
 My interrupt handler is very simple, and don't occupy so much program memory.
 I have noticed that if the size of my application is larger than 0x0800, it will jump error. If the size of my application code is not larger than 0x0800, it will jump correctly. I have checked the spec of PIC16F886,and find that one page of program memory is 0x0800. But I don't find what's relationship between them.
 Anyway I'll try according to what you said.
 |  |  
		|  |  
		| Ttelmah Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Mon Nov 24, 2008 10:08 am |   |  
				| 
 |  
				| What I don't understand, is why the bootloader is present at all. The main application code, should not have any reference to the bootloader at all, except in it's relocated start address. You are showing the code, as if you are including the bootloader file in the final application. 
 Now, the obvious question, is what do you mean by your 'application'. Are you actually refering to the 'main'. If so, you may well need to be using more routines, to split this up. Basically, on the 16 chips, you are dealing with paged memory, and the compiler needs to be dealing with multiple small sections of code, which it can re-order to make things fit. Normally it'll complain if it can't fit things (giving an 'out of ROM' error, despite there being plenty of actual space still available). A search here wll find lots of threads about how to split up your code to avoid this. What I think is happening, is that you slightly 'odd' jump vector layout, is preventing the compiler from giving this error message, despite actually hitting this problem. On the 16 chips the normal location for the interrupt vector would be 4 locations above the boot entry point - 8 for 18 chips.
 
 Best Wishes
 |  |  
		|  |  
		| joe2008 
 
 
 Joined: 19 Aug 2008
 Posts: 6
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Nov 24, 2008 9:05 pm |   |  
				| 
 |  
				| Sorry, I think I need give more details about the problem and program. 
 Now I updated I2C_Bootloader_PIC16F886_Library_2.01.c as below:
 
 
  	  | Code: |  	  | #define CONST_USER_CODE_START_INTR_ADDR 0x304     //user code area start - interrupt vector #define CONST_USER_CODE_JUMP_ADDR       0x300     //user code jump vector - allow max intr context save code
 #build ( reset = CONST_USER_CODE_JUMP_ADDR, interrupt = CONST_USER_CODE_START_INTR_ADDR )
 //================================================================== (Bootloader Embedded - ROM Implementation)
 #rom   0x0000   =   {   0x3000,   0x008A,   0x2821,   0x0000,   0x00FF,   0x0E03,   0x0183,   0x00A1   }
 #rom   0x0008   =   {   0x080A,   0x00A0,   0x018A,   0x3003,   0x008A,   0x2B00,   0x0009,   0x3FFF   }
 #rom   0x0010   =   {   0x0041,   0x0041,   0x0032,   0x0035,   0x0034,   0x0032,   0x0030,   0x004C   }
 #rom   0x0018   =   {   0x0000,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF   }
 #rom   0x0020   =   {   0x3FFF,   0x0184,   0x1383,   0x301F,   0x0583,   0x1683,   0x1703,   0x1587   }
 #rom   0x0028   =   {   0x3008,   0x1303,   0x0099,   0x3002,   0x009A,   0x30A6,   0x0098,   0x3090   }
 #rom   0x0030   =   {   0x1283,   0x0098,   0x1683,   0x1703,   0x0809,   0x39C0,   0x0089,   0x1303   }
 ....
 #rom   0x02F8   =   {   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF,   0x3FFF   }
 | 
 
 
 Main.C as below:
 
  	  | Code: |  	  | #include "I2C_Bootloader_PIC16F886_Library_2.01.c"
 #include <16F886REG.h>
 #include <Software_UART.h>
 #include <MASTER_ADM_I2C_MODULE.h>
 #include <MATH.h>
 // =======================================================================
 // =======================================================================
 void main()
 {
 sys_init();                  // Configure I/O ports, peripherals, interrupts, timers & buffers.
 
 epow_on = 1;
 inrush_en = 1;
 
 while(1)
 {
 restart_wdt();                // Restart watchdog timer.
 acquire_adc();   // ADC procedures.
 
 detect_epow();      // Early Power Off
 inrush_control();
 PWM_CONTROL();
 
 temp_monitor();   // Monitor PFC Temp
 
 refresh_bulkok();  // PFC Bulk Control
 fnUART_EVENTS();
 }
 }
 | 
 
 The procedure of my program will be:
 First run into initial start address(0x0000), and jump to 0x300 if don't meet bootload mode. Then jump to start address of "main" of main.C and run application code.
 
 Now I build the project file and don't show any errors:
 
  	  | Code: |  	  | Memory usage:   ROM=26%      RAM=38% - 42% 0 Errors,  12 Warnings.
 BUILD SUCCEEDED: Tue Nov 25 10:38:10 2008
 | 
 
 Then I pursue the procedure by watching disassembly listing.
 
  	  | Code: |  	  | [color=red]0300[/color]  3008     MOVLW 0x8 0301    008A     MOVWF 0xa
 0302    2800     [color=red]GOTO 0[/color]
 0303    0000     NOP
 0304    00FF     MOVWF 0x7f
 0305    0E03     SWAPF 0x3, W
 0306    0183     CLRF 0x3
 0307    00A1     MOVWF 0x21
 | 
 ....
 032B    0E21     SWAPF 0x21, W
 032C    0083     MOVWF 0x3
 032D    0EFF     SWAPF 0x7f, F
 032E    0E7F     SWAPF 0x7f, W
 032F    0009     RETFIE
 0330    118A     BCF 0xa, 0x3
 0331    120A     BCF 0xa, 0x4
 0332    2B33     GOTO 0x333[/code]
 
 
  	  | Code: |  	  | 107:               void main() 108:                  {
 [color=red]0800 [/color]   0184     CLRF 0x4
 0801    1383     BCF 0x3, 0x7
 0802    301F     MOVLW 0x1f
 0803    0583     ANDWF 0x3, F
 0804    1683     BSF 0x3, 0x5
 ....
 }
 | 
 
 
 
  	  | Code: |  	  | 823:               #INT_EXT 824:               void service_RB0(void)
 825:               {
 826:                      INTCON_INTF=0; //must cleared in software
 0333    108B     BCF 0xb, 0x1
 827:                       PWM_wait_cntr++; //For PWM control delay
 0334    0ABE     INCF 0x3e, F
 828:                       // get sum of AC input voltage, put into i8_acv7
 829:                     i8_acv7    = i8_acv2;   // Save the ave value, for the last 10ms
 0335    0838     MOVF 0x38, W
 0336    00BC     MOVWF 0x3c
 0337    0837     MOVF 0x37, W
 | 
 
 My problem is it seems don't jump to 0x800 which "main" start when jump out bootload mode, while not any build error.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |