CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

External memory+bootloader -> problem #org

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
pasini



Joined: 12 Dec 2005
Posts: 50
Location: Curitiba - Brazil

View user's profile Send private message Send e-mail

External memory+bootloader -> problem #org
PostPosted: Thu Mar 23, 2006 6:45 am     Reply with quote

PIC18F8680 MPLAB 7.31 CCS 3.241

I have a bootloader running in the internal memory of PIC and it is supposed to program the real app code to the external Flash program memory. External memory begins at 0x10000 and goes up to 0x80000 (19bits of address - 512kwords). The configuration I want is EMCU extended microcontroller mode, with internal and external program memories.

The problem is when I write the real code (that is supposed to begin at 0x10000) with #org directive.

My code is:
Code:

#include "18f8680.h"
#device *=16 ADC=10
//#fuses HS,NOWDT,NOPROTECT,NOLVP
#fuses HS,NOWDT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT,EMCU//,WAIT //,NODEBUG
#use delay(clock=20000000)
#use rs232(stream=RS232,baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
//#use FAST_IO (C)
#case

#build(memory=0x10000:0x80000)

#define BASE 0x010000
#define BUZZER            PIN_C2
#define LigaBuzzer()      output_high(BUZZER)
#define DesligaBuzzer()      output_low(BUZZER)

#org 0x10000
void retorno_isr(void)
{
/*   #asm
      MOVFF  0F,00
      MOVFF  10,01
      MOVFF  11,02
      MOVFF  12,03
      MOVFF  13,04
      MOVFF  0D,FE9
      MOVFF  08,FEA
      MOVFF  09,FE1
      MOVFF  0A,FE2
      MOVFF  0B,FD9
      MOVFF  0C,FDA
      MOVFF  14,FF3
      MOVFF  15,FF4
      MOVFF  16,FFA
      MOVFF  05,FE8
      MOVFF  07,FE0
      MOVFF  06,FD8
      RETFIE 0
   #endasm
*/   
}

#org 0x10100, 0x101FE
void TIMER0_isr(void)
{

   #asm
      goto 0x10000
   #endasm   
}

#org 0x10200, 0x102FE
void TIMER2_isr(void)
{
   
   
   #asm
      goto 0x10000
   #endasm
}

#org 0x10300, 0x103FE
void main(void)
{
   while(1)
   {
      LigaBuzzer();
      delay_ms(25);
      DesligaBuzzer();
      delay_ms(25);
   }
}


and the output errors are ( repeated erros, displaying just one -> same erros for different memory locations)
Quote:

--- Info 300 "teste.c" Line 44(1,8): More info: Attempted to create: 10100-101FE for #org
*** Error 126 "teste.c" Line 44(1,8): Invalid ORG range


Why is the #org range incorrect ?

If I do not include the #org statement and use the bootloader to offset the addresses to external memory it does not compile too because code is located in the interrupt vectors locations.
Please, any suggestions ?

Thanks in advance for any help.
Pasini
mpfj



Joined: 09 Sep 2003
Posts: 95
Location: UK

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Thu Mar 23, 2006 7:10 am     Reply with quote

I think this happens because the CCS compiler knows the device only has 64k of available address space (i.e. the internal flash).

Since you're using the external memory at address 0x10000 (i.e. 64k and above), the compiler is saying you're not allowed to do that !!

I believe this has been covered in the past, and you can "fool" the compiler by making your own version of the chip using the Chip Edit tool. With this new version of the device, you simply make the address range bigger, hence fooling the compiler into thinking it's okay to place code above the 64k boundary.
pasini



Joined: 12 Dec 2005
Posts: 50
Location: Curitiba - Brazil

View user's profile Send private message Send e-mail

PostPosted: Thu Mar 23, 2006 8:35 am     Reply with quote

How do I create a new device ? I never did that.
I tried copying the PIC18F8680 to _PIC18F8680 and change the memory size but the device is not shown in the device list.
Do I have to to change device.dat ? How do I do this ?

Will it work to solve my problem ? Have you tried this before ?

Thanks
Pasini
mpfj



Joined: 09 Sep 2003
Posts: 95
Location: UK

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Thu Mar 23, 2006 9:01 am     Reply with quote

Using the device editor, I copied the 18F8622 device (which only has 64k of internal flash) and called it 18F8622Z.

I then edited this device and in the Memory -> Program (words) entry, changed the size from 32768 to 131072. This fools the compiler into thinking the device has 256k of internal flash to play with !!).

