打印

PIC单片机内置E2PROM很容易丢码,怎么回事?

[复制链接]
17631|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ftpeople|  楼主 | 2007-9-18 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是PIC16F628A单片机,由于PCB空间不够,无法外置E2PROM,只能使用单片机内置的E2PROM,也是第一次使用,程序完全按照文档上的范例.但是往往在现场使用一段时间就会有50%左右的产品出现丢码,以前用外置E2PROM几乎不出现此情况,不知道使用过内置E2PROM的网友有没有跟我相同的遭遇?
沙发
iaiwork21| | 2007-9-18 10:16 | 只看该作者

关注ing

正准备用16F690的EEPROM

估计的话应该是LZ程序问题,PIC不会出如此大漏洞

使用特权

评论回复
板凳
ftpeople|  楼主 | 2007-9-18 10:28 | 只看该作者

ret

在调用一次读或写的过程时,都有延时20ms左右的时间,读写功能程序如下,请指教是否有错误,谢谢!

/*----------------------------------------
功能:写单片机内部的E2PROM
----------------------------------------*/
void E2PROMWrite(uchar Address,uchar Value)
{
     EEADR = Address;               //送入被写单元地址
     EEDATA = Value;                //写入数值
     GIE = 0;                       //关闭全局中断
     asm("nop");
     asm("nop");
     WREN = 1;                      //允许写操作
     EECON2 = 0x55;
     EECON2 = 0xAA;
     WR = 1;                        //开始写过程
     while(WR);                     //等待写过程结束
     GIE = 1;                       //开全局中断
     WREN = 0;                      //关闭写操作
}    
/*----------------------------------------
功能:读单片机内部的E2PROM
-------------------------------------------*/
uchar E2PROMRead(uchar Address)
{
     EEADR = Address;               //送入被读单元地址
     RD = 1;                        //启动读操作
     asm("nop");
     asm("nop");
     return(EEDATA);                //返回被读数值
}

使用特权

评论回复
地板
yewuyi| | 2007-9-18 11:30 | 只看该作者

开启MCU的BOD

使用特权

评论回复
5
5_0_5| | 2007-9-18 12:21 | 只看该作者

路过

使用特权

评论回复
6
xieyuanbin| | 2007-9-18 12:39 | 只看该作者

不知道你是什么样的现场。

除了上面yewuyi版主的建议之外,另外还建议不要把数据放在EEPROM开头的十几个字节内。

使用特权

评论回复
7
hjh002| | 2007-9-18 16:01 | 只看该作者

要机校验

每次写完数据再读出来校验一下才比较可靠。

使用特权

评论回复
8
ftpeople|  楼主 | 2007-9-18 17:16 | 只看该作者

做的是安防产品,装在住宅小区每户房间里

总共就用了3个字节,分别是0x00,0x01,0x0F,且只有在安装时候会对其进行一次写操作,而后正常使用时CPU只有读操作,0x00和0x01存储用户房号,0x0F是前面两个字节的校验,如果发生校验错误,设备就会发出提示,但并不会重写E2PROM,只有等人工排除.

现场出现的问题就是在都调试完毕后,在不确定的时间后会出现校验错误的提示,说明前面两个字节的数据已经变掉了,只有人为的重新写入,待一段时间后又会发生,但也不是每台设备都会出现这个问题,且发生过问题的机器也不一定会再发生,反正没什么规律.


另请教版主:为什么前面十几字节最好不用?有什么说法吗?

使用特权

评论回复
9
xieyuanbin| | 2007-9-18 17:46 | 只看该作者

怎样防止EEPROM丢失?

EEPROM丢失问题是很头痛的,尤其是内置E方,在电源电压不稳定时比较容易导致程序乱跑,从而使程序误操作E方,外置E方也有被擦除的,不过由于I2C信号比较复杂,写的过程比较长,所以不太容易被误写。也有见过外置EEPROM被误擦除的。
总的来讲,导致EEPROM程序误操作的主要原因是电源电压不稳定,或者干扰强大两个原因,对付电源电压不稳定的办法是将单片机的BOD(或BOR)开启,避免单片机进入不稳定状态,对付强干扰就没有什么好办法,除了重新布线等增加康干扰措施外,最好的办法就是做冗余备份,将数据备份2-3份,采取3取2或4取3等办法。
另一个比较另类的办法就是不要将数据放在EEPROM开头的几个字节中,因为在大多数情况下,不管程序如何跑,受损的数据总是开头那几个字节,以后的空间由于电压下降等时间关系是来不及操作的,而且误操作时地址,数据往往都为零,所以如果避开开头几个字节就可以避开大多数的误操作。这里需要注意的是,写EEPROM数据的程序不要包含地址,字节数等信息,而应该在调用它的时候另外赋值,这样才不至于让乱跑的程序“猜中”你的数据地址。

使用特权

评论回复
10
ftpeople|  楼主 | 2007-9-18 20:32 | 只看该作者

