avr单片机看门狗程序
- 格式:doc
- 大小:45.50 KB
- 文档页数:10
单片机看门狗程序/*此程序实现单片机"看门狗"WDT的功能*/#include "p18f458.h"unsigned long i;/*系统初始化子程序*/void initial(){TRISD = 0X00; /*D口设为输出*/}/*延时子程序*/void DELAY(){for (i=19999;--i;)continue;}/*主程序*/main (){initial(); /*初始化,设定看门狗的相关寄存器*/PORTD = 0X00; /*D口送00H,发光二极管亮*/DELAY(); /*给予一定时间的延时*/PORTD = 0XFF; /*D口送FFH,发光二极管灭*/while(1){;} /*死循环,等待看门狗溢出复位*/}-------------------汇编语言版本的单片机看门狗程序---------------- ;此程序实现"看门狗"WDT的功能;此单片机看门狗由独家提供LIST P=18F458INCLUDE "P18F458.INC"DEYH EQU 0X20DEYL EQU DEYH+1ORG 0X00GOTO MAINORG 0X30;*************初始化子程序*****************INITIALCLRF TRISD ;D口设为输出RETURN;**************延时子程序**************************DELAYMOVLW 0XFFMOVWF DEYHAGAIN1MOVLW 0XFFMOVWF DEYLAGAIN2DECFSZ DEYLGOTO AGAIN2DECFSZ DEYHGOTO AGAIN1NOPRETURN;************单片机看门狗主程序**************************** MAIN NOPCALL INITIAL ;系统初始化MOVLW 0X00MOVWF PORTD ;D口送00H,发光二极管亮CALL DELAYMOVLW 0XFFMOVWF PORTD ;D口送FFH,发光二极管灭LOOPGOTO LOOP ;死循环,等待看门狗复位ENDAVR看门狗程序范例A VR看门狗程序范例,程序演示了看门狗的复位过程,使用了本站新手入门的第一个范例,普通情况下,程序最后陷入死循环,但是这个程序里,看门狗让单片机复位,你会看见LED 一直闪动,效果和第一个范例程序相同。
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。
由于我用过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显示端口自加。
单片机看门狗(Watchdog)的工作原理及其应用2010年05月16日星期日 23:00在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环。
程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
所以,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)。
看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行。
这个时候,看门狗电路就会由于得不到单片机送来的信号。
便在它和单片机复位引脚相连的引脚上送出一个复位信号。
使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
看门狗,又叫 watchdog timer,是一个定时器电路。
一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU 正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零。
如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,是MCU复位,防止MCU死机。
看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
所以,在使用有看门狗的芯片时要注意清看门狗。
课程结业实验报告课程名称:嵌入式系统设计报告题目:基于 ARM的看门狗程序设计专业班级:通信 1601 班学号:学生姓名:指导教师:2021年6月20日看门狗实验1实验目的(1)认识 WATCHDOG 的作用;(2)掌握 WATCHDOG 准时器的使用方法。
2实验内容(1)编程增加看门狗功能,观察看门狗作用;(2)编程实现看门狗喂狗。
3实验基础知识(1)看门狗功能:嵌入式系统运转时受外面搅乱或系统错误,程序有时会出现“跑飞〞,以致整个系统瘫痪。
为防范这一现象的发生,在对系统牢固性要求较高的场合经常要参加看门狗电路〔 WATCHDOG〕。
看门狗的作用是当系统跑飞而进入死循环时,恢复系统的运转。
(2)看门狗工作原理:设本系统程序完满运转一周的时间是Tp,看门狗定是周期是Ti,Ti>Tp, 在程序运转一周后就更正准时器的计数值,只要程序正常运转,准时器就不会溢出,假设由于搅乱等原因是系统不能够在Tp 时辰更正准时器的数值,准时器将在Ti 时辰溢出,惹起系统复位,使系统得以重新运转,从而起到监控的作用在一个完满的嵌入式系统中或单片机小系统中平时都有看门狗准时器,且一般集成在办理器芯片中,看门狗实质上就是一个准时器,知识它在期满后将自动惹起系统复位。
〔3〕看门狗准时器计数值:输入到计数器的时钟周期t_watchdog =1/(PCLK/Prescaler value + 1)/ Division_factor)看门狗的准时周期T = WTCNT * t_watchdog〔4〕看门狗准时器存放器控制存放器〔 WTCON 〕数据存放器〔 WTDAT 〕计数器存放器〔 WTCNT 〕(1)新建一个工程 watchdog,增加相应的文件,并更正 watchdog 的工程设置;创立并参加到工程watchdog 中,局部参照代码以下:/* functions */void rtc_tick_isr(void) __attribute__ ((interrupt("IRQ")));;void rtc_int_isr(void) __attribute__ ((interrupt("IRQ")));;// 设置存放器参数#define WDT_ENABLE(0x01<<5)#define WDT_INT_ENABLE(0x01<<2)#define WDT_RST_ENABLE(0x01<<0)#define WDT_CLK_SEL(0X3<<3)/* 1/128 */#define WDT_PRE_SCALER((PCLK/1000000-1)<<8)/* 49void watchdog_init(){rWTCNT = 8448 * 2;/* 设置看门狗初始值*/rWTCON = WDT_ENABLE | WDT_RST_ENABLE | WDT_CLK_SEL | WDT_PRE_SCALER;/*翻开看门狗*/}void rtc_set_date(st_date* p_date){rRTCCON = 0x01;rBCDYEAR = p_date->year;rBCDMON= p_date->mon;rBCDDAY= p_date->day;rBCDDATE = p_date->week_day;rBCDHOUR = p_date->hour;rBCDMIN= p_date->min;rBCDSEC = p_date->sec;rRTCCON = 0x00;}{ ⋯}void rtc_tick_init( char tick ){Irq_Request(IRQ_TICK, rtc_tick_isr);rRTCCON= 0x0;//No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]rTICNT= (tick&0x7f)|0x80;/*TICK中断使能,周期(1+tick)/128秒*/Irq_Enable(IRQ_TICK);}void Main(void){int old_index ;st_date m_date;/*配置系*/ChangeClockDivider(1,1);// 1:2:4ChangeMPllValue(0xa1,0x3,0x1);/* 中断初始化*/Isr_Init();/* 初始化端口*/Port_Init();/* 初始化串口*/Uart_Init(0,115200);Uart_Select(0);/* 置告警的及方式,0x41 表示使能RTC 告警,以及使能秒告警*/rtc_alarm_set(&m_date, 0x41);rtc_tick_init(127)watchdog_init();old_index = led_index;PRINTF(" 请在 2 秒内喂狗,否那么系统将在约 2 秒后复位 \n\n");while(1){if(old_index != led_index)/* 每隔一秒更新一次数据*/ {rtc_get_date(&m_date);old_index = led_index;}};}void rtc_tick_isr(void){Irq_Clear(IRQ_TICK);/* 去除 TICK 中断*/*((U8*) 0x10000006) = 0x00;*(unsigned char*)0x10000004 = seg7table[led_index%10];led_index++;/* 喂狗*/rWTCNT = 8448 * 2;}(2) 注意设置运转设备,如图 1.1 所示。
单片机看门狗程序/*此程序实现单片机"看门狗"WDT的功能*/#include "p18f458.h"unsigned long i;/*系统初始化子程序*/void initial(){TRISD = 0X00; /*D口设为输出*/}/*延时子程序*/void DELAY(){for (i=19999;--i;)continue;}/*主程序*/main (){initial(); /*初始化,设定看门狗的相关寄存器*/PORTD = 0X00; /*D口送00H,发光二极管亮*/DELAY(); /*给予一定时间的延时*/PORTD = 0XFF; /*D口送FFH,发光二极管灭*/while(1){;} /*死循环,等待看门狗溢出复位*/}-------------------汇编语言版本的单片机看门狗程序---------------- ;此程序实现"看门狗"WDT的功能;此单片机看门狗由独家提供LIST P=18F458INCLUDE "P18F458.INC"DEYH EQU 0X20DEYL EQU DEYH+1ORG 0X00GOTO MAINORG 0X30;*************初始化子程序*****************INITIALCLRF TRISD ;D口设为输出RETURN;**************延时子程序**************************DELAYMOVLW 0XFFMOVWF DEYHAGAIN1MOVLW 0XFFMOVWF DEYLAGAIN2DECFSZ DEYLGOTO AGAIN2DECFSZ DEYHGOTO AGAIN1NOPRETURN;************单片机看门狗主程序**************************** MAIN NOPCALL INITIAL ;系统初始化MOVLW 0X00MOVWF PORTD ;D口送00H,发光二极管亮CALL DELAYMOVLW 0XFFMOVWF PORTD ;D口送FFH,发光二极管灭LOOPGOTO LOOP ;死循环,等待看门狗复位ENDAVR看门狗程序范例A VR看门狗程序范例,程序演示了看门狗的复位过程,使用了本站新手入门的第一个范例,普通情况下,程序最后陷入死循环,但是这个程序里,看门狗让单片机复位,你会看见LED 一直闪动,效果和第一个范例程序相同。
就两点,初始化,然后喂狗,喂狗要在看门狗咬人之前,(复位之前喂狗)。
CODE://ICC-A VR application builder : 2007-1-31 17:27:04// Target : M16// Crystal: 7.3728Mhz// Auther:古欣A VR与虚拟仪器[url][/url]// 看门狗复位演示程序。
#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x03; //设置为输出DDRA = 0x03; //高电平,两个LED都灭PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}//Watchdog initialize// prescale: 2048K //预分频越大,定时时间越长,也就是可以更长时间不喂约为2.1s复位void watchdog_init(void){WDR(); //this prevents a timout on enablingWDTCR = 0x1F; //特别注意这一条不是ICC生成的,是后来加上的。
WDTCR = 0x0F; //WA TCHDOG 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--);}CLI(); //这里喂狗}//call this routine to initialize all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();watchdog_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x00; //timer interrupt sourcesSEI(); //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(); 喂狗,单片机就不会复位了。
}AVR看门狗使用程序A VR看门狗一个硬件单元,当程序由于某种原因跑“飞”了,它就Reset程序。
就像小狗看门一样。
//Watchdog initialize// prescale: 2048Kvoid watchdog_init(void){WDR(); //this prevents a timout on enablingWDTCR = 0x0F; //WA TCHDOG ENABLED - dont forget to issue WDRs} 上面是用ICC的App Builder生成的看门狗初始化程序,这些语句达不到初始化看门狗的目的,需要在中间加一句WDTCR = 0x1F; 。
最后一行代码提醒狗主人,别忘了及时清零看门狗定时器(喂狗),否则,小狗就咬人了。
一个相对独立的计数自动重启单片机的硬件部件,如果启用它后,不在一定的时间内清除它的计数值,就会达到计数的最高值而溢出,然后它就指挥单片机重启。
所以要在你的程序里适当的加入清看门狗的指令,一旦你的单片机程序出了问题,当然就不能按照你的程序原先设定那样自动清看门狗了,也就是常说的程序跑飞了,这个时候看门狗就会重启单片机试图解决问题。
一般只对瞬间干扰造成的问题有效,要是长时间的干扰或是软硬件问题,看门狗的意义不是很大。
我的理解就象是监视程序执行的保安一样, 程序正常执行时会在他的益处时间之内给他一个复位信号,当程序跑飞的时候他在溢出时间之内是收不到复位信号的,这时看门狗就会在设定的时间内产生系统复位的信号!A VR的看门狗是软狗,也是硬狗!如果熔丝位不设定,就是软狗,因为程序可以关闭,也可以打开如果熔丝位设定了,就是硬狗,因为程序只可以清除,而无法打开或关闭!是不是在程序中加入WDR(); 就算“喂狗”了?喂狗好象要计算好时间吧?我每执行一个函数就喂狗一次如何?如果你的循环体内每循环一次的时间不超过看门狗的复位时间,主要喂狗一次就可以了。
A VR看门狗程序范例,程序演示了看门狗的复位过程,使用了本站新手入门的第一个范例,普通情况下,程序最后陷入死循环,但是这个程序里,看门狗让单片机复位,你会看见LED 一直闪动,效果和第一个范例程序相同。
就两点,初始化,然后喂狗,喂狗要在看门狗咬人之前,(复位之前喂狗)。
//ICC-A VR application builder : 2007-1-31 17:27:04// Target : M16// Crystal: 7.3728Mhz// Auther:古欣// 看门狗复位演示程序。
#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x03; //设置为输出DDRA = 0x03; //高电平,两个LED都灭PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}//Watchdog initialize// prescale: 2048K //预分频越大,定时时间越长,也就是可以更长时间不喂// 约为2.1s复位(根据数据手册,2048K,5V典型值)void watchdog_init(void){WDR(); //this prevents a timout on enablingWDTCR = 0x1F; //特别注意这一条不是ICC生成的,是后来加上的。
WDTCR = 0x0F; //WA TCHDOG 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 peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();watchdog_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x00; //timer interrupt sourcesSEI(); //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) //普通情况下,程序会陷入这里一直循环。