avr单片机看门狗程序

合集下载

avr单片机看门狗程序

avr单片机看门狗程序

单片机看门狗程序/*此程序实现单片机"看门狗"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 一直闪动,效果和第一个范例程序相同。

单片机实验看门狗实验

单片机实验看门狗实验

实验八 看门狗实验

/***************************************************************************** // Function name : rtc_get_date // Description : 获取实时时钟当前时间、日期 // Return type : void // Argument : p_date, 返回日期的指针 *****************************************************************************/ void rtc_get_date(st_date* p_date) { rRTCCON = 0x01; p_date->year = rBCDYEAR ; p_date->mon = rBCDMON ; p_date->day = rBCDDAY ; p_date->week_day= rBCDDATE ; p_date->hour = rBCDHOUR ; p_date->min = rBCDMIN ; p_date->sec = rBCDSEC ; rRTCCON = 0x00; } /***************************************************************************** // Function name : rtc_tick_init // Description : 初始化S3C2410的TICK定时器 // Return type : void // Argument : tick, 设置的TICK频率(时钟滴答的周期为 (1+tick)/128秒) *****************************************************************************/

看门狗的使用

看门狗的使用

看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。

在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。

由于我用过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单片机看门狗的使用

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单片机的看门狗

关于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单片机看门狗实验报告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 看门狗WDT程序

AVR 看门狗WDT程序

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)的工作原理及其应用

单片机看门狗(Watchdog)的工作原理及其应用

单片机看门狗(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死机。

看门狗的作用就是防止程序发生死循环,或者说程序跑飞。

工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。

所以,在使用有看门狗的芯片时要注意清看门狗。

单片机看门狗程序

单片机看门狗程序
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
门狗”WDT的功能;此单片机看门狗由51hei独家提供LISTP=18F458INCLUDE”
P18F458.INC”
DEYHEQU0X20DEYLEQUDEYH+1
ORG0X00GOTOMAINORG0X30
;*************初始化子程序*****************INITIALCLRFTRISD;D口
;************单片机看门狗主程序
****************************MAINNOPCALLINITIAL;系统初始化
MOVLW0X00MOVWFPORTD;D口送00H,发光二极管亮
CALLDELAYMOVLW0XFFMOVWFPORTD;D口送FFH,发光二极管灭
LOOPGOTOLOOP;死循环,等待看门狗复位END
/*主程序*/main(){initial();/*初始化,设定看门狗的相关寄存器*/PORTD=
0X00;/*D口送00H,发光二极管亮*/DELAY();/*给予一定时间的延时*/PORTD
=0XFF;/*D口送FFH,发光二极管灭*/while(1){;}/*死循环,等待看门狗溢出
复位*/}
-------------------汇编语言版本的单片机看门狗程序----------------;此程序实现”看
单片机看门狗程序
/*此程序实现单片机”看门狗”WDT的功能*/
#include”p18f458.h”
unsignedlongi;
/*系统初始化子程序*/voidinitial(){TRISD = 0X00;/*D口设为输出*/}
/*延时子程序*/voue;}

(完整word版)基于ARM看门狗程序设计

(完整word版)基于ARM看门狗程序设计

课程结业实验报告课程名称:嵌入式系统设计报告题目:基于 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 所示。

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;//不用的管脚使能内部上拉电阻。

看门狗实验解密版

