AVR看门狗及EEPROM

合集下载

AVR单片机内部EEPROM应用方法

AVR单片机内部EEPROM应用方法

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

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

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

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

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

AVR单片机看门狗的使用

AVR单片机看门狗的使用


验评 资 ¥ 150

USB转RS232开 4 数码 静态显 8 数码 态扫 4x4 键 ¥ 65 ¥ 40 显 ¥ 15 ¥ 40
/study/J0022.html
1
3
[2009/2/15 2:50:07]





MSP430单 AVR单 C8051F单 PIC单

TI
图讲 请 阅 骤 AVRmega16 册 “ 时 ” 节 P40 关内
导 HOLTEK单 STC单 ANALOG DEVICES IAR SYSTEM ICC Keil Protel IAR AVR 将 贴 项 JTAG main.c 讲 称为 AVRmega16 WatchDog 项
/************************************************** * * WatchDog 试验——AVRmega单 * * : __watchdog_reset();语 释 CPU * *时 2007 12 * * * * 编译环 IAR AVR V4.20A * 验 **************************************************/




[
绍] [
] [MSP430] [AVR] [51] [
][
][
载] [
购] [

][
][
][ 单
]
MSP430开
MSP430FET JTAG-I ¥ 120 MSP430FET JTAG-II ¥ 150 MSP430F135 验 -I ¥ 120 MSP430 验 -I ¥ 180 MSP430开 -II ¥ 200 MSP430 USB JTAG 资 EZ430 资 习 执 验 为 CPU 图 AVRmega16单 带

单片机-AVR-EEPROM的读写分析

单片机-AVR-EEPROM的读写分析

1.单片机(AVR)EEPROM的读写分析由于AVR的EEPROM写周期比较长(一般为毫秒级),因此在编程使用过程中要特别注意.对于读EEPROM没什么好说的,读一个字节的数据要耗费4个时钟周期,可以忍受,写就比较麻烦了,虽然放在EEPROM的数据都不是频繁访问的;虽然可以用读-比较-写的机制降低EEPROM的写操作频度,但在写入过程中,过长的写入周期还是会造成一些问题,下面就分析一下几种方式的EEPROM写操作.1.1.循环查询式将地址和数据写入EEPROM相关的寄存器,置写标志后就循环不断查询写完成标志,直到写完成,退出循环,顺序执行其他程序.在置写入标志到写完成的这段时间,程序除了不断查询写完成标志和响应硬件中断之外什么也不干,这段时间就这么浪费了,如果是个实时性要求比较高的应用,浪费的就不仅是时间了,很可能在这段时间里I/O状态的变化不能得到及时的响应,如果一下子要进行多个字节的EEPROM的写入操作,那情况会更糟.针对这种情况,有种解决办法就是,这个写完成查询放在软件的死循环中(无操作系统的情况下,系统启动后都要进入一个死循环),每循环一次查询一次写完成标志,这样就不必一直等待写操作完成而可以干别的事情了,但是这样会带来两个问题.一是,如果死循环周期无法保证,则每一次的EEPROM写操作的完成标志查询也得不到保证,从而进行一次EEPROM写操作的周期也无法保证(最长延迟时间就是一个死循环周期的最长时间);二是,在执行一次EEPROM写入操作到写完成这段时间里死循环里其它的子程序不能进行EEPROM读写操作.第一个问题如果能保证最大循环周期在延迟允许范围内就不是问题了,否则就得采取下面讲到的方式二了;第二个问题的解决方法是每次EEPROM读写操作都要在其中加入对EEPROM写完成标志寄存器的判断,如果有数据正在写入,则等待或退出,但等待和退出又会造成等待延迟和写入操作不成功的问题,解决办法是先放入一个数据缓冲区,待上一次写入操作完成,再从缓冲区里拽出一个字节进行下一次写入周期,但这又会涉及到选择合适的缓冲区大小以及的问题,这个问题在下面中断式操作里继续讨论.1.2.定时查询式在写入EEPROM地址和数据寄存器置写标志后启动定时器,定时查询写完成标志,这种方法继承了方式1的大部分优缺点,唯一的进步就是能够确定写操作延迟时间为定时周期.1.3.中断式编写EEPROM写完成中断子程序,设置一个FIFO缓冲区,要写入的数据先放入这个FIFO,如果EEPROM操作空闲,则从FIFO中揪一字节数据出来写EEPROM,置完写完成标志就返回,然后去干别的事情,EEPROM写完成产生一个中断,在中断服务程序中再从FIFO中揪一个字节去写EEPROM,如此循环直到FIFO空,这种方式虽然能在第一时间完成一次写操作,但是还是有个和和方式1中提到一样的问题,怎么选择这个FIFO的大小.小了,待写入数据可能溢出丢失,大了,多大算大,1K够不够,10K够不够,硬件上有这么多RAM空间么,这就需要根据实际资源和系统需求来定了.如果EEPROM写操作频率很低,比一次EEPROM写操作间隔还要长得多,那么几个单位的FIFO就足够了;如果EEPROM写操作频率可能很高或一次大批量连续写入数据就要求很大的FIFO,达到能够保证数据不丢失,这就要根据批量数据大小和写频率来定了,另外还要考虑可用RAM空间的限制来找出最佳值,同时有FIFO溢出一定要制定相应的应对措施.最后注意两点:1.读写之前一定要检测是否已经有EEPROM写操作;在写完成之后一定要再读出写入的数据校验写入操作是否成功,不成功则EEPROM损坏,要做好应对措施.2.如果要保存一个16位的数据,一定要保证在这16位数据分成的两字节都成功写入了EEPROM再去读该数据,否则在刚写完一个字节就去读该数据,得到的数据显然不是你想要的,如果该数据是一重要参数,后果可想而知.。

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

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

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

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

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

