Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

RAM problem on PIC16F877A

Status
Not open for further replies.

john120

Banned
Joined
Aug 13, 2011
Messages
257
Helped
11
Reputation
22
Reaction score
10
Trophy points
1,298
Activity points
0
hello,can anyone show me how I can solve the problem of my program I am using a big array of 191 values which will increase also;then I spitted in because the compile was saying that the data is too big;but now I am having an error saying:Not enough RAM for all variables

see my codes below:plz help
#include <16f877a.h>
#DEVICE ADC=10
#Device *=16
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include "lcd.c"

#define ARRAY_SIZE 95
#define ARRAY_SIZE 96


float voltsf,volts;
float value;
float value1;
int i;

unsigned int adc_value;
//int size;
int search;
float l;

int j[]={12359,
12348,
12319,
12318,
12303,
12301,
12280,
12264,
12261.2,
12245,
12230,
12230,
12210,
12200,
12199.99,
12199.96,
12179.99,
12179.38,
12169.99,
12159.99,
12151.29,
12149.99,
12120,
12099.99,
12098.99,
12094.99,
12097.99,
12084.99,
12069.99,
12049.99,
12024.99,
12014.99,
12009.99,
11999.99,
11994.99,
11989.99,
11980,
11968.99,
11968.99,
11959.99,
11954.99,
11949.99,
11944.99,
11939.99,
11934.99,
11929.99,
11899.99,
11880,
11869.99,
11840.99,
11832.39,
11822.29,
11811.99,
11809.99,
11799.99,
11749.49,
11738.49,
11736.49,
11734.99,
11724.99,
11714.99,
11699.99,
11684.99,
11674.99,
11659.99,
11644.99,
11629.99,
11599.97,
11584.99,
11574.99,
11564.99,
11549.99,
11525,
11514.99,
11504.99,
11498.7,
11439.99,
11429.99,
11417.99,
11434.99,
11425.99,
11414.99,
11403.99,
11395.99,
11385.59,
11374.99,
11364.99,
11354.99,
11344.99,
11334.99,
11299.98,
11284.99,
11274.99,
11249.98,
11234.99,
};
int p[]={11224.99,
11214.99,
11199.49,
11184.99,
11174.99,
11164.99,
11149.99,
11134.99,
11119.99,
11090,
11079.99,
11064.99,
11051.99,
11034.99,
11024.99,
11009.99,
10997.98,
10984.99,
10974.99,
10963.99,
10951.99,
10939.99,
10924.99,
10914.99,
10899.99,
10884.99,
10874.99,
10861.99,
10849.99,
10819.99,
10799.99,
10784.99,
10774.99,
10764.99,
10758.99,
10758.59,
10758.29,
10748.19,
10734.99,
10724.99,
10711.99,
10699.99,
10684.99,
10671.99,
10660.99,
10649.99,
10631.99,
10623.99,
10612.99,
10609.99,
10599.99,
10579.99,
10559.99,
10549.99,
10539.99,
10529.99,
10519.49,
10514.99,
10499.99,
10484.99,
10469.99,
10454.99,
10439.99,
10424.99,
10411.99,
10399.99,
10384.99,
10369.99,
10354.99,
10330,
10319.99,
10299.99,
10289.98,
10274.99,
10264.99,
10259.99,
10249.99,
10239.99,
10224.99,
10214.99,
10209.99,
10199.99,
10184.99,
10181.99,
10179.99,
10174.99,
10169.99,
10164.99,
10159.99,
10159.99,
10149.99,
10144.99,
10139.99,
10129.99,
10124.99,
10134.99,
};
int k[]={12349,
12341,
12340,
12315,
12300.9,
12289,
12260,
12262,
12248,
12230.01,
12229.99,
12209.99,
12200.01,
12199.99,
12179.95,
12180,
12179.39,
12170,
12160,
12151.3,
12150,
12120,
12100,
12099,
12095,
12098,
12085,
12070,
12050,
12025,
12015,
12010,
12000,
11995,
11990,
11985,
11970,
11969,
11960,
11955,
11950,
11945,
11940,
11935,
11930,
11900,
11885,
11870,
11841,
11832.4,
11822.3,
11812,
11810,
11800,
11790,
11738.5,
11736.5,
11735,
11725,
11715,
11700,
11685,
11675,
11660,
11645,
11630,
11599.99,
11585,
11575,
11565,
11550,
11535,
11515,
11505,
11498.8,
11440,
11430,
11418,
11415,
11426,
11415,
11404,
11396,
11385.6,
11375,
11365,
11355,
11345,
11335,
11299.99,
11285,
11275,
11275,
11235,
11225,
};

