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 CCS Technical Support

#org an const variable ROM placement

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
pinton.fabio@tin.it



Joined: 08 Jul 2007
Posts: 6

View user's profile Send private message

#org an const variable ROM placement
PostPosted: Tue Mar 15, 2016 12:19 am     Reply with quote

Hi to all.
In order to optimize the time to program (and debug) my application I try to place some constant at beginning of the ROM.

Due the fact that compiler place constant at end of rom, the programming require a lot of time each time I need to debug application (I use ICD2).

The code is:
Code:
#include "18F46K22.H"  //Microcontroller
....
#DEVICE CONST=ROM

#org 0x0200, 0x02FF
const char MyString[] = "Hello Word";
rom int Var = 5;

#org default


The program memory after compiling is:
Quote:
...
256 01FE FFFF NOP
257 0200 FFFF NOP
258 0202 FFFF NOP
259 0204 FFFF NOP
260 0206 FFFF NOP
261 0208 FFFF NOP
.....
383 02FC FFFF NOP
384 02FE FFFF NOP
385 0300 C107 MOVFF 0x107, 0x101
.....
32761 FFF0 FFFF NOP
32762 FFF2 FFFF NOP
32763 FFF4 6548 CPFSGT 0x48, BANKED
32764 FFF6 6C6C NEGF 0xf6c, ACCESS
32765 FFF8 206F ADDWFC 0xf6f, W, ACCESS
32766 FFFA 6F57 MOVWF 0x57, BANKED
32767 FFFC 6472 CPFSGT 0xf72, ACCESS
32768 FFFE FF00 NOP


Variables aren't located where I expected !

Any suggestion?
My primary goal is to reduce programming time ...

Many thanks
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Tue Mar 15, 2016 7:36 am     Reply with quote

http://www.ccsinfo.com/forum/viewtopic.php?t=26245
see item #4 and #5
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Mar 15, 2016 10:36 am     Reply with quote

The test program below places the 'const' data and rom data in the
specified addresses in program memory. Here is the text at the end
of the .LST file which shows this. Also, I viewed the program memory
in MPLAB and the data is in the specified locations. I tested this with
compiler vs. 5.055 and MPLAB vs. 8.92.
Code:
ROM data:
000200: 48 65 6C 6C 6F 20 57 6F 72 6C 64 00    Hello World.
000300: 05                                                 .

Test program:
Code:
#include "18F46K22.H"   
#fuses INTRC_IO, NOWDT
#use delay(clock=4M)
#use rs232(baud=9600, UART1, ERRORS)
 
#DEVICE CONST=ROM

#org 0x0200
const char MyString[] = "Hello World";
#org default

#org 0x0300
rom int Var = 5;
#org default

//=====================================
void main()
{

while(TRUE);
}
pinton.fabio@tin.it



Joined: 08 Jul 2007
Posts: 6

View user's profile Send private message

PostPosted: Tue Mar 15, 2016 3:23 pm     Reply with quote

Hi,
I've try with your suggestion

I'm using V4 version compiler.

Code:

#include "18F46K22.H"
#include "DEF_18(L)F2X_4XK22.h"

    #fuses INTRC_IO, NOPLLEN, PRIMARY_ON, NOFCMEN, NOIESO
    #fuses NOPBADEN, NOHFOFST
    #fuses PUT, WDT

#DEVICE *=16, ADC=10
#DEVICE CONST=ROM

#use delay(clock=64000000,RESTART_WDT)

#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#USE FAST_IO(E)

#org 0x0200
const char MyString[] = "Hello World";
#org default

#pragma ZERO_RAM
void main()
{   
    while(TRUE);
}


Compiler generate this error an compiling fail:
Quote:

Executing: "C:\Program Files\PICC\Ccsc.exe" +FH "Main.c" out="..\0_output\" #__DEBUG=1 +ICD +DF +LN I+="Y:\Fw\Pic\18x\" +T +A +M -Z +Y=9 +EA #__18F46K22=TRUE
--- Info 300 "Main.c" Line 129(1,7): More info: Segment at 00000-0FFFE (0000 used)
--- Info 300 "Main.c" Line 129(1,7): More info: Attempted to create: 00200-00000 for #org
*** Error 126 "Main.c" Line 129(1,7): Invalid ORG range
1 Errors, 0 Warnings.
Build Failed.
Halting build on first failure as requested.
BUILD FAILED: Tue Mar 15 22:12:17 2016


if I modify #org stantement
Code:

#org 0x0200,0x0250
const char MyString[] = "Hello World";
#org default


The program memory is:
Quote:

....
254 01FA EF46 GOTO 0x268c
255 01FC F013 NOP
256 01FE FFFF NOP
257 0200 FFFF NOP
258 0202 FFFF NOP
259 0204 FFFF NOP
260 0206 FFFF NOP
261 0208 FFFF NOP
....
295 024C FFFF NOP
296 024E FFFF NOP
297 0250 FFFF NOP
298 0252 C107 MOVFF 0x107, 0x101
....
32761 FFF0 FFFF NOP
32762 FFF2 FFFF NOP
32763 FFF4 6548 CPFSGT 0x48, BANKED
32764 FFF6 6C6C NEGF 0xf6c, ACCESS
32765 FFF8 206F ADDWFC 0xf6f, W, ACCESS
32766 FFFA 6F57 MOVWF 0x57, BANKED
32767 FFFC 6C72 NEGF 0xf72, ACCESS
32768 FFFE 0064

.....like the first message.



Bye
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Mar 24, 2016 1:49 pm     Reply with quote

Quote:
I'm using V4 version compiler.

You sent me a PM asking for more help, but you never read my PM reply,
which is:

