在线情况
楼主
  • 头像
  • 级别
    • 积分6
    • 经验299
    • 文章37
    • 注册2006-06-01
    这样喂狗狗也会跑飞,高人近来看看,会养狗的
    #include "msp430x14x.h"
    void main()
    {
          int i;
          WDTCTL=WDTPW+WDTHOLD;
          BCSCTL1&=~XT2OFF;
          do
          {
                IFG1&=~OFIFG;
                for(i=0XFF;i>0;i--);
          }
          while((IFG1&OFIFG)!=0);
          BCSCTL2|=SELM1;
          BCSCTL2|=SELS;
          WDTCTL = WDT_ARST_1000;                      //开狗
          while(1)
          {
                WDTCTL = WDTPW + WDTCNTCL;             //喂狗
                unsigned int i,j;
                for(i=0;i<5;i++)
                        for(j=0;j<2000;j++);
          }
    }

    我打开的8M时钟,但是发现只要有超过几千个的软件延迟,系统就自动复位了.我开的可是1秒的看门狗啊,高手指点下为什么啊,
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    你可以看看以下这个关于“训狗心法”
    【MC430F14入门例程】:WDT看门狗
    http://www.microcontrol.cn/mcbbs/Announce/Announce.asp?BoardID=112&ID=8211&q=1&r=4116
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分6
      • 经验299
      • 文章37
      • 注册2006-06-01
      DC的喂狗心得好象没有涉及到我说的情况啊,也就是我设的是1000ms的看门狗,专门测试过,一秒自动复位,没有任何问题,但是只要有超过5ms的时间不喂,它就自动复位,而不是理论的一秒,只能在程序里遍地撒狗粮才可以不跑飞,ms秒级的延迟必须在2000延迟内喂狗,否则用超过5ms的延迟就会导致复位.用几个149测试过都这样
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
        你延时是不是已超过5ms,有精确计算过“for(i=0;i<5;i++) for(j=0;j<2000;j++);”有多长时间吗。
        看来是延时过长没有喂狗的原因吧。
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      5
      • 头像
      • 级别
        • 积分6
        • 经验1342
        • 文章73
        • 注册2006-09-25
        他是把狗喂错了,WDTCTL = WDT_ARST_1000; 改成这样试试WDTCTL |= WDT_ARST_1000;
        微控网感谢您的参与
        在线情况
        6
        • 头像
        • 级别
          • 积分2
          • 经验440
          • 文章20
          • 注册2007-06-03
          楼上说得对
          但是错是在WDTCTL = WDTPW + WDTCNTCL这句,应改为WDTCTL |= WDTPW + WDTCNTCL;
          前者将SSEL和IS0、1都赋0,因此时钟选为了smclk,8m,此时狗的定时时间应该在4ms左右
          剩下就要看for循环的具体时间了,估计是大于4ms了
          微控网感谢您的参与
          在线情况
          7
          • 头像
          • 级别
            • 积分30
            • 经验4170
            • 文章139
            • 注册2006-10-19
            楼上说得正确啊!!!!
            微控网感谢您的参与
            在线情况
            8
            • 头像
            • 级别
              • 积分6
              • 经验1342
              • 文章73
              • 注册2006-09-25
              败给你了,厉害
              微控网感谢您的参与
              在线情况
              9
              • 头像
              • 级别
                • 积分5
                • 经验802
                • 文章21
                • 注册2007-08-19
                我觉得他开狗的是对的:WDTCTL = WDT_ARST_1000;                      //开狗
                如果改成:WDTCTL |= WDT_ARST_1000;                      //开狗
                那就把WDT给停止了
                喂狗是不对的,应该改成 WDTCTL |= WDTPW + WDTCNTCL;
                微控网感谢您的参与
                在线情况
                10
                • 头像
                • 级别
                  • 积分51
                  • 经验2657
                  • 文章206
                  • 注册2007-03-18
                  看来大家对狗狗的误解不少,上边有些操作虽然能得到正确结果,但我认为那种写法可能仍然没有真正的理解狗狗的思维方式,我认为有两种写法是比较正确的。
                  首先我们可以看一下在头文件中对于WDT_ARST_1000的定义,如下:

                  #define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL)   /* 1000ms  " */

                  那就是说,它已经包含了喂狗所必须的WDTCNTCL了。
                  然后,有两点要注意的:一是狗必须用口令操作,也就是WDTPW;二是狗狗的寄存器不支持位操作,所以或的写法有些不妥,但如果或的时候包括了WDTPW+WDTCNTCL的话,理应可以进行操作的,不过个人认为,由于这样需要先取值,经过或运算再写入,就不如直接MOV。

                  所以,综上所述,楼主的情形,无论是初始化狗还是喂统统是一样的,都使用以下的同一句:WDTCTL = WDT_ARST_1000;
                  如果将此句放在主程序死循环的循环体开头,可以省去一个初始化过程,因为它既是初始化也是喂。
                  当然另一种正确的方法就是WDTCTL |= WDTPW + WDTCNTCL;了,因为这句包括了我刚才提到的必备狗粮,个人认为这种写法更适合于在不同的子程序中有不同的狗设置,也就是较复杂的程序时使用,这个指令是不会区别狗的设置的,一律喂。而第一种方案在喂的同时由于会重新设置狗的间隔,所以恐怕在复杂的程序中有时会引起意外的狗状态改变了,大家要区别使用啊!
                  微控论坛特约嘉宾
                  在线情况
                  11
                  • 头像
                  • 级别
                    • 积分9
                    • 经验139
                    • 文章14
                    • 注册2012-08-30
                    呵呵,十楼说的好!赞个
                    微控网感谢您的参与
                    在线情况
                    12
                    • 头像
                    • 级别
                      • 积分9
                      • 经验139
                      • 文章14
                      • 注册2012-08-30
                      [FACE=宋体][SIZE=12px]我实验了下:在5438A中([/SIZE][/FACE][FACE=宋体][SIZE=12px]WDTCTL |= WDTPW + WDTCNTCL;  )[/SIZE][/FACE][FACE=宋体][SIZE=12px]这样喂狗怎么不行?[/SIZE][/FACE][P][FACE=宋体][SIZE=12px]只能用[/SIZE][/FACE][LINE-HEIGHT=21.60][FACE=宋体][BGCOLOR=rgb][SIZE=14px]WDTCTL = WDT_ARST_1000;来喂狗。[/SIZE][/BGCOLOR][/FACE][/LINE-HEIGHT][/P]
                      微控网感谢您的参与
                      Powered by LeadBBS 9.2 .
                      Page created in 0.1719 seconds with 6 queries.