int m[]={11215,
11199.5,
11185,
11175,
11165,
11150,
11135,
11120,
11105,
11080,
11065,
11052,
11035,
11025,
11010,
10997.99,
10985,
10975,
10964,
10952,
10940,
10925,
10915,
10900,
10885,
10875,
10862,
10850,
10820,
10800,
10785,
10775,
10765,
10759,
10758.6,
10758.3,
10748.2,
10735,
10725,
10712,
10700,
10685,
10672,
10661,
10650,
10632,
10624,
10613,
10610,
10600,
10580,
10560,
10550,
10540,
10530,
10519.5,
10515,
10500,
10485,
10470,
10455,
10440,
10425,
10412,
10400,
10385,
10370,
10355,
10340,
10320,
10300,
10289.99,
10275,
10265,
10260,
10250,
10240,
10225,
10215,
10210,
10200,
10185,
10182,
10180,
10175,
10170,
10165,
10160,
10155,
10155,
10145,
10140,
10135,
10125,
10120,
10130,
};
int FindIndex(int *vals, int size, int search)
{
int i;
float l;
for ( i =0; i <size ; i++)
while((value1<= j)&&(k<=value1))
{

l=(i*0.1)+7;
lcd_gotoxy(11,1);
printf(lcd_putc,"\f%2.1f",l);
printf(lcd_putc,"\%%");
delay_ms(1500);
}
}

void main(void)
{
set_tris_c(0xff);
set_tris_b(0x00);
lcd_init();
delay_us(200);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
adc_value = read_adc();
volts = ((float)(adc_value * 500)/1023.0);
delay_ms(400);

set_timer1(0);
setup_timer_1(t1_external | T1_DIV_BY_8);
delay_ms(250);
setup_timer_1(T1_DISABLED);
value=get_timer1();
value1=(value*32)/100;


jule:



lcd_gotoxy(11,4);
printf(lcd_putc,"\f%3.0f",value1);
delay_ms(1500);
lcd_gotoxy(11,1);
printf(lcd_putc,"\f%2.1f",l);
printf(lcd_putc,"\%%");
delay_ms(1500);
break;

while(true)
{
if((input(PIN_C5)==0))
{
delay_ms(20);
if(input(PIN_C5)==0)
{
delay_ms(150);
lcd_gotoxy(7,1);
printf(lcd_putc,"\fWait");
delay_ms(2500);
printf(lcd_putc,"\f%3.1f",volts);//this is temperature

printf(lcd_putc,"\°C");
delay_ms(2500);

FindIndex(k,ARRAY_SIZE,value1);
delay_ms(2500);
goto kagabo;
}
}

if(input(PIN_C4)==0)
{
if(input(PIN_C4)==0)
{
printf(lcd_putc,"\fSquare Wave");
delay_ms(2000);
}
}

if(input(PIN_C1)==0)
{
if(input(PIN_C1)==0)
{
printf(lcd_putc,"\fSine Wave");
delay_ms(2000);
}
}
}
}
 

Looks like you have declared j as a variable. It needs to be a constant. Variables take up RAM, constants only take up program space.
 

You also have floating point numbers in an int array - that isn't going to work. You have also defined 'ARRAY_SIZE' twice, only the second value will be used.

As 'upand_at_them' suggests, declare the arrays as 'const'. This should tell the compiler that the values can't be changed (they are constant) and as such can be located in program space rather than RAM. I think you will run out of RAM space anyway the way you do it at the moment, an int takes two bytes of RAM per value so such large arrays will use most if not all of the available space.

Brian.
 

You also have floating point numbers in an int array - that isn't going to work. You have also defined 'ARRAY_SIZE' twice, only the second value will be used.

As 'upand_at_them' suggests, declare the arrays as 'const'. This should tell the compiler that the values can't be changed (they are constant) and as such can be located in program space rather than RAM. I think you will run out of RAM space anyway the way you do it at the moment, an int takes two bytes of RAM per value so such large arrays will use most if not all of the available space.

Brian.
A great problem is that when I declare as const float j[]= {different values};at the compilation the ccs c compiler says:
1.Function not void does not return a value FindIndex (normally this was defined as a function)
2.Attempt to create a pointer to a constant

Plz help on this
 

int FindIndex(int *vals, int size, int search)

you are using a return type function and does not return any thing . So replace it with void type or return 0 at end if you are not returning any thing from this function
 

int FindIndex(int *vals, int size, int search)

you are using a return type function and does not return any thing . So replace it with void type or return 0 at end if you are not returning any thing from this function

Can you plz help me to draft the real codes which will print the value of l;

thanks!!
 

void FindIndex(int *vals, int size, int search)
{
int i;
float l;
for ( i =0; i <size ; i++)
while((value1<= j)&&(k<=value1))
{

l=(i*0.1)+7;
lcd_gotoxy(11,1);
printf(lcd_putc,"\f%2.1f",l);
printf(lcd_putc,"\%%");
delay_ms(1500);
}
}

if you don't want to return any thing
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top