Go to the thread and post your exact compiler version.
The version will be a 4-digit number such as 4.068, or 4.135, or 4.141, etc.

Here are three ways to find the CCS compiler version:

1. Compile a test source file and look at the top of the .LST file, which will
be in your project folder. It will show the version. However, to get
the .LST file to be generated, the source file must compile with no errors.

2. Click on the Start button in Windows, then go to Programs, and then
find the entry for CCS, which will be called "PIC-C". Then click on the icon
for "Compiler Version". It will display a box which shows the compiler
version.

3. Open a Command Prompt window and go to c:\Program Files\Picc
(or to whatever directory CCS is installed in) and run this command line:
CCSC.exe +v
This method should always work.
pinton.fabio@tin.it



Joined: 08 Jul 2007
Posts: 6

View user's profile Send private message

Compiler version
PostPosted: Thu Mar 24, 2016 3:39 pm     Reply with quote

I've checked on .lst file.
Quote:

CCS PCH C Compiler, Version 4.135, 23-mar-16 06:48


Bye
_________________
Fabio
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Mar 25, 2016 2:28 am     Reply with quote

I don't think 'rom' and #org work as well in your version as they do
in vs. 5.xxx. So with vs. 4.135, I used 'const' and #org to place the
"Hello World" data in the 0x200 address range.
The program below has the following output in MPLAB vs. 8.92 simulator:
Quote:

addr of text = 0210
Hello World

Test program:
Code:
#include <18F46K22.H>
#fuses INTRC_IO, NOPLLEN, PRIMARY_ON, NOFCMEN, NOIESO
#fuses NOPBADEN, NOHFOFST
#fuses PUT, WDT
#use delay(clock=64000000,RESTART_WDT)
#use rs232(baud=9600, UART1, ERRORS)

#org 0x0200, 0x220
const char MyString[12] = "Hello World";
#org default

//==================================
void main()
{   
int16 addr;
int8 value;
int8 i;

addr = label_address(MyString);
printf("addr of text = %lx \r", addr);
i = 0;

for(i = 0; i < sizeof(MyString); i++)
   {
    value = MyString[i];
    printf("%c", value);
   }

while(TRUE);
}


Here is part of the Program Memory window in MPLAB, showing the
address of the data:
Code:
Addr  Opcode Label      Disassembly             

0200  6AF7   @const80   CLRF TBLPTRH, ACCESS                   
0202  0F10              ADDLW 0x10                             
0204  6EF6              MOVWF TBLPTRL, ACCESS                 
0206  0E02              MOVLW 0x2                             
0208  22F7              ADDWFC TBLPTRH, F, ACCESS             
020A  0009              TBLRD*+                               
020C  50F5              MOVF TABLAT, W, ACCESS                 
020E  0012              RETURN 0   
// "Hello World" data starts below:                           
0210  6548              CPFSGT 0x48, BANKED                   
0212  6C6C              NEGF SSP2CON1, ACCESS                 
0214  206F              ADDWFC SSP2BUF, W, ACCESS             
0216  6F57              MOVWF 0x57, BANKED                     
0218  6C72              NEGF TXSTA2, ACCESS                   
021A  0064                                                                     
021C  FFFF              NOP                                   
021E  FFFF              NOP                                   
pinton.fabio@tin.it



Joined: 08 Jul 2007
Posts: 6

View user's profile Send private message

PostPosted: Fri Mar 25, 2016 3:31 am     Reply with quote

The only differences from my code and your code is the dimension, for my isnt declared
Code:

#org 0x0200
const char MyString[] = "Hello World";
#org default

On your
Code:

#org 0x0200, 0x220
const char MyString[12] = "Hello World";
#org default


I will test it, but, do you think that this is the reason that my program put the data on end of memory and your where you define?

Thanks and bye
_________________
Fabio
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Fri Mar 25, 2016 5:08 am     Reply with quote

The first thing to remove, is the const=ROM line.

Compile your code without this, and it will place the data in ROM.

CCS mode is the default, and for some reason, specifying this causes it to go wrong on your version.

Then you need _one_ size specified.

If you modify your program so it gives an address 'range'

#org 0x200, 0x220

for example, it'll then compile as is.

The problem here is that when the 'pre-processor' (not really a pre-processor in CCS, but the initial pass which starts trying to lay the memory 'out'), arrives at the ORG, it tries to allocate the whole of memory for the ORG......

Now, you also have to realise that with a const, CCS places the program to access the const, in front of the data. This is what PCM_Programmer is showing, with the 'label_address' code. So your 12 character string, actually needs 22 bytes of ROM to be stored.

So with your code changed to:
Code:

#include "18F46K22.H"
//#include "DEF_18(L)F2X_4XK22.h"

    #fuses INTRC_IO, NOPLLEN, PRIMARY_ON, NOFCMEN, NOIESO
    #fuses NOPBADEN, NOHFOFST
    #fuses PUT, WDT

#DEVICE ADC=10 //*=16 does nothing on a PIC18
//#DEVICE CONST=ROM

#use delay(clock=64000000,RESTART_WDT)

#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#USE FAST_IO(E)

#org 0x0200,0x220
const char MyString[] = "Hello World";
#org default

#pragma ZERO_RAM
void main()
{   
    while(TRUE);
}

The listing shows:
Code:

*
00200:  CLRF   FF7
00202:  ADDLW  10
00204:  MOVWF  FF6
00206:  MOVLW  02
00208:  ADDWFC FF7,F
0020A:  TBLRD*+
0020C:  MOVF   FF5,W
0020E:  RETURN 0
00210:  DATA 48,65
00212:  DATA 6C,6C
00214:  DATA 6F,20
00216:  DATA 57,6F
00218:  DATA 72,6C
0021A:  DATA 64,00
0021C:  RETURN 0
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