谢谢两位版主与各位网友的赐教!

我现在打算想办法在原PCB上焊接外置EEPROM,多位置数据备份,打开MCU的BOD,POWRT,WDT,希望能解决,谢谢!

使用特权

评论回复
11
龙在天涯| | 2007-9-18 21:31 | 只看该作者

我以前也遇到这样的问题,在程序开始后延时20ms以上就不出

使用特权

评论回复
12
xieyuanbin| | 2007-9-19 08:12 | 只看该作者

我看没有必要外接EEPROM。

原来你这么多东东没打开。POWRT是必须要打开的,但BOD和WDT由于会多耗电,如果用在电池产品上就需要考虑。但BOD,WDT对系统的稳定性作用也相当大。另外采用开机延时、数据不写在第1行和冗余备份(在同一个EEPROM内)就已经足够了。从你的情况看并不是擦除的样子。

使用特权

评论回复
13
ftpeople|  楼主 | 2007-9-19 09:17 | 只看该作者

开机延时一直都有加

最长的加到200ms,程序初始时不操作E2PROM,但问题依旧.

为了这个问题,现场的芯片以前返回过一次修改了,这次再返回就是第二次了,必须一击即中,不容有失,所以为了保险起见,还是采取一直使用的外置E2PROM方式.

以前用PIC的芯片开发产品都没有开启POWRT,BOD,WDT,且都采用外置E2PROM,几年下来一直用得很好,这次第一次使用内置E2PROM,没想到会出问题,以后会注意的,谢谢版主!

使用特权

评论回复
14
leida6734| | 2007-9-22 11:09 | 只看该作者

我也明白了

我的程序也该好好改改了;在上电开机过程中,20%的机会数据会被改动,实在头疼

使用特权

评论回复
15
yewuyi| | 2007-9-22 16:51 | 只看该作者

内置的肯定要比外加EE安全

没收到好结果的原因是你没处理好,16F628A被大家大把用着,没问题的。


不管内外EE,一定要开BOD,如果是低功耗产品,则外加一个低功耗的RST芯片。


PWRT也应该打开,如果PCB/软件设计得当,在满足使用,并通过各项测试的情况下也可以不开WDT。


出现你那50%的故障基本就是BOD没开造成的。

使用特权

评论回复
16
兰天白云| | 2007-9-25 14:22 | 只看该作者

我就用开头几个,工控场合,从未发生这种情况

难道我运气好?(产品已买出40000台以上,最初的至少用了1年以上)

使用特权

评论回复
17
ftpeople|  楼主 | 2007-9-25 18:29 | 只看该作者

"兰天白云"你有如楼上两位版主所说的开启PWRT和BOD吗?

我现在开启PWRT和BOD,数据多位置备份处理.小批量的在现场再试一段时间,上帝保佑了! :)

使用特权

评论回复
18
yewuyi| | 2007-9-25 21:22 | 只看该作者

用开头的几个字节也不会有问题的

但BOD一定要开,PWRT也要打开。

如果读写EE软件正确,并且PCB设计得当,就是用前几个字节也没有问题的。


XIE斑竹的意思其实是,如果发生万一,MCU出现上电不稳定工作的现象,那么放在前几个字节被修改的概率会大一点。

EE出问题的最可能的原因是:
1:BOD问题
2:写EE过程中,MCU掉电,在掉到刚过BOD电压之后,电压又立即返回,此时可能出现异常。
3:不恰当的读写EE程序
4:PCB的EMC性能不过关。

1通过开启MCU的BOD解决
2很难出现,一般不会出现大概率的产品出问题,能碰到表示你的运气很好,高手会处理,但其实不处理也无所谓
3这个只要会看DATASHEET,通过一定的分析就知道怎么写程序发生异常时破坏数据的可能最小。
4硬功夫,需要自己慢慢练。

使用特权

评论回复
19
兰天白云| | 2007-9-26 08:25 | 只看该作者

开启PWRT和BOD

开启PWRT和BOD
但写EE的程序很关键.
有一种情况很讨厌,如果程序跑飞,又正好落到写EE的刚开始处,那就死定了
此时地址随机,数据也随机,EE被改写.
不管是内部EE还是外部EE都不是绝对的可靠.
所以整一个好的硬件电路很重要,一个好的程序结构也重要

使用特权

评论回复
20
aolin| | 2007-9-26 13:33 | 只看该作者

两年前就碰到过这个问题,那时候还是Martin版主的时候!

我也碰到过.
我们做的用16F630做的产品,使用内置EEPROM就就是经常掉码,老是被客户投诉.............!
而且我的一个朋友厂在用16F630时,也是经常掉码,头疼得很,后来他改为ATMEL的MEGA8后,就没有出现过掉码!
而我们仓库中还有用16F630做好的成品, 现在老板要求清货,正要我解决这个问题再出货.
我也看看这几招行不行!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

57

帖子

0

粉丝