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

[复制链接]
19580|46
 楼主| ftpeople 发表于 2007-9-18 10:09 | 显示全部楼层 |阅读模式
用的是PIC16F628A单片机,由于PCB空间不够,无法外置E2PROM,只能使用单片机内置的E2PROM,也是第一次使用,程序完全按照文档上的范例.但是往往在现场使用一段时间就会有50%左右的产品出现丢码,以前用外置E2PROM几乎不出现此情况,不知道使用过内置E2PROM的网友有没有跟我相同的遭遇?
iaiwork21 发表于 2007-9-18 10:16 | 显示全部楼层

关注ing

正准备用16F690的EEPROM<br /><br />估计的话应该是LZ程序问题,PIC不会出如此大漏洞
 楼主| ftpeople 发表于 2007-9-18 10:28 | 显示全部楼层

ret

在调用一次读或写的过程时,都有延时20ms左右的时间,读写功能程序如下,请指教是否有错误,谢谢!<br /><br />/*----------------------------------------<br />功能:写单片机内部的E2PROM<br />----------------------------------------*/<br />void&nbsp;E2PROMWrite(uchar&nbsp;Address,uchar&nbsp;Value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEADR&nbsp;=&nbsp;Address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送入被写单元地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEDATA&nbsp;=&nbsp;Value;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入数值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GIE&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭全局中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WREN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许写操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON2&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON2&nbsp;=&nbsp;0xAA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WR&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始写过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(WR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待写过程结束<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GIE&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开全局中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WREN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭写操作<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />/*----------------------------------------<br />功能:读单片机内部的E2PROM<br />-------------------------------------------*/<br />uchar&nbsp;E2PROMRead(uchar&nbsp;Address)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEADR&nbsp;=&nbsp;Address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送入被读单元地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RD&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动读操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(EEDATA);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回被读数值<br />}
yewuyi 发表于 2007-9-18 11:30 | 显示全部楼层

开启MCU的BOD

  
5_0_5 发表于 2007-9-18 12:21 | 显示全部楼层

路过

  
xieyuanbin 发表于 2007-9-18 12:39 | 显示全部楼层

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

除了上面yewuyi版主的建议之外,另外还建议不要把数据放在EEPROM开头的十几个字节内。
hjh002 发表于 2007-9-18 16:01 | 显示全部楼层

要机校验

每次写完数据再读出来校验一下才比较可靠。
 楼主| ftpeople 发表于 2007-9-18 17:16 | 显示全部楼层

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

总共就用了3个字节,分别是0x00,0x01,0x0F,且只有在安装时候会对其进行一次写操作,而后正常使用时CPU只有读操作,0x00和0x01存储用户房号,0x0F是前面两个字节的校验,如果发生校验错误,设备就会发出提示,但并不会重写E2PROM,只有等人工排除.<br /><br />现场出现的问题就是在都调试完毕后,在不确定的时间后会出现校验错误的提示,说明前面两个字节的数据已经变掉了,只有人为的重新写入,待一段时间后又会发生,但也不是每台设备都会出现这个问题,且发生过问题的机器也不一定会再发生,反正没什么规律.<br /><br /><br />另请教版主:为什么前面十几字节最好不用?有什么说法吗?
xieyuanbin 发表于 2007-9-18 17:46 | 显示全部楼层

怎样防止EEPROM丢失?

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

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

我现在打算想办法在原PCB上焊接外置EEPROM,多位置数据备份,打开MCU的BOD,POWRT,WDT,希望能解决,谢谢!
龙在天涯 发表于 2007-9-18 21:31 | 显示全部楼层

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

  
xieyuanbin 发表于 2007-9-19 08:12 | 显示全部楼层

我看没有必要外接EEPROM。

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

开机延时一直都有加

最长的加到200ms,程序初始时不操作E2PROM,但问题依旧.<br /><br />为了这个问题,现场的芯片以前返回过一次修改了,这次再返回就是第二次了,必须一击即中,不容有失,所以为了保险起见,还是采取一直使用的外置E2PROM方式.<br /><br />以前用PIC的芯片开发产品都没有开启POWRT,BOD,WDT,且都采用外置E2PROM,几年下来一直用得很好,这次第一次使用内置E2PROM,没想到会出问题,以后会注意的,谢谢版主!
leida6734 发表于 2007-9-22 11:09 | 显示全部楼层

我也明白了

我的程序也该好好改改了;在上电开机过程中,20%的机会数据会被改动,实在头疼
yewuyi 发表于 2007-9-22 16:51 | 显示全部楼层

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

没收到好结果的原因是你没处理好,16F628A被大家大把用着,没问题的。<br /><br /><br />不管内外EE,一定要开BOD,如果是低功耗产品,则外加一个低功耗的RST芯片。<br /><br /><br />PWRT也应该打开,如果PCB/软件设计得当,在满足使用,并通过各项测试的情况下也可以不开WDT。<br /><br /><br />出现你那50%的故障基本就是BOD没开造成的。
兰天白云 发表于 2007-9-25 14:22 | 显示全部楼层

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

难道我运气好?(产品已买出40000台以上,最初的至少用了1年以上)
 楼主| ftpeople 发表于 2007-9-25 18:29 | 显示全部楼层

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

我现在开启PWRT和BOD,数据多位置备份处理.小批量的在现场再试一段时间,上帝保佑了!&nbsp;:)
yewuyi 发表于 2007-9-25 21:22 | 显示全部楼层

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

但BOD一定要开,PWRT也要打开。<br /><br />如果读写EE软件正确,并且PCB设计得当,就是用前几个字节也没有问题的。<br /><br /><br />XIE斑竹的意思其实是,如果发生万一,MCU出现上电不稳定工作的现象,那么放在前几个字节被修改的概率会大一点。<br /><br />EE出问题的最可能的原因是:<br />1:BOD问题<br />2:写EE过程中,MCU掉电,在掉到刚过BOD电压之后,电压又立即返回,此时可能出现异常。<br />3:不恰当的读写EE程序<br />4:PCB的EMC性能不过关。<br /><br />1通过开启MCU的BOD解决<br />2很难出现,一般不会出现大概率的产品出问题,能碰到表示你的运气很好,高手会处理,但其实不处理也无所谓<br />3这个只要会看DATASHEET,通过一定的分析就知道怎么写程序发生异常时破坏数据的可能最小。<br />4硬功夫,需要自己慢慢练。
兰天白云 发表于 2007-9-26 08:25 | 显示全部楼层

开启PWRT和BOD

开启PWRT和BOD<br />但写EE的程序很关键.<br />有一种情况很讨厌,如果程序跑飞,又正好落到写EE的刚开始处,那就死定了<br />此时地址随机,数据也随机,EE被改写.<br />不管是内部EE还是外部EE都不是绝对的可靠.<br />所以整一个好的硬件电路很重要,一个好的程序结构也重要
aolin 发表于 2007-9-26 13:33 | 显示全部楼层

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

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

本版积分规则

20

主题

57

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部