avrEEPROM数据丢失问题原因与解决方案

合集下载

治标治本,彻底解决AVR单片机EEPROM数据丢失问题

治标治本,彻底解决AVR单片机EEPROM数据丢失问题

治标治本,彻底解决AVR单片机EEPROM数据丢失问题治标治本,彻底解决AVR单片机EEPROM数据丢失问题在项目中复制出来的程序,使用时可能有些地方需要修改。

编译环境:WinAVR-20060421 + AVR Studio 4.12.498 Service Pack 4基本思路:每份写到EEPRM的数据,都做三个备份,每个备份的数据都做CRC16校验,只要系统运行中出错,错误地修改了EEPROM 数据,那么根据校验字节就知道哪个备份的数据被修改了,然后用正确的备份覆盖出错的备份,达到数据恢复的目的。

EEPROMSave.h 文件:/* EEPROM管理定义 */#define EepromPageSize 64 //页容量定义#define EepromPage0Addr 0x0000 //各个页的其始地址定义#define EepromPage1Addr (EepromPage0Addr + EepromPageSize)#define EepromPage2Addr (EepromPage1Addr + EepromPageSize)#define EepromPage3Addr (EepromPage2Addr + EepromPageSize)#define EepromPage4Addr (EepromPage3Addr + EepromPageSize)#define EepromPage5Addr (EepromPage4Addr + EepromPageSize)#define EepromPage6Addr (EepromPage5Addr + EepromPageSize)#define EepromPage7Addr (EepromPage6Addr + EepromPageSize)/*最后两个字节为CRC16校验码,其余为数据| 0 | 1 | 2 | |.......................| 61 | 62 | 63 |Data Data...................Data.....CRCH CRCL*/#define VALID 0x01#define INVALID 0x00/*-----------------------------------------------------------------------------------------*/EEPROMSave.c 文件:/************************************************************** ******函数名称:EepromReadByte()*函数功能:写一个Byte的数据进EEPROM*输入参数:address:地址*返回参数:从指定地址读出来的数据*编写作者:my_avr*编写时间:2007年8月13日*相关说明:*************************************************************** *****/unsigned char EepromReadByte(unsigned char *address){unsigned char data;data = 0;eeprom_busy_wait();data = eeprom_read_byte(address);return data;}/************************************************************** ******函数名称:EepromReadWord();*函数功能:写一个Word的数据进EEPROM*输入参数:address:地址*返回参数:从指定地址读出来的数据*编写作者:my_avr*编写时间:2007年8月13日*相关说明:*************************************************************** *****/uint16_t EepromReadWord(uint16_t *address){uint16_t data;data = 0;eeprom_busy_wait();data = eeprom_read_word(address);return data;}/************************************************************** ******函数名称:EepromWriteByte()*函数功能:写一个Byte的数据进EEPROM*输入参数:address:地址;data:数据*返回参数:无*编写作者:my_avr*编写时间:2007年8月13日*相关说明:*************************************************************** *****/void EepromWriteByte(unsigned char *address,unsigned char data){eeprom_busy_wait();eeprom_write_byte(address,data);}/************************************************************** ******函数名称:EepromWriteWord()*函数功能:写一个Word的数据进EEPROM*输入参数:address:地址;data:数据*返回参数:*编写作者:my_avr*编写时间:2007年8月13日*相关说明:*************************************************************** *****/void EepromWriteWord(unsigned int *address,unsigned intdata){eeprom_busy_wait();eeprom_write_word(address,data);}/************************************************************** ******函数名称:EepromWriteBlock()*函数功能:将缓冲区中的n个数据写进EEPROM*输入参数:address:地址;data:数据*返回参数:*编写作者:my_avr*编写时间:2007年8月13日*相关说明:*************************************************************** *****/void EepromWriteBlock(unsigned char *buff,unsigned char *address,unsigned char n){unsigned char i;for (i = 0; i < n; i++){EepromWriteByte((unsigned char *)(address + i),*buff);buff++;}}/************************************************************** *****函数名称:unsigned char EepromCheck(unsigned char *pdata,unsigned char packsize)*函数功能:检查EEPROM的数据是否有效,采用CRC16校验技术。

数据缺失处理方法

数据缺失处理方法

数据缺失处理方法数据缺失是指在数据集中某些观测值或者变量的值缺失或者丢失的情况。

数据缺失可能由于多种原因导致,例如人为录入错误、设备故障、样本损坏等。

在数据分析和建模过程中,处理数据缺失是一个重要的任务,因为缺失数据可能会导致分析结果的偏差和不许确性。