但是引起程序跑飞的原因却是多方面的第一. 电压不正常,工作不稳定,程序跑飞。

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

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

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

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

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

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

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

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

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

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

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

AVR的一点驯狗心得

AVR的一点驯狗心得

AVR的一点驯狗心得新的AVR 系列(例如,ATMEGA168 等)使用增强功能的看门狗(Enhanced Watchdog Timer),与原来的看门狗相比较,除了有相同复位的功能以外,还增加了中断的功能设计时。

使用看门狗的中断功能,可以实现从Power Down 状态唤醒CPU;另外同时能使中断和复位功能,可以在系统发生错误时,先进入中断状态,保存关键数据到EEPROM,然后在进行系统复位。

AVR 新的看门狗与旧狗(例如,ATMEGA16 等)比较,增加了新的功能的同时脾气也有了不少改变。

设计时要摸清它的脾气,以防被狗咬。

下面说明以ATMEGA16 和ATMEGA168 作一个简单比较为例,简要地说明一下注意要点: 看门狗定时器控制寄存器– WDTCR: Atmega16: Atmega168: 1.A1tmega168 由于具有中断功能,所以WDTCR 增加了WDIF 和WDIE 两个额外的bit 的功能; 2.增加了WDP3,溢出周期可以有长达8 秒; 3.新的看门狗在初始化时,WDT 的值不再一定是0。

只要MCUSR 寄存器上的WDRF 置位,WDT 也将被强制置位。

这时,如果WDE 要清零,必须要WDRF 先清零。

4.在设计时即使不用WDT,它也可能在无意中被能使,例如在runaway 指针和调电情况下。

因此即使不用WDT,在初始代码中一定要检查复位标志,如果WDT 系统复位发生要采取处理步骤。

最近重新设计一个项目,由原先使用的ATMEGA16 更新到ATMEGA168。

把原代码转换后,测试结果异常。

经过一天多的测试,才发现是新的看门狗惹的祸。

以前用ATMEGA16,在初始化后才开始喂狗,可是新的AVR 系列(例如ATMEGA168 等),系统复位发生时(除上电复位外) ,WDT可能继续运行,并使用最小溢出周期(大约15mS) ,造成了系统不断复位。

根据datasheet,在程序开始时的关狗后一切就恢复正常了: #include #include uint8_t mcusr_mirror; void get_mcusr(void) __attribute__((naked))。

AVR单片机看门狗实验报告2013v1(有不同)

