PIC16F877A的EEPROM使用
扫描二维码
随时随地手机看文章
unsigned char eeprom_read(unsigned char addr);void eeprom_write(unsigned char addr, unsigned char value);这两个函数是PIC内部函数,可以直接调用;
-----------------------------以下内容是baidu空间的一位博主写的-------http://hi.baidu.com/wxg923/item/17d65d23942ea9fd50fd8788---------
-上周在做一个项目时,需要对测试数据实时的保存,以被重新上电后读取.采用了PIC的内部EEPROM,正常读取时没有什么问题.反复上电掉电就出现了EEPROM被清0(改写).
查阅相关资料:EEROM写过程包括两个阶段:先擦除(电压为20V) 再写入(电压18V);EEPROM在写入过程中如果电压不稳定,很容易导致错误.先使用了软件冗余法,同一个data写在连续3个地址,使用时比较,只有2个相同时才使用.这样做,反复上电掉电出错几率小了很多,但是还是会出错.在反复上电100多次时还是出错.另一个解决办法就是使能BOD,写EEPROM时,先检测BOD.网上一位兄弟使用此方法反复上电2000多次才错误一次.
上述方法有两个致命缺陷:1.EEPROM寿命短,EEPROM按最低10万次算,我的项目每2s写一次EEPROM,连续使用2周后EEPROM就可能寿命以尽.2还是有错误,没有100%正确.
解决方案:使用掉电检测,如果成本许可还可以使用法拉电容.
电源电压掉电时,产生一个INT信号,PIC进入外部中断程序:首先将IO清零以降低电流损耗,此时利用电容C1的放电时间将要保存的数据写入EEPROM.470uF D型钽电容可供PIC工作20ms左右,足够写8bety EEPROM.
---------------------以下内容是我实验内容--------摘自博客园的--“业精于勤,荒于嬉;行成于思,毁于随---------
/******************************************
******PIC16F877A 内部EEPROM读写实验*******
Author:hnrain
Date:2010-12-25
Version:V0.1
Email:hnrain1004@gmail.com
Forum:http://bbs.cepark.com
_______________________________
实验现象:先给内部EEPROM的0~7字节写数据1~8,再读出第0字节的
内容,并判断读出来的数据是不是1,如果是1则点亮RD0口的LED。
重点内容:
内部EEPROM的操作主要通过4个寄存器
EECON1,EECON2,EEDATA,EEADR
EEDATA寄存器存放8位读写数据
EEADR存放EEPROM被访问过的地址
EECON1寄存器定义:
bit7:5 未用;读为0
bit4 EEIF:EEPROM写操作中断标志位
1 = 写操作完成(必须软件清零)
0 = 写操作未完成或还未开始
bit3 WRERR:EEPROM错误标志位
1 = 写操作过早终止
0 = 写操作已完成
bit2 WREN:EEPROM写使能位
1 = 允许写入
0 = 禁止写入EEPROM
bit1 WR:写操作控制位
1 = 启动写周期,一旦写入完成,该位将被硬件清零
写操作控制位只能用软件置"1"
0 = EEPROM的写周期已完成
bit0 RD:读控制位
1 = 启动EEPROM读操作。读需要一个周期,RD由硬件清零
RD只能用软件置“1”
0 = 未启动EEPROM读操作
写入EEPROM有一个特定的过程:将55H写入EECON2,将AAH写入EECON2
然后将WR位置1
*******************************************/