|
|
View previous topic :: View next topic |
Author |
Message |
sebdey
Joined: 11 Sep 2003 Posts: 17 Location: Switzerland
|
memcpy and const tables |
Posted: Wed Mar 28, 2007 7:51 am |
|
|
Hello,
I am developing an application with a graphical LCD, and am running into the problem of displaying bitmaps on my lcd.
I want to store my bitmaps in rom using a #rom statement. But I then cannot retrieve the correct data using memcpy. Here's my code:
Bitmap declaration and storage
Code: |
#define LOGO 0x0F000
...
#rom int8 LOGO = {0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
|
In main, after lcd initialisation etc...
Code: |
...
glcd_drawbitmap(90,30,LOGO,8,16);
...
|
The glcd_drawbitmap routine
Code: |
void
glcd_drawbitmap(int x, int y, int32 bitmapAddress, int width, int height)
{
int bitmapData[1024];
int *bitmapPointer=bitmapData;
int i,j,k;
height=height>>3;
memcpy(bitmapPointer, bitmapAddress, width*height);
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
for(k=0;k<8;k++)
{
if(bit_test(*bitmapPointer,k))
glcd_pixel(x+j,y+(i<<3)+k,ON);
else
glcd_pixel(x+j,y+(i<<3)+k,OFF);
}
bitmapPointer++;
}
}
}
|
This will only output garbage (and always the same garbage) on my lcd, I suspect the memcpy to not copy the correct area of my flash into the bitmapData table. What am I doing wrong ? I searched the forum for memcpy and #rom, but nothing really helped me...
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 28, 2007 11:29 am |
|
|
Make a small test program where you test only the memcpy()
function. Study the function documentation. Look at the .LST file
to see what it's doing.
By a small program, I mean less than 6 lines of code in main().
Concentrate on fixing the memcpy() problem only. Don't write
to the LCD. Don't #include the LCD driver files. Use printf()
to a terminal window for output. Keep it very simple.
If you can't solve it, then post your test program. Be sure to post
all the #include, #use and #fuses statements. Also post your compiler
version. |
|
|
me, sebdey Guest
|
|
Posted: Thu Mar 29, 2007 12:43 am |
|
|
Thanks PCM,
but here I am not looking for a lesson but an answer from someone who could reduce my development time...
I have already solved my problem by other means, i.e. declaring the arrays as:
Code: |
#define LOGO_ID 0
const int8 LOGO[16] = {0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
#define BITMAP1_ID 1
const int8 BITMAP1[length] = {data...};
#define BITMAP2_ID 2
const int8 BITMAP2[length] = {data...};
...
|
and then reading them in my glcd_drawbitmap by using:
Code: |
(...)
switch (bitmapID)
{
case LOGO_ID:
memcpy(bitmapPointer,LOGO, width*height);
break;
case BITMAP1_ID:
memcpy(bitmapPointer,BITMAP1, width*height);
break;
(...)
|
But even if this is working, it's not what I want. If no one is willing to give me a short and quick answer, I don't want to lose time trying things that I already tried for hours.
I have done tests with memcpy and standard ram arrays and also with const rom arrays and it works, but no chance with a #rom memory definition... Maybe is this completely impossible and I should resolve it with a read_program_memory or my current solution...
Have a good day... |
|
|
kevcon
Joined: 21 Feb 2007 Posts: 142 Location: Michigan, USA
|
|
Posted: Thu Mar 29, 2007 7:40 am |
|
|
Because CCS dosen't handle ROM pointers correctly ( yet? ), You have to fake it out and write your own routines.
This is geard towards PIC18s, it may work for you, but I don't know for sure because I don't know what chip you are using.
Code: |
#define TBLPTRU 0xFF8
#define TBLPTRL 0xFF6
#define TABLAT 0xFF5
#byte _TBLPTRU = TBLPTRU
#byte _TBLPTRL = TBLPTRL
#byte _TABLAT = TABLAT
void rom_to_ram_memcpy(int8 *ramptr, int8 *romptr, int16 numberofBytes);
|
Code: |
#define LOGO 0x01000
#rom int8 LOGO = { 0x12, 0x34 }
int8 bitMapData[ 16 ];
void main( void )
{
int8 *bitMapPointer = bitMapData;
rom_to_ram_memcpy( bitMapPointer, LOGO, 2 );
}
void rom_to_ram_memcpy(int8 *ramptr, int8 *romptr, int16 numberofBytes)
{
char *_TBLPTR;
#locate _TBLPTR = TBLPTRL
//Setup ROM TABLE Pointer
_TBLPTRU = 0x00;
_TBLPTR = romptr;
for (; numberofBytes-- ; ramptr++ ) {
#asm
TBLRD *+
#endasm
*ramptr = _TABLAT;
}
}
|
|
|
|
_sebdey Guest
|
|
Posted: Thu Mar 29, 2007 8:53 am |
|
|
Thanks for your answer kevcon !
I will then have to see which method is the best for my project in terms of ease of use/implementation/scalability....
Btw, my fault, I forgot to mention that I am using 18F4620, and 3.235...
Have a good day/night/evening ! |
|
|
|
|
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
|