单片机为了提高抗干扰能力一般都具有看门狗的功能,看门狗可以在单片机程序死机或者程序跑飞的情况下自动对单片机进行复位操作,使单片机重新开始工作,保证程序正常运行。我们也可以把看门狗应用在计算机上,以保证计算机系统的正常运行。实际上,看门狗在计算机上的应用已经比较普遍了,在一些对系统稳定性有严格要求的场合都能见到“看门狗”的影子,比如工业控制领域的计算机和一些作服务器使用的电脑主板。
一、看门狗的原理
看门狗的简称是WDT(Watch Dog Timer),硬件主要由一个定时器组成,在打开看门狗时,定时器开始工作,定时时间一到,触发系统复位。这样在软件上合适的地方需要在看门狗的定时之间到之前对看门狗定时器的计数器进行清零,只要软件运行正常,就不会出现复位。当软件死机或运行出错时,则不对看门狗定时器的计数器清零,看门狗定时时间到后即对系统进行复位,使系统重新开始工作,从而保证系统的正常运行。其中看门狗的定时时间可以由用户设定。软件上对看门狗的控制很简单,只有3种操作:打开看门狗、关闭看门狗和看门狗定时器清零。
二、硬件分析
这个电路是被做成一个板卡插在计算机的ISA插槽中,引出一个控制信号控制计算机的复位键。当系统死机时,看门狗电路会触发复位功能,使计算机重新启动,恢复正常运行。
U1的型号为74HCT73,是一个双JK触发器,这里只用到了一路。这个芯片具有单独的J、K、清零和时钟输入端。当第①脚(CLK)时钟输入端为高电平时,允许输入端输入数据。这时,J、K输入端的逻辑电平可以变化,并且只要符合最低建立时间,就执行符合真值表(见表1)的双稳态工作状态,在时钟脉冲的负边沿上输入数据被传输到输出端。

U2的型号为74HCT4060,这是一个带振荡器的14级二进制串行计数器。该计数器由14个主-从触发器和1个振荡器组成。该振荡器的频率可由石英晶振控制,也可由外接RC电路构成。每个触发器的输出端馈至下一级,每个输出端的频率为前一级的一半。计数器的状态根据振荡器输入端的负边沿而改变。复位端是低电平有效。真值表见表2。

U3的型号为74HCT02,这是一个4路2输入或非门电路。真值表见表3。

U4的型号为74HCT688。这是一个8位数值比较器,它可以完成两个8位二进制或BCD制之间的比较。P0~P7为一组8位数据,Q0~Q7为另一组8位数据。若参加比较的两个数相等,则74HCT688的第(P=Q)将输出低电平,否则为高电平。真值表见表4。

整个电路的工作过程如下:
定时器部分由74HCT4060、10挡旋转开关和VT1组成。74HCT4060的振荡周期由外接RC电路决定,也可根据需要自行调整。它的10个输出端对应着不同的定时时间。10位DIP开关用来选择定时时间,这样VT1可在不同的时间间隔导通,因为VT1的C极接到了复位按键,所以VT1的导通将导致计算机复位。
SW10用来设置看门狗的定时时间,每位打开可以得到不同的定时时间,见表5。
地址设置部分由1个74HCT688比较器完成。Q3~Q7的电平是固定的,通过3位拨码开关,可以改变Q0~Q2的电平。它们对应的是地址线的A2~A9,所以我们可以通过拨码开关将地址在十六进制的地址300H~31CH之间任意设置,以避免与计算机上其他设备的冲突。
S1用来设置看门狗定时器在计算机中的映射地址。软件通过这个地址访问看门狗,实现对看门狗的控制。表6是SW1的设置。
3. 看门狗部分
计算机正常工作时,看门狗程序要定时对看门狗电路进行清零操作。这个清零操作实际上就是定时访问看门狗电路的地址,对该地址进行一些读写操作,以表示计算机程序仍在正常运行。而看门狗电路一旦检测到这些操作,就对定时器部分清零,这样在该定时周期内,计算机就不会重新启动。
计算机上电后,会向ISA槽的B2脚(RESET)送入一个复位信号,该复位信号为高电平有效。RESET为高电平时,会对C3进行充电,最后导致VT2导通。VT2导通后,C2开始放电,C2放电完毕后,U1的第②脚变为低电平。U1复位,第Q-输出高电平。当复位结束后,复位信号变低,导致U1第②脚变高,但因为没有时钟信号,所以Q-保持高电平,则U2没有开始计数。
当我们要打开看门狗电路时,需要对看门狗电路进行读操作,首先在ISA总线上发送地址,当总线上的地址与看门狗电路预先设置的地址相同,即P=Q时,74HCT688的第会输出低电平。不过第是否允许输出是要受74HCT688的第①脚控制的。74HCT688第①脚的状态则由74HCT02决定。
ISA槽的A11(AEN地址允许)平时总是处于低电平。程序进行读写时,除了发送地址,还会发送读写控制信号,而读写信号不会同时出现,即读写时U3的第②脚和第⑥脚总处于相反的状态。因此U3第⑧脚和第⑨脚的电平也相反,第⑩脚将输出低电平。也就是74HCT688的第①脚为低电平,允许74HCT688的第输出。(注:因为地址线是复用的,所以同样的地址可能是看门狗的,也可能是其他设备的(如内存),所以还要确认是对IO的读写操作,才能确认是对看门狗的操作。)
对于74HCT73来说,有了时钟信号,读操作时:J为低(读信号),K为高(无写信号),Q-为高;紧接着的写操作时:J为高(无读信号),K为低(写信号),Q-为低。74HCT4060第(RESET)也为低,开始记数。
在计算机正常运行期间,看门狗程序会定期执行一定的操作使看门狗的定时器清零,其时间间隔要小于定时时间。清零操作实际执行的是一个读操作和一个写操作。对于74HCT73来说,读信号将导致Q-为高,即74HCT4060停止计数。接着的一个写操作导致U1的Q-为低,即74HCT4060开始计数。这样看门狗就开始正常运行了。
如果要关闭看门狗,则只送一个读信号就可以了。
如果计算机死机,则看门狗电路就接收不到定期的清零操作了。当74HCT4060达到定时时间,VT1就会导通,计算机就会复位。
三、软件设计及应用
看门狗的控制操作很简单,只有3种操作,软件上可以使用任何语言来控制看门狗,下面使用C语言来说明如何控制看门狗:
1. 打开看门狗操作或看门狗定时器清零操作
打开看门狗或看门狗定时器清零操作需要完成两个步骤:
(1) 从看门狗的控制地址读
(2) 输出任何数据到看门狗的控制地址
相应的C语言代码如下:
void WatchDogStart(int port)
9{
inport(port);
outport(port,0);
??}
注:port为看门狗的控制地址。
2. 关闭看门狗操作
关闭看门狗操作只需要完成从看门狗的控制地址读即可。相应的C语言代码如下:
void WatchDogStop(int port)
9{
inport(port);
9}
注:port为看门狗的控制地址。
我们只要在应用系统的软件中使用上面的方法来控制看门狗就可以使看门狗开始工作,这样当这个系统出错或死机时没有对看门狗定时器清零,就会引发系统复位。我们也可以设计一个通用的软件,在开机时自动运行这个软件打开看门狗,然后在后台定时对看门狗定时器清零,这样当系统死机时,同样可以完成系统自动复位。
(赵晓杰 刘河川)

