|
|
View previous topic :: View next topic |
Author |
Message |
chargedneuron
Joined: 05 May 2007 Posts: 6 Location: Springfield, Oregon, USA
|
Assistance with AddressMod() |
Posted: Wed Oct 10, 2007 1:18 am |
|
|
I am trying to create a LARGE data space in my external RAM. For the moment and the sake of simplicity I am using a 24FC1025, (1024K) Flash Chip connected to my PIC16F77 processor.
PIC16F77 @ 20MHz
24FC1025 1024KB Flash, (using 512K) over I2C at 1Mb.
RS232 @ 19200 for relaying debug data to the terminal.
Compiler version 4.056 via MPLab
I seem to be having an issue with AddressMod(); I have searched the forums looking for a bit more info then what is found in the manuals. So far the suggestions found in the few threads related to my issue have yielded very little improvements.
If I use the internal RAM of the processor everything seems to work just fine for a small array. I have also proven out my E2 routines.
I have attached a boiled down version of my program.
Code: |
// Select Device type
#include <16F77.h>
// Set large pointers for optimized memory configuration
#device *=16
// Set the Device's Internal Configuration and Fuses
// High Speed System Clock
// No WatchDog Timer
// No Code Protection
#fuses HS,NOWDT,NOPROTECT
// Specifiy the Device's Clock frequency
#use delay(clock=20000000)
// Set the Device's I/O Protocol
#use Fast_IO // Set Port C to Fast I/O ( Comms )
// Configure a UART Port for the Device
#use rs232 (baud=19200, xmit=PIN_C6, rcv=PIN_C7)
// Configure a I2C Port for the Device
#use i2c(master, scl=PIN_C1, sda=PIN_C2, Force_SW, Fast = 1000000 )
// *** Program Libraries *** *** *** *** *** *** *** *** #include <stdlibm.h> // Attach the standard memory librarys
#include <e:\Color LCD Demo\Expanded_Ram_Flash.c> // Attach Expanded Ram (Flash)
// --- Main Function ---
void main()
{
// Function Varibles
int8 index;
int16 *Pixel;
// --- Setup Hardware ---
Set_Tris_C( 0x80 ); // All Output 7 input
// --- Setup drivers ---
init_ext_eeprom(); // Initalize the Flash
// --- Function body ---
printf("\f\r\nStart\n\n");
// --- Allocate required RAM ---
Pixel = malloc( sizeof(int16) * 20 );
// --- Recall RAM to CLCD ---
printf("\r\nAction");
if( Pixel != NULL )
printf("\r\n\nAllocated\r\n");
else
{
printf("\r\n\nNOT ALLOCATED!\r\n");
delay_ms(5000);
}
for( index = 0; index <= 20; index++ )
Pixel[ index ] = index;
for( index = 0; index <= 20; index++ )
printf("\r\n Index %u Element %LX", index, Pixel[ index ] );
printf("\r\n\nDone\n\n\n");
free( Pixel );
// --- Endless Loop ---
while( true );
}
|
With a result of
Code: |
Start
Action
Allocated
Index 0 Element 0000
Index 1 Element 0001
Index 2 Element 0002
Index 3 Element 0003
Index 4 Element 0004
Index 5 Element 0005
Index 6 Element 0006
Index 7 Element 0007
Index 8 Element 0008
Index 9 Element 0009
Index 10 Element 000A
Index 11 Element 000B
Index 12 Element 000C
Index 13 Element 000D
Index 14 Element 000E
Index 15 Element 000F
Index 16 Element 0010
Index 17 Element 0011
Index 18 Element 0012
Index 19 Element 0013
Index 20 Element 0014
Done
|
Next I change the location that 'Pixel' is stored from Internal to External RAM.
Replacing
with
Code: |
#Type default=EE_RAM
int16 *Pixel;
#Type default=
|
and my result is now
Code: |
Start
Action
NOT ALLOCATED!
Index 0 Element 0900
Index 1 Element 0902
Index 2 Element 0904
Index 3 Element 0906
Index 4 Element 0908
Index 5 Element 090A
Index 6 Element 090C
Index 7 Element 090E
Index 8 Element 0910
Index 9 Element 0912
Index 10 Element 0914
Index 11 Element 0900
Index 12 Element 0900
Index 13 Element 0900
Index 14 Element 0900
Index 15 Element 0900
Index 16 Element 0900
Index 17 Element 0900
Index 18 Element 0900
Index 19 Element 0900
Index 20 Element 0900
Done
|
I don't understand where the 0x09** is coming from. Also the array no longer points to a 2 byte object. And it should have allocated the memory to the object...
The E2 code is below
Code: |
#include <e:\Color LCD Demo\241025.c> // Attach I2C FLASH functions
// --- Function Prototypes --- --- --- --- ---
void InitExpRam ( void );
void ReadExpRam ( int32 Addr, int8 *Ram, int8 Bytes );
void WriteExpRam ( int32 Addr, int8 *Ram, int8 Bytes );
// === Functions === === === === ===
// --- Initalize external Ram --- --- --- --- ---
void InitExpRam ( void )
{
init_ext_eeprom(); // Initalize the Flash
}
// --- Read external Ram --- --- --- --- ---
void ReadExpRam( int32 Addr, int8 *Ram, int8 Bytes )
{
int index;
for( index = 0; index < bytes; ++index )
*Ram = read_ext_eeprom( Addr );
}
// --- Write external ram --- --- --- --- ---
void WriteExpRam( int32 Addr, int8 *Ram, int8 Bytes )
{
int index;
for( index = 0; index < bytes; ++index )
write_ext_eeprom( Addr, *Ram );
}
// --- Apply Expanded RAM --- --- --- --- ---
addressmod( EE_RAM, ReadExpRam, WriteExpRam, 0x0000, 0xFFFF );
|
_________________ "Trouble? I call it sport!" - Hyde - The League of Extraordinary Gentlemen
Last edited by chargedneuron on Wed Oct 10, 2007 6:45 pm; edited 1 time in total |
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
|
Posted: Wed Oct 10, 2007 11:44 am |
|
|
It looks like you are attempting to apply concepts that are good for a PC to an Embedded device. You can not dynamically allocate memory on a PIC. Thats not to say memory cant be recycled, it can between non recursive functions for local variables.
You can not really use a pointer to external memory in an EEPROM. The instruction set of the PIC does not support that kind of operation. You know what you want to accomplish. You have to think how is this going to actually work at a low level. I would suggest writing a function to load the indexed data from the EEPROM into LCD RAM. It doesn't have to actually reside in the PIC RAM more than a byte at a time. |
|
|
chargedneuron
Joined: 05 May 2007 Posts: 6 Location: Springfield, Oregon, USA
|
|
Posted: Wed Oct 10, 2007 7:01 pm |
|
|
Many thanks for your comments.
I must ask though, if it is not possible to dynamically allocate RAM using AddressMod() & malloc() then why are they included in the CCS compiler?
Obviously by my initial results show that the malloc() works because I managed to allocate 20 bytes, store and recall data from that array.
After applying AddressMod() I continue to see the data allocated but the data size seems corrupted. If I clear the FLASH prior to running this program, using the AddressMod(), The Flash shows that the data was written to the flash. However it seems that the data object sizes are all wrong.
Notice that the second version of the program shows that the array was initialized and written to. Index 0 to Index 10 seem to have the original data there, just a bit compressed and with a mysterious extra byte, (0x09).
For example;
Index 0 Element 0900
Index 1 Element 0902
Index 2 Element 0904
Index 3 Element 0906
Index 4 Element 0908
Index 5 Element 090A
Index 6 Element 090C
Index 7 Element 090E
Index 8 Element 0910
Index 9 Element 0912
Index 10 Element 0914
Index 11 to Index 20 are actually pointing to Index 22 to Index 40.
The Flash shows that it was written to as a INT8 object size. If the program is rewritten with a INT8 object size the program works just fine.
Code: |
Start
Action
Clear Flash
NOT ALLOCATED!
Index 0 Element 00
Index 1 Element 01
Index 2 Element 02
Index 3 Element 03
Index 4 Element 04
Index 5 Element 05
Index 6 Element 06
Index 7 Element 07
Index 8 Element 08
Index 9 Element 09
Index 10 Element 0A
Index 11 Element 0B
Index 12 Element 0C
Index 13 Element 0D
Index 14 Element 0E
Index 15 Element 0F
Index 16 Element 10
Index 17 Element 11
Index 18 Element 12
Index 19 Element 13
Index 20 Element 14
Done
Flash Contents
0000 --> 00
0001 --> 01
0002 --> 02
0003 --> 03
0004 --> 04
0005 --> 05
0006 --> 06
0007 --> 07
0008 --> 08
0009 --> 09
000A --> 0A
000B --> 0B
000C --> 0C
000D --> 0D
000E --> 0E
000F --> 0F
0010 --> 10
0011 --> 11
0012 --> 12
0013 --> 13
0014 --> 14
|
It is my guess that somewhere in AddressMod(), when it evaluates the object size and stores that in the variable 'byte' the object size is getting messed up. I would say that this could work if we can figure out where the object size is getting fouled up.
Many Thanks!
Cheers! - JMc _________________ "Trouble? I call it sport!" - Hyde - The League of Extraordinary Gentlemen
|
|
|
|
|
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
|