本文将介绍几种常用的数据缺失处理方法,包括删除缺失数据、插补缺失数据和模型预测等方法。

这些方法可以根据数据集的特点和分析目的来选择和应用。

一、删除缺失数据删除缺失数据是最简单和直接的处理方法之一。

当缺失数据的比例较小且对整体数据集的影响较小时,可以考虑删除缺失数据。

删除缺失数据的方法包括删除缺失观测值和删除缺失变量。

1. 删除缺失观测值:对于某些分析任务,可以删除包含缺失值的观测值。

这种方法适合于缺失数据的比例较小且缺失的观测值对整体数据集的影响较小的情况。

删除缺失观测值的优点是简单快捷,不需要对数据进行额外处理。

然而,这种方法可能会导致数据集的样本量减少,可能会影响到模型的准确性。

2. 删除缺失变量:在某些情况下,如果某个变量的缺失值较多,可以考虑删除该变量。

删除缺失变量的方法适合于缺失数据的比例较大且对整体数据集的影响较大的情况。

删除缺失变量的优点是可以减少数据集的维度,简化分析过程。

然而,这种方法可能会丢失实用的信息,影响到分析结果的准确性。

二、插补缺失数据插补缺失数据是一种常用的处理方法,它通过某种规则或者模型来估计缺失数据的值。

插补方法可以分为单变量插补和多变量插补两种。

1. 单变量插补:单变量插补是指根据其他变量的观测值来估计缺失数据的值。

常用的单变量插补方法有均值插补、中位数插补和众数插补。

- 均值插补:将缺失值用该变量的均值来代替。

这种方法假设缺失值与其他观测值的平均水平相同。

- 中位数插补:将缺失值用该变量的中位数来代替。

这种方法假设缺失值与其他观测值的中间水平相同。

- 众数插补:将缺失值用该变量的众数来代替。

这种方法适合于分类变量或者有明显偏倚的变量。

数据缺失值的4种处理方法

数据缺失值的4种处理方法

数据缺失值的4种处理方法数据缺失值的4种处理方法一、缺失值产生的原因缺失值的产生的原因多种多样,主要分为机械原因和人为原因。

机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。

人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。

二、缺失值的类型缺失值从缺失的分布来讲可以分为完全随机缺失,随机缺失和完全非随机缺失。

完全随机缺失(missing completely at random,MCAR)指的是数据的缺失是随机的,数据的缺失不依赖于任何不完全变量或完全变量。

随机缺失(missing at random,MAR)指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。

完全非随机缺失(missing not at random,MNAR)指的是数据的缺失依赖于不完全变量自身。

从缺失值的所属属性上讲,如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失,如果缺失值属于不同的属性,称为任意缺失。

另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失。

三、缺失值的处理方法对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。

对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,所以对于主观数据一般不推荐插补的方法。

插补主要是针对客观数据,它的可靠性有保证。

1.删除含有缺失值的个案主要有简单删除法和权重法。

简单删除法是对缺失值进行处理的最原始方法。

它将存在缺失值的个案删除。

如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。

当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。

防止eeprom数据丢失的措施

防止eeprom数据丢失的措施

防止eeprom数据丢失的措施2007-09-25 13:32摘要:并行EEPROM存贮器在工业现场使用时,有时由于会受到较大干扰则可能导致其存贮在EEPROM中的数据内容发生改变或丢失。

文中介绍了并行EEPROM受干扰而丢失数据的原因,介绍了ATMEL公司AT28C系列EEPROM的结构、特点和性能,详细阐述了该EEPROM卓越的硬件和软件数据保护(SDP)功能,最后给出了SDP 算法和部分C51程序。

关键词:AT28C系列抗干扰数据保护 SDP1 前言EEPROM是一种具有掉电记忆功能的存贮器,其内容可以象普通RAM一样进行改写,而且改写时能够自动擦除并换成新内容。

它不象EPROM那样需要紫外线擦除;而只需用电即可擦除并改写存贮在其内部的内容。

EEPROM通常在内部带有编程电源。

由于它只需外接单一+5V电源,因此使用起来十分方便。

和串行芯片相比,并行EEPROM的电路接口和编程设计均简单得多,所以在对电路板面积要求不很苛刻的情况下,使用EEPROM存贮器还是十分的方便。

2 并行EEPROM中数据丢失的原因并行EEPROM通常采用总线扩展接口方法,图1所示是基于AT28C256的接口电路,其中CS为地址译码产生的片选信号,RD和WR为单片机的读、写信号。

