基于AVR看门狗的Reset程序范例解读

发布者:SparklingStar22最新更新时间:2020-01-08 来源: eefocus关键字:AVR  看门狗  Reset程序 手机看文章 扫描二维码
随时随地手机看文章

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一直闪动,效果和第一个范例程序相同。


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

相对独立的计数自动重启单片机的硬件部件,如果启用它后,不在一定的时间内清除它的计数值,就会达到计数的最高值而溢出,然后它就指挥单片机重启。 所以要在你的程序里适当的加入清看门狗的指令,一旦你的单片机程序出了问题,当然就不能按照你的程序原先设定那样自动清看门狗了,也就是常说的程序跑飞了,这个时候看门狗就会重启单片机试图解决问题。一般只对瞬间干扰造成的问题有效,要是长时间的干扰或是软硬件问题,看门狗的意义不是很大。

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

#include

#include

void port_init(void)

{

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

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

PORTB = 0x00;

DDRB = 0x00;

PORTC = 0x00;

DDRC = 0x00;

PORTD = 0x00;

DDRD = 0x00;

}

//Watchdog iniTIalize

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

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

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(); //看门狗计数清零

关键字:AVR  看门狗  Reset程序 引用地址:基于AVR看门狗的Reset程序范例解读

上一篇:avrstudio 5开发atmega128 _0
下一篇:基于AVR的自动扶梯

推荐阅读最新更新时间:2024-11-13 21:50

单片机的比较(avr 8051 stc 等)
1、AVR 单片机 与8051的比较: 主要区别是内核不同,指令集不同,io结构不同,外设不同。 优点是速度快,IO强大,性价比高。 AVR单片机比8051的硬件资源多得多,AVR单片中的MEGA系列内部还有AD转换器,在一些简单的电路中 ,有了AVR单片机就甚至是零外部元件了,使用非常方便,是主流的单片机,而价格又不贵! 2、STC是改进型51。内部的EEPROM, 对于参数的保存还是很方便的,EMC性能也要好一点,价格也相对便宜 PIC是自己的结构,MICROCHIP开发 AVR是自己的结构,ATMEL开发的 3、8051单片机 : 8051单片机最早由INTEL公司推出,其后,多家公司购买了8051的内核,使
[单片机]
AVR第11课:如何对待我们的单片机
大家学习MCS51单片机和AVR单片机,又或者是PIC单片机,又或者是MSP430单片机之后,是否感觉自己可以成为一名工程师了呢?我在这里来说说我的看法吧。 我们学习这些单片机的时候,先学习了理论知识,这个一般是书本上的理论知识,比如介绍单片机的发展、单片机的应用领域、单片机的原理等等。然后呢找一块开发板,对着视频教程学习,边看视屏边做实验,学习完之后呢,去做那么一两个小项目,比如“基于LabView和PWM的霍尔测速和控速的直流电机系统”,这个项目呢,相对来说综合要求能力比较高,如果一个人能够坐下来的话,你的能力就算不错了,相当不错了。从设计电路图、焊接电路板、写程序、调试等等下来,会有很大的提高。 如果仅仅做了实验,我
[单片机]
STM32中的独立看门狗和窗口看门狗是什么
一、前言 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗和窗口看门狗。 独立看门狗 :使用的是外部时钟,即使主频不工作了,看门狗也能正常工作。只要在到达喂狗时间的上限前喂狗即表示程序是正常的,这点和窗口看门狗是有区别的。另外独立看门狗是独立于整个系统之外的,这也是独立看门狗名字的由来,他有自己独立的时钟,不受整个系统的影响,所以独立看门狗主要用来监控硬件上的错误。 窗口看门狗 :使用芯片内部时钟。喂狗的时间既有上限又有下限,即喂狗太早或者太晚都不行,比如我要求你在0.8s到0.9s内
[单片机]
STM32中的独立<font color='red'>看门狗</font>和窗口<font color='red'>看门狗</font>是什么
AVR开发 Arduino方法(一) 端口子系统
  Arduino UNO R3的主处理器ATMega328P上有3个8位的输入/输出端口,分别是PB,PC和PD。Arduino IDE提供的Blink示例可以帮助我们了解端口的数字输出功能: 1 // Blink.ino 2 int led = 13; 3 4 void setup() { 5 pinMode(led, OUTPUT); 6 } 7 8 void loop() { 9 digitalWrite(led, HIGH); 10 delay(1000); 11 digitalWrite(led, LOW); 12 delay(1000); 13 }   这个示例使Arduino开发
[单片机]
<font color='red'>AVR</font>开发 Arduino方法(一) 端口子系统
AVR_GCC程序设计基础
1.在avr studio的project options(工程选项里面)在General选项里面需要注意的是: edit configuratio:这个选项的意思是当前项目的默认输出文件夹是default,而且这个文件夹的名称是可以改的 Device:是我们要选择工作的芯片 Frequency:是芯片的工作频率 Optimizatio:是程序编译时优化的级别主要是优化程序输出可执行文件的大小 unsigned char(-funsigned char):默认程序中的char类型为是无符号类型 其他的设置都基本上是默认的设置。 2.makfile 在使用avr_gcc的编译器是,makfile是必不可少,如果你是默认的话
[单片机]
<font color='red'>AVR</font>_GCC<font color='red'>程序</font>设计基础
编程点滴:8位AVR定时器溢出中断测试程序
本程序利用timer0控制LED以500ms为间隔亮灭。 文件组成:测试程序 main.c ,定时器设置程序 timer_8bit_test1.c 及头文件 timer_8bit_test1.h 。 main.c /* ***************************************** * File name: main.c * Function: 8位定时器溢出中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author & Date: Joshua Chan, 2012/03/24 * *************************************
[单片机]
如何使用AVR单片机进行自整定PID控制器的设计
本文介绍了基于AVR单片机的自整定PID控制器的设计.该控制器以FESTO水位为控制对象,控制核心为ATmega128单片机.采用继电自整定PID算法,并用LED数码管实时显示控制情况.实验结果表明,本设计可以根据实际情况在线自整定PID参数.控制效果快速,平稳,超调量小。 PID控制器是过程控制中所用的主要控制器-由于其算法简单.鲁棒性好和可靠性高等特点,被广泛应用于工业过程控制.但是PID参数的整定一般需要经验丰富的工程技术人员来完成.既耗时又费力,加之实际系统有滞后和非线性等因素,增加了PID参数整定的难度.如何在线自整定PID参数,以符合过程控制的要求。是目前控制器设计中的一个重要课题,它不仅能减少操作人员的负担,还可
[单片机]
如何使用<font color='red'>AVR</font>单片机进行自整定PID控制器的设计
AVR单片机硬件电路设计
复位线路的设计 Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可(R0)。 为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。 D3(1N4148)的作用有两个:作用一是将复位输入的最高电压钳在Vcc+0.5V 左右,另一作用是系统断电时,将R0(10K)电阻短路,让C0快速放电,让下一次来电时,能产生有效的复位。 当AVR在工作时,按下S0开关时,复位脚变成低电平,触发AVR芯片复位。 重要说明:实际应用时,如果你不需要复位按钮,复位脚可以不接任何的零件,AVR芯片也能稳定工作。即这部分不需
[单片机]
<font color='red'>AVR</font>单片机硬件电路设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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