View previous topic :: View next topic |
Author |
Message |
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
EX_PCD_BOOTLOADER PIC24FJ128GL305 |
Posted: Fri Dec 23, 2022 2:37 am |
|
|
CCS 5.104
Hello,
I have a working bootloader code for PIC24FJ48GA002 and now i am trying to test it on a PIC24FJ128GL305 but I get "Error#126 Invalid ORG range:"
Code: |
Info#300 More info: Segment at 00000-017FE (0000 used):
Info#300 More info: Segment at 01800-0FFFE (0000 used) Priv:
Info#300 More info: Segment at 10000-15EFE (0000 used) Priv:
Info#300 More info: Attempted to create: 01800-01804 for #org:
Error#126 Invalid ORG range:
1 Errors, 1 Warnings.:
|
Please share your ideas
Code: |
#include <24FJ128GL305.h>
#FUSES NOWDT //Watch Dog Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES FRC_PLL
#FUSES NOPR //Pimary oscillator disabled
#FUSES OSCIO //OSC2 is general purpose output
#FUSES NOCKSNOFSM
#FUSES NOBROWNOUT
#BUILD (stack=1024)
#use delay(int=32M)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#use fast_io(F)
#use fast_io(G)
#pin_select U1TX = PIN_F4
#pin_select U1RX = PIN_F5
#use rs232(BAUD=115200,BRGH1OK,UART1,ERRORS)
#word LATB= getenv("SFR:LATB")
#word LATC=getenv("SFR:LATC")
#word LATD=getenv("SFR:LATD")
#word LATE=getenv("SFR:LATE")
#word LATF=getenv("SFR:LATF")
#word LATG=getenv("SFR:LATG")
#word TRISB= getenv("SFR:TRISB")
#word TRISC=getenv("SFR:TRISC")
#word TRISD=getenv("SFR:TRISD")
#word TRISE=getenv("SFR:TRISE")
#word TRISF=getenv("SFR:TRISF")
#word TRISG=getenv("SFR:TRISG")
#word PORTB=getenv("SFR:PORTB")
#word PORTC=getenv("SFR:PORTC")
#word PORTD=getenv("SFR:PORTD")
#word PORTE=getenv("SFR:PORTE")
#word PORTF=getenv("SFR:PORTF")
#word PORTG=getenv("SFR:PORTG")
#word PR1=getenv("SFR:PR1")
#word PR2=getenv("SFR:PR2")
#word PR3=getenv("SFR:PR3")
#word IOCPUG=getenv("SFR:IOCPUG")
#define _bootloader
#define LOADER_PAGES 3
#include <pcd_bootloader.h>
#include "loader_pcd.h"
#org LOADER_END+1,LOADER_END+5
void application(void)
{
while(TRUE);
}
#include "Pins.h"
#include "Variables.h"
#include "Timer.h"
//------------------------------------------------------
void Main(){
TRISB=0b0100000001000000;
TRISC=0b0000000000000000;
TRISD=0b0000000000001000;
TRISE=0b0000000000000000;
TRISF=0b0000000000100000;
TRISG=0b0000000010000000;
IOCPUG=0b0000000010000000; //Enable G7 pull up (Button))
LATB=0;
LATC=0;
LATD=0;
LATE=0;
LATF=0;
LATG=0;
SETUP_ADC(ADC_OFF);
SETUP_ADC_PORTS(NO_ANALOGS);
delay_ms(10);
OledCS=1;
EepromCS=1;
printf("\n\rStarting Bootloader.");
delay_ms(500);
if(!Button){
printf("\r\nWaiting for download...");
load_program();
}
printf("\r\nStarting App...");
application();
}
#int_default
void isr(void){
jump_to_isr(LOADER_END+5);
}
|
_________________ George.
Last edited by georpo on Fri Dec 23, 2022 5:34 am; edited 1 time in total |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Fri Dec 23, 2022 2:57 am |
|
|
If I change to :
It works, I do not know if this will cause any problem
but the bootloader compiled and I got it to download the firmware successfully. _________________ George. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Fri Dec 23, 2022 3:09 am |
|
|
OK, without setting the org range, the timer interrupt is not working.
I guess it is related to this:
Code: |
#int_default
void isr(void){
jump_to_isr(LOADER_END+5);
}
|
So what is the correct org range? _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Fri Dec 23, 2022 11:11 am |
|
|
That is the wrong #org for the application. It needs to just use
Code: |
#org APPLICATION_START
void application(void)
{
while(TRUE);
}
|
Your current #ORG making it clash with the #INT #ORG....
You are trying to load the application into the vector above the LOADER,
where the jump to the actual application needs to be. This then makes
it clash with the interrupt re-vectoring table (on PCD, the #INT_DEFAULT
jump_to_isr code generates a whole new vector table for the main
application). Hence it can't get it to fit.... |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Fri Dec 23, 2022 2:39 pm |
|
|
Ttelmah to the rescue once again.
The code from the example is working just fine.
And it also worked for the PIC24FJ128GL305 but the interrupt never triggered.
I will try your suggestion and report back.
Should I also change this to past projects already working? _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Sat Dec 24, 2022 6:58 am |
|
|
Are you sure you need the stack to be 1K?. That is using a lot of your RAM.
Look at the stack size in the compiled code. Remember each 'location' needs
two bytes, but I'd have thought something like 512, would be enough.
Your fuses need NOIOL1WAY, or your main code is not going to be able
to set the PPS for devices. Possibly this is what is preventing the interrupt
from working (the device is not actually on the pins you think).
What interrupt are you trying to use? Obviously check it is enabled etc..
Have a great Christmas. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Wed Dec 28, 2022 12:44 am |
|
|
Hi!
I changed to #org APPLICATION_START but the timer2 interrupt does not fire. Everything works, OLED,UART,SPI but not the interrupt. Maybe the "jump_to_isr(LOADER_END+5);" is wrong? why +5?
The interrupt and the timer are configured correctly because if I run the firmware directly without bootloader the interrupt fires.
Please look at the code below.
BOOTLOADER
Code: |
#include <24FJ128GL305.h>
#FUSES NOWDT //Watch Dog Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES FRC_PLL
#FUSES NOPR //Pimary oscillator disabled
#FUSES OSCIO //OSC2 is general purpose output
#FUSES NOCKSNOFSM
#FUSES NOBROWNOUT
#FUSES NOIOL1WAY
#BUILD (stack=512)
#use delay(int=32M)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#use fast_io(F)
#use fast_io(G)
#pin_select U1TX = PIN_F4
#pin_select U1RX = PIN_F5
#pin_select SDO1 = PIN_D4
#pin_select SCK1OUT = PIN_D5
#pin_select SDI1 = PIN_D3
#use rs232(BAUD=115200,BRGH1OK,UART1,ERRORS)
#define _bootloader
#define LOADER_PAGES 3
#include <pcd_bootloader.h>
#include "loader_pcd.h"
//#org LOADER_END+1,LOADER_END+5
//#org LOADER_END+1
#org APPLICATION_START
void application(void)
{
while(TRUE);
}
#word LATB= getenv("SFR:LATB")
#word LATC=getenv("SFR:LATC")
#word LATD=getenv("SFR:LATD")
#word LATE=getenv("SFR:LATE")
#word LATF=getenv("SFR:LATF")
#word LATG=getenv("SFR:LATG")
#word TRISB= getenv("SFR:TRISB")
#word TRISC=getenv("SFR:TRISC")
#word TRISD=getenv("SFR:TRISD")
#word TRISE=getenv("SFR:TRISE")
#word TRISF=getenv("SFR:TRISF")
#word TRISG=getenv("SFR:TRISG")
#word PORTB=getenv("SFR:PORTB")
#word PORTC=getenv("SFR:PORTC")
#word PORTD=getenv("SFR:PORTD")
#word PORTE=getenv("SFR:PORTE")
#word PORTF=getenv("SFR:PORTF")
#word PORTG=getenv("SFR:PORTG")
#word PR1=getenv("SFR:PR1")
#word PR2=getenv("SFR:PR2")
#word PR3=getenv("SFR:PR3")
#word IOCPUG=getenv("SFR:IOCPUG")
#include "Pins.h"
#include "Variables.h"
#include "Timer.h"
//------------------------------------------------------
void Main(){
TRISB=0b0100000001000000;
TRISC=0b0000000000000000;
TRISD=0b0000000000001000;
TRISE=0b0000000000000000;
TRISF=0b0000000000100000;
TRISG=0b0000000010000000;
IOCPUG=0b0000000010000000; //Enable G7 pull up (Button))
LATB=0;
LATC=0;
LATD=0;
LATE=0;
LATF=0;
LATG=0;
SETUP_ADC(ADC_OFF);
SETUP_ADC_PORTS(NO_ANALOGS);
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H , 4000000);
delay_ms(10);
Led=1;
OledCS=1;
EepromCS=1;
printf("\n\rStarting Bootloader.");
delay_ms(2000);
if(!Button){
printf("\r\nWaiting for download...");
load_program();
}
printf("\r\nStarting App...");
Led=0;
application();
}
#int_default
void isr(void){
jump_to_isr(LOADER_END+5);
}
|
FIRMWARE
Code: |
#include <24FJ128GL305.h>
#define UseBootloader
#ifdef UseBootloader
#FUSES NONE
#else
#FUSES NOWDT //Watch Dog Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES FRC_PLL
#FUSES NOPR //Pimary oscillator disabled
#FUSES OSCIO //OSC2 is general purpose output
#FUSES NOCKSNOFSM
#FUSES NOBROWNOUT
#FUSES NOIOL1WAY
#endif
#BUILD (stack=512)
#use delay(int=32M)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#use fast_io(F)
#use fast_io(G)
#pin_select U1TX = PIN_F4
#pin_select U1RX = PIN_F5
#ifndef UseBootloader
#pin_select SDO1 = PIN_D4
#pin_select SCK1OUT = PIN_D5
#pin_select SDI1 = PIN_D3
#endif
#use rs232(BAUD=115200,BRGH1OK,UART1,ERRORS)
#ifdef UseBootloader
#define LOADER_PAGES 3
#include <pcd_bootloader.h>
#endif
#word LATB= getenv("SFR:LATB")
#word LATC=getenv("SFR:LATC")
#word LATD=getenv("SFR:LATD")
#word LATE=getenv("SFR:LATE")
#word LATF=getenv("SFR:LATF")
#word LATG=getenv("SFR:LATG")
#word TRISB= getenv("SFR:TRISB")
#word TRISC=getenv("SFR:TRISC")
#word TRISD=getenv("SFR:TRISD")
#word TRISE=getenv("SFR:TRISE")
#word TRISF=getenv("SFR:TRISF")
#word TRISG=getenv("SFR:TRISG")
#word PORTB=getenv("SFR:PORTB")
#word PORTC=getenv("SFR:PORTC")
#word PORTD=getenv("SFR:PORTD")
#word PORTE=getenv("SFR:PORTE")
#word PORTF=getenv("SFR:PORTF")
#word PORTG=getenv("SFR:PORTG")
#word PR1=getenv("SFR:PR1")
#word PR2=getenv("SFR:PR2")
#word PR3=getenv("SFR:PR3")
#word IOCPUG=getenv("SFR:IOCPUG")
#include "Pins.h"
#include "Variables.h"
#include "Timer.h"
#include "ssh1106.h"
//------------------------------------------------------
void Main(){
TRISB=0b0100000001000000;
TRISC=0b0000000000000000;
TRISD=0b0000000000001000;
TRISE=0b0000000000000000;
TRISF=0b0000000000100000;
TRISG=0b0000000010000000;
IOCPUG=0b0000000010000000; //Enable G7 pull up (Button)
LATB=0;
LATC=0;
LATD=0;
LATE=0;
LATF=0;
LATG=0;
SETUP_ADC(ADC_OFF);
SETUP_ADC_PORTS(NO_ANALOGS);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_64); //10mS
PR2=20000;
#ifndef UseBootloader
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H , 4000000);
#endif
enable_interrupts(INT_TIMER2); //Enable Timer Interrupt
enable_interrupts(GLOBAL);
delay_ms(10);
printf("\r\nRunning!!!");
OledCS=1;
EepromCS=1;
OledInit();
while(1){
OledClear(0);
sprintf(TextBuffer,"VERSION 6");
OledText(0,0,4);
UpdateOled();
delay_ms(500);
OledClear(1);
delay_ms(500);
if(!Button) reset_cpu();
}
}
|
Code: |
#INT_TIMER2
void TImer2ISR(){
if(!Led) Led=1;
else Led=0;
}
|
_________________ George. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Wed Dec 28, 2022 12:57 am |
|
|
I found it.
I had the "#INT_TIMER2" both in the bootloader and in the firmware
I removed it from the bootloader and now it works in the firmware.
As about the stack size, no I am not sure it should be 1K. I remember that this is usual for PIC24 and DSpic.
Where can I see the stack size in the compiled code?
Thanks!!! _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Wed Dec 28, 2022 2:19 am |
|
|
You open the .lst file generated. About 10 lines down it has the number of
stack levels used.
Normally the default stack, is just a little too small if you are using
complex printf statements. However 1024, would only be used if you
had a rather extreme number of calls inside calls inside calls.
For example my current code in a PIC33EP512GM305, is over 195K bytes
in size, but only uses 204 stack levels. 512Bytes works fine.
Remember the stack uses 2 bytes per level, and having perhaps a 10%
margin in sensible.
1K is not 'usual'. But having to expand it beyond the default size is.
1K is commonly used on some of the chips with more RAM than yours,
but it is worth being a little more 'stingy' if you start to find RAM running
short on the main program.
Yes, using interrupts in the bootloader is difficult. Better to 'poll' the
interrupt bit involved, which simplifies things massively. You can do it by
having separate vector tables for the main and the bootloader.
Glad you are moving forwards.
Happy New Year to all. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Wed Dec 28, 2022 4:27 am |
|
|
Code: |
ROM used: 5890 bytes (7%)
Largest free fragment is 53502
RAM used: 1593 (19%) at main() level
1627 (20%) worst case
Stack used: 64 locations (26 in main + 38 for interrupts)
Stack size: 512
|
64 locations. so, 64x2=128? _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Wed Dec 28, 2022 10:54 am |
|
|
Exactly. That would just be hitting the limit of the default stack. Worth
going a little bigger, but not to 1K!... |
|
|
|