AVR单片机看门狗实验报告2013v1(有不同)
void watchdog_on(void) { WDTCR = 0x0F; // WDTCR |=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); }
void watchdog_off(void)
{ /* Write logical one to WDTOE and WDE
这里严格要求这样的顺序*/
WDTCR = (1<<WDTOE) | (1<<WDE); /* Turn off WDT 这里严格要求这样的顺序*/
WDTCR = 0x00;
}
void Delay(void) { unsigned char i,j; for(i=200;i>0;i--)
{ for(j=100;j>0;j--); WDR(); //这里喂狗不然超过时间了
BIT 2、1、0 这三位设置看门狗溢出的间隔,在设置好的时间内不喂狗,就重启。
二、 具体例子(基于 ICCAVR7.22)
A、 打开和配置看门狗为最大时间间隔 2.2s void watchdog_on(void) { WDTCR |=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); }
{ } }
4.2 加入看门狗后
//ICC-AVR application builder : 2013-9-23 9:24:33 // Target : M16 // Crystal: 4.0000Mhz
#include <iom16v.h> #include <macros.h>
void port_init(void) { PORTD = 0x00; DDRD = 0xff; }

AVR单片机 看门狗范例 GCCAVR WDR 复位检测和控制看门狗

AVR单片机 看门狗范例 GCCAVR WDR 复位检测和控制看门狗

AVR单片机看门狗范例GCCAVR WDR 复位检测和控制看门狗内容来源:OURAVR发布时间:[2010-10-28]查看次数:805/*************************************************** AVR 复位检测和控制看门狗的范例******* ******* 作者:HJJourAVR ******* 编译器:WINAVR20050214 ******* ******* 2005.9.28 **************************************************//*本程序简单的示范了AVRATMEGA16的复位检测和控制看门狗系统控制和复位复位来源的检测JTAG复位指示看门狗复位指示BOD复位指示RESET引脚复位指示上电复位指示看门狗的控制出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器。

熔丝位设置1 使能BOD功能BODEN=02 选择BOD电平BODLEVEL=1 2.7V(VCC=3V) (可选)BODLEVEL=0 4.0V(VCC=5V) (可选)*/#include <avr/io.h>#include <avr/delay.h>//时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其他时钟#include <avr/wdt.h>/*wdt.h里面看门狗溢出时间常量定义#define WDTO_15MS 0#define WDTO_30MS 1#define WDTO_60MS 2#define WDTO_120MS 3#define WDTO_250MS 4#define WDTO_500MS 5#define WDTO_1S 6#define WDTO_2S 7下面的4S/8S定义只能用于 ATtiny2313, ATmega48, ATmega88 and the ATmega168.#define WDTO_4S 8#define WDTO_8S 9看门狗操作函数wdt_disable()关闭看门狗wdt_enable(timeout)使能看门狗及溢出时间设定wdt_reset()复位看门狗(喂狗)*///管脚定义#define WDT_EN 7 //PA7 看门狗的喂狗控制引脚// 高电平,不喂狗// 低电平,喂狗#define LED_JT 4 //PA4 JTAG复位指示#define LED_WD 3 //PA3 看门狗复位指示#define LED_BO 2 //PA2 BOD复位指示#define LED_EXT 1 //PA1 RESET引脚复位指示#define LED_PO 0 //PA0 上电复位指示//以上信号皆为低电平有效int main(void){unsigned char CPU_STATUS;unsigned char i;//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTB=0xFF;//不用的管脚使能内部上拉电阻。

AVR复位

AVR复位

当然,在AVR的RST脚也接一个0.1uF的电容到GND,这电容的作用是很重要的。因为一般情况单片机受到干扰而复位基本是由于 RST受到干扰而 复位的。加上这个电容后有一定的作用,但也不是百分百的可以解决问题。所以前向的电源的处理很重要,前面的没处理好,5V端这边怎么折腾也是没什么好的效果。
当然,如果在交流侧有条件的话, 建议也加上EMI滤波电路。
我基本上按ATMEL提供的EMC注意手册里的说明来处理电源。现在把一个12V的直流电机直接接在正常工作的 ATTINY24 的系统里,然后不断的通断工作,相信这个干扰是很大的,但系统一直稳定工作,没有任何的死机复位现象。
PCB方面也是需要下工夫的,当然这个需要积累,建议多看看抗干扰方面的书籍和 PCB布线的书,收获是很大的。
随便说了一堆,可能还有很多片面的地方 ,希望对大家有所帮助。
使用AVR 芯片时, 很多人在实际使用的时候很容易出现工作过程中的复位,基本上是由于传导干扰造成的,而辐射干扰倒是可以通过PCB设计和铁壳屏蔽来解决。
而传导辐射就得需要在电源上下工夫了。
在5V直流电源端要做好滤波和去耦,在靠近AVR的VCC和GND的地方要加上0.1uF的独石电容或高频电容,可以很好的滤除从电源串入的高频脉冲干扰(这类的高频脉冲干扰基本上由同线路的电磁器件产生的,如电机、继电器,这类的器件多数情况下是和单片机同一路直流电源的,如12V、24V直流,而单片机的5V电源基本上是12V、24V电源端取的,然后进行稳压处理)。
掉电复位:就是在单片机运行过程中电压突然跌落,这个时候单片机会出现很多不确定的现象,所以在这个时候需要将单片机复位,让它处于一个确定的状态。这就是BOD功能,一个非常实用的功能,AVR单片机带有这个功能。

嵌入式学习笔记21——AVR单片机之片内EEPROM

嵌入式学习笔记21——AVR单片机之片内EEPROM

嵌入式学习笔记21——AVR单片机之片内EEPROM1. ATmega16 单片机内部具有512 字节的EEPROM,它是一个独立的数据空间。

数据读写以一字节为单位,通过专用的指令来实现对EEPROM 的操作,也可通过ISP,JTAG,并行编程的方式实现EEPROM 的读写;采用内部RC振荡器的1MHz 作为访问的定时时钟,其编程使用周期8848 个周期,时间大约8.5ms;操作过程中尽量关闭中断,保证时序不被打断。

2. EEPROM 存储器相关的寄存器程序中可直接对地址寄存器EEAR 赋值,如EEAR=0x01BA。

控制寄存器EECR 用于控制单片机对EEPROM 的操作位3EERIE:EEPROM 中断准备好使能位。

当EERIE 置1 而且全局中断I 置位时,如果EEWE 为0,则单片机产生一个中断表示写操作完成。

(即置1 后,才能在全中断I 为1,且EEWE 为0 时产生写操作完成中断。

)位2EEMWE:EEPROM 主写使能位。

当EEMWE 为1 时,设置EEWE 为1 将把EEDR 中的数据写入EEAR 所选择的的地址空间中(只是写入地址空间,还没有真正写入到EEPROM)。

如果EEMWE 为0,则EEWE 无效。

EEMWE 在被用户置1 后的4 个时钟周期后被硬件清0。

位1EEWE:EEPROM 写使能位。

当EEPROM 的地址和数据准备好之后,用户必须设置EEWE 为1,才能将数据写入EEPROM 中,在置EEWE 为1 之前,EEMWE 必须置1,否则写入操作无效。

EEPROM 数据的写入操作如下:a 等待EEWE 为0;b 把EEPROM 的地址写入EEAR;c 把EEPROM 的数据写入EEDR;d 置EEMWE 为1;e 在置。

详解AVR单片机防eeprom掉数据的办法

详解AVR单片机防eeprom掉数据的办法

详解AVR单片机防eeprom掉数据的办法应用A VR芯片内部EEPROM写入(或写入后读出)出错问题,下面有A VR的芯片手册有相关介绍(来自mega8中文翻译文档):防止EEPROM 数据丢失若电源电压过低,CPU 和EEPROM 有可能工作不正常,造成EEPROM 数据的毁坏( 丢失)。

这种情况在使用独立的EEPROM 器件时也会遇到。

因而需要使用相同的保护方案。

由于电压过低造成EEPROM 数据损坏有两种可能:一是电压低于EEPROM 写操作所需要的最低电压;二是CPU 本身已经无法正常工作。

EEPROM 数据损坏的问题可以通过以下方法解决:当电压过低时保持A VR RESET 信号为低。

这可以通过使能芯片的掉电检测电路BOD 来实现。

如果BOD 电平无法满足要求则可以使用外部复位电路。

若写操作过程当中发生了复位,只要电压足够高,写操作仍将正常结束。

以上官方文档介绍主要提示的是电压过低发生的异常而造成读写错误,并未涉及到其它问题。

个人总结,在实际应用过程中有以下问题造成数据读写错误:1.程序受到干扰(或程序存在BUG)造成写入EEPROM的数据本身就是错误的;2.EEPROM写入次数过多(这个问题在频繁写入时会遇到),造成无法写入的;3.再提电压问题:由于电压过低,造成写入的数据实际未写入或写入错误;EEPROM写入错误问题是不可避免的,因此就应有相关的归避措施和恢复措施:从硬件方面来说:加入BOD措施是必要的,同时芯片的电源滤波也有较高要求,芯片的复位电路、晶振(及芯片晶振设置位,指单片机的工作频率,这对EEPROM读写有影响)也应仔细处理,以提高抗干扰;当然,一个设计优良的线路板对抗干扰有很大帮助;从软件方面来说:可以有以下方式进行控制:1.在写入EEPROM前,需对写入的EEPROM数据进行验证措施,若不正常则不写入;2.EEPROM写入后再读出(即较验),写前数据比较,应一致,否则可能为EEPROM无法再写入,这时可能要更换存储区地址;3.楼主的解决方案有比较好的效果,但是我14楼提出的问题:太占EERPOM存储空间了,可以精简一下会更好;因为A VR内部的EEROM区有限,若存在大量存储数据情况下,则有可能选用高阶的芯片而造成成本上升;4.数据读出时有验证,并存在恢复措施,以使数据错误降到最低。

最新AVR单片机EEPROM寄存器汇总

最新AVR单片机EEPROM寄存器汇总

A V R单片机E E P R O M寄存器ATmega88包含512字节的EEPROM数据存储器。

它是作为一个独立的数据EEPROM 的寿命至少为 100,000 次擦除周期。

EEPROM 的访问由地址寄存器,数据寄存器和控制寄存器决定。

具体的 SPI 及并行下载 EEPROM 数据请参见P254“存储器编程”。

EEPROM 读/ 写访问EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。

EEPROM的写访问时间由Table 3给出。

自定时功能可以让用户软件监测何时可以开始写下一字节。

用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。

此时CPU 可能工作于低于晶振所要求的电源电压。

请参见P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。

为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。

具体参看EEPROM控制寄存器的内容。

执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。

EEPROM 地址寄存器- EEARH和EEARL· Bits 15..9 – Res: 保留保留位,读操作返回值为零。

· Bits 8..0 – EEAR8..0: EEPROM 地址EEPROM 地址寄存器– EEARH和EEARL指定了 512 字节的EEPROM。

EEPROM 地址是线性的,从 0 到 511 。

EEAR 的初始值没有定义。

在访问EEPROM 之前必须为其赋予正确的数据。

EEAR8 在 ATmega48 中为无效位,必须始终将其赋值为”0”。

EEPROM 数据寄存器- EEDR· Bits 7..0 – EEDR7.0: EEPROM 数据对于EEPROM 写操作, EEDR 是需要写到EEAR 单元的数据;对于读操作,EEDR 是从地址EEAR 读取的数据。

AVR单片机的看门狗详解

AVR单片机的看门狗详解

AVR单片机的看门狗详解
AVR 看门狗一个硬件单元,当程序由于某种原因跑“飞”了,它就Reset 程序。

就像小狗看门一样。

//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
上面是用ICC 的App Builder 生成的看门狗初始化程序,这些语句达不到初始化看门狗的目的,需要在中间加一句WDTCR = 0x1F; 。

最后一行代码提醒狗主人,别忘了及时清零看门狗定时器(喂狗),否则,小狗就咬人了。

一个相对独立的计数自动重启单片机的硬件部件,如果启用它后,不在一定的时间内清除它的计数值,就会达到计数的最高值而溢出,然后它就指挥单片机重启。

所以要在你的程序里适当的加入清看门狗的指令,一旦你的单片机程序出了问题,当然就不能按照你的程序原先设定那样自动清看门狗了,也就是常说的程序跑飞了,这个时候看门狗就会重启单片机试图解决问题。

一般只对瞬间干扰造成的问题有效,要是长时间的干扰或是软硬件问题,看门狗的意义不是很大。

我的理解就象是监视程序执行的保安一样, 程序正常执行时会在他的益处时间之内给他一个复位信号,当程序跑飞的时候他在溢出时间之内是收不到复位信号的,这时看门狗就会在设定的时间内产生系统复位的信号!。

AVR单片机EEPROM的读写

AVR单片机EEPROM的读写

AVR单片机EEPROM的读写
一AVR 存储类型不要外挂方便使用
1.FLASH 存储程序代码
2.EEPROM 运行的数据掉电不丢失的数据存储分页的数据
3.SRAM 运行的临时数据
EEPROM:读写以字节为单位通过专用指令或SPI、JTAG 直接读写
使用RC 震荡作为时钟,典型值为8.5ms
有时数据丢失的原因:刚上电电压不稳就操作、读写时被中断打断、程序跑飞了
怎样预防:
熔丝位的电压检测设置:低于电压就停止
熔丝位系统时钟的设置:设置上电暂停时间长一点
双字节存储,或加校验位
操作时尽量关中断
二相关寄存器
存储器需要数据和地址来操作以及相应的控制寄存器
地址寄存器EEARH EEARL
数据寄存器EEDR
控制寄存器EECR
* ** * EERIE EEMWE EEWE EERE
以一个实例示范下即可。

第十二章AVR看门狗及EEPROM

第十二章AVR看门狗及EEPROM
令。 n 用户在读取EEPROM 时应该检测EEWE。 n 如果一个写操作正在进行,就无法读取EEPROM,也无法改变
寄存器EEAR。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
AVR 内置EEPROM
n EEPROM 数据寄存器 - EEDR
n 对于EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;
n 对于读操作, EEDR 是从地址EEAR 读取的 数据。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n 从EEPROM 指定位置处开始写"size"个字节写的内容由"ptr."指向 的缓冲区提供
第十二章AVR看门狗及EEPROM
ICC读写EEPROM内置函数原型
unsigned char EEPROMread( int location) {
EEAR = location;
EECR |= 0x01; strobe
n EERIE: 使能EEPROM 准备好中断
n 当EEWE 清零时EEPROM 准备好中断即可发 生。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n EEMWE: EEPROM 主机写使能
n EEMWE决定了EEWE置位是否可以启动EEPROM写 操作。
n 当EEMWE为“1”时,在4个时钟周期内置位EEWE 将把数据写入EEPROM 的指定地址;

AVR内部EEPROM使用

AVR内部EEPROM使用

AVR單片機內部EEPROM詳解使用EEPROM倒是挺簡單的,無非是讀和寫操作,首先需要判斷是否在讀寫中,判斷讀寫忙標志,然後要保證讀寫時不能被打斷即要關中斷,接著要寫入到寫數據的地址,接著寫數據,再將地址和數據控制位置位下,數據就寫進了,最後別忘了開中斷。

讀數據時,只要寫入地址,然後將讀控制位置位,再從寄存器EEDR中讀出數據即可。

以上用法是簡單用法,當然這種用法不能用在實際工程應用中的,因爲寫數據需要8ms的時間,系統當然不允許一直等待這8ms的,在本文下面介紹了一種比較好的方式,來安排系統工作的時間。

當然前提是要理解清楚最簡單的工作模式。

一、簡單的工作模式void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //寫入地址EEDR = ucData; //送入數據EECR |=(1<<EEMWE); //地址和寫控制位鎖存,即可EECR |=(1<<EEWE);SEI();}unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //送入地址EECR |=(1<<EERE); //讀位置位SEI();return EEDR; //返回數據}讀和寫的操作如下面所示讀寫數據時要從0x01開始,00地址有bug(數據手冊上講的)temp=EEPROM_read(0x01);EEPROM_write(0x01,temp);二、提升篇-使用緩衝機構的操作思路是這樣的:首先建立讀寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀\寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數據都寫完了。

关于AVR单片机的看门狗

关于AVR单片机的看门狗

关于AVR单片机的看门狗看门狗这个东西以前没接触过理解它费了一点周折。

使用它的复位MCU 的功能实现LED 的闪烁。

准备工作是设定WDT 的超时时间(如1s)首先使能看门狗(wdt_enable),然后喂狗(wdt_reset),再延时灯的闪烁时间(delay=0.5s),使灯亮(SET_LED);再用一个恰当的比较长的延时(delay>0.5s)饿死狗。

之后MCU 重启,如此往复。

(1)延时可以调用库函数,还可以使用定时器;(2)SET_LED; while(1) wdt_reset(); 表示不断喂狗,从而不让MCU 重启,使灯一直亮着。

程序中使用这些代码的用途待考证,可以给作者发email 嘿嘿~(3)软件看门狗和硬件看门狗。

软件看门狗可以用wdt_disable 来禁掉。

而硬件看门狗不能。

AVR 可以通过修改熔丝位来分别实现软硬看门狗。

(4)wdt_enable(timeout)的参数timeout 表示看门狗的超时时间,即timeout时间内不喂狗,狗就会叫,mcu 就会复位。

=================================================================================================#include#include#include#define uchar unsigned char#define uint unsigned int#define SET_LED PORTA&=0XFE //PA0 输出低电平,黄灯亮#define CLR_LED PORTA|=0X01//PA0 输出高电平,黄灯灭。

avr操作eeprom

avr操作eeprom

AVR如何将数据写入EEPROM用ICCAVR编译程序,对EEPROM的操作很简单,只要在头文件中包含eeprom.h文件即可。

读取数据调用EEPROMread(addr) 函数,用addr指明读取的地址,该地址的数据在返回值中;写入数据调用EEPROMwrite(addr,x),即将x写入地址addr中。

以上是大前提。

面向具体应用,由于我们想做密码锁,密码锁的初始密码与修改密码都需要保存到EEPROM中,否则,每次上电的密码都会是初始密码。

而数据保存在EEPROM中,依然需要先写再读,若写函数与读函数都写在flash主函数中,像下面的写法,那么依然解决不了“上电变初始”的问题。

uchar pw[]={1,2,3,4,5,6};void writeROM(void){ EEPROMwrite(0x20,pw[0]);EEPROMwrite(0x21,pw[1]);EEPROMwrite(0x22,pw[2]);EEPROMwrite(0x23,pw[3]);EEPROMwrite(0x24,pw[4]);EEPROMwrite(0x25,pw[5]);}void readROM(void){ pw[0]=EEPROMread(0x20);pw[1]=EEPROMread(0x21);pw[2]=EEPROMread(0x22);pw[3]=EEPROMread(0x23);pw[4]=EEPROMread(0x24);pw[5]=EEPROMread(0x25);}void main(){……writeROM();readROM();……}遇到这个困惑后,求助,得到这样的一个回答:编程器就支持直接对EEPROM的编程的,建个Bin或Hex文件,烧录进去就行了。

恍然大悟,于是这样解决的。

先保留着pw[]的赋值语句和writeROM()语句,烧写flash。

然后AVRfighter中有个“读EEPROM”按钮,点击,就可以在“EEPROM内容”中看到EEPROM 中的数据,然后点击右边的“保存”按钮,可以将EEPROM中的数据保存为bin或hex格式。

AVR使用范例--EEPROM使用详解

AVR使用范例--EEPROM使用详解

AVR使用范例--EEPROM使用详解本页关键词:什么是eeprom spi eeprom eeprom程序eeprom资料eeprom结构eeprom 读写eeprom的读写本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。

程序代码:下载相关文件∙void main(void)∙{∙ unsigned char temp1,temp2;/*定义变量*/∙ unsigned char buffer[10];/*定义数组*/∙ unsigned char buf[]="AVR与虚拟仪器";/*定义字符串*/∙∙ EEPROMwrite(0x10,'a');/*单字符写入到0x10,注意是单引号*/∙ temp1 = EEPROMread(0x10);/*读一个字符到temp1*/∙∙∙ EEPROM_WRITE(0x20,"abcdefg");/*写字符串到0x20*/∙ EEPROM_READ(0x20,temp2);/*读字符到temp2,temp2=a*/∙ EEPROM_READ(0x20,buffer);/*读字符串到数组中 buffer[10]=abcdefg */∙∙ EEPROM_WRITE(0x30,buf);/*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/∙∙ while(1)∙ ;∙}∙调试后的效果:调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。

如下图:打开调试选项:钩选保护eeprom数据选项:打开相关观测窗口:按F10逐条语句运行,查看运行结果。

1. 地址10上的值被改写为“a”2. temp1的值变为a,及读取了地址0x10的值a:3. abcdefg写入20开始的地址:4. temp2的变为地址20的值a:5. 以0x20开始的值都读入buffer数组中:6. 预定义的数组中的值写到EEPROM中:7. 设置不保护EEPROM的值之后,停止调试再开始调试,EEPROM中的值改为0XFF:通过以上的观察,我想你已经对EEPROM的操作有了一定的认识,同时,你可以打开eeprom.h查看内部内容,是如何定义函数的。

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

#pragma data:data
内部EEPROM使用实例

定义RAM中的变量

SystemInfo sysdata={“GSM eHOME System”, “Ver 1.0”, “05/08/13 ”}; SysSetupType SetupData; SmsFileType SmsFile; AlamRecType AlamRec; uint8 SuperPassWord[16]; uint8 InputMenuInfo[8][20; uint8 OutputMenuInfo[8][20];
AVR 内置EEPROM
� �
在ICC中, eeprom.h头文件中预定义了内置 EEPROM读写宏: EEPROM_READ(int location, object)


这个宏调用了EEPROMReadBytes 函数从EEPROM 指定位置读取数据 送给数据对象 "object"可以是任意程序变量包括结构和数组例如
� �
在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“ 在紧接的4 个时钟周期之内对WDE 写"0”
AVR 看门狗
AVR 看门狗
void WDT_off(void) { /* WDT 复位*/ _WDR(); /* 置位 WDTOE 和 WDE*/ WDTCR |= (1<<WDTOE) | (1<<WDE); /* 关闭WDT */ WDTCR = 0x00; }
AVR 内置EEPROM
� �
ATmega16 内置512字节的EEPROM 与EEPROM相关的寄存器
� � �
EEPROM 地址寄存器- EEARH和EEARL EEPROM 数据寄存器 - EEDR EEPROM 控制寄存器- EECR
AVR 内置EEPROM

EEPROM 地址寄存器- EEARH和EEARL
AVR 看门狗
AVR 看门狗

与看门狗相关的寄存器

WDTCR

WDTOE: 看门狗修改使能

清零WDE 时必须置位WDTOE,否则不能禁止看 门狗。一旦置位,硬件将在紧接的4 个时钟周期 之后将其清零。
AVR 看门狗

WDE: 使能看门狗


WDE为 “1 “ 时,看门狗使能,否则看门狗将被禁止。只有在 WDTOE为 ”1“ 时 WDE 才能清零。 以下为关闭看门狗的步骤:


指定了512字节的EEPROM空间。EEPROM地 址是线性的,从0 到511。 EEAR 的初始值没有定义。在访问 EEPROM 之前必须为其赋予正确的数据。
AVR 内置EEPROM

EEPROM 数据寄存器 - EEDR


对于EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据; 对于读操作, EEDR 是从地址EEAR 读取的 数据。
ICC中将变量分配至 EEPROM中


将变量分配到 EEPROM区域,可以使用编 译附注#pragma data:eeprom 将产生扩展名为 .eep 的EEPROM初始化 文件。
内部EEPROM使用实例
定义变量到EEPROM #pragma data:eeprom SystemInfo SysData; SysSetupType SetupEepData; SmsFileType SmsEepFile[10]; AlamRecType AlamEepRec[20]; uint8 SuperPassWordEep[16]; uint8 InputMenuInfoEep[8][20]; uint8 OutputMenuInfoEep[8][20]; uint8 SystemInit;
内部EEPROM使用实例

写入数据

EEPROM_WRITE((uint16)&SetupEepData,S etupData); EEPROM_READ((uint16)&SetupEepData,Se tupData);

读出数据

AVR 看门狗

பைடு நூலகம்
在ICC中,macros.h头文件中预定义了复位看门狗定时 器的宏

WDR()
//Watchdog initialize // prescale: 2048K void watchdog_init(void) { WDR(); //this prevents a timout on enabling WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs }
AVR 内置EEPROM

EEPROM 控制寄存器- EECR

EERE: EEPROM 读使能

� �
� �
当 EEPROM地址设置好之后,需置位 EERE以便将数据读入 EEAR 。 EEPROM 数据的读取只需要一条指令,且无需等待 。 读取 EEPROM后 CPU 要停止 4 个时钟周期才可以执行下一条指 令。 用户在读取 EEPROM 时应该检测 EEWE。 如果一个写操作正在进行,就无法读取 EEPROM,也无法改变 寄存器 EEAR。
第十二章 AVR看门狗及EEPROM
2007、06、26
AVR 看门狗

引入看门狗的意义
� �
防止程序跑飞 增强系统抗干扰能力
AVR 看门狗
AVR 看门狗


� �

看门狗使用一个独立的定时器,时钟源为内置 1Mhz独立振荡器 当看门狗定时器定时溢出时,将产生 1CLK 宽度 的复位脉冲 定时间隔由看门狗预分频器调节 程序执行时,定期复位看门狗定时器,以保证 看门狗不产生复位脉冲 程序跑飞时,由于在定时间隔内没有复位看门 狗定时器的操作,当定时溢出时,系统复位。
ICC中将变量分配至 EEPROM中
� � � � � � �
#pragma data:eeprom int foo = 0x1234; char table[] = { 0, 1, 2, 3, 4, 5 }; #pragma data:data ... int i; EEPROM_READ((int)&foo, i); // i 等于 0x1234
AVR 内置EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* 等待上一次写操作结束 */ while(EECR & (1<<EEWE)); /* 设置地址和数据寄存器 */ EEAR = uiAddress; EEDR = ucData; /* 置位 EEMWE */ EECR |= (1<<EEMWE); /* 置位 EEWE 以启动写操作 */ EECR |= (1<<EEWE); }

ICC读写EEPROM内置函数原型
unsigned char EEPROMread( int location) { EEAR = location; EECR |= 0x01; strobe return (EEDR); } // Set READ // Return byte
ICC读写EEPROM内置函数原型
� �
int i; EEPROM_Read(0x1, i); // 读 2 个字节给 i

EEPROM_WRITE(int location, object)


这个宏调用了EEPROMWriteBytes 函数将数据对象写入到EEPROM 的 指定位置 "object"可以是任意程序变量包括结构和数组例如
AVR 内置EEPROM

注意:
� �
� � � �
如果在步骤5 和6 之间发生了中断,写操作将失败。 因为此时EEPROM 写使能操作将超时。 如果一个操作EEPROM的中断打断了另一个 EEPROM操作,EEAR 或EEDR寄存器可能被修改, 引起EEPROM 操作失败。 建议此时关闭全局中断标志I。 经过写访问时间之后,EEWE 硬件清零。 用户可以凭借这一位判断写时序是否已经完成。 EEWE 置位后, CPU 要停止两个时钟周期才会运行 下一条指令。
AVR 内置EEPROM
unsigned char EEPROM_read(unsigned int uiAddress) { /* 等待上一次写操作结束 */ while(EECR & (1<<EEWE)); /* 设置地址寄存器*/ EEAR = uiAddress; /* 设置EERE 以启动读操作*/ EECR |= (1<<EERE); /* 自数据寄存器返回数据 */ return EEDR; }
AVR 内置EEPROM

EEPROM 控制寄存器- EECR

EERIE: 使能EEPROM 准备好中断

当EEWE 清零时EEPROM 准备好中断即可发 生。
AVR 内置EEPROM

EEPROM 控制寄存器- EECR

EEMWE: EEPROM 主机写使能
� �
� �
EEMWE决定了EEWE置位是否可以启动EEPROM写 操作。 当EEMWE为“1”时,在4个时钟周期内置位EEWE 将 把数据写入EEPROM 的指定地址; 若EEMWE 为“0“,则操作EEWE 不起作用。 EEMWE 置位后4 个周期,硬件对其清零。
AVR 内置EEPROM
相关文档
最新文档