|
|
View previous topic :: View next topic |
Author |
Message |
qwwe
Joined: 17 Sep 2017 Posts: 59
|
*** Error 71 "alarm2.c" Line 545(1,2): Out of ROM, |
Posted: Thu Nov 23, 2017 2:17 pm |
|
|
Hi, I want to save a sound that I've converted to Hex code into ROM memory Microcontroller and then play it through the Changing the PWM duty cycle.
But when compiling, it gives the following error:
Code: |
*** Error 71 "alarm2.c" Line 545(1,2): Out of ROM, A segment or the program is too large @const688
Seg 00003-007FF, 07FD left, need 01FC9
Seg 00000-00002, 0000 left, need 01FC9 Reserved
1 Errors, 0 Warnings.
Build Failed.
|
Code: |
#include <16f1823.h>
#device *=16
#fuses NOWDT //NO Watch Dog Timer
#fuses PUT //Power Up Timer
#fuses NOLVP //No low voltage programing
#fuses NOCPD //No EE protection
#fuses NOPROTECT //Code not protected from reading
#fuses NOWRT //Program memory not write protected
#fuses NODEBUG //No Debug mode for ICD
#fuses NOBROWNOUT //No brownout reset
#USE DELAY (internal=1000000)
#include <stdio.h>
#include <string.h>
int32 i;
const char hoshdar[8128] = {0x52, 0x49, 0x46, 0x46, 0xB8, 0x1F, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,.............
.............
.............
};
void main()
{
set_tris_c(0b11101111);
output_low(PIN_C5);
setup_timer_2(T2_DIV_BY_1,20,1);
setup_ccp1(ccp_pwm);
while(TRUE)
{
for(i=0;i<8128;i++)
{
set_pwm1_duty(hoshdar[i]);
}
}
}
|
Thanks for the advice |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Thu Nov 23, 2017 2:44 pm |
|
|
You really,really need to read the datasheet ! I know, 400 pages of dull, boring information, but a lot of it is very,very important. I downloaded the DS and saw that in the 'family types' chart on page 4 it says that PIC has 2K words of program storage.
so....
do you think you can store 8,000 bytes of data AND your program into 2K words ??
THIS is why it is CRITICAL to read any PICs datasheet. Even after 20 years of 'playing with PICs' I scan all the pages, read entire chapters 2-3 times when I'm using a new peripheral . It's 'little' details like VDD vs speed charts, odd register definitions, clock configurations...that you need to understand. Those are just some of the reasons I've standardized all my products on the PIC18F46K22. I've yet to run out of pins,peripherals or memory...
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19553
|
|
Posted: Thu Nov 23, 2017 3:09 pm |
|
|
Particularly on a PIC16, where each ROM location only holds 14bits, so a whole ROM word has to be used for every byte. |
|
|
qwwe
Joined: 17 Sep 2017 Posts: 59
|
|
Posted: Thu Nov 23, 2017 11:26 pm |
|
|
Now, what should I do to solve the problem?
I did not get it right. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19553
|
|
Posted: Fri Nov 24, 2017 12:06 am |
|
|
Attach something like an external EEPROM, and store your data in this.
A little 24128. will give you 16K bytes of storage.
Only two wires needed (preferably the hardware MSSP lines), drivers in the standard library. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Fri Nov 24, 2017 5:44 pm |
|
|
The other option is to select a PIC with a LOT more 'program memory'. PICs are really , really inexpensive today.
If this is a hobby, consider a 40 pin device with TWO hardware UARTs and 32 or 64KW of memory.
I've been using the PIC18F46K22 as my 'goto' PIC for years now and have yet to run out of memory or peripherals.It's also good for either 3V or 5 V operation at 64MHz ! |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1911
|
|
Posted: Fri Nov 24, 2017 7:14 pm |
|
|
temtronic wrote: | PICs are really , really inexpensive today.
If this is a hobby, consider a 40 pin device with TWO hardware UARTs and 32 or 64KW of memory. |
I don't like the 64kW models. The heat sinks are too unwieldy.
[I'm teasing] |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Fri Nov 24, 2017 8:55 pm |
|
|
Reminds me of how we checked for a bad RAM chips in the 70s..
test each chip by touching with a finger, the one that burnt you was the bad one ! Easy to replace as everything was in sockets back then ! Good old days... |
|
|
qwwe
Joined: 17 Sep 2017 Posts: 59
|
|
Posted: Fri Nov 24, 2017 11:19 pm |
|
|
I used the 16f1829 IC, but it still has the same problem
This IC has 8 KB of memory.
And I also reduced the size of the array.Because I used the Midi format this time to reduce the volume of the song
Code: |
#include <16f1829.h>
#device *=16
//#fuses HS //High speed Osc (> 4mhz for PCM/PCH)
#fuses NOWDT //NO Watch Dog Timer
#fuses PUT //Power Up Timer
#fuses NOLVP //No low voltage programing
#fuses NOCPD //No EE protection
#fuses NOPROTECT //Code not protected from reading
#fuses NOWRT //Program memory not write protected
#fuses NODEBUG //No Debug mode for ICD
#fuses NOBROWNOUT //No brownout reset
#USE DELAY (internal=1000000)
#include <stdio.h>
#include <string.h>
int16 i;
const unsigned Char data[2088] = {
0x4D, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x02,
.........
.......
};
void main()
{
set_tris_c(0b11101111);
output_low(PIN_C5);
setup_timer_2(T2_DIV_BY_1,30,1);
setup_ccp1(ccp_pwm);
while(TRUE)
{
for(i=0;i<2088;i++)
{
set_pwm1_duty(data[i]);
}
}
}
|
This time, this error
Code: |
*** Error 71 "alarm2.c" Line 168(1,2): Out of ROM, A segment or the program is too large @const760
Seg 00003-007FF, 07FD left, need 00831
Seg 00800-00FFF, 0800 left, need 00831
Seg 01000-017FF, 0800 left, need 00831
Seg 01800-01FFF, 0800 left, need 00831
Seg 00000-00002, 0000 left, need 00831 Reserved
1 Errors, 0 Warnings.
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Sat Nov 25, 2017 6:31 pm |
|
|
hmm you need to post your compiler version !! Critical
While the #device =16 should have allowed the memory to appear contiguous, perhaps it's a compiler bug.
Curiously it needs 0x831 which is 2097 decimal and your array is 2088. Maybe the 10 extra bytes are 'overhead' but it is a 'red flag' to me.
Makes me wonder if you're trying to use a 'student' version of the compiler where it's 'range' is limited ??
Again, please post compiler version. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Nov 25, 2017 10:28 pm |
|
|
The compiler is not allowing a 'const' array to be larger than a Flash
memory page. I can't find this documented anywhere, so far.
They do document that a function can't exceed a 'segment' (Flash memory
page size): https://www.ccsinfo.com/faq.php?page=out_of_rom
The page size for the 16F1829 is 2K. So that's why you're getting the
error. Your array exceeds 2K. Also, a few more ROM words are added
by the compiler to allow accessing the array data.
One simple solution is to break up the array into two or more smaller
arrays. Then add code to access the correct array based on the index
value. Look at the CCS driver file, Graphics.c. (This is in the \Drivers
folder in the CCS installation folder on your PC). It has two font arrays,
named FONT and FONT2. Each one contains part of the font data.
Look at the glcd_text57() function. It has the following code which
selects the correct array to use, depending on the index value:
Code: | if(*textptr < 'S') // Checks if the letter is in the first font array
memcpy(pixelData, FONT[*textptr - ' '], 5);
else if(*textptr <= '~') // Check if the letter is in the second font array
memcpy(pixelData, FONT2[*textptr - 'S'], 5);
else
memcpy(pixelData, FONT[0], 5); // Default to space
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Sun Nov 26, 2017 6:57 am |
|
|
Interesting what PCM P says.....makes 100% sense. Also 'interesting' that the CCS code gets around the 'bug'. Makes me thik they knew about it back then and have never addressed the issue, maybe since no ones reported it ?? |
|
|
|
|
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
|