View previous topic :: View next topic |
Author |
Message |
astus
Joined: 17 Nov 2003 Posts: 12 Location: Australia
|
EEPROM on pic16f877 |
Posted: Tue Nov 18, 2003 4:43 pm |
|
|
Hi,
I'm having a problem writing to the eeprom in a 16f877. I have tried to use the built in function write_eeprom with no luck and also used a another users function eeprom_write that was posted in this fourm. The code posted is below, also my compilier version is pcm 2.734.
Note that para[] is a external array. The system just reads back 0xFF.
Code: |
void eeprom_write (char address, char data)
{
EEADR = address;
EEDATA = data;
bit_clear(PIR2, b_EEIF); //clear EEPROM flag
bit_clear(EECON1, b_EEPGD); //access to data memory
bit_set(EECON1, b_WREN); //access to data memory
//required
EECON2=0x55;
EECON2=0xAA;
bit_set(EECON1, b_WR); //start the write
while(bit_test(EECON1, b_WR)){}
bit_clear(EECON1, b_WREN); //access to data memory
bit_clear(PIR2, b_EEIF); //clear EEPROM flag
}
void load_paras() {
int i;
for (i=0; i < TOTAL_PARAMS; ++i ){
eeprom_write( i, 69 );
}
}
void read_data_in() {
int i;
for (i=0; i < TOTAL_PARAMS; ++i ){
para[ i ] = read_eeprom( i );
}
}
|
Any help would be appreciaited as I have been banging my head a little with this one.
Thanks
Adam Thompson |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 18, 2003 5:40 pm |
|
|
I ran the following test program with PCM vs. 2.734. It works fine.
It displays the following on the terminal window:
Start
Wrote 0x55 to eeprom address 0
Read 55
Wrote 0xAA to eeprom address 0
Read AA
Done
Try this program. If you're using a 4 MHz crystal, then change
the HS to XT. Also change the #use delay clock to 4000000.
Code: | #include <16F877.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 8000000)
#use rs232(baud = 9600, xmit=PIN_C6, rcv = PIN_C7, ERRORS)
//===========================================
main()
{
printf("Start\n\r\n\r");
write_eeprom(0, 0x55);
printf("Wrote 0x55 to eeprom address 0\n\r");
printf("Read %X\n\r", read_eeprom(0));
printf("\n\r");
write_eeprom(0, 0xAA);
printf("Wrote 0xAA to eeprom address 0\n\r");
printf("Read %X\n\r", read_eeprom(0));
printf("\n\rDone\n\r");
while(1);
}
|
|
|
|
Guest
|
|
Posted: Tue Nov 18, 2003 10:00 pm |
|
|
Thanks, I not sure what I've done but everything seems to be working!
Thanks
Again. |
|
|
csanders
Joined: 23 Apr 2005 Posts: 16
|
|
Posted: Fri Aug 10, 2007 2:34 pm |
|
|
PCM Programmer:
I am having a similar problem as well. I tried you test program, but I still can't modify the EEPROM when doing a write.
What is odd is that I can change the EEPROM values when downloading a new program via the #ROM statement & in the CCS Debug IDE, just not at runtime.
I have tried this on another MCU, but still no luck.
What is really driving me nuts is that this worked on a project I did a year ago using the exact same board. I think it must be a Fuse problem, but I can't figure it out.
Here are the Fuse settings read from the ICD Utility:
HS
NOOSCSEN
NOBROWNOUT
WDT128
NOWDT
BORV25
NOPUT
NOWAIT
MCU
CCP2C1
STVREN
DEBUG
NOLVP
NOPROTECT
NOCPD
NOCPB
NOWRT
NOWRTD
NOWRTC
NOWRTB
NOEBTR
NOEBTRB
The MCU is an 18F8720, and I am using compiler version 4.033. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 10, 2007 2:51 pm |
|
|
I notice you have the DEBUG fuse set. Are you stepping through this
code with the debugger, or placing breakpoints ?
According to the ICD2 help file, the Data EEPROM window will not
show updated values unless you read the data eeprom. In other
words, if you place a breakpoint just after the write_eeprom()
function, but before the read_eeprom(), you won't see updated
values. It will appear to not be writing to the eeprom.
Place the breakpoint on a line after the read_eeprom() function. |
|
|
csanders
Joined: 23 Apr 2005 Posts: 16
|
|
Posted: Fri Aug 10, 2007 3:35 pm |
|
|
I place the breakpoint before the write_eeprom instruction, and step through the instruction past the read_eeprom function. I verify the value returned from the read by hovering over the variable returned by the read function. I also refresh the Data EE window in the debug window to determine if the EEPROM data has been updated.
Can you think of anything else it might be?
Thanks for the help |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 10, 2007 3:38 pm |
|
|
Try running the posted program as a "stand alone" program.
Run it actual hardware. Don't use the debugger. Have the
output go to a terminal window on your PC. See if it works. |
|
|
csanders
Joined: 23 Apr 2005 Posts: 16
|
|
Posted: Mon Aug 13, 2007 7:24 am |
|
|
OK - The write function works if I am not debugging on the MCU. Is this a bug that needs to be reported, or is there something I can do on my end to make this work properly with the ICD? |
|
|
Pret
Joined: 18 Jul 2006 Posts: 92 Location: Iasi, Romania
|
|
Posted: Tue Aug 14, 2007 6:56 am |
|
|
Not that there is a number of 16F877 PIC's on the market which contains a bug in the first 4 bytes of the EE. Personally i have one of it and i found the Microchip related errata. As general hint, try to skip those first 4 bytes of EE. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 14, 2007 10:51 am |
|
|
I couldn't find an errata on the 16F877 that says the first four bytes
of eeprom have a bug. Here's the 16F877 page, with links to the three
errata documents on the lower right side.
http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010241
I also did a search of the Microchip site with Google. I didn't see any
such errata. I used these search strings:
Quote: | site:microchip.com 16F877 eeprom errata |
Quote: | site:microchip.com 16F877 eeprom bug |
If you have an errata on this, then post a link to it. |
|
|
nirayo
Joined: 23 Feb 2009 Posts: 10
|
read_eeprom & write_eeprom |
Posted: Wed Mar 11, 2009 8:35 am |
|
|
PCM programmer wrote: | I ran the following test program with PCM vs. 2.734. It works fine.
It displays the following on the terminal window:
Start
Wrote 0x55 to eeprom address 0
Read 55
Wrote 0xAA to eeprom address 0
Read AA
Done
Try this program. If you're using a 4 MHz crystal, then change
the HS to XT. Also change the #use delay clock to 4000000.
Code: | #include <16F877.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 8000000)
#use rs232(baud = 9600, xmit=PIN_C6, rcv = PIN_C7, ERRORS)
//===========================================
main()
{
printf("Start\n\r\n\r");
write_eeprom(0, 0x55);
printf("Wrote 0x55 to eeprom address 0\n\r");
printf("Read %X\n\r", read_eeprom(0));
printf("\n\r");
write_eeprom(0, 0xAA);
printf("Wrote 0xAA to eeprom address 0\n\r");
printf("Read %X\n\r", read_eeprom(0));
printf("\n\rDone\n\r");
while(1);
}
|
|
hello pcm programmer - I tried your code, but when compilng it I get an error "Undefined identifier -- write_eeprom" and the same for the read command
is there some include I need to put in my file, what am i missing here??? |
|
|
Ttelmah Guest
|
|
Posted: Wed Mar 11, 2009 9:27 am |
|
|
I think the poster is confusing problem posts on the MicroChip forum, with errata...
There was quite a long thread a while ago, with a couple of people having problems with the early EEPROM locations on the Microchip forum. However it was almost certainly code, not the chips themselves. Have shipped now, something in 6 digits, of units containing the 877, using the EEPROM, and have used just about every silicon release, since the first engineering examples, and have never had an EEPROM problem on these chips.
You have to be slightly careful 'searching', and try using '87x', as well as '877', since some of the early erratas applied to all the 87x chips.
I'd try re-installing the compiler. Not finding internal functions, is a sure sign of a corrupted installation.
Best Wishes |
|
|
guang cheng
Joined: 30 Nov 2009 Posts: 2
|
|
Posted: Sun Sep 23, 2012 4:38 am |
|
|
I also have problem with EEPROM in 18F4580. I use the same code with you to write and read the data from EEPROM again. After I check this data written in EEPROM yet. I delete the code write to EEPROM then load it again to chip. Now, I read the value from that EEPROM address but it doesn't return the proper value. Thus, can you help me to fix this problem?
Here is my code:
First load:
Code: |
write_eeprom(0,0x55);
int value;
value=read_eeprom(0);
printf(lcd_putc,"%d",value);
delay_ms(1000);
|
Second load:
Code: |
int value;
value=read_eeprom(0);
printf(lcd_putc,"%d",value);
delay_ms(1000);
|
LCD appear: -1-1-1 and so on _________________ Dui yi ge ren, ni shi shi ye! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
guang cheng
Joined: 30 Nov 2009 Posts: 2
|
|
Posted: Tue Sep 25, 2012 7:49 am |
|
|
Thank you very much for replying! I misunderstand between 2 functions: read/write from/to program memory and from/to eeprom. _________________ Dui yi ge ren, ni shi shi ye! |
|
|
|