keilc 发表于 2009-1-10 10:56:55

看门狗 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);

machao 发表于 2009-1-14 12:42:40

你是如何知道和证明WDT没有复位的?

keilc 发表于 2009-4-20 20:27:12

wdt复位后,应该从程序的开始出执行。如果没复位的话,在看门时间超了后,还会接着向下执行的。

keilc 发表于 2009-4-20 20:28:56

后来知道了,是延时程序的问题。一秒基本上是三秒,通过小灯闪烁掐的秒表。原因不明!!!!!
页: [1]
查看完整版本: 看门狗 WDT不能复位,测试程序只有一个延时,很简单的。用的是meag128!!!【恢复】