一、ATMEGA128數(shù)據(jù)手冊
看門狗定時器
看門狗定時器由獨立的1 Mhz 片內(nèi)振蕩器驅(qū)動。這是VCC= 5V 時的典型值。請參見特性數(shù)據(jù)以了解其他VCC電平下的典型值。通過設(shè)置看門狗定時器的預(yù)分頻器可以調(diào)節(jié)看門狗復(fù)位的時間間隔,如P53 Table 22 所示??撮T狗復(fù)位指令WDR用來復(fù)位看門狗定時器。此外,禁止看門狗定時器或發(fā)生復(fù)位時定時器也被復(fù)位。復(fù)位時間有8 個選項。如果沒有及時復(fù)位定時器,一旦時間超過復(fù)位周期,ATmega128 就復(fù)位,并執(zhí)行復(fù)位向量指向的程序。具體的看門狗復(fù)位時序在P50 有說明。
為了防止無意之間禁止看門狗定時器或改變了復(fù)位時間,根據(jù)熔絲位M103C 和 WDTON 芯片提供了3 個不同的保護級別,如Table 21. 所示。安全級別0 相應(yīng)于ATmega103 的 設(shè)置。使能看門狗定時器則沒有限制。請參考P 54“ 改變看門狗定時器配置的時間序列”。
看門狗定時器控制寄存器- WDTCR
? Bits 7..5 – Res: 保留
保留位,讀操作返回值為零。
? Bit 4 – WDCE: 看門狗修改使能
清零WDE 時必須先置位WDCE,否則不能禁止看門狗。一旦置位,硬件將在緊接的4 個 時鐘周期之后將其清零。請參考有關(guān)WDE 的說明來禁止看門狗。工作于安全級別1 和2 時也必須置位WDCE 以修改預(yù)分頻器的數(shù)據(jù),如P 54 “ 改變看門狗定時器配置的時間序列” 所示。
? Bit 3 – WDE: 看門狗使能
WDE為"1“時,看門狗使能,否則看門狗將被禁止。只有在WDCE為"1“時WDE才能清零。以下為關(guān)閉看門狗的步驟:
1. 在同一個指令內(nèi)對WDCE 和WDE 寫"1“,即使WDE 已經(jīng)為"1“。
2. 在緊接的4 個時鐘周期之內(nèi)對WDE 寫"0”。
工作于安全級別2 時是永遠無法禁止看門狗定時器的。參見 P 54 “ 改變看門狗定時器配置的時間序列” 。
? Bits 2..0 – WDP2, WDP1, WDP0: 看門狗定時器預(yù)分頻器2, 1, 和0
WDP2、WDP1 和WDP0 決定看門狗定時器的預(yù)分頻器,如Table 22 所示。
下面的例子分別用匯編和C 實現(xiàn)了關(guān)閉WDT 的操作。在此假定中斷處于用戶控制之下 (比如禁止全局中斷) ,因而在執(zhí)行下面程序時中斷不會發(fā)生。
匯編代碼例程WDT_off:; 置位 WDCE 和 WDE
ldir16, (1<
; 關(guān)閉WDT
ldir16, (0<
ret
C 代碼例程
voidWDT_off(void)
{
WDTCR = (1<
WDTCR = 0x00;
}
看門狗初始化程序
C 代碼例程
voidWDT_Init(void)
{
_WDR();//reset watchdog timer
WDTCR |= (1<
}
改變看門狗定時器配置的時間序列
改變配置的序列根據(jù)不同的安全級別略有不同。下面將逐一說明。
安全級別0
這個模式與ATmega103 的看門狗操作相兼容??撮T狗的初始狀態(tài)是禁止的,可以沒有限制地通過置位WDE 來使能它,以及改變定時器溢出周期。禁止看門狗定時器時則需要遵 守有關(guān)WDE 的說明。
安全級別1
在這個模式下,看門狗定時器的初始狀態(tài)是禁止的,可以沒有限制地通過置位WDE 來使能它(例如:WDTCR|= (1<
2. 在緊接的4 個時鐘周期之內(nèi)同時對WDE 寫"0”,以及為WDP 寫入合適的數(shù)據(jù),而WDCE 則寫"0”。
安全級別2
在這個模式下,看門狗定時器總是使能的, WDE 的讀返回值為"1”。 改變定時器溢出周期需要執(zhí)行一個特定的時間序列:
1. 在同一個指令內(nèi)對WDCE和WDE寫"1“。雖然WDE總是為置位狀態(tài),也必須寫"1“以啟動時序。
2. 在緊接的4 個時鐘周期之內(nèi)同時對WDCE 寫"0”,以及為WDP 寫入合適的數(shù)據(jù)。WDE 的數(shù)值可以任意。
二、看門狗AVR-GCC例程
頭文件:#include ,包含看門狗復(fù)位命令 _WDR();
avr-libc 提供三個API 支持對器件內(nèi)部Watchdog 的操作,它們分別是:
wdt_reset() // Watchdog 復(fù)位
wdt_enable(timeout) // Watchdog 使能
wdt_disable() // Watchdog 禁止
調(diào)用上述函數(shù)前要包含頭文件 wdt.h ,wdt.h 中還定義Watchdog 定時器超時符號常量,它們用于為wdt_enable 函數(shù)提供timeout 值。符號常量分別如下:
符號常量值含意
WDTO_15MS Watchdog定時器15 毫秒超時
WDTO_30MS Watchdog定時器30 毫秒超時
WDTO_60MS Watchdog定時器60 毫秒超時
WDTO_120MS Watchdog定時器120 毫秒超時
WDTO_250MS Watchdog定時器250 毫秒超時
WDTO_500MS Watchdog定時器500 毫秒超時
WDTO_1S Watchdog定時器1 秒超時
WDTO_2S Watchdog定時器2 秒超時
Watchdog 測試程序:
在CA-M8 上執(zhí)行此程序時應(yīng)打開S1-8(LEDY),使黃色發(fā)光管連接PB0 引腳。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define SET_LED PORTB&=0XFE //PB0 接黃色發(fā)光管
#define CLR_LED PORTB|=0X01
//誤差不會太大的延時1ms 函數(shù)
void DelayMs(uint ms)
{
uint i;
for(i=0;i
_delay_loop_2(4 *250);
}
int main(void)
{
DDRB=_BV(PB0);
PORTB=_BV(PB0); //CLR_LED
//WDT 計數(shù)器同期為一秒
wdt_enable(WDTO_1S);
wdt_reset();//喂狗
DelayMs(500);
SET_LED;
//等待餓死狗
DelayMs(5000);
SET_LED;
while(1)
wdt_reset();
}
執(zhí)行結(jié)果:
CA-M8 上的黃色發(fā)光管不斷的閃爍,證明了Watchdog 使MCU 不斷的復(fù)位。
三、注意事項
如果循環(huán)體內(nèi)每循環(huán)一次的時間不超過看門狗的復(fù)位時間,主要喂狗一次就可以,否則需要多次喂狗。