AVR单片机的看门狗详解

发布者:北极星小鹏最新更新时间:2013-01-14 来源: 21IC 关键字:AVR单片机  看门狗  ICC 手机看文章 扫描二维码
随时随地手机看文章

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的看门狗是软狗,也是硬狗! 如果熔丝位不设定,就是软狗,因为程序可以关闭,也可以打开 如果熔丝位设定了,就是硬狗,因为程序只可以清除,而无法打开或关闭!

是不是在程序中加入 WDR(); 就算“喂狗”了?喂狗好象要计算好时间吧?我每执行一个函数就喂狗一次如何?

如果你的循环体内每循环一次的时间不超过看门狗的复位时间,主要喂狗一次就可以了。

AVR看门狗程序范例,程序演示了看门狗的复位过程,使用了本站新手入门的第一个范例,普通情况下,程序最后陷入死循环,但是这个程序里,看门狗让单片机复位,你会看见LED一直闪动,效果和第一个范例程序相同。

就两点,初始化,然后喂狗,喂狗要在看门狗咬人之前,(复位之前喂狗)。

1.jpg

 

//ICC-AVR application builder : 2012-1-31 17:27:04

// Target : M16

// Crystal: 7.3728Mhz

// Auther: 古欣

// 看门狗复位演示程序。

#include

#include

void port_init(void)

{

PORTA = 0x03; //设置为输出

DDRA = 0x03; //高电平,两个LED都灭

PORTB = 0x00;

DDRB = 0x00;

PORTC = 0x00; //m103 output only

DDRC = 0x00;

PORTD = 0x00;

DDRD = 0x00;

}

//Watchdog initialize

// prescale: 2048K //预分频越大,定时时间越长,也就是可以更长时间不喂

// 约为2.1s复位 (根据数据手册,2048K,5V典型值)[page]

void watchdog_init(void)

{

WDR(); //this prevents a timout on enabling

WDTCR = 0x1F; //特别注意这一条不是ICC生成的,是后来加上的。

WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs

}

//加入了喂狗的延时程序

void Delay(void)

{

unsigned char i,j;

for(i=200;i>0;i--)

{

for(j=200;j>0;j--)

;

}

WDR(); //这里喂狗

}

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

watchdog_init();

MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

void main(void)

{

unsigned int i;

init_devices(); //初始化

for(i=10;i>0;i--) //看到程序的闪动

{

PORTA = 0x02; //1脚为高,0脚为低,0脚灯亮

Delay(); //延时

PORTA = 0x01; //0脚为高,1脚为低,1脚灯亮

Delay(); //延时

}

while(1) //普通情况下,程序会陷入这里一直循环。

; //看门狗能够让单片机复位,程序重新运行,我们看到LED闪烁。

//如果在这里加入WDR(); 喂狗,单片机就不会复位了。

}

补充,特别说明

使能看门狗不能用 |=,必须要直接赋值=。

还有数据手册上说:

改变定时器溢出时间及禁止(已经使能的)看门狗定时器需要执行一个特定的时间序列:

1. 在同一个指令内对WDCE 和WDE 写"1“,即使WDE 已经为"1“。

2. 在紧接的4 个时钟周期之内将WDE 和WDP 设置为合适的值,而WDCE 写"0”。

所以在WDTCR=0x0E;之前加上一句WDTCR=0x1F;

void watchdog(void)

{

WDR(); //看门狗计数清零

WDTCR=0x1F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S

WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S

}

initial_WDT:

WDR ;2011-09-22增加看门狗

LDI R16, $1F

OUT WDTCR,R16 ;使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S

LDI R16, $0F

OUT WDTCR,R16

关键字:AVR单片机  看门狗  ICC 引用地址:AVR单片机的看门狗详解

上一篇:AVR单片机的C语言开发简介
下一篇:AVR单片机开发工具介绍

推荐阅读最新更新时间:2024-03-16 13:16

