AVR单片机 看门狗范例 GCCAVR WDR 复位检测和控制看门狗

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

AVR单片机看门狗范例GCCAVR WDR 复位检测和控制看门狗

内容来源:OURAVR发布时间:[2010-10-28]查看次数:805

/***********************************************

**** AVR 复位检测和控制看门狗的范例***

**** ***

**** 作者:HJJourAVR ***

**** 编译器:WINAVR20050214 ***

**** ***

**** 2005.9.28 ***

***********************************************/

/*

本程序简单的示范了AVRATMEGA16的复位检测和控制看门狗

系统控制和复位

复位来源的检测

JTAG复位指示

看门狗复位指示

BOD复位指示

RESET引脚复位指示

上电复位指示

看门狗的控制

出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器。

熔丝位设置

1 使能BOD功能BODEN=0

2 选择BOD电平BODLEVEL=1 2.7V(VCC=3V) (可选)

BODLEVEL=0 4.0V(VCC=5V) (可选)

*/

#include

#include

//时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其

他时钟

#include

/*

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<

CPU_STATUS =MCUCSR;//读取MCU控制和状态寄存器

//可以在JTAG调试时直接观察 MCUCSR的状态。 CPU_STATUS&=0x1F;

switch(CPU_STATUS)

{

case(1<

PORTA&=~(1<

break;

case(1<

PORTA&=~(1<

break;

case(1<

PORTA&=~(1<

break;

case(1<

PORTA&=~(1<

break;

case(1<

PORTA&=~(1<

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_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 正常工作之前有一定的时间让电源达到稳定的电平。

相关文档
最新文档