编程时,只需一句MOVX指令即可完成EEPROM存贮器的读、写操作,使用十分方便,但并行EEPROM在工业现场往往会受到干扰而导致其存贮在内部的数据内容发生改变,从而造成数据的损坏或丢失。

经分析,EEPROM存贮器的数据丢失主要发生在系统上电、掉电或复位等情况下。

主要表现在以下两种情况。

(1)当整个数据存贮系统中的CPU在复位信号解除后,一般都将会延时数百μs 时间,因此,在这段时间内,读信号、写信号、地址信号和数据信号都可能随机变化,从面造成对存贮器的误写操作而使其中的数据改变。

(2)在电源缓慢升降过程中,当CPU处于临界工作状态时,其读写时序可能会出现混乱,从而使存贮器中的数据发生改变。

AVR单片机内部EEPROM应用方法

AVR单片机内部EEPROM应用方法

AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。

在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。

困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。

操作EEPROM 对时序的要求较高。

更加Datasheet 里的写操作范例程序:while(EECR &amp; (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR &amp; (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。

计算机存储数据丢失的主要原因

计算机存储数据丢失的主要原因

计算机存储数据丢失的主要原因
计算机存储数据丢失的主要原因有以下几个方面:
1.人为操作失误:这是最常见的数据丢失原因之一,例如误删文件、格式化硬盘、操作系统故障等。

2.病毒攻击:计算机病毒是指一种程序,它的主要功能是在感染的计算机上进行破坏、篡改、隐藏或复制等操作,从而导致数据丢失。

3.硬件故障:硬盘故障、电源问题、主板损坏、内存故障等硬件问题也是导致数据丢失的主要原因之一。

4.自然灾害:自然灾害如火灾、水灾、地震等也会导致计算机硬件设备的损坏,从而导致数据丢失。

5.未经授权的访问:黑客攻击、网络钓鱼等方式可能导致数据被窃取或者修改,从而导致数据丢失。

为了避免数据丢失,我们需要定期备份数据,使用杀毒软件防范病毒攻击,定期检查硬件设备的状态,以及保护好自己的账号和密码,避免未经授权的访问。

avrEEPROM数据丢失问题原因与解决方案

avrEEPROM数据丢失问题原因与解决方案

avrEEPROM数据丢失问题原因与解决方案avr EEPROM 数据丢失问题原因与解决方案总结一下引起AVR内部EEPROM数据丢失的原因:1.程序问题;2.程序跑飞;3.EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作;4.系统有很大的感性负载,在断电的时候会产生一个反向高压,EEPROM有可能会自擦除。

(还有什么原因,欢迎大家继续列举,以便完善及想办法解决)针对问题1,程序问题不再该文讨论范围内。

针对问题2,程序跑飞,这个因该是引起EEPROM数据丢失的主要原因。

但是引起程序跑飞的原因却是多方面的。

第一.电压不正常,工作不稳定,程序跑飞。

针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必要的,毕竟BOD功耗太高。

第二,晶体振荡受干扰,频率不稳定,程序跑飞。

针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。

第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。

针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣,那么就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单片机试试看了。

针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。

针对问题4,如果系统真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不要让这种反向高压产生,无论如何,这种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。

====================================== ================================================================ ========经过上面硬件上的一些处理,虽然EEPROM数据丢失的可能已经很小了,。

EEPROM常遇问题和解决办法

EEPROM常遇问题和解决办法

在项目开发中经常使用到EEPROM,现在把自己开发中曾经遇到的陷阱和自己的解决方法列出。

(1)现象:加密型遥控器的ID自动丢失和改变。

原因:在更新EEPROM过程中,断开电源。

解决方法:a.更改设计避免在写入EEPROM过程中断开电源;b.增加100uF的电容,断电后瞬间维持EEPROM供电正常至EEPROM写入完成。

(2)现象:保存在EEPROM里的配置信息自动被改变。

原因:在EEPROM读写过程中进入了中断服务程序,而中断服务程序也调用了EEPROM读写函数。

解决方法:a.保证EEPROM读写函数的第一句是cli(),最后一句是sei();b.中断服务程序不直接调用EEPROM读写函数,如果SRAM足够大使用读写缓冲区代替直接读写EEPROM,中断返回后在主循环粒更新EEPROM;c.如果检测到EEPROM已被占用,则进入阻塞状态,等待EEPROM释放后继续执行;d.如果EEPROM里的数据长度大于EEPROM最小存储单元,必须保证该数据的读写不被打断。

(3)现象:突然断电时,EEPROM数据偶尔会丢失。

原因:在断电时刚好在进行EEPROM 写操作。

解决方法:加大电源滤波电容的容量,增加电压检测功能,当电压偏低时禁止EEPROM写入操作。

(4)现象:当大功率交流或直流电机启动或后,EEPROM里的数据自动丢失或改变。

原因:在大功率电机启动或断开瞬间EMI干扰大。

解决方法:a.避开这些时候读写EEPROM。

b.如果无法避开这些时候,启动EEPROM写保护功能,并且每个数据都保存多个副本。

c.使EEPROM和EEPROM的DAT,CLK等信号线远离可能产生干扰的元件,并且避免形成大的环路。

d.使用EMI抑制电路降低干扰幅度。

9.5 注意事项单片机的断电保护虽然不是非常复杂,但是要做得好,使线路简洁、性能可靠却很不容易。

下面列了几点设计时需要注意的事项。

(1)加大滤波电容的容量。

单片机接收到电压监控电路送来的中断信号后,立即中断正在执行的程序,转入中断服务子程序,执行数据保护并最后使单片机和RAM进入低功耗状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

avr EEPROM 数据丢失问题原因与解决方

总结一下引起AVR内部EEPROM数据丢失的原因:
1.程序问题;
2.程序跑飞;
3.EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作;
4.系统有很大的感性负载,在断电的时候会产生一
个反向高压,EEPROM有可能会自擦除。

&hellip;&hellip;(还有什么原因,欢迎大家继续列举,以便完善及想办法解决)
针对问题1,程序问题不再该文讨论范围内。

针对问题2,程序跑飞,这个因该是引起EEPROM数据丢失的主要原因。

但是引起程序跑飞的原因却是多方
面的。

第一.电压不正常,工作不稳定,程序跑飞。

针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必
要的,毕竟BOD功耗太高。

第二,晶体振荡受干扰,频率不稳定,程序跑飞。

针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。

第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。

针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣
,那么就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单片机试试看了。

针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。

针对问题4,如果系统真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不要让这种反向高压产生,无论如何,这
种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。

================================================= ================================================= ============
经过上面硬件上的一些处理,虽然EEPROM数据丢
失的可能已经很小了,但是我们仍然不能保证EEPROM数据就不会丢失了。

这时EEPROM数据的可*性,那就得从软件上去考虑了,接着我们从
软件的方面继续讨论。

我的做法是,数据分块,分区,校验,备份。

当然这里讲的处理方法,仅仅是提供一种想法,你可以做不同数据长度的分块,不同大小的
分区,采用不同的地址映射方法,以及采用更多次的数据备份。

下面以Mega168为例继续讨论。

1.Mega168EEPROM512字节,把EEPROM分为两个区,每个
区256个字节,然后以8个字节为一个段,那么每个区就有32段。

数据区:0x000-0x0FF
0段:0x000-0x007
1段:0x008-0x00F
&hellip;&hellip;
31段:0x0F8-0x0FF
备份区:0x100-0x1FF
每个段8个字节,其中前6个字节为有效数据,后2个字节为CRC16校验,数据格式下图所示:
2.EEPROM读写操作
EEPROM的操作以段为单位,
段写入函数:写数据到数据区时,先计算数据CRC16校验,然后同时把数据写入到数据区和备份区;
段读取函数:读取数据时,同时读取数据区以及备
份区,如果数据区校验有误,备份区数据校验正确,就用备份区数据恢复数据区数据;
如果备份区数据有误,数据区数据正确,那么数据写入备份区重新备份;如果数据区备份区数据都有误,那么返回读取失败。

3.数据区与备份区的对应关系
数据读写操作以段进行,内部的数据区与备份区怎么映射呢?为了防治数据与备份同时被意外修改,那么数据与备份地址空间相隔不能太
近,并且数据与备份的地址,应该尽量不同。

假设数据地址为Data_Addr,备份地址为Bakup_Addr,我使用下面的函数映射地址:
Bakup_Addr=(Data_Addr+0x100)^0x03F
加0x100是把地址定义到备份区,与0x03F异或,是把低6bits取反,这样处理,数据与备份的地址空间较远,并且地址有7bits的不同。

例如,第3段的地址:0x018-0x01F,
对应的备份区为:0x127-0x120
如下图所示:
4.读写函数加入写保护判断,在读写EEPROM前关闭写保护,读写完毕后,立即开启写保护,这样可以有效防止程序跑飞造成的EEPROM意外修改。

5.第0块建议禁止使用。

相关文档
最新文档