|
|
View previous topic :: View next topic |
Author |
Message |
TD Guest
|
PIC18F252 EEPROM read/write |
Posted: Sun Oct 23, 2005 9:00 pm |
|
|
Hello all, My application requires to write a program to write data ( 4 characters) to the eeprom based on the input from RS232. This is going to be run on the pic microcontroller once to store the values in the eeprom. I am using PIC18F252.
say i want to store 1234 in memory. i enter #AB1234
Code: |
do
{
if(( '#' == buffer[0]) && ( 'A' == buffer[1] ) && ( 'B' == buffer[2] ) )
{
C1 = buffer[3];
C2 = buffer[4];
C3 = buffer[5];
C4 = buffer[6];
write_eeprom(20,CO1);
write_eeprom(21,CO2);
write_eeprom(22,CO3);
write_eeprom(23,CO4);
}
}
while(true);
|
and this data has to be stored permanently in the EEPROM. My question is what address in EEPROM do i chose ( i wrote 20-23 to show some values)
I want to download a second program to the pic without erasing the EEPROM data( I am using picstartplus programmer and any directions on this would be helpful) Now this program reads the eeprom data once every powerup for processing
Code: |
v1 = read_eeprom(20) - 0x30;
v2 = read_eeprom(21) - 0x30;
v3 = read_eeprom(22) - 0x30;
v4 = read_eeprom(23) - 0x30;
|
i am reading from the address locations 20-23. Please let me any suggestions on the whole approach and things i am missing here since I am new to this field. |
|
|
Ttelmah Guest
|
|
Posted: Mon Oct 24, 2005 2:57 am |
|
|
For the EEPROM address, whatever you want.
The 'limit' on the value, is the size of the EEPROM on the chip (look at the data sheet), and addresses start at '0'. Nothing else uses the EEPROM, except your code, so provided you are careful to ensure your code allways uses the same addresses, and objects do not overlap, you can put the data anywhere. If you are going to use more than one value stored, then consider using a 'virtual' address, with a define, so something like:
#define TEXT_MESSAGE (20)
and then storing the message to the locations starting at this point.
Be 'wary' of the code you show though. As written, it'll keep writing values to the EEPROM continuously, once the buffer value is seen. This will wear out the EEPROM quite quickly (Each write will take about 2mSec, and the typical EEPROM has a 'life' of about 100K cycles). It could wear the EEPROM out in potentially only about 100 seconds - generally it'll probably last longer because the value oes not change, but it shows an important 'caveat'...
Best Wishes |
|
|
TD Guest
|
eeprom read/write |
Posted: Mon Oct 24, 2005 1:33 pm |
|
|
thanks for your reply.
Ttelmah wrote: |
and then storing the message to the locations starting at this point.
Be 'wary' of the code you show though. As written, it'll keep writing values to the EEPROM continuously, once the buffer value is seen. This will wear out the EEPROM quite quickly (Each write will take about 2mSec, and the typical EEPROM has a 'life' of about 100K cycles). It could wear the EEPROM out in potentially only about 100 seconds - generally it'll probably last longer because the value oes not change, but it shows an important 'caveat'... |
in my application the buffer string will be entered once so as to write to the eeprom. It will be read from eeprom every power up. hence 100K cycles should be sufficient.
The problem I am facing is preserving the contents of EEPROM when I am reprogramming the pic using picstartplus programmer. As someone suggested I unchecked the Program Data EEPROM but I think I am making a mistake.
Okay this is what I follow. After enabling the programmer > Erase Flash Device > Program for downloading the 1st program
I wrote to the eeprom and checked it as well and it seems to be fine.
Code: |
// would have received the characters to store in data eeprom from
// RS 232 input but here i am just showing some character
write_eeprom(20,'1');
write_eeprom(21,'5');
write_eeprom(22,'2');
write_eeprom(23,'5');
v1 = read_eeprom(20) - 0x30;
v2 = read_eeprom(21) - 0x30;
v3 = read_eeprom(22)- 0x30;
v4 = read_eeprom(23) - 0x30;
if( 1 == v1 && 5 == v2 && 2 == v3 && 5 == v4)
Output_high(Pin_C5);
else
Output_high(Pin_C3);
|
Now when I want to reprogram the pic without erasing the eeprom. I compile/run the new code and then Enabled the programmer. Now do I have to click on erase flash device to erase the previos program memory/ config bits ? And then click on Program/ verify and unchecked DATA EEPROM. But still it seems to clear the eeprom data memory. Any suggestions would be very helpful. thanks much |
|
|
TD Guest
|
|
Posted: Mon Oct 24, 2005 1:59 pm |
|
|
Quote: |
Now do I have to click on erase flash device to erase the previos program memory/ config bits ? |
I guess I should not do this while reprogramming the PIC so as to preserve the EEPROM contents ? |
|
|
Ttelmah Guest
|
|
Posted: Mon Oct 24, 2005 2:38 pm |
|
|
Dead right.
The 'erase', triggers a _full_ erase. It is essential in some circumstances (the only way of turning off most of the 'protection' fuses), but the programmer is smart enough to know that if you ask it to program the main memory, it has to erase just this first. It should automatically erase what is needed.
Best Wishes |
|
|
TD Guest
|
|
Posted: Tue Oct 25, 2005 3:33 pm |
|
|
thanks again. But I am having trouble reprogramming the pic without erasingthe data eeprom.
I downloaded the code (1st program) and eeprom is updated with some values. Now I run the new code and then Enabled the programmer. And when I click on Program/ verify and unchecked data EEPROM and then clicked on Program, I always get a Failure. Is it because I have not erased the previous program memory/ this is the not the right way to do it ? Any suggestions would be very helpful. thanks much |
|
|
Ttelmah Guest
|
|
Posted: Wed Oct 26, 2005 3:02 am |
|
|
I think you need to post which programmer is involved. There are so many slight 'variations' in how they work....
On the one I use, there is a seperate 'erase' button, which triggers a full erase, and an option in the programming menu, for 'block erase before programming', which you enable to have it clear the area being programmed.
Best Wishes |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Oct 26, 2005 3:11 am |
|
|
TD wrote: | thanks again. But I am having trouble reprogramming the pic without erasingthe data eeprom.
I downloaded the code (1st program) and eeprom is updated with some values. Now I run the new code and then Enabled the programmer. And when I click on Program/ verify and unchecked data EEPROM and then clicked on Program, I always get a Failure. Is it because I have not erased the previous program memory/ this is the not the right way to do it ? Any suggestions would be very helpful. thanks much | Which #fuse settings are you using? As Ttelmah already indicated some fuse settings may cause troubles, for example the PROTECT fuse makes it impossible to write to the flash memory (duh, that's why it's called 'protect'). These fuses can only be reset by executing a 'full erase'. |
|
|
Guest
|
|
Posted: Wed Oct 26, 2005 9:48 pm |
|
|
ckielstra wrote: | TD wrote: | thanks again. But I am having trouble reprogramming the pic without erasingthe data eeprom.
I downloaded the code (1st program) and eeprom is updated with some values. Now I run the new code and then Enabled the programmer. And when I click on Program/ verify and unchecked data EEPROM and then clicked on Program, I always get a Failure. Is it because I have not erased the previous program memory/ this is the not the right way to do it ? Any suggestions would be very helpful. thanks much | Which #fuse settings are you using? As Ttelmah already indicated some fuse settings may cause troubles, for example the PROTECT fuse makes it impossible to write to the flash memory (duh, that's why it's called 'protect'). These fuses can only be reset by executing a 'full erase'. |
Okay these are my fuse settings,
#fuses HS,PROTECT,CPD,CPB, PUT,NOWDT,BORV27,NOLVP
I will try doing the necessary changes on them (I know I did not do research on the fuse settings since I am modifying the program written by another person.....lame reason) And I do not have access to the program now but will post the the version details tomorrow. But regards the PROTECT fuse, I ran the 1st program on the PIC and am able to write/read the entered data from the EEPROM. thanks in advance... |
|
|
TD Guest
|
|
Posted: Thu Oct 27, 2005 12:02 am |
|
|
Okay I was just glancing through the fuses and found this,
CPD Data EEPROM Code Protected
NOCPD No EE protection |
|
|
Ttelmah Guest
|
|
Posted: Thu Oct 27, 2005 2:22 am |
|
|
The big problem though is the 'PROTECT' fuse.
Once this is set, it can only be cleared by a full chip erase...
Basically if the code needs protection, you should be thinking again about how everything is implemented. Remember that if somebody has access to the .hex file, the fuse does no good at all. The way to retain the EEPROM, if the protect fuse is set, and the EEPROM is unprotected, is to first read the EEPROM, then erase the whole chip, and program the new code, and return the EEPROM contents, verify, then program just the protect fuse. Some programmers will allow you to 'script' this sort of sequence.
For development, leave the code protection off, till you have stable code.
Best Wishes |
|
|
TD Guest
|
|
Posted: Thu Oct 27, 2005 5:21 pm |
|
|
Thanks a lot. That definitely makes sense. I am going to have to try them out tomorrow. |
|
|
TD Guest
|
still having trouble downloading |
Posted: Fri Oct 28, 2005 12:15 pm |
|
|
Hello, I am still having trouble downloading the program ( it always says failure when i try to program it without erasing the EEPROM). I am using PIC C Compiler IDE v 3.215 PCH v 3.217. I have MPLAB 5.70 with PICStartplus programmer v2.60
Okay this is my first program where I write 2 values to eeprom and then read it succcessfully as well ( I had Starting and Success on my hyperterminal)
Code: |
#include <18f252.h>
#use delay(clock = 20000000)
#fuses HS,NOPROTECT,NOCPD,NOCPB,NOWDT,NOBROWNOUT,NOLVP
#use rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)
BYTE v1, v2, v3, v4;
void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);
printf("Starting \r\n");
write_eeprom(20,'1');
write_eeprom(21,'5');
v1 = read_eeprom(20) - 0x30;
v2 = read_eeprom(21) - 0x30;
if( 1 == v1 && 5 == v2 ) printf("Success \r\n");
else printf(" Failure \r\n");
}
|
And I wrote a test program which i want to download to the PIC without erasing the data EEPROM contents. I just commented the write_eeprom from the previous program and I Click on
PICStartPlus > Enable programmer
PICStartPlus > Program (Unchecked Data EEPROM) and then hit program
Code: |
// same code as above except I removed write_eeprom so that I can
read the EEPROM and test if it was retained
|
But it gives me failure when I program.... |
|
|
TD Guest
|
still having trouble downloading |
Posted: Fri Oct 28, 2005 12:16 pm |
|
|
Hello, I am still having trouble downloading the program ( it always says failure when i try to program it without erasing the EEPROM). I am using PIC C Compiler IDE v 3.215 PCH v 3.217. I have MPLAB 5.70 with PICStartplus programmer v2.60
Okay this is my first program where I write 2 values to eeprom and then read it succcessfully as well ( I had Starting and Success on my hyperterminal)
Code: |
#include <18f252.h>
#use delay(clock = 20000000)
#fuses HS,NOPROTECT,NOCPD,NOCPB,NOWDT,NOBROWNOUT,NOLVP
#use rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)
BYTE v1, v2, v3, v4;
void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);
printf("Starting \r\n");
write_eeprom(20,'1');
write_eeprom(21,'5');
v1 = read_eeprom(20) - 0x30;
v2 = read_eeprom(21) - 0x30;
if( 1 == v1 && 5 == v2 ) printf("Success \r\n");
else printf(" Failure \r\n");
}
|
And I wrote a test program which i want to download to the PIC without erasing the data EEPROM contents. I just commented the write_eeprom from the previous program and I Click on
PICStartPlus > Enable programmer
PICStartPlus > Program (Unchecked Data EEPROM) and then hit program
Code: |
// same code as above except I removed write_eeprom so that I can
read the EEPROM and test if it was retained
|
But it gives me failure when I program.... |
|
|
TD Guest
|
|
Posted: Fri Oct 28, 2005 12:22 pm |
|
|
Sorry for double posting.
In the above post when I said failure, I meant I cannot program the PIC and not the output when I hook up the device... This is the Error Log
Device Type: 18F252
Program Memory Errors
Address Good Bad
010A: 5037 5035
010C: 0F17 0F15
011E: C037 C035
0124: 2437 2435
0128: 6E37 6E35
012C: 5C37 5C35
0132: F037 F035
0158: 6A37 6A17
015A: 6A38 6A18
015C: 0EC0 0E00
015E: 12F2 0210
0160: 8A9D 0A18
0162: 6A3E 6A1A
0164: 503E 401C
0166: DF97 4A15
016A: 6E00 0E00
016C: 5000 1000
016E: A89E 889C
0170: D7FE 4244
0172: 6EAD 4004
0174: 0E0B 0E00
0176: 5C3E 0804
0178: E1F5 6000
017A: 0103 0000
017C: 915D 801C
017E: 0E14 0614
0182: 9CA6 0C02
0184: 9EA6 1C04
0186: 80A6 80A4
0188: 50A8 0000
018A: B0F2 0000
018C: 8983 0801
Any additional errors are not displayed. |
|
|
|
|
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
|