AVR单片机 看门狗范例 GCCAVR WDR 复位检测和控制看门狗
- 格式:docx
- 大小:27.34 KB
- 文档页数:8
看门狗百科名片单片机"看门狗"在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)目录应用基本原理看门狗使用注意看门狗运用设计思路编辑本段应用看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
编辑本段基本原理看门狗,又叫watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。
加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。
通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现,不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。
看门狗定时器寄存器(WDT_CONTR)STC单片机看门狗定时器寄存器在特殊功能寄存器中的字节地址为E1H,不能位寻址,该寄存器用来管理STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。
单片机复位时该寄存器不一定全部被清0,在STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择,大家根据需要可做出适合自己设计系统的选择。
其各位的定义如表4.2.1所示。
表1看门狗定时器寄存器(WDT_CONTR)EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。
由于我用过AVR的单片机,和AVR的相比,MSP430的看门狗要灵活的多,首先默认看门狗是开着的,因此如果不使用看门狗的话要关闭,指令如下:WDTCTL = WDTPW + WDTHOLD如果打开看门狗则需要在程序中清零,指令如下:WDTCTL=WDTPW+WDTCNTCL从头文件的定义中可以看出主要有两种方式,一种就是当做普通的定时器使用,一种才是作为看门狗,另外就是时钟源可选,选择8M或者32K的晶振来获得不同的延时,通过上面可以看出看门狗定时器最大的时间可以到1S,在程序中可以灵活的利用看门狗定时器实现想要的功能。
下面介绍两个典型应用:1、在动态数码管显示中的应用,具体代码可以参考我之前的笔记,部分代码如下:WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次//可以去看头文件中具体的配置,这里使用的手表晶振64分频计算可得是1.9msIE1 |= WDTIE; // 使能看门狗中断__interrupt void watchdog_timer(void){}这个程序主要是将看门狗定时器当做普通定时器使用,1.9ms刚好适合动态扫描间隔,在看门狗中断中对数码管进行动态扫描,这样使用相对于开一个定时器来说要有所方便。
因此在需要的定时与看门狗定时器的几个时间相同时可以考虑使用看门狗。
2、普通延时WDTCTL = WDT_ADLY_1000; //间隔定时器,定时1000ms//延时2sfor(i = 0; i< 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}这个程序同样是将看门狗当普通定时器使用,在主程序中读取中断标志位,实现延时效果,上面的程序为什么是延时2S自己分析。
关于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 看门狗WDT程序点击: 215, 文章入库日期: 2008-06-19 01:02:43, 来源: 很多人喜欢养宠物狗,很多单片鸭大侠则喜欢养看门狗,如果您也希望搞条AVR的看门狗养养,很适合您。
养看门狗的用意,在于用它监控系统:在程序本该运行的地方喂狗,如果程序卡死或跑飞,行到那,那样狗没有被喂到,饿死了,控制器复位,得以重启从而进行控制。
本节演示功能:养一只AVR内部看门狗,及时喂狗,狗不饿死,AVR单片鸭不复位;不及时喂饿死了,AVR单片鸭就复位。
本节的程序设计较为简单,旨在给出养狗、喂狗,不让狗饿死的简单示例。
实际应用时考虑的要注意什么时候喂狗,放狗。
硬件设计AVR主控电路原理图(点击图片放大,不需要放大镜!)LED控制电路原理图(点击图片放大,不需要放大镜!)下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!//目标系统: 基于AVR单片机//应用软件: ICC AVR/*01010101010101010101010101010101010101010101010101010101010101010101----------------------------------------------------------------------实验内容:观察喂狗与不喂狗的区别,使用PB口的LED指示灯做状态指示。
----------------------------------------------------------------------硬件连接:将PB口的LED指示灯使能开关切换到"ON"状态。
----------------------------------------------------------------------注意事项:(1)若有加载库程序,请将光盘根目录下的“库程序”下的“ICC_H”文件夹拷到D盘(2)请详细阅读:光盘根目录下的“产品资料开发板实验板SMK系列SMK1632说明资料”---------------------------------------------------------------------- 10101010101010101010101010101010101010101010101010101010101010101010*/#include <iom16v.h>#include "D:ICC_HCmmICC.H"#define DISP_DDR DDRB#define DISP_PORT PORTB/*--------------------------------------------------------------------程序名称:看门狗WDT初始化程序程序功能:注意事项:提示说明:输入:返回:--------------------------------------------------------------------*/void wdt_init(void){asm("wdr"); //clr wdtWDTCR=0x0F; //enable wdt,clk = 2048,2.1S}/*--------------------------------------------------------------------程序名称:程序功能:注意事项:提示说明:输入:返回:--------------------------------------------------------------------*/void main(void){uint8 i;DISP_DDR = 0XFF;wdt_init();while(1){DISP_PORT++; //数据显示向上加,作AVR正常运行的指示asm("wdr"); //喂狗,去除此句将导致狗饿死,AVR复位delay50ms(20);}}在AVR的运行程序中设置让PB显示端口自加。
复位/上电(外部)复位/低电压检测和复位/看门狗定时器复位复位电路产生一个一定宽度的复位脉冲信号去复位整个电路,使其工作在预设的状态,保证电路从一个预先已知的状态开始工作。
SH66/67/69xxx系列单片机复位功能包括上电(外部)复位、低电压复位、看门狗定时器复位等。
1.上电复位 ( Power On Reset,POR )及外部复位内建的上电复位电路配合外接的上电复位辅助电路,在上电时产生复位脉冲信号复位整个电路,保证电路从一个预先已知的预设状态开始工作。
SH66/67/69xxx系列单片机内建了稳定的上电复位电路,在复位输入端外接的复位辅助电路配合下,单片机具有稳定可靠上电复位性能。
同时,复位输入端也作为外部复位的输入端,输入外部复位信号复位整个电路。
中颖的SH66/67/69xxx 系列单片机普遍采用低电平有效的复位方式。
按应用场合和对上电复位可靠性要求不同,复位外部电路可采用不同的方式。
简易型RC复位电路最简单的上电复位电路即是用RC充放电电路所构成(如图1-1),应用于干扰较小的环境。
复位时间长短由电阻R和电容C的值决定。
复位时间的长短,一般考虑为当系统电源稳定进入单片机工作范围时,才可结束复位。
当单片机断电时,C上的电荷应尽快完全放电,以保证下次复位的成功。
R和C建议数值为47k.和0.1μF。
复位电路的布线很重要,一般要求复位电容C与单片机的Reset 和VSS引脚的布线最短。
RC图1-1 简易型RC复位电路改良型RC复位电路为了让上电复位更加稳定,在简易型RC复位电路的基础上,可以在电阻位置并联一个二极管构成改良型RC复位电路(如图1-2)。
复位时间长短仍由R 和C的值决定。
当单片机断电时,附加的二极管D可使电容C上的电荷快速完全放电,以保证下次复位的成功。
C图1-2 改良型RC复位电路高抗干扰型RC复位电路高抗干扰型RC复位电路如图1-3,高抗干扰型RC复位电路应用于干扰较强的环境。
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 看门狗一个硬件单元,当程序由于某种原因跑“飞”了,它就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; 。
最后一行代码提醒狗主人,别忘了及时清零看门狗定时器(喂狗),否则,小狗就咬人了。
一个相对独立的计数自动重启单片机的硬件部件,如果启用它后,不在一定的时间内清除它的计数值,就会达到计数的最高值而溢出,然后它就指挥单片机重启。
所以要在你的程序里适当的加入清看门狗的指令,一旦你的单片机程序出了问题,当然就不能按照你的程序原先设定那样自动清看门狗了,也就是常说的程序跑飞了,这个时候看门狗就会重启单片机试图解决问题。
一般只对瞬间干扰造成的问题有效,要是长时间的干扰或是软硬件问题,看门狗的意义不是很大。
我的理解就象是监视程序执行的保安一样, 程序正常执行时会在他的益处时间之内给他一个复位信号,当程序跑飞的时候他在溢出时间之内是收不到复位信号的,这时看门狗就会在设定的时间内产生系统复位的信号!。
利用单片机内部定时器实现软件看门狗利用单片机内部定时器实现软件看门狗勤镐工控(05/09/04)软件看门狗(WATCH DOG)也叫做程序运行监视系统。
当程序运行受到干扰,程序飞到一个临时构成的死循环中时,系统将完全瘫痪,软件陷阱也无能为力了,这时就需要人工复位或硬件复位;如果没有人工操作和硬件复位系统,我们采用软件看门狗技术同样也能使系统复位,恢复正常。
这种程序监视系统就好比主人家养了一条狗,主人总要定时喂狗,如果主人忘了喂狗(程序受到干扰,跑飞掉了),狗就会大叫起来,提醒主人(程序重新运行)。
软件看门狗的特性如下:1、本身独立工作,基本上不依赖CPU;2、CPU在一个固定的时间间隔内和系统打一次交道(喂一次狗),以表明系统目前工作正常。
3、当CPU陷入死循环后,能及时发觉并使系统复位。
当系统陷入死循环后,怎样才能从死循环中跳出来呢?只有比这个死循环更高级的中断程序才能夺走CPU的控制权。
为此,可以用一个定时器来做软件看门狗,因为定时器在运行时不占用CPU资源,它是独立工作的,所以,将它的溢出中断设定为最高优先级中断,系统的其它中断均设为比它低级的中断优先级。
然后根据看门狗的定时时间来设定定时器初值。
软件看门狗启动后,系统工作程序必须经常“喂它”,且每两次之间的间隔不得大于定时器的定时时间。
程序中只要设立一个设置定时器初值的子程序,喂它时只要调用这个子程序即可。
当程序陷入死循环后,定时器溢出,产生高优先级中断,从而跳出死循环。
我们还可以在定时器中断服务程序中放置一条LJMP ERR 指令,即可使程序转向出错处理程序;由出错程序来完成以后的工作,并用软件的方法使系统复位。
以下是一个用定时/计数器T0作软件看门狗的完整程序:ORG 0000HAJMP MAINORG 000BHLJMP ERR MAIN :MOV SP , #60HMOV PSW , #00HMOV SCON , #00HMOV TMOD , #01H ;设置T0为16位定时器SETB ET0 ;允许T0中断SETB PT0 ;设置T0中断为高级中断MOV TL0, #00H ;设定T0的定时初值,定时时间约为16ms(6M 晶振)MOV TH0, #0B0HSETB EA ;开中断SETB TR0 ;启动T0 LOOP:...... ;主程序开始LCALL WATCH DOG ;调用喂狗子程序......LJMP LOOP WATCHDOG:MOV TL0, #00H ;喂狗子程序MOV TH0, #0B0HSETB TR0RET ERR:POP ACC ;定时器中断POP ACC ;看门狗软件复位程序CLR APUSH ACCPUSH ACC RETI在程序中,由于执行了中断服务程序后,PC 的指针已经指向0000H ,从而实现了软件复位的目的。
AVR 单片机应用常见问题集合问: 即使看门狗没有使用我也有时在AVR Studio 调试软件的状态栏中看到“WDT reset” WDT 复位的信息这是为什么?答当目标器件运行在较高的频率大于6 MHZ)时来自扁平电缆FPC 电缆的噪声信号可能错误地触发WDT 复位检测电路这对程序的仿真和执行没有影响它们不会由于噪声的原因而产生复位噪声仅仅影响AVR Studio 调试软件的信息处理在这种情况下不要理睬这个信息当目标器件运行在较低的频率小于或等于4 MHZ 时应该不会出现这个问题.问:程序在仿真器或单片机中不工作,而在模拟器中看来工作很正常这是什么原因?答这是堆栈指针设置中的常见问题。
对所有带SRAM 的AVR 单片机堆栈指针必须设置在SRAM 最后的地址在汇编程序中这样做是正确的ldi R16 low(RAMEND) 装载堆栈指针的低字节到R16out SPL R16 输出这个数值到堆栈指针寄存器ldi R16 high(RAMEND) 装载堆栈指针的高字节到R16out SPH R16 如果AVR 的SRAM 小于256 字节就将这行注释掉在C 程序中堆栈指针是在启动代码中自动设置的注意链接文件(XCL 文件)定义了堆栈指针的位置问:当开始做一个使用AVR 单片机的新项目时最常见最共同问题有哪些?答最常见最共同的错误是,忘记对不带硬件堆栈的芯片设置堆栈指针对AT90S8515 单片机上这样做是妥当的LDI R16 low(RAMEND)OUT SPL R16LDI R16 high(RAMEND)OUT SPH R16注在ATMEL 的汇编语言源程序中经常将R16 寄存器用temp 符号来代替。
另一个常见的错误是将端口作为输出使用时忘记设置端口在AVR 单片机中设置端口作为输出使用是通过写一个1 到数据方向寄存器(DDR)中完成的。
比如设置端口PORTB 输出高电平LDI R16 0xFF 装载十六进制数FF 到寄存器R16OUT DDRB R16 设置端口PORTB 作为输出使用OUT PORTB R16 设置端口PORTB 输出高电平使用AVR 汇编器时第三个常见的错误是在使用装载程序存储器(LPM)指令时指向了程序存贮器中错误的地址AVR 的程序存贮器是组织成字16 bit 的形式而LPM 指令是读取字节8 bit LPM 指令可以读16 位字的高位字节或低位字节中的任意一个因为这个原因必须将1 6 位的程序存贮器地址分解成两个指向你所希望装入的字节的地址。
一种简单可靠的单片机复位及看门狗保护的方法
叶念渝
【期刊名称】《电气自动化》
【年(卷),期】1997(019)006
【摘要】介绍了由MAX813L集成电路构成的单片机复位电路,它瘘可作具有抗干扰能力的保护看门狗,其硬软件结构简单可靠,已获得广泛的应用。
【总页数】1页(P44)
【作者】叶念渝
【作者单位】华中理工大学自控系
【正文语种】中文
【中图分类】TP368.103
【相关文献】
1.一种高可靠性看门狗及掉电保护电路 [J], 张维
2.一种单片机电源监测和看门狗保护电路及方法 [J], 叶念渝;何兆湘
3.一种新的单片机"看门狗"电路软件设计方法 [J], 李维国;俞晓红
4.一种简单可靠的单片机键盘显示接口方法 [J], 徐佩安;秦健
5.一种新颖可靠的单片机“看门狗”电路 [J], 乐金松
因版权原因,仅展示原文概要,查看原文内容请购买。
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;//不用的管脚使能内部上拉电阻。
PORTC =0xFF;PORTD =0xFF;PORTA =0xFF;DDRA =(1<<LED_JT)|(1<<LED_WD)|(1<<LED_BO )|(1<<LED_EXT)|(1<<LED_PO);//输出驱动LEDCPU_STATUS =MCUCSR;//读取MCU控制和状态寄存器//可以在JTAG调试时直接观察 MCUCSR的状态。
CPU_STATUS&=0x1F;switch(CPU_STATUS){case(1<<JTRF)://JTAG引起的复位?PORTA&=~(1<<LED_JT);break;case(1<<WDRF)://看门狗引起的复位?PORTA&=~(1<<LED_WD);break;case(1<<BORF)://BOD引起的复位?PORTA&=~(1<<LED_BO);break;case(1<<EXTRF)://RESET引脚引起的复位?PORTA&=~(1<<LED_EXT);break;case(1<<PORF)://上电引起的复位?PORTA&=~(1<<LED_PO);break;default://多种复位同时发生? PORTA=~CPU_STATUS;break;}MCUCSR=0x00;//清除标志位for(i=0;i<200;i++)_delay_ms(10);//延时2秒wdt_enable(WDTO_2S);//使能看门狗,溢出时间为2秒左右while(1){if(!(PINA&(1<<WDT_EN)))wdt_reset();//如果PA7为低电平时,复位看门狗(喂狗)}}/*程序运行效果如果PA7是高电平,不喂狗,则每2秒钟看门狗复位一次,LED_WD亮如果PA7是低电平,喂狗,则方便作如下实验第一次上电时,发生上电复位事件,LED_PO亮按下复位按键,发上外部复位事件,LED_EXT亮调节电源电压调到4.0V(或2.7V)以下,然后调回5.0V(3.0V),发生BOD复位事件,LED_BO亮在JTAG调试时,使用[reset]功能,发生JTAG复位事件,LED_JT亮注意:有时候会出现多种复位事件同时发生,例如:上电的同时按住复位按键,将会同时发生上电复位事件和外部复位事件*//*系统控制和复位复位AVR 复位时所有的I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。
复位向量处的指令必须是绝对跳转JMP 指令,以使程序跳转到复位处理例程。
如果程序永远不利用中断功能,中断向量可以由一般的程序代码所覆盖。
这个处理方法同样适用于当复位向量位于应用程序区,中断向量位于Boot 区—或者反过来—的时候。
复位源有效时I/O 端口立即复位为初始值。
此时不要求任何时钟处于正常运行状态。
所有的复位信号消失之后,芯片内部的一个延迟计数器被激活,将内部复位的时间延长。
这种处理方式使得在MCU 正常工作之前有一定的时间让电源达到稳定的电平。
延迟计数器的溢出时间通过熔丝位SUT 与CKSEL 设定。
延迟时间的选择请参见P23― 时钟源‖ 。
复位源ATmega16 有5 个复位源:上电复位。
电源电压低于上电复位门限VPOT 时,MCU 复位。
外部复位。
引脚RESET 上的低电平持续时间大于最小脉冲宽度时MCU 复位。
看门狗复位。
看门狗使能并且看门狗定时器溢出时复位发生。
掉电检测复位。
掉电检测复位功能使能,且电源电压低于掉电检测复位门限VBOT 时MCU 即复位。
JTAG AVR复位。
复位寄存器为1时MCU复位。
详见P215―IEEE 1149.1 (JTAG) 边界扫描‖ 。
上电复位上电复位(POR) 脉冲由片内检测电路产生。
无论何时VCC 低于检测电平POR 即发生。
POR 电路可以用来触发启动复位,或者用来检测电源故障。
POR电路保证器件在上电时复位。
VCC 达到上电门限电压后触发延迟计数器。
在计数器溢出之前器件一直保持为复位状态。
当VCC 下降时,只要低于检测门限,RESET 信号立即生效。
外部复位外部复位由外加于RESET 引脚的低电平产生。
当复位低电平持续时间大于最小脉冲宽度时即触发复位过程,即使此时并没有时钟信号在运行。
当外加信号达到复位门限电压VRST( 上升沿) 时,tTOUT 延时周期开始。
延时结束后MCU 即启动。
掉电检测ATmega16 具有片内BOD(Brown-out Detection) 电路,通过与固定的触发电平的对比来检测工作过程中VCC 的变化。
此触发电平通过熔丝位BODLEVEL 来设定,2.7V(BODLEVEL 未编程),4.0V (BODLEVEL 已编程)。
BOD 的触发电平具有迟滞功能以消除电源尖峰的影响。
这个迟滞功能可以解释为VBOT+ = VBOT + VHYST/2 以及VBOT- = VBOT- VHYST/2。
BOD 电路的开关由熔丝位BODEN控制。
当BOD使能后(BODEN被编程),一旦VCC下降到触发电平以下(VBOT-),BOD 复位立即被激发。
当VCC 上升到触发电平以上时(VBOT+),延时计数器开始计数,一旦超过溢出时间tTOUT,MCU 即恢复工作。
如果VCC一直低于触发电平并保持tBOD时间,BOD电路将只检测电压跌落。
看门狗复位看门狗定时器溢出时将产生持续时间为1 个CK 周期的复位脉冲。
在脉冲的下降沿,延时定时器开始对tTOUT 记数MCU控制和状态寄存器-MCUCSRMCU 控制和状态寄存器提供了有关引起MCU 复位的复位源的信息Bit 4 – JTRF: JTAG 复位标志通过JTAG 指令AVR_RESET 可以使JTAG 复位寄存器置位,并引发MCU 复位,并使JTRF置位。
上电复位将使其清零,也可以通过写‖0‖ 来清除。
Bit 3 – WDRF: 看门狗复位标志看门狗复位发生时置位。
上电复位将使其清零,也可以通过写‖0‖ 来清除。
Bit 2 – BORF: 掉电检测复位标志掉电检测复位发生时置位。
上电复位将使其清零,也可以通过写‖0‖ 来清除。
Bit 1 – EXTRF: 外部复位标志外部复位发生时置位。
上电复位将使其清零,也可以通过写‖0‖ 来清除。
Bit 0 – PORF: 上电复位标志上电复位发生时置位。
只能通过写‖0‖ 来清除。
为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。
如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解看门狗定时器看门狗定时器由独立的1Mhz 片内振荡器驱动。
这是VCC = 5V 时的典型值。
通过设置看门狗定时器的预分频器可以调节看门狗复位的时间间隔。
看门狗复位指令WDR 用来复位看门狗定时器。
此外,禁止看门狗定时器或发生复位时定时器也被复位。
复位时间有8 个选项。
如果没有及时复位定时器,一旦时间超过复位周期,ATmega16 就复位,并执行复位向量指向的程序。
为了防止无意之间禁止看门狗定时器,在看门狗禁用后必须跟一个特定的修改序列。
1. 在同一个指令内对WDTOE 和WDE 写"1―,即使WDE 已经为"1―2. 在紧接的4 个时钟周期之内对WDE 写"0‖看门狗定时器控制寄存器-WDTCRBit 4 – WDTOE: 看门狗修改使能清零WDE 时必须置位WDTOE,否则不能禁止看门狗。