大家有没有遇到过PIC内部E2PROM失效啊?

[复制链接]
9528|37
yewuyi 发表于 2008-9-4 08:41 | 显示全部楼层

加到VCC电容,然后把BOD的电压尽量开高一点

这样在电压不稳定的时候,MCU会被复位,已经发出的写EE操作将有相对长一点的电压下降时间
yewuyi 发表于 2008-9-4 08:43 | 显示全部楼层

奇怪,俺用PIC从来都是只写一次,校验都省了,还真没发现

xieyuanbin&nbsp;发表于&nbsp;2008-9-4&nbsp;08:40&nbsp;PIC&nbsp;单片机&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />20楼:&nbsp;问一下匠人电源如何得来?&nbsp;<br /><br />貌似周期性失败?<br />不知道你校验失败后如何处理?重写还是跳过?没看到你重写的程序.只写一次遇到写失败的可能性比较大.我一般的处理是写-校验-错-重写-校验-错-报错.<br /><br />&nbsp;<br />&nbsp;<br />
yewuyi 发表于 2008-9-4 08:46 | 显示全部楼层

俺一般把BOD开的最高

直接写一次,不校验,从来没发现出错(主要是PIC16F91X系列)。<br /><br />用AVR的时候到是搞了写两次,因为AVR的E2PROM比较的。。。
 楼主| 程序匠人 发表于 2008-9-4 10:00 | 显示全部楼层

回 xieyuanbin

<br />&nbsp;xieyuanbin&nbsp;发表于&nbsp;2008-9-4&nbsp;08:40&nbsp;PIC&nbsp;单片机&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />20楼:&nbsp;问一下匠人电源如何得来?&nbsp;<br /><br />貌似周期性失败?<br />不知道你校验失败后如何处理?重写还是跳过?没看到你重写的程序.只写一次遇到写失败的可能性比较大.我一般的处理是写-校验-错-重写-校验-错-报错.&nbsp;<br /><br />-----------------------------------------------<br />第1个问题:电源是靠滑环和电刷传导的,虽然有电容稳压,不过,还是会有接触不良导致的波动。另外,由于LED显示切换,也可能导致波动。这些都是猜测,因为板子在旋转,无法用示波器去观察板子上的电压波动情况。<br /><br />第2个问题:为了满足实时性,我在写E2PROM的等待周期里,不会空等待,而是把系统控制权交回给系统。待到下次再进入程序时再去做校验。如果写入失败,我会再写,连续三次校验失败,则跳过。我的处理是<font color=#FF0000>(先读</font><font color=#FF0000>-校验-错-写-再读-校验-再错-再写-连续错-跳过)</font>。程序我前面已经给出了,现在再摘录并说明如下:<br /><br /><br />&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;EEP_SAVE_ID&nbsp;&lt=&nbsp;180&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存自定义点阵图片下部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读出校验<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEADR&nbsp;=&nbsp;PICTURE2_ADR&nbsp;+&nbsp;EEP_SAVE_ID&nbsp;-&nbsp;90&nbsp;;&nbsp;//地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_eeprom()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EEPROM字节读程序<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;EEDATA&nbsp;==&nbsp;DISP_QUEUE2[EEP_SAVE_ID&nbsp;-&nbsp;90]&nbsp;)&nbsp;<font color=#FF0000>//如果校验一致(代表写成功,切换到下一单元)<br /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEPROM_ERR_JSQ&nbsp;=&nbsp;0&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EPPROM写失败计数器=0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEP_SAVE_ID&nbsp;++&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EEPROM存储指针+1&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF0000>(切换到下一单元)</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(&nbsp;++EEPROM_ERR_JSQ&nbsp;&gt&nbsp;3&nbsp;)&nbsp;&nbsp;&nbsp;<font color=#FF0000>&nbsp;//如果连续n次写入失败(代表写失败,放弃当前单元,切换到下一单元)<br /><br /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEPROM_ERR_JSQ&nbsp;=&nbsp;0&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EPPROM写失败计数器=0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEPROM_ERR_FLAG&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;//EPPROM写失败标志=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEP_SAVE_ID&nbsp;++&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EEPROM存储指针+1&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF0000>(放弃当前单元,切换到下一单元)</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF0000>&nbsp;&nbsp;//否则,更新数据<br /></font>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEDATA&nbsp;=&nbsp;DISP_QUEUE2[EEP_SAVE_ID&nbsp;-&nbsp;90]&nbsp;;&nbsp;//数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_eeprom()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EEPROM字节写程序<font color=#FF0000>(这里是真正的写入操作,一般来说,第一次读校验后,会执行这里)<br /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
ddb_21ic 发表于 2008-9-4 10:51 | 显示全部楼层

匠人的注释写的那么好,累不累啊

有中文编程的样子了
 楼主| 程序匠人 发表于 2008-9-4 12:49 | 显示全部楼层

回楼上,好记性不如烂笔头

与其以后想破头,不如顺手写注释。<br /><br />经常有人说:“项目赶得太急,我只能写程序,没时间写注释”——匠人不以为然。<br /><br />根据匠人的推算,我们即使是在全神贯注编程的时候,写程序的平均速度也不过每分钟一两行。<br /><br />一天8个工作小时,即480分钟,如果真的每分钟一条,那就要写480条语句,实际上我们一天写不了那么多代码。<br /><br />更多的时候是大脑在思考,而手上却闲着。<br /><br />而我们的打字速度,实际上可以达到每分中200个键以上。因此,速度的瓶颈不在打字上。<br /><br />我们完全可以做到一边思考,一边打字。不会额外浪费多少时间。<br /><br />不但不会浪费时间,还会节约日后程序升级维护的时间。<br /><br />因此,写注释是件划算的买卖。
xieyuanbin 发表于 2008-9-4 22:17 | 显示全部楼层

你可以增加校验错重写的次数,来判断是否电源失效.另一个问题是,是否复位呢?可以将BOD开低点试试.<br />
xieyuanbin 发表于 2008-9-4 22:19 | 显示全部楼层

22楼

显然应该预见到他的电源靠电刷馈电,所以电源不稳的情况是经常发生的,这种情况就要校验EEPROM是否写成功.
 楼主| 程序匠人 发表于 2008-9-4 23:34 | 显示全部楼层

基本可以确定是电源的问题了

现在改为在指针板静止时发送数据,电源不再波动,成功。<br /><br />秀张图片:<br /><br />这是传递后的图片实际效果。由于相机曝光时间不够,没有拍全
 楼主| 程序匠人 发表于 2008-9-4 23:36 | 显示全部楼层

再秀一张

这是后台软件的截图。现在修改显示图片很简单了,串口就可以搞定,不再需要每次都重新改程序了。呵呵。
xieyuanbin 发表于 2008-9-5 19:16 | 显示全部楼层

指针静止??

指针什么时候静止啊?
 楼主| 程序匠人 发表于 2008-9-5 21:13 | 显示全部楼层

呵呵,指针不转的时候就是静止的

俺这个旋转时钟,大多数时候都是静止的。在需要的时候,拍一下手,就转起来了。转个20S,不搭理它,它就又消停了。消停归消停,电照样通着,这个时候去通讯的话,就不用担心电源的波动了。
xieyuanbin 发表于 2008-9-6 10:06 | 显示全部楼层

你内部EE记录什么东西?不是上面的图形吧?

  
 楼主| 程序匠人 发表于 2008-9-6 21:59 | 显示全部楼层

就是记录上面的图片啊,呵呵

当然,还有一些其它东西,比如闹钟时间等
xieyuanbin 发表于 2008-9-7 12:05 | 显示全部楼层

呵呵,我算错字节数了.

  
foxmax 发表于 2008-9-8 11:22 | 显示全部楼层

没有遇到过

  
NE5532 发表于 2008-9-9 21:00 | 显示全部楼层

16F系遇到过,莫名其妙被改。

概率10万分之1左右,很奇怪。
hch 发表于 2008-9-20 02:39 | 显示全部楼层

这样有没有问题?

EEPROM_WRITE(5,ldata);<br />Delay1mS(100);<br />ldata=EEPROM_READ(5);<br />Delay1mS(100);<br /><br />用自带的&nbsp;&nbsp;仿真没有问题&nbsp;烧片&nbsp;不行&nbsp;&nbsp;郁闷&nbsp;&nbsp;12f629
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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