|
|
View previous topic :: View next topic |
Author |
Message |
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
Typemod using custom external ram functions |
Posted: Thu Apr 20, 2006 2:38 pm |
|
|
PCWH R3.249 I am seeing a typemod bug I can't explain.
I am using typemod for access to external memory as shown here.
http://www.ccsinfo.com/faq.php?page=addressmod
I made shell read and write functions.
The write function just prints the proposed data.
If I put in a line for "record2" I see expected data.
If I take that line out, I don't see the expected data.
Does anyone understand whats going on here?
Code: | #include <18F452.H>
#use delay(clock=40000000)
#fuses h4,nowdt,noprotect,nolvp
#use rs232(baud=19200,xmit=PIN_C0,invert,stream=DEBUG,disable_ints) // stderr(same as debug)
#case
#zero_ram
//---------------------------------------------
mr(int32 addr,int8 *data,int8 size);
mw(int32 addr,int8 *data,int8 size);
//---------------------------------------------
typemod <,mr,mw,0x0000,0xFFFF>RAM;//24 bit address ,16 bit range
//---------------------------------------------
struct rec_struc //rec definition
{
int16 pc;
int16 ai;
int8 tz;
}RAM record;
int16 RAM record2;
//====================================================================//
void main(void)
{
setup_adc_ports(NO_ANALOGS);
set_tris_a(0);set_tris_b(0);set_tris_c(0);set_tris_d(0);set_tris_e(0);
printf("Start\n\r");
record.pc=0x1122;
record.ai=0x3344;
record.tz=0x55;
record2 =0x6677; //<----------------Take out this line and it BLOWS up
printf("DONE !\n\r");
while(1)
{
}
}
//======================multi_write===========================//
mw(int32 addr,int8 *data,int8 size)
{
int8 x;
int32 start_size;
start_size=size;
fprintf(DEBUG,"write addr=%lu s=%u ",addr,size);
for(x=0;x<size;x++,data++){
fprintf(DEBUG,"0x%X,",*data);
}
fprintf(DEBUG,"\n\r");
return(TRUE);
}
//======================multi_read===========================//
mr(int32 addr,int8 *data,int8 size){
}
|
Code: |
//--BAD--
write addr=0 s=2 0x22,0x00,
write addr=2 s=2 0x44,0x02,
write addr=4 s=1 0x55,
|
Code: |
//--Good--
write addr=0 s=2 0x22,0x11,
write addr=2 s=2 0x44,0x33,
write addr=4 s=1 0x55,
write addr=5 s=2 0x77,0x66,
|
Last edited by treitmey on Thu Apr 20, 2006 3:46 pm; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 20, 2006 3:34 pm |
|
|
Quote: | struct rec_struc //rec definition
{
int16 pc;
int16 ai;
int8 tz;
}RAM record;
int16 RAM record2; |
One thing you might try is to take the "record" declaration out
of the structure and typdef the structure instead. Then use the
type to declare "record" on a separate line of code. I haven't
tested this but it's something to try. The way you describe the
problem implies that possibly CCS is looking for a typedef, and
they may have only tested it in that manner. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Thu Apr 20, 2006 3:50 pm |
|
|
Thanks
Seems to work. Doesn't give me a "warm fuzzy" feeling tho.
Code: | #include <18F452.H>
#use delay(clock=40000000)
#fuses h4,nowdt,noprotect,nolvp
#use rs232(baud=19200,xmit=PIN_C0,invert,stream=DEBUG,disable_ints) // stderr(same as debug)
#case
#zero_ram
int8 ERRORS;
#define FRAM_CHIPS 4
//-------prototype-------------------------------
mr(int32 addr,int8 *data,int8 size);
mw(int32 addr,int8 *data,int8 size);
//---------------------------------------------
typemod <,mr,mw,0x0000,0xFFFF>RAM;//24 bit address ,16 bit range
//---------------------------------------------
struct rec_struc //rec definition
{
int16 pc;
int16 ai;
int8 tz;
};
//====================================================================//
void main(void)
{
struct rec_struc RAM record;
setup_adc_ports(NO_ANALOGS);
set_tris_a(0);set_tris_b(0);set_tris_c(0);set_tris_d(0);set_tris_e(0);
printf("Start\n\r");
record.pc=0xBBAA;
record.ai=0xDDCC;
record.tz=0xFF;
printf("DONE !\n\r");
while(1)
{
}
}
//======================multi_write===========================//
mw(int32 addr,int8 *data,int8 size)
{
int8 x;
int32 start_size;
start_size=size;
fprintf(DEBUG,"write addr=%lu s=%u ",addr,size);
for(x=0;x<size;x++,data++){
fprintf(DEBUG,"0x%X,",*data);
}
fprintf(DEBUG,"\n\r");
return(TRUE);
}
//======================multi_read===========================//
mr(int32 addr,int8 *data,int8 size){
} |
I responded so fast, cause I came to that same conclusion. Didn't know why it acted like that tho. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Thu Apr 20, 2006 4:08 pm |
|
|
BTW:
#byte and #locate will also screw up typemod variables
It looks like the compiler understands the use,.. but the second
byte of data transfered is corrupted again. |
|
|
|
|
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
|