看门狗实验解密版

} ================================================================================
以上的程式状态时没有喂狗的状态,所以每超过 2 秒 LED 就会闪耀一下。
如果试着将 WDR();的注释拿掉,那么 LED 就不会闪耀了。
源码: ===================================================================
//1600-WDT.c //看门狗演示程式 //akuei2 22-01-10
#include "iom16v.h" #include "macros.h"
WDTCR&=~BIT(WDE);
//关闭看门狗
}
为什么关闭看门狗需要同时置一 WDTOE 和 WDE 位呢?具体我也不是很清楚,但是根 据手册说:当 WDTOE 和 WDE 一同置一时,会产生 4 个有效的关闭周期。如果在这四 个周期内,将 WDE 位设置位 0,那么久会成功关闭看门狗。
"喂狗" - 喂狗实现的方法如下: #include "macros.h"
15.4 试验: 看门狗演示 该试验的思路基本上是利用 8 位 LED。程式一开始的时候启动看门狗,关闭 LED,然 后点亮 LED,程式停止。如果程式预设没有喂狗,当超过最长的喂狗时间后,程式就会 自动复位,这时候就会看到 LED 闪耀。相反的,如果在有效喂狗的时间内,重复喂狗 的话,那么 LED 永远会亮着。
... ...
while(1)
{
PORTB=0x00; //点亮 8 位 LED

AVR内部看门狗实验

AVR内部看门狗实验
AVR内部看门狗实验
AVR内部看门口实验。
1、看门口实验。在主程序中周期喂狗,通过按下按键让程序无限循环,从
而启动看门狗。
2、内部1 M晶振,程序采用单任务方式,软件延时。
3、进行此实验请插上JP1、JP3的所有8个短路块,JP7(LED_EN)短路
块。
4、通过此实验可了解看门狗的设置及看门狗的喂狗等。
1S*/while (1) &#123;
delay_ms(250);
WDR();/*喂ห้องสมุดไป่ตู้*/
PORTB–(1 << 0);/*PB0电平取反*/
while(PINA != 0xFF);/*检测按键*/
&#125;
&#125;
*/
#include“iom16v.h”
#include
/*延时函数*/
void delay_ms(unsigned char i)&#123;
unsigned char a, b;
for (a = 1; a < i; a++) &#123;
for (b = 1; b; b++) &#123;
;
&#125;
PORTD = 0xFF;
PORTB = 0x00;
WDR();/*喂狗*/
delay_ms(250);
WDR();/*喂狗*/
delay_ms(250);
PORTB = 0xFF;
WDTCR |= ((1 << WDTOE) | (1 << WDE));/*启动时序*/
WDTCR=((1<<WDE)|(1<<WDP2)|(1<<WDP1));/*设定周期为

任务四 看门狗报警_AVR单片机(C语言)项目开发实践教程_[共4页]

任务四 看门狗报警_AVR单片机(C语言)项目开发实践教程_[共4页]
二、Байду номын сангаас件设计
看门狗复位硬件电路图如图 7-8 所示。
95
任务四 看门狗报警
一、任务要求
利用 ATmega16 单片机内部的看门狗定时器,设计一个单片机抗干扰应用系统。当霓虹灯 显示系统启动时,8 个 LED 等短暂闪烁,正常运行后 8 个 LED 循环点亮,由外部按键触发模 拟干扰源(停止“喂狗”,LED 不正常点亮),系统自动重新启动进入正常运行状态。
项目七 中断控制应用
int main() {
uint8_t a,b,c,d; DDRB|=0x03; PORTB|=0x04; DDRD&=0xf7; PORTD|=0x08; cli(); GICR|=0xa0; MCUCR|=0x08; MCUCSR|=0x40; GIFR|=_BV(5); sei();
while(1) {
a=i%10; b=i%100/10; c=i/100%10; d=i/1000; play(a); play(b); play(c); play(d); delay_ms(300); } }
五、项目实施
1.根据元器件清单选择合适的元器件。 2.根据硬件设计原理图,在万能电路板进行元器件布局,并进行焊接工作。 3.焊接完成后,重复进行线路检查,防止短路、虚接现象。 4.在 AVR Studio 软件中创建项目,输入源代码并生成*.hex 文件。 5.在确认硬件电路正确的前提下,通过 JTAG 仿真器进行程序的下载与硬件在线调试。

基于ARM看门狗程序设计

基于ARM看门狗程序设计

.课程结业实验报告课程名称:嵌入式系统设计报告题目:基于ARM的看门狗程序设计专业班级:学号:班1601通信学生姓名:指导教师:20 月年2017 6 日...看门狗实验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)4 实验步骤...(1) 新建一个工程watchdog,添加相应的文件,并修改watchdog的工程设置;创建watchdog.c并加入到工程watchdog中,部分参考代码如下:/* functions */void rtc_tick_isr(void) __attribute__ ((interrupt(IRQ)));;void rtc_int_isr(void) __attribute__ ((interrupt(IRQ)));;//设置寄存器参数#define WDT_ENABLE (0x01<<5)(0x01<<2) #define WDT_INT_ENABLE#define WDT_RST_ENABLE (0x01<<0)#define WDT_CLK_SEL(0X3 /* 1/128 */<<3)#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_get_date(st_date* p_date)...{…}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:4// FCLK=202.8MHz ChangeMPllValue(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;剐义?尨请在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_x0010_];led_index++;/* 喂狗*/rWTCNT = 8448 * 2;}(2) 注意设置运行设备,如图1.1所示。

利用单片机内部定时器实现软件看门狗

利用单片机内部定时器实现软件看门狗

利用单片机内部定时器实现软件看门狗利用单片机内部定时器实现软件看门狗勤镐工控(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看门狗及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 的指定地址;

ATmega64看门狗

ATmega64看门狗

编译软件:avr studio芯片型号:A Tmega64说明:使用看门狗时,头文件#include <avr/wdt.h>,通过看库文件可以看到以下资料:Defines#define wdt_reset() __asm__ __volatile__ ("wdr")#define wdt_enable(value)#define wdt_disable()#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#define WDTO_4S 8#define WDTO_8S 9作用及如何使用基本一目了然,需要说一下wdt_enable(value),其中的value值选WDTO_15MS~WDTO_8S之一,例:wdt_enable(WDTO_2S);程序部分/**********时间:2012.3.10著者:备注:喂狗时间2s。

如果灯一闪一闪,表明看门狗起作用了(程序反复重启)。

如果灯一直亮,表明看门狗未起作用。

***********///主函数int main(void){DDRA = 0x01;PORTA = 0X0;wdt_enable(WDTO_2S);//看门狗定时器的时间2s_delay_ms(1000);PORTA=0X01;while(1){_delay_ms(5000);wdt_reset();//喂狗}}电路部分软件:proteusPE0/RXD0/PDI 2PE1/TXD0/PDO 3PE2/XCK0/AIN04PE3/OC3A/AIN15PE4/OC3B/INT46PE5/OC3C/INT57PE6/T3/INT68PE7/ICP3/INT79PB0/SS 10PB1/SCK 11PB2/MOSI 12PB3/MISO 13PB4/OC014PB5/OC1A 15PB6/OC1B16PB7/OC2/OC1C 17PG3/TOSC218PG4/TOSC119RESET 20XTAL223XTAL124PD0/SCL/INT025PD1/SDA/INT126PD2/RXD1/INT227PD3/TXD1/INT328PD4/ICP129PD5/XCK130PD6/T131PD7/T232PG0/WR 33PG1/RD 34PC0/A835PC1/A936PC2/A1037PC3/A1138PC4/A1239PC5/A1340PC6/A1441PC7/A1542PG2/ALE 43PA7/AD744PA6/AD645PA5/AD546PA4/AD447PA3/AD348PA2/AD249PA1/AD150PA0/AD051PF7/ADC7/TDI54PF6/ADC6/TDO 55PF5/ADC5/TMS 56PF4/ADC4/TCK 57PF3/ADC358PF2/ADC259PF1/ADC160PF0/ADC061AREF 62AVCC 64PEN1U1ATMEGA641234567820191817161514139121011U2LED-BARGRAPH-RED有问题欢迎交流:liuwuqiong657@。

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

单片机看门狗程序/*此程序实现单片机"看门狗"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) //普通情况下,程序会陷入这里一直循环。

相关文档
最新文档