|
|
View previous topic :: View next topic |
Author |
Message |
snock
Joined: 10 Oct 2011 Posts: 24
|
Storing parameters in flash on PIC24FJ64GB106 |
Posted: Thu Oct 13, 2011 10:49 am |
|
|
I have a project running on a PIC24FJGB106 and need to store some parameters in the flash program memory. I just can't see where I am going wrong on writing to and reading from the flash. It's either not getting properly stored or read back properly.
Here are the relevant pieces of the code:
Code: |
#define MAXZONE 6
#define PARAM_ADDR 0x9800
#define WRITE_SIZE getenv("FLASH_WRITE_SIZE")
// * ZONE CONTROL STRUCTURE ****************************************************
struct z_type {
unsigned int32 dose_c; // Dose counter for zone
unsigned int32 on_t; // On time (minutes, def=5 min)
unsigned int32 off_t; // Off time (minutes, def=115 min)
unsigned int32 pk_off_t; // Peak off time (minutes, def=115 min)
unsigned int32 drain_t; // Drain timer to keep zone / field valve open
unsigned int32 flt_flsh_t; // Filter flush time (seconds, def=20 sec)
unsigned int32 flt_flsh_c; // Filter flush counter (def=1 cycle)
unsigned int32 flt_flsh_cyc; // Cycle counter for flush valve
unsigned int32 fld_flsh_t; // Field flush time (minutes, def=1 min)
unsigned int32 fld_flsh_c; // Field flush counter (def=20 cycles)
unsigned int32 fld_flsh_cyc; // Cycle counter for field valve
};
// *****************************************************************************
static struct z_type zone[MAXZONE];
// * PARAMETER SAVE ROUTINE ****************************************************
void save_param(unsigned int32 addr) {
disable_interrupts(INTR_GLOBAL);
write_program_memory(addr, zone, WRITE_SIZE);
enable_interrupts(INTR_GLOBAL);
}
// *****************************************************************************
// * PARAMETER LOAD ROUTINE ****************************************************
void load_param(unsigned int32 addr) {
disable_interrupts(INTR_GLOBAL);
read_program_memory(addr, zone, WRITE_SIZE);
enable_interrupts(INTR_GLOBAL);
}
// ***************************************************************************** |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu Oct 13, 2011 2:52 pm |
|
|
The program memory, is written in pages. An erase only takes place, with the write function, if you write to the first address of the page. Now this gets fractionally difficult, since the write instruction works in bytes, while the page size is in instruction words (512words). The page size is 1536 bytes (0x600), and your 0x9800 address, does not divide evenly by this. You need to use 0x9600, or 0x9C00, which are the bank addresses either side.
Best Wishes |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Fri Oct 14, 2011 12:13 am |
|
|
Quote: | The page size is 1536 bytes (0x600), and your 0x9800 address, does not divide evenly by this. You need to use 0x9600, or 0x9C00, which are the bank addresses either side. |
The assumption is wrong. I agree, that the PIC24 flash size calculation is confusing, if you're not familiar to it.
PIC24 flash memory addresses are word addresses (except for the *.hex file representation that uses byte addresses). Page base addresses are a multiple of 0x400. They span a memory size of 1024 words respectively 2048 bytes each. But only 3 of 4 bytes are populated, so you get a 1536 bytes of actual storage. The 512 dummy bytes also imply the fact, that you can't store continuous data structures to the flash without remapping it.
If you are interested in an effective storage of data in PIC24 flash memory, you should review AN1095 Emulating Data EEPROM for PIC18 and PIC24. |
|
|
|
|
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
|