|
|
View previous topic :: View next topic |
Author |
Message |
Fabien
Joined: 27 Jan 2010 Posts: 3
|
"not enough ram" error and PIC16F636 |
Posted: Wed Jan 27, 2010 10:22 am |
|
|
Hi gents
I'm using CCS 3.249, and I'm trying to program a PIC16F636, but I'm having a problem with the RAM memory,
When I'm compiling I'm using 76% RAM and 12% of ROM.
I add one int16 variable usually 2% of RAM, and CCS is sending "not enough ram"
I was supposed to get : 78% RAM and 12% of ROM.
Do you have any suggestion to solve my problem, I'm not using all the memory.
Thanks!
Fabien |
|
|
Ttelmah Guest
|
|
Posted: Wed Jan 27, 2010 10:37 am |
|
|
Possibly.
#device *=16
By default, the compiler only accesses the first bank of memory. Allows the code to be slightly smaller, and faster, with no bank switching involved. The above tells the compiler to use all the memory.
However on your chip, all the available RAM is in the bottom bank, so should be accessible without this. But, it sounds as if possibly the chip is not accessing the access bank area (top 16 locations), so worth trying this.
An int16, uses more than 2%. Actually 3.125%. This chip has just 64 bytes of RAM, so a 2 byte variable uses 1/32 of the memory space.
Remember also, that if (for instance), you add a 16bit variable, and in doing so add 16bit arithmetic operations, the 'scratch' RAM used by the compiler will also increase, so a single variable could result in more memory being used than you think....
Best Wishes |
|
|
Fabien
Joined: 27 Jan 2010 Posts: 3
|
|
Posted: Wed Jan 27, 2010 11:08 am |
|
|
Hi Ttelmah,
I tried to put #device *=16, but nothing change...I can't use more than 76% of RAM.
I'm not using the variable to make arithmetic operations I'm just calling them to send via SPI to another component, my variable are like this one:
Code: |
int16 ALC_BLOCK [6][2] = { { 0x0F11 , 0x1400 } ,
{ 0x0F0A , 0x0B49 } ,
{ 0x0F0B , 0x07FD } ,
{ 0x0F0C , 0x0401 } ,
{ 0x0F14 , 0x08F4 } ,
{ 0x0F15 , 0x00E4 } } ;
|
Fabien |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jan 27, 2010 2:24 pm |
|
|
I compiled the test program below with vs. 3.249 and got the following
result in the .LST file:
Quote: |
CCS PCM C Compiler, Version 3.249, xxxxx 27-Jan-10 12:23
Filename: pcm_test.lst
ROM used: 226 words (11%)
Largest free fragment is 1822
RAM used: 127 (100%) at main() level
127 (100%) worst case
Stack: 0 locations
|
MPLAB Output Window:
Quote: |
0 Errors, 0 Warnings.
Loaded C:\Program Files\PICC\Projects\PCM_Test\pcm_test.cof.
BUILD SUCCEEDED: Wed Jan 27 12:23:38 2010
|
Test program:
Code: |
#include <16F636.H>
#fuses XT, NOWDT, BROWNOUT, PUT
#use delay(clock=4000000)
int16 ALC_BLOCK [6][2] = { { 0x0F11 , 0x1400 } ,
{ 0x0F0A , 0x0B49 } ,
{ 0x0F0B , 0x07FD } ,
{ 0x0F0C , 0x0401 } ,
{ 0x0F14 , 0x08F4 } ,
{ 0x0F15 , 0x00E4 } } ;
int16 ALC_BLOCK1 [6][2] = {{ 0x0A11 , 0x1A00 } ,
{ 0x0A0A , 0x0A49 } ,
{ 0x0A0B , 0x0AFD } ,
{ 0x0A0C , 0x0A01 } ,
{ 0x0A14 , 0x0AF4 } ,
{ 0x0A15 , 0x0AE4 } } ;
int16 ALC_BLOCK2[6][2] = {{ 0x0B11 , 0x1B00 } ,
{ 0x0B0A , 0x0B49 } ,
{ 0x0B0B , 0x0BFD } ,
{ 0x0B0C , 0x0B01 } ,
{ 0x0B14 , 0x0BF4 } ,
{ 0x0B15 , 0x0BE4 } } ;
int16 ALC_BLOCK3[6][2] = {{ 0x0C11 , 0x1C00 } ,
{ 0x0C0A , 0x0C49 } ,
{ 0x0C0B , 0x0CFD } ,
{ 0x0C0C , 0x0C01 } ,
{ 0x0C14 , 0x0CF4 } ,
{ 0x0C15 , 0x0CE4 } } ;
int16 ALC_BLOCK4[4][2] = {{ 0x0D11 , 0x1D00 } ,
{ 0x0D0A , 0x0D49 } ,
{ 0x0D0B , 0x0DFD } ,
{ 0x0D0C , 0x0D01 } };
int16 a, b, c, d, e;
//======================================
void main()
{
while(1);
} |
|
|
|
Ttelmah Guest
|
|
Posted: Wed Jan 27, 2010 3:35 pm |
|
|
I think you are not understanding how large your variable is.
What you post is twelve int16 variables. 24 bytes, and would use 37.5% of the total RAM. You don't have this much available...
So the compiler is 'right'.
However, it sounds as if you don't actually need them to be _variables_ at all?. You talk about 'just sending them over SPI'. The point about a 'variable', is that it is 'variable' (can be changed), so has to be stored in RAM. If these are fixed values, then declare the data as a constant instead...
Best Wishes |
|
|
Fabien
Joined: 27 Jan 2010 Posts: 3
|
|
Posted: Thu Jan 28, 2010 2:43 am |
|
|
Hi gents, Thanks for your reply,
i switched my variables to constante like this :
Code: |
int16 const ALC_BLOCK [6][2] = { { 0x0F11 , 0x1400 } ,
{ 0x0F0A , 0x0B49 } ,
{ 0x0F0B , 0x07FD } ,
{ 0x0F0C , 0x0401 } ,
{ 0x0F14 , 0x08F4 } ,
{ 0x0F15 , 0x00E4 } } ;
|
my data memory came back to 5%...
But i can't use my data in my function i've the following error
"attempt to create a pointer to a constant"
the function call is :
Code: |
write_internal_data_memory(ALC_BLOCK,6*2);
|
and the function is
Code: |
void write_internal_data_memory (int16 *block, int8 dimension)
{
int1 CR1_B7 = 1 ;
int8 i ;
int8 save = 0 ;
for(i=0; i<dimension; i=i+2)
{
mcu_data_write(CR6_ADDR, (block[i]&0xFF00)>>8);
mcu_data_write(CR7_ADDR, block[i]&0x00FF);
mcu_data_write(CR8_ADDR, (block[i+1]&0xFF00)>>8);
mcu_data_write(CR9_ADDR, block[i+1]&0x00FF);
save=mcu_data_read(CR1_ADDR);
mcu_data_write(CR1_ADDR, save|0x80);
do
{
CR1_B7=((mcu_data_read(CR1_ADDR)&0x80)>>7);
}
while(CR1_B7==1);
}
}
|
thanks for your help |
|
|
Ttelmah Guest
|
|
Posted: Thu Jan 28, 2010 2:55 am |
|
|
Since they are constants, do you actually 'need' to hand them to the function?. Declare the value inside the function that uses it, and just access the elements as an array.
Do a search here for 'pointer to constant', to see 'why' this is necessary...
Best Wishes |
|
|
|
|
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
|