下面用一个试验程序来说明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复位,则可让单片机进入特殊的处理子程序,达到预定的目的。
| 欢迎光临 美丽的网站-英华家电维修论坛 (http://www.bsss.info/) | Powered by Discuz! X3.2 |