View previous topic :: View next topic |
Author |
Message |
joseph20480
Joined: 21 Dec 2011 Posts: 42
|
Pic24fj16ga004 - Saving data into program memory |
Posted: Mon Jan 17, 2022 11:50 am |
|
|
dear eveyone,
My question is about saving data into memory program, as an eeprom.
My pic : 24fj16ga004.
I have found a lot of explain, but i'm already confused.
What I think:
1. define start address of my program on top of my code.
2. use command provided by CCS.
3. Configure my MPLAB / Pickit for do not erase the data place.
it's right ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Mon Jan 17, 2022 12:50 pm |
|
|
How much data do you need to store?.
How often do you need to update it?.
Easiest way is to use the virtual_eeprom driver supplied with the compiler.
Downside is that this is quite bulky, and needs a reasonably large amount
of the program memory.
It does though allow you to write single bytes just as to an EEPROM.
Trying to write the memory yourself, even using the supplied functions
is quite hard. You are dealing with three bytes of data every four bytes,
and have to erase an entire page to clear anything.
Microchip have an application note about emulating the behaviour of an
EEPROM in this memory, and it is this that the CCS driver emulates. |
|
|
joseph20480
Joined: 21 Dec 2011 Posts: 42
|
|
Posted: Thu Jan 20, 2022 5:17 am |
|
|
My need is to store 3 16bits value. no more.
The value is like offset / setting of my system.
Sure, add a little I2C eeprom is one solution but add it for so little data seem to be luxury.
Have you an advice for me ? an example ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Thu Jan 20, 2022 6:34 am |
|
|
As I said, use the CCS driver.
You would need something like:
Code: |
//your processor header files clock settings etc.
//Assuming an RS232 is also configured
#define VIRTUAL_EEPROM_8BIT_ADDY
#include "virtual_eeprom.c"
void main()
{
union {
int16 vals[3];
BYTE bytes[];
}demo_val = {1,2,3};
int ctr;
init_virtual_eeprom(); //start the driver
while(TRUE)
{
if (virtual_eeprom_max_entries() ==0) //this is a diagnostic to tell you
//if there is anything stored in the virtual EEPROM
{
//eeprom is empty so write some data.
for (ctr=0;ctr<sizeof(demo_val);ctr++)
write_virtual_eeprom(ctr,demo_val.bytes[ctr]);
}
//Now read the data that is in the EEPROM and print it.
for (ctr=0;ctr<sizeof(demo_val);ctr++)
demo_val.bytes[ctr]=read_virtual_eeprom(ctr);
//read the stored bytes
//Now print the three 16bit values
for (ctr=0;ctr<sizeof(demo_val)/2;ctr++)
printf("Val %d is %d\n", ctr, demo_val.vals[ctr]);
delay_ms(1000:
}
}
|
This shows writing three 16bit values to the virtual eeprom (only after
the chip is erased), and then reading these and displaying them.
For your chip the virtual EEPROM would start at 0x2400.
To explain, the erase pages are 512bytes in size. The chip has it's config
data at the top of the top page (so this cannot be erased), and 0x2BFF,
So the page below this is 0x2800, and the page below this is at 0x2400.
The driver needs two pages so it can copy stuff from one to the other
when an erase is needed. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Thu Jan 20, 2022 7:15 am |
|
|
If these 3 values are computed during running of the program,say calibrations of 'configurations', then you should also have 3 'default' values stored as well.
That way, when the program runs the first time 'bad things' don't happen. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Thu Jan 20, 2022 7:22 am |
|
|
Yes.
On systems I do with calibrations like this, they store a checksum for the
calibration values, and if the checksum is wrong, or the values fall outside
the legal range, they drop back to a 'master' calibration value. This is the
first one generated after the system is initialised, and is stored separately
from the 'in use' calibrations. |
|
|
joseph20480
Joined: 21 Dec 2011 Posts: 42
|
|
Posted: Thu Jan 20, 2022 2:56 pm |
|
|
your reply is -always- rapid and clear.
thanks for all
it's works perfectly |
|
|
|