打印
[PIC®/AVR®/dsPIC®产品]

PIC12/14/16看门狗复位及掉电复位标志nTO、nPD的读取

[复制链接]
1569|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ailingg|  楼主 | 2017-12-3 16:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ailingg 于 2017-12-3 17:20 编辑

      最近调试看门狗复位,根据数据手册上复位标志的定义读取看门狗复位标志nTO,发现始终为1。翻遍数据手册都是说WDT复位时nTO为0,
没有其他特别提到的使用条件,但在main函数读取始终为1,网络搜索缘由也无果。
      后来调试时查看汇编,WDT复位后nTO确实为0,但进入main函数之前执行了“CLRWDT”语句,致使进入main函数后nTO复位为1。问题
找到,只要在进入main函数前读取status即可,只是在C编程中无从着手,要到startup.as中进行汇编处理。最怕汇编了,在XC8编译器用户
指南中搜索“reset”,找到了相关问题阐述,原来人家早有了处理,也不知道说是自己学的肤浅还是这个小问题藏的挺深。

   


     

     
       所谓的使能resetbits子选项,就是下图的红框所示,还挺不好找。

         

  变量声明也不是XC8用户指南里说的那样,在pic.h末尾已经声明,如下,
        /* The below reflect the state of TO and PD, respectively, which would otherwise
   be trashed by startup code. */

   extern __bank0 unsigned char __resetbits;
   extern __bank0 __bit __powerdown;
   extern __bank0 __bit __timeout;

  在startup.as中的处理,如下,

         psect    init
start

    ; Save the TO, PD bit states before they are cleared by clrwdt instruction
    global    ___resetbits
    global    ___powerdown
    global    ___timeout
    ___resetbits    equ    32
    ___powerdown    equ    (___resetbits*8)+3
    ___timeout    equ    (___resetbits*8)+4
    clrf    STATUS        ;select bank 0
    movf STATUS,w
    movwf ___resetbits
    psect    end_init
    global start_initialization
    ljmp start_initialization    ;jump to C runtime clear & initialization

沙发
ailingg|  楼主 | 2017-12-3 17:09 | 只看该作者
本帖最后由 ailingg 于 2017-12-3 17:11 编辑

  可以正常读取status的 nTO位了   

   /* 看门狗复位  */
    if( !( __resetbits & _STATUS_nTO_MASK ) && ( __resetbits & _STATUS_nPD_MASK ) )
    {
        
        #if defined _16F73
            ADCON1 = 0x06;                     /* configure all pins of PORTA as digital inputs  */
        #elif defined _16F723 || __16F723A
            ANSELA = 0;                        /* PORTA 所有引脚设置为数字端口  */
            ANSELB = 0;                        /* PORTB 所有引脚设置为数字端口  */
            OSCCONbits.IRCF = 3;               /* 内部振荡器 16.0M  */
        #endif

        PORTA = 0x00;
        PORTB = 0x00;
        PORTC = 0x00;        
        
        TRISA = 0x00;                          /* set RA<7:0> as outputs  */
        TRISC = 0x00;
        #if DEV_VACUUM_MACHINE == 400
            TRISB = 0xf0;
        #elif DEV_VACUUM_MACHINE == 260
            TRISB = 0xe0;
        #endif
        OPTION_REGbits.PSA = 1;               /* 预分频器分配给WDT  */
        CLRWDT();
        OPTION_REGbits.PS = 6;                /* 预分频比为 1:64  */
        Timer2_Init( );
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

167

帖子

2

粉丝