一个有关看门狗(AT89s51)的问题问一下高手们。
1.看门狗是一个寄存器吧,它里面有些啥标识符。里面会有像TMOD寄存器里的GATE、C/T#、M1、M1.....吗?
2.还有在用它的时候,为什么要写入:
MOV WDTRST,#1EH
MOV WDTRST,#0E1H
就能使能看门狗?这里的#1EH、#0E1H有什么用哦。
需要了解它内部的情况吗?
3.最后一个问题了,就是在用看门狗的程序中如果主程序很长(超过了狗的最大时间2000ms),我意思是程序没有进入死循环哈。那怎么办哦!!!
各位......谢谢咯!我的可用分全押进去了也只有那么点点,
等多的时候再给你们哈。
大侠你能帮我看看你上边的那个问题么
就是Keil3 关于结构体定义的问题
看门狗具体使用方法如下:
在程序初始化中向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H。即可激
活看门狗。
Org 0000
Ljmp begin
Begin:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
;在程序初始化中激活看门狗。
……
……
For:
……
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
;喂狗指令
……
Ljmp for
在C语言中要增加一个声明语句。
在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E;
WDTRST=0xE1;//初始化看门狗,即激活它
While (1)
{
WDTRST=0x1E;
WDTRST=0xE1;//喂狗指令
}
}
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。所以必须保证CPU有可靠的上电复位。
否则看门狗也无法工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固
定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。
4.在ATMEL的89S51系列的89S51与89C51功能相同。指令兼容。HEX程序无需任何转换可以直接使用。89S51只比89C51增加了一个看门狗功能。89S51的其它功能可以参见89C51的资料
以上程序我已调试通过。还利用定时器把看门狗的喂狗时间延长几秒至几分钟。
程序没进入死循环,只要小于看门狗的溢出周期,那系统就不会复位啊,看门狗的目的就是怕程序陷入莫名的死循环中
1. 看门狗通常是一个定时器, 可能会有至少一个用于控制的寄存器, 但不会像51的T0/T1一样
2. 在用它的时候, 51里面早期常用的是向一个寄存器按规定顺序写入规定的常数:
MOV WDTRST,#1EH
MOV WDTRST,#0E1H
3. 你有几个选择
1是使用复位时间更长的WDT, 避免在正常运行中发现复位
2是改变程序,减少两次复位操作之间的时间间隔
3是使用某种kernel,一个任务负责耗时操作,另一个任务(较高优先级)负责WDT复位/系统监管什么的
单片机很久没用了,但看门狗一般都是一样的
1. 组成
一般有这么两类寄存器:定时器(用来计时)、配置寄存器
具体工作只能查看对应的单片机datasheet
2. 工作原理
配置寄存器用来控制 看门狗的 使能/非能, 暂停/恢复等。
设置了超时时间(如0.2s),并使能看门狗 后,若未每隔t(t<0.2s
)去清零定时器,则看门狗将自动复位。这个清零寄存器的动作 俗称 “喂狗”
3. 假如有些程序很长(超过看门狗超时时间),则必须在这些程序中间插入 “喂狗” 程序
谢谢你们,看了你们的答案都没有提到看门狗里的标识符。
看来是不用详细了解它的内部结构了?