|
|
View previous topic :: View next topic |
Author |
Message |
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
write_eeprom and read_eeprom |
Posted: Mon Jan 10, 2022 6:10 am |
|
|
Hi Guys
Simple query related to eeprom. I am unable to write and then read from eeprom. values displaying on LCD is 0.
Following is my code
Code: |
#include <16F877A.h>
#device adc=8
#FUSES NOWDT,HS,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include "Flexlcd.c"
#define ADDRESS 50
void main()
{
lcd_init();
write_eeprom(ADDRESS,2);
delay_ms(10);
printf(lcd_putc,"%d",read_eeprom(ADDRESS));
while(TRUE)
{
}
}
|
Kindly guide me |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon Jan 10, 2022 8:13 am |
|
|
What compiler version?.
The code as posted works correctly for me. Displays 2.
Is it possible that you ran code before this, which has worn out the EEPROM?.
Can be done in less than 5 minutes by repeated writes.
Beware if you do enable the watchdog. Remember timeout by
default is just 18mSec, and can be as short as 7mSec. It'd keep resetting
and writing to the EEPROM, which would kill the chip very quickly. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Mon Jan 10, 2022 8:28 am |
|
|
hmm
'fuse' says NOwdt...
then 'delay' says 'restart_wdt'
has me wondering IF code to restart the WDT will be created and run ?
generally speaking though, WDT should never,ever be enabled until 100% of the program is correctly running and project is ready to be shipped to client. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon Jan 10, 2022 8:42 am |
|
|
I actually wondered if he originally tried with the WDT enabled, hence the
restart_wdt. Then since the eeprom write itself can take up to 8mSec, and
the lcd_init normally has a delay in it, could easily result in the code
rapidly and repeatedly writing to the EEPROM, till it is destroyed.... |
|
|
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
|
Posted: Mon Jan 10, 2022 11:21 pm |
|
|
Hi Guys
@Ttelmah @temtronic
Quote: |
What compiler version?
|
The version I am working on is 4.124
Quote: |
I actually wondered if he originally tried with the WDT enabled |
No I didn't enabled the WDT. it is disable.
what I was tried before
Code: |
#include <16F877A.h>
#device adc=8
#FUSES NOWDT,HS,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include "Flexlcd.c"
#define ADDRESS 50
void main()
{
lcd_init();
write_eeprom(48,_BATTERY_VOLT);
write_eeprom(ADDRESS,2);
delay_ms(10);
printf(lcd_putc,"%d",read_eeprom(ADDRESS));
while(TRUE)
{
}
}
|
Is my controller EEPROM damaged?
Is there any way to check if EEPROM still alive? |
|
|
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
|
Posted: Mon Jan 10, 2022 11:27 pm |
|
|
another question.
If the EEPROM is damaged then all the part of EEPROM will be damage or only the address will be effected which we are writing? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Tue Jan 11, 2022 3:36 am |
|
|
Ouch.
Seriously, that is an ancient compiler. About 2007!...
At that age it could be a compiler fault. However, I don't remember there
being faults with the EEPROM at that time. However this thread had exactly
the same behaviour:
[url]
http://www.ccsinfo.com/forum/viewtopic.php?t=50536&highlight=writeeeprom
[/url]
Big question, what is your power supply?. The EEPROM is one of the most
critical components on supply voltage. Enable BROWNOOUT. The EEPROM
write will fail if the voltage falls below 4v. The BROWNOUT fuse will make
the chip reset if this happens. The EEPROM write draws quite a spike on
the supply rail, and if your supply is not adequate the write could fail.
It would be the individual cell that gets destroyed. Unlike flash, where the
memory is 'page' based, the EEPROM works cell by cell. |
|
|
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
|
Posted: Tue Jan 11, 2022 6:59 am |
|
|
I am using adaptor of 12V 300mA (I have to check if this really gives 300mA or not) then 5v regulator. 100uF is on input and 10uF is on output of regulator.
Let me try BROWNOUT Fuses enabled and check the result.
Meanwhile anyother suggestion what i can do or check? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 11, 2022 7:24 am |
|
|
Try another address, other than 48 or 50. Maybe you just burnt out
those two addresses. Maybe the others are OK. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Tue Jan 11, 2022 7:54 am |
|
|
and, have you got something like a 0.1uF ceramic capacitor right by the
actual processor supply pins, and all the supply pins connected?. Both
supply pins and both grounds are needed. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Tue Jan 11, 2022 8:20 am |
|
|
re: Quote: | Seriously, that is an ancient compiler. About 2007!... |
Thanks, now I really DO feel like a dinosaur !!!
I started with PCM v2.534...... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Tue Jan 11, 2022 12:26 pm |
|
|
I too started well before this, but individual faults were common on
older compiler versions.The late V4 versions like 4.141 were very good,
but versions like the one here, were often flakey.
I tended not to keep versions that had problems. Did not keep 4.124, which
suggests I had found it had issues... |
|
|
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
|
Posted: Wed Jan 19, 2022 4:11 am |
|
|
Hi Guys
I am still unable to read/write to/from EEPROM.
I added 0.1uF capacitors on the Vss and Vdd pins of microcontroller, also I added BROWNOUT fuse
following is the code
Code: |
#include <16F877A.h>
#device adc=8
#FUSES NOWDT,HS,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#include "Flexlcd.c"
#define ADDRESS 61
void main()
{
//lcd_init();
delay_ms(100);
write_eeprom(ADDRESS,2);
delay_ms(100);
//printf("HELLO");
printf("value = %d",read_eeprom(ADDRESS));
while(TRUE)
{
}
}
|
|
|
|
Picmicro_man
Joined: 01 Jan 2022 Posts: 13
|
|
Posted: Wed Jan 19, 2022 5:24 am |
|
|
i also tried to do this but same result
Code: |
#include <16F877A.h>
#device adc=8
#FUSES HS,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#include "Flexlcd.c"
#define ADDRESS 101
int variable_a = 0;
void main()
{
printf("HELLO");
while(TRUE)
{
if(!input(PIN_D2))
{
while(!input(PIN_D2)) delay_ms(1);
delay_ms(100);
write_eeprom(ADDRESS,2);
delay_ms(100);
variable_a = read_eeprom(ADDRESS);
delay_ms(100);
printf("value = %d",variable_a);
}
}
}
|
Is the whole EEPROM corrupt or am I missing something? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Jan 19, 2022 8:10 am |
|
|
Try something different:
Code: |
#include <16F877A.h>
#device adc=8
#FUSES NOWDT,HS,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#ROM 0x2100 = {0xAA}
#include "Flexlcd.c"
#define ADDRESS 0
void main()
{
lcd_init();
delay_ms(10);
printf(lcd_putc,"%d",read_eeprom(ADDRESS));
while(TRUE)
{
}
}
|
This will make your programmer write 0xAA to the first byte of the
EEPROM. If this reads back correctly, then we know this cell at least
of the EEPROM does work correctly. |
|
|
|
|
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
|