I then copied the 18F8622.h header file, and called it 18F8622Z.h.

In this new header file, I changed the line :
Code:
#device PIC18F8622
to
Code:
#device PIC18F8622Z

The following code then compiles ...
Code:
#include <18F8622Z.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV25                   //Brownout reset at 2.5V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES MCU                      //Microcontroller Mode

#use delay(clock=20000000)

#org 0x10000

void main()
{
   printf("Hello world!");
}


to give the following listing ...
Code:
CCS PCH C Compiler, Version 3.243, 32117               23-Mar-06 14:53

               Filename: C:\Documents and Settings\Mark\My Documents\321.lst

               ROM used: 92 bytes (0%)
                         Largest free fragment is 65536
               RAM used: 6 (0%) at main() level
                         6 (0%) worst case
               Stack:    1 locations

*
00000:  GOTO   10000
.................... #include <18F8622Z.h>
.................... //////// Standard Header file for the PIC18F8622Z device ////////////////
.................... #device PIC18F8622Z
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT                    //No Watch Dog Timer
.................... #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
.................... #FUSES INTRC                    //Internal RC Osc
.................... #FUSES NOPROTECT                //Code not protected from reading
.................... #FUSES NOIESO                   //Internal External Switch Over mode disabled
.................... #FUSES BROWNOUT                 //Reset when brownout detected
.................... #FUSES BORV25                   //Brownout reset at 2.5V
.................... #FUSES NOPUT                    //No Power Up Timer
.................... #FUSES NOCPD                    //No EE protection
.................... #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
.................... #FUSES NODEBUG                  //No Debug mode for ICD
.................... #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOWRT                    //Program memory not write protected
.................... #FUSES NOCPB                    //No Boot Block code protection
.................... #FUSES NOEBTRB                  //Boot block not protected from table reads
.................... #FUSES NOEBTR                   //Memory not protected from table reads
.................... #FUSES NOWRTD                   //Data EEPROM not write protected
.................... #FUSES NOWRTC                   //configuration not registers write protected
.................... #FUSES NOWRTB                   //Boot block not write protected
.................... #FUSES FCMEN                    //Fail-safe clock monitor enabled
.................... #FUSES LPT1OSC                  //Timer1 configured for low-power operation
.................... #FUSES MCLR                     //Master Clear pin enabled
.................... #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
.................... #FUSES MCU                      //Microcontroller Mode
....................
.................... #use delay(clock=20000000)
....................
.................... #org 0x10000
....................
.................... void main()
.................... {
*
10000:  CLRF   FF8
10002:  BCF    FD0.7
10004:  CLRF   FEA
10006:  CLRF   FE9
10008:  MOVF   FC1,W
1000A:  ANDLW  C0
1000C:  IORLW  0F
1000E:  MOVWF  FC1
10010:  MOVLW  07
10012:  MOVWF  FB4
....................    printf("Hello world!");
10014:  CLRF   06
10016:  MOVF   06,W
10018:  CALL   0008
1001C:  IORLW  00
1001E:  BTFSC  FD8.2
10020:  GOTO   10034
10024:  INCF   06,F
10026:  BTFSS  00.0
10028:  GOTO   10026
1002C:  BCF    FFF.7
1002E:  MOVWF  00
10030:  GOTO   10016
.................... }
....................
10034:  SLEEP

Configuration Fuses:
   Word  1: 4900   NOIESO FCMEN INTRC
   Word  2: 0E1F   BROWNOUT WDT128 NOWDT BORV25 NOPUT
   Word  3: 87F3   CCP2C1 LPT1OSC MCLR MCU WAIT BW16 ABW20 ECCPE
   Word  4: 0080   NOSTVREN NODEBUG NOLVP NOXINST RESERVED
   Word  5: C00F   NOPROTECT NOCPD NOCPB
   Word  6: E00F   NOWRT NOWRTD NOWRTC NOWRTB
   Word  7: 400F   NOEBTRB NOEBTR

You can clearly see that the compiler puts all the code (apart from the restart vector) at address 0x10000 and above Laughing
mpfj



Joined: 09 Sep 2003
Posts: 95
Location: UK

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Thu Mar 23, 2006 9:02 am     Reply with quote

pasini wrote:
... but the device is not shown in the device list.

It should be at the end of the list !!
pasini



Joined: 12 Dec 2005
Posts: 50
Location: Curitiba - Brazil

View user's profile Send private message Send e-mail

PostPosted: Mon Mar 27, 2006 7:12 am     Reply with quote

