看门狗 WDT不能复位,测试程序只有一个延时,很简单的。用的是meag128!!!【恢复】
这是写的测试程序。用的片子是mega128,wdt.h中没有指明支持128. 128的wdt寄存器和mega16是一样的。只是定义不同。但是wdt.h中有这样的定义。
#if defined(WDTCSR)
# define _WD_CONTROL_REG WDTCSR
#else
# define _WD_CONTROL_REG WDTCR
#endif
#if defined(WDTOE)
#define _WD_CHANGE_BIT WDTOE
#else
#define _WD_CHANGE_BIT WDCE
#endif
所以就无所谓了!!!汇编代码显示对wdt寄存器初始化是对的!!1!!
请高手指教!!!!
#include <avr/io.h>
#include <avr/wdt.h>
#include "delay.h"
void main(void)
{
int i=10;
int j=10;
wdt_enable(WDTO_30MS);
wdt_reset();
_delay_ms(10);
_delay_ms(10);
_delay_ms(10);
_delay_ms(10);//运行到这里或附近就应该复位的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_delay_ms(10);
_delay_ms(10);
_delay_ms(10);
wdt_reset();
。。。。。。。。。
这是生成的汇编代码
+00000067: E188 LDI R24,0x18 Load immediate
+00000068: E090 LDI R25,0x00 Load immediate
+00000069: E029 LDI R18,0x09 Load immediate
+0000006A: B60F IN R0,0x3F In from I/O location
+0000006B: 94F8 CLI Global Interrupt Disable
+0000006C: 95A8 WDR Watchdog reset
+0000006D: BD81 OUT 0x21,R24 Out to I/O location
+0000006E: BE0F OUT 0x3F,R0 Out to I/O location
+0000006F: BD21 OUT 0x21,R18 Out to I/O location
13: wdt_enable(WDTO_30MS);
+00000070: B60F IN R0,0x3F In from I/O location
+00000071: 94F8 CLI Global Interrupt Disable
+00000072: 95A8 WDR Watchdog reset
+00000073: BD81 OUT 0x21,R24 Out to I/O location
+00000074: BE0F OUT 0x3F,R0 Out to I/O location
+00000075: BD21 OUT 0x21,R18 Out to I/O location
14: wdt_reset();
+00000076: 95A8 WDR Watchdog reset
15: _delay_ms(10);
+00000077: E08A LDI R24,0x0A Load immediate
+00000078: E090 LDI R25,0x00 Load immediate
+00000079: 940E02AC CALL 0x000002AC Call subroutine
16: _delay_ms(10); 你是如何知道和证明WDT没有复位的? wdt复位后,应该从程序的开始出执行。如果没复位的话,在看门时间超了后,还会接着向下执行的。 后来知道了,是延时程序的问题。一秒基本上是三秒,通过小灯闪烁掐的秒表。原因不明!!!!!
页:
[1]