|
|
View previous topic :: View next topic |
Author |
Message |
Joseph88
Joined: 14 Aug 2006 Posts: 17
|
Problem with memory map |
Posted: Thu Jan 25, 2007 9:19 am |
|
|
I'm working on a project with multiple LCD's (24 to be exact) and keyboard input. The project also requires that I save the user keyboard input. Everything works fine up to LCD 16, but from lcd 17-24, it repeats the memory information from LCD's 1-8. I'm using the 18F4525 with the latest CSC compiler. This is how I have the memory configured:
Code: |
unsigned int32 memMap(int8 lcdNum){
switch(lcdNum) {
case 1 : return 0x0000; break;
case 2 : return 0x0040; break;
case 3 : return 0x0080; break;
case 4: return 0x00C0; break;
case 5: return 0x0100; break;
case 6: return 0x0140; break;
case 7: return 0x0180; break;
case 8: return 0x01C0; break;
case 9: return 0x0200; break;
case 10: return 0x0240; break;
case 11: return 0x0280; break;
case 12: return 0x02C0; break;
case 13: return 0x0300; break;
case 14: return 0x0340; break;
case 15: return 0x0380; break;
case 16: return 0x03C0; break;
case 17: return 0x1000; break;
case 18: return 0x1040; break;
case 19: return 0x10C0; break;
case 20: return 0x1100; break;
case 21: return 0x1140; break;
case 22: return 0x1180; break;
case 23: return 0x11C0; break;
case 24: return 0x1200; break;
}
}
//This is how i'm reading the memory:
void handle_read_memory(){
for (lcdNum=1; lcdNum <= numberofLCDs; lcdNum++){
read_string(memMap(lcdNum));
}
}
This is how i'm writing to memory:
void handle_save_memory(){
write_string(memMap(lcdNum), userLabel);
}
//readstring function
void read_string(unsigned int16 address ) {
int i =0;
char c;
for (i=0; i < 16; i++){
c=read_eeprom(address);
address++;
}
}
//writestring function - function to take string array from keyboasrd and //write to eeprom
void write_string(unsigned int16 address, int8 string[]) {
int8 ctr=0;
for(ctr = 0; ctr < 16; ctr++){
write_eeprom(address++,string[ctr]);
}
}
|
Is there anything obvious that i'm doing wrong with my memory setup? |
|
|
Ttelmah Guest
|
|
Posted: Thu Jan 25, 2007 11:08 am |
|
|
A couple of comments.
First, why fiddle around with your 'memmap' function. Why not just declare this as a constant array?.
So, something like:
Code: |
const int16 memmap[] = {
0x0000,0x0000,0x0040,0x0080,
0x00C0,0x0100,0x0140,0x0180,
0x01C0,0x0200,0x0240,0x0280,
0x02C0,0x0300,0x0340,0x0380,
0x03C0,0x1000,0x1040,0x10C0,
0x1100,0x1140,0x1180,0x11C0,0x1200 };
|
Then 'memmap[lcdnum]', will access the required value (note the extra '0' entry, since C arrays start at 0).
Now then, one thing leaps out. You appear to have a local variable, and a global, of the same name. In the 'handle_read_memory' function, you access 'lcd_num', which is not declared in this function, so is presumably 'global', but then in the MemMp function, you use a local 'lcd_num' value. Now this is meant to be OK, but I'd always consider it to be potentially dangerous...
Best Wishes |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Thu Jan 25, 2007 12:04 pm |
|
|
What is the size of the eeprom? If your eeprom is too small, you might be rolling over. Notice the address of 17, 0x1000 which could get confused with LCD 1's 0x0000. |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Thu Jan 25, 2007 12:17 pm |
|
|
unsigned int32 memMap(int8 lcdNum);
It should be int16
Humberto |
|
|
Joseph88
Joined: 14 Aug 2006 Posts: 17
|
|
Posted: Fri Jan 26, 2007 7:07 am |
|
|
Thanks for the help guys. I changed the memory structure so that it doesn't pass 0x1000, and it did the trick.
Joe |
|
|
|
|
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
|