AVR单片机M8控制256级七彩流水灯程序
#include inc.h #include #include #include extern const uchar qct ; uint16_t data0,data1; uint8_t bitcnt; uint8_t CaptureOK; uint16_t ms,Sec; uint32_t MsCnt; //ms count void Shift(uint da) { uchar i; for(i=0;i 16;i++) { CLR_SCK;
[单片机]
MSP430学习小结1-看门狗的使用总结
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。 由于我用过AVR的单片机,和AVR的相比,MSP430的看门狗要灵活的多,首先默认看门狗是开着的,因此如果不使用看门狗的话要关闭,指令如下: WDTCTL = WDTPW + WDTHOLD 如果打开看门狗则需要在程序中清零,指令如下: WDTCTL=WDTPW+WDTCNTCL 这只是基本的应用,430的看门狗要稍微复杂一些,首先从IAR的头文件中看看定义了几种工作状态: /* WDT-interv
[单片机]
AVR单片机教程——走向高层
在系列教程的最后一篇中,我将向你推荐3个可以深造的方向:C++、事件驱动、RTOS。掌握这些技术可以帮助你更快、更好地开发更大的项目。 本文涉及到许多概念性的内容,如果你有不同意见,欢迎讨论。 关于高层 这一篇教程叫作“走向高层”。什么是高层? 我认为,如果寥寥几行代码就能实现一个复杂功能,或者一行代码可以对应到几百句汇编,那么你就站在高层。高层与底层是相对的概念,没有绝对的界限。 站得高,看得远,这同样适用于编程,我们要走向高层。高层是对底层的封装,是对现实的抽象,高层相比于底层更加贴近应用。站在高层,你可以看到很多底层看不到的东西,主要有编程工具和思路。合理利用工具,可以简化代码,降低工作量;用合适的思路编程,
[单片机]
<font color='red'>AVR单片机</font>教程——走向高层
AVR单片机的DS1302操作程序
file://---by 变成浪子 //mega16 7.3728MHz石英晶体 iCCavr6.31a //相关定义: #define uint unsigned int #define uchar unsigned char #define DS1302_RST 0 //pc0 #define DS1302_SDA 1 //pc1 #define DS1302_SCLK 6 //pc6 //ds1302相关 //DS1302_RST=1 #define Set_DS1302_RST() PORTC|=1 #define Clr_DS1302_RST() PORTC&=~(1 #d
[嵌入式]
AVR单片机串口多机通讯程序
在多机通信过程中,所有设备的 RS232接口是并在通信线上的,其中只能有一个设备为主机,其他为从机,通信由主机发起。数据帧一般采用1位起始位、9位数据位,其中第9位(RXB8)被用作为表征该帧是地址帧还是数据帧。当帧类型表征位为“1”时,表示该帧数据为一个地址帧;当帧类型表征位为“0”时,表示这个帧为一个数据帧。   在AVR中,通过设置从机的UCSRA寄存器中标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。如果使能了过滤功能,从机接收器对接收到的那些不是地址信息帧的数据帧将进行过滤,不将其放入接收缓冲器中,这在多机通信中有效的方便了从机MCU处理数据帧程序的编写(同标准51 结构相比)。而发送器则不受MPC
[单片机]
基于AVR单片机的ISP设计
0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照最新的USB OTG技术规范,设计了一种遵循USB协议的主/从机系统。 1 ISP1362芯片的内部结构 Philips公司的ISP1362是一款符合USB 2.0总线协议的接口芯片,内部有3个USB控制
[单片机]
基于<font color='red'>AVR单片机</font>的ISP设计
avr+开发环境+linux,win7下avr单片机开发环境的搭建
操作系统:win7 professional x86 开发软件:avr studio 4.19 首先下载avr studio 4.19,因为貌似这是atmel官方最后支持jtag ice的开发环境。而且也就只有这个4的版本才支持win7,正好本人有个jtag,所以果断选择这个版本了。 相关软件下载地址: 貌似这个里面有很多常见的工具下载。 刚开始我是用的avr studio 4.19+WinAVR-20100110这个环境搭建的开发环境。 但是问题出现了,编译文件时出现了找不到编译器。出现如下的错误: make: Makefile: No such file or directory avr-objcopy: 'mai
[单片机]
avr+开发环境+linux,win7下<font color='red'>avr单片机</font>开发环境的搭建
AVR单片机TC0快速PWM
PWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高。改变占空比就改变输出的电压,常用于实现D/A,调节电压或电流,改变电动机的转速等。 快速PWM模式:它的计数方式是TCNT0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位PWM修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此PWM输出频率高。在快速PWM模式下,计数器的最大值决定了PWM的频率,而比较寄存器OCR0决定了占空比的大小。T/C0是8位计数器, 输出PWM的频率=系统时钟频率/(分频系数*255) 。 PW
[单片机]
<font color='red'>AVR单片机</font>TC0快速PWM
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved