hittiger 发表于 2008-9-1 10:43:08

mega48 eeprom的存储方案

最近做仪表,用的mega48。但是遇到个eeprom存储的问题。


目前研究的算法试验了很多次,在运行时突然停电,开机都没问题,累计都正确。但是还是担心高位出问题。用的方法是纯软件的算法解决的,因为不想再硬件上增加成本。

具体的方案是,数据是逐个累加的,所以我开辟一段100个字节eeprom空间,初始化为0,101,102,、、、、、199 。然后写入数据时地址+1,地址到100又回到0。断电后,搜索断点,找到后如果断点数据正好在写入时出错,就通过上下文规律恢复读出,如果正确就把数据直接读出。规律很简单,就是每一个地址的数据比前一个大1,如果不是,继续向后面,判断后面一组的数据是否符合这个规律。如果是,就找到断点。如果不是,判断为数据写入出错。所以根据规律恢复。

如果存的数据是0-255 那么开辟128个字节,我的是0-200所以就开辟了100个字节,这样正好每一次都能有断点,数据也不可能重复出现在同一个地方。

hittiger 发表于 2008-9-1 10:46:47

贴子挺长,各位看了可别忘了我提的问题哟。

我的做法是数据高位没有备份,因为高位不经常改写,直接用了一个地址存储。各位认为是否可靠?

my_avr 发表于 2008-9-1 11:21:29

做一个掉电保存不可以吗?不用这么麻烦吧.

所有的里程数据都记录在RAM里,只要一掉电,马上把这些数据保存到EEPROM里.当然,要多写些备份,以防止出错

hittiger 发表于 2008-9-1 11:55:28

掉电保存是硬件上检测掉电吧,我刚开始是这么想的,不过觉得不一定可靠,数据需要每累加一次纪录一次,如果意外干扰死机才可以保证数据没错。检测掉电不是什么好方法,需要大电容,写入数据个数也有限。电容成本也上去了,虽然只有几毛钱,但是总的觉得软件能解决的话还是软件解决。
刚才花了点时间,把所有的数据都备份了三组。按顺序写入,如果前面两组相同,数据正确,把后一个写入前面两个的数据。如果不同,判断后两个数据是否相同,若同,判断写入第一个数据错,后面数据+1为真实数据。如果后面两个不同,判断第一个正确,第二个写入出错,把第一个数据给后面两个。

my_avr 发表于 2008-9-1 12:08:05

我用M88做过掉电检测的东西,使用的是片子内部的模拟比较器,

外部的供电经过电阻分压后接到模拟比较器的负端,参考电压采用内部的1.1V参考电压.

只要电压低于1.1V,进入模拟比较器中断后马上关闭所有输出,然后把数据写到EEPROM中.

VCC上面用了2个220uF的电容,实验证明可以可靠地写35个字节的数据,其实可以写更多,不过我怕它不可靠,只写了32个字节.

my_avr 发表于 2008-9-1 12:13:07

在判断数据备份是否正确时,我的办法是:

每个备份的数据作累加和校验,然后把数据和校验码一同写到EEPROM中,系统重启后,先校验每个备份是否都正确,若有不正确的备份,立即用正确的备份来覆盖出错的备份,这样,不管何时EEPROM中都有三个备份,出错的可能性很小.

hittiger 发表于 2008-9-1 15:45:43

我觉得同时存多组数据校验才有用。如果是一个数据,那么多存一份就等同于校验了。

另外外部供电环境恶劣,有正相反向尖峰,所以我如果要用电压检测得在原电路上串联一级稳压电路。如果直接从电源上分压检测,很容易出现电压 低压 高压尖峰,烧毁io。

首先硬件上不能再提高成本了。其次又多了些元件,工人同志又得多花时间焊电阻,多累呀。即使是机器自动生产,也会是成本升高,生产速度降低。

另外非常感谢my_avr热心的回答。让我知道,掉电检测也是可行的,并且在440uf时可以写入35个字节还多。以后说不定大家会用得着。

outong 发表于 2010-4-26 16:50:49

楼主很有想法,这样就省了很多硬件电路

tantw 发表于 2013-1-16 13:04:00

学习了,不错。

marker 发表于 2013-1-16 13:38:53

这是EEPROM,过于频繁的写操作会使整机寿命缩短,好象不能完全实现掉电保存数据吧?楼主的想法不错,但是不具备实际操作性。5楼my_avr的方案是靠谱的。
页: [1]
查看完整版本: mega48 eeprom的存储方案