MEGAl6L单片机有五个复位源,分别是上电复位、外部复位、低电压复位、JTAG复位和看门狗复位。复位后所有I/O寄存器被置成初始值,程序从000H处开始执行。五种复位源所产生的复位信息记录在MCU状态寄存器MCUCSR中,如附表所示。
当复位发生时,相应的寄存器标志位被置位。
要启用看门狗定时器功能,必须对看门狗控制寄存器WDTCR进行初始化。WDTCR的Bit3是使能控制位,Bit0~Bit2决定看门狗的预分频,即溢出时间,最短16.3ms,最长2.1s。
在编写程序时,合理安排WDR复位指令位置,使程序在正常运行状态下,WDR在看门狗定时器还没有超时溢出,就将其清零,因而不会产生复位。工程实践中如遇强电磁干扰,会出现“程序跑飞”进入死循环的情况,这时看门狗就会超时溢出,产生一个CK周期的窄复位脉冲,使程序计数器指向000H,程序从头开始执行。
下面用一个试验程序来说明MEGAl6L看门狗的动作过程和用法。电路如附图所示。发光管LEDl、LED2分别指示程序为正常执行和复位。上电复位或外部复位后,LED2亮1秒便熄灭,接着LED1以O.1秒频率闪亮。设置一个开关Kl来模拟死循环,当开关K1按下后,LEDl灭(程序进入死循环),如按下K1的时间超过2s,LED2再次点亮,说明是看门狗定时器复位,当开关K1放开后,LEDl继续闪亮,程序继续工作,如果在死循环中加上WDT复位指令WDR,即使按键一直按下,LED2也不会亮。程序代码如下:
.org $000ldi temp,low(ramend)out SPL,templdi temp,high(ramend)out SPH,templdi temp,$06;端口初始化out portd,tempout ddrd,temPIN temp,wdtcr;wdt初始化ori temp,$0f;WDT 溢出时间2.1sout wdtcr,temploop:clr tempout mcusr,temPCBi portd,2;LED2亮rcall delay_1ssbi portd,2loopl:rcall ledl blinkwaitl:sbIC pind,O;Kl按下?
rjmp loopl;K1没按调ledl_blink(略)rjmp waitl;按K1停在waitl循环end有时不能让程序从头执行,如笔者设计的一个食盐包装机控制程序中,每个机械动作按步骤进行,如在夹袋时发生WDT复位后,让程序从头执行,则会产生废袋。这时需要区分是上电复位还是看门狗复位,在程序上做一些处理,使程序回到死机时的位置继续执行。具体方法是在程序初始化之后加上一段代码,判断MCUCSR中的Bit3位的状态,以便决定程序的去向。如果是WDT复位,则可让单片机进入特殊的处理子程序,达到预定的目的。