Ok if I include only the #org 0x10000. If I try to include other #org´s the error appears again.

Code:
#org 0x010000
void main(void)
{
   while(1)
   {   LigaBuzzer();
      delay_ms(150);
      DesligaBuzzer();
      delay_ms(50);      
   }
}

#org 0x010500,0x10600
void timer0(void)
{
}

#org 0x010700,0x010800
void timer2(void)
{
}


The error is
Quote:
--- Info 300 "teste.c" Line 125(1,9): More info: Attempted to create: 10700-10800 for #org
*** Error 126 "teste.c" Line 125(1,9): Invalid ORG range


Thanks
Pasini
mpfj



Joined: 09 Sep 2003
Posts: 95
Location: UK

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Tue Mar 28, 2006 3:26 am     Reply with quote

If you check the CCS Reference Manual, you will see the #org syntax is as follows:-
Code:
#org start, end
or
#org segment
or
#org start, end {}
or
#org start, end auto=0
#ORG start,end DEFAULT
or
#ORG DEFAULT

Each instance of #org must have a "start" and an "end" value, unless you are continuing a previously declared #org, in which case you can jsut specify the "start" value (which CCS call the "segment").

So in your case you must have something like ...
Code:
#org 0x010000, 0x10300     // *** NOTE THE ADDITIONAL END VALUE !! ***
void main(void)
{
   while(1)
   {   LigaBuzzer();
      delay_ms(150);
      DesligaBuzzer();
      delay_ms(50);     
   }
}

#org 0x010500,0x10600
void timer0(void)
{
}

#org 0x010700,0x010800
void timer2(void)
{
}

As a test, I compiled the following ...
Code:
#include <18F8680Z.h>

#org 0x10000, 0x10500

int16 fn(void) {
   return(0x1234);
}

#org 0x15000, 0x15500

void main()
{
   printf("Hello world!");

   fn();
}

The resulting LST file follows, and you clearly see the reset vector is at 0x0000, which jumps straight to 0x15000, with fn() located at 0x10000.
Code:
CCS PCH C Compiler, Version 3.249, 266               28-Mar-06 10:21

               Filename: C:\Documents and Settings\Mark\My Documents\321.lst

               ROM used: 106 bytes (0%)
                         Largest free fragment is 65536
               RAM used: 6 (0%) at main() level
                         6 (0%) worst case
               Stack:    1 locations

*
00000:  GOTO   15000
.................... #include <18F8680Z.h>
.................... //////// Standard Header file for the PIC18F8680 device ////////////////
.................... #device PIC18F8680Z
.................... #list
....................
....................
.................... #org 0x10000, 0x10500
....................
.................... int16 fn(void) {
....................    return(0x1234);
*
10000:  MOVLW  34
10002:  MOVWF  01
10004:  MOVLW  12
10006:  MOVWF  02
.................... }
10008:  RETLW  00
....................
.................... #org 0x15000, 0x15500
....................
.................... void main()
.................... {
*
15000:  CLRF   FF8
15002:  BCF    FD0.7
15004:  CLRF   FEA
15006:  CLRF   FE9
15008:  MOVF   FC1,W
1500A:  ANDLW  C0
1500C:  IORLW  0F
1500E:  MOVWF  FC1
15010:  MOVLW  07
15012:  MOVWF  FB4
....................    printf("Hello world!");
15014:  CLRF   06
15016:  MOVF   06,W
15018:  CALL   0008
1501C:  IORLW  00
1501E:  BTFSC  FD8.2
15020:  GOTO   15034
15024:  INCF   06,F
15026:  BTFSS  00.0
15028:  GOTO   15026
1502C:  BCF    FFF.7
1502E:  MOVWF  00
15030:  GOTO   15016
....................
....................    fn();
15034:  CALL   10000
.................... }
15038:  SLEEP

Hope this gets you up and running ... Smile
pasini



Joined: 12 Dec 2005
Posts: 50
Location: Curitiba - Brazil

View user's profile Send private message Send e-mail

PostPosted: Tue Mar 28, 2006 6:08 pm     Reply with quote

Now I really understand what I shall do to make everything run ok.
Being sure that the external memory is properly connected to the MCU, create an alternative MCU with the extended memory. Put all the code, including the bootloader, in a single project with extended memory mode. Be careful with the #org's. Program the MCU and run the bootloader to save remaining program code.
Yes, it runs like this
Thank you all for the help. Very Happy Wink Razz Mr. Green
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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