|
|
View previous topic :: View next topic |
Author |
Message |
Daniel7
Joined: 22 Nov 2018 Posts: 3
|
Use of eeprom in ccs PIC16F916 |
Posted: Thu Nov 22, 2018 12:36 pm |
|
|
Hi,
I'm trying to program a PIC16F916 using CCS and i'm having problems with the instructions for use the eeprom.
Reading the ccs manual I thought the following instructions work by themselves
read_eeprom(adress)
write_eeprom (address,value)
But when I try to use them it simply doesn't work, in fact when i add these instructions to my code, the entire program stops working.
Is there any kind of configuration that i need to do before i can use them?
The way i'm using them is "a=read_eeprom(0);" and "write_eeprom(0,a);", where "a" is an int variable i'm using without problem in other parts of the code. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Use of eeprom in ccs PIC16F916 |
Posted: Thu Nov 22, 2018 1:06 pm |
|
|
Daniel7 wrote: | But when I try to use them it simply doesn't work, in fact when i add these instructions to my code, the entire program stops working.
|
How do you know it stops working ? Post a short program that
demonstrates this.
Also post your compiler version. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Thu Nov 22, 2018 1:35 pm |
|
|
and (I hope) you are not using the write very often.
You have to understand that EEPROM has a very limited write life.
If you wrote a program that looped calling write_eeprom, it could kill the EEPROM in under a minute. Once damaged, a write might well hang.... |
|
|
Daniel7
Joined: 22 Nov 2018 Posts: 3
|
Re: Use of eeprom in ccs PIC16F916 |
Posted: Thu Nov 22, 2018 2:09 pm |
|
|
Quote: | Also post your compiler version. |
About the version, is it that i'm using "pcw compiler" what you want?
Quote: |
How do you know it stops working ? Post a short program that
demonstrates this. |
I'm simulating the program with altium. Here is most of the program (it's no very big)
Code: |
#include <16f916.h>
#fuses NOPROTECT,NOCPD,NOWDT,XT,BROWNOUT
#use delay (clock=4000000)
#use rs232 (BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7)
#byte port_a=5
#byte port_b=6
#byte port_c=7
int s;
int a=0;
int reset=1;
int g;
#int_rda
Modo_leds()
{s=getc();
if(a<5)
{a++;
reset=2;
}
if(a>=5&reset==1)
{a=0;
}
reset=1;
write_eeprom(0,a);
}
main()
{
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b00000001);
enable_interrupts (int_rda);
enable_interrupts (global);
a=read_eeprom(1);
|
After this in the loop i'm doing different out series using the a, b and c ports depending on the value of "a" variable
When i compile the program without using the eeprom instructions it works perfectly, but when i use them, the out ports just stay always the same way, no matter how many times i use the interruption.
Quote: | and (I hope) you are not using the write very often. |
I'm trying to use it only when the external interruption, i think that should work for quite a few of them, but correct me if you think it doesn't |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Thu Nov 22, 2018 2:50 pm |
|
|
OK.
Huge issue.
Writing the eeprom, inside the RDA interrupt.
Reason. An EEPROM write takes typically 5mSec. INT_RDA at 9600Baud, can occur every 1.04mSec. Now if you are sending with a terminal program for example, and type a character<enter>, the 'enter' will result in three characters being sent one immediately after the other. The UART buffer is just two two characters long, so if this happens it will overflow, since it is hung writing the EEPROM. If it overflows, since you do not have 'ERRORS' in your RS232 setup, the UART will then be permanently hung.....
Repeat five times. When setting up a hardware UART, I _must_ always have 'ERRORS' on the UART setup, unless I'm handling errors myself.
Then move the write out of the interrupt handler. Set a flag, and do the write in your main. Modify your sending method, to ensure that there is always a delay to allow the write to happen in your transmitted data.
Then rethink what you are doing. Currently a byte could be being written every time a character is received. This could kill the EEPROM in just over 10 seconds. You need to only write to the EEPROM at very long intervals. Perhaps at the moment when the chip is switched off, or once a day at the most. Otherwise it _will_ die.... |
|
|
Daniel7
Joined: 22 Nov 2018 Posts: 3
|
|
Posted: Thu Nov 22, 2018 4:25 pm |
|
|
For now i've configured the timer0 when external interruption is over, and then write the eeprom in the timer interruption. At least it's working this way.
Now I have to rethink what i'm doing to extend the life of the eeprom.
Thank you very much, Ttelmah and PCM programmer, for your help. |
|
|
|
|
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
|