当前位置: 首页 >> 应用笔记 >>你选择的正文
 
看门狗的使用
                                                    
日期:04-04-2006  
 

 

    看门狗的作用是防止程序跑飞,在程序跑飞后,程序中将无法正常喂狗,导致看门狗溢出。溢出后,将会复位芯片。程序将会从零地址开始重新执行,也就是将已跑飞的程序,重新执行。
    由于高级语言编译器,编译代码时,将会在用户代码前,加入一段初始化代码,该初始化代码中包含了清RAM的代码。
    该段代码在程序从零地址开始后,将会在执行用户程序前被运行。
    看门狗复位后,有些用户希望变量的值能够保留为复位前的值。下边的例子就是一个根据复位的原因来决定,变量是否需要被赋初值。
    在讲解下边的例子前,先说明以下几点:

    1. 看门狗复位后,并不能保证变量的值仍然是正确的,因为不确定在程序跑飞后,是否有误操作该变量的动作。

    2. 单片机只要不掉电,RAM中的值就会丢失(变量的值就是被分配到RAM中的)。

    3. 使用$noramclear  语句后,程序中全局变量的初始值不再是0,而是一个随机值。该值决定于被分配的RAM上的值。如有需要,需在程序中给变量赋初值。

            '------------------------------------------------------------------------
            '使用芯片:  ATmega16,
            '晶振:      内部8MHz晶振
            'email:     support@avrbascom.com
            '软件版本:  Bascom-AVR 1.11.8.2 Full version
            '------------------------------------------------------------------------

          $regfile = "m16def.dat"
          $crystal = 8000000

          $noramclear                                                 '不初始化RAM,也就是不初始化全局变量

          Config Watchdog = 2048                                      '定义看门狗复位时间为2048 毫秒
          Start Watchdog
          Config Porta = Output
          Dim A As Byte


          If Mcucsr = &H01 Then                                       '判断是否为上电复位
          A = &HFF                                                  ???   '如果是,给A赋初值
          End If

          A = Not A
          Porta = A
          Do
          'Reset Watchdog
          Loop
          End

    程序下载到芯片中运行,您可以看到A口所接的LED会在大约2秒钟闪动一次,说明看门狗复位动作被执行。
    如除去Reset Watchdog的注释后,您可以发现LED就会停止闪烁。
    使用$noramclear语句后,程序中的变量不会被初始化为0。需程序中手动赋值,但这时需通过mcucsr寄存器来确定复位原因,决定是否执行赋值语句。
    如不使用$noramclear语句,不能在A口观察到led闪动,原因是每次程序开始运行前变量A都被清零。

    如将程序改为
          '------------------------------------------------------------------------
          '使用芯片:  ATmega16,
          '晶振:      内部8MHz晶振
          'mail:      support@avrbascom.com
          '软件版本:  Bascom-AVR 1.11.8.2 Full version
          '------------------------------------------------------------------------

          $regfile = "m16def.dat"
          $crystal = 8000000

          $noramclear                                                 '不初始化RAM,也就是不初始化全局变量

          Config Watchdog = 2048                                      'reset after 2048 mSec
          Start Watchdog
          Config Porta = Output
          Dim A As Byte
          Dim B As Byte


          If Mcucsr = &H01 Then                                       '判断是否为上电复位
          A = &HFF                                                    '如果是,给A赋初值
          End If

          If B = 30 Then
          Stop Watchdog
          End If

          Incr B
          A = Not A
          Porta = A
          Do
          Loop
          End

    看门狗复位30次后,就会关闭看门狗,A口的Led将不会再继续闪烁。