打印

求助:关于PIC16F873A的WDT溢出复位时的STATUS的TO状态位

[复制链接]
3249|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIZI330|  楼主 | 2010-4-17 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近写了一个程序,复位时根据是否是WDT溢出复位而采取不同的初始化程序.我实际测试的结果是:当WDT溢出复位时寄存器STATUS的TO位是1,而不是数据手册上的0.我用的是HiTech-PICC编译器.
以下是我的程序:

#include <htc.h>

__CONFIG(XT & WDTEN &  PWRTEN &  BOREN &  LVPDIS);

void main (void)
{
     _delay(1);

     if (POR && BOR && !TO && PD) { //是WDT溢出复位吗?
         CLRWDT();     //是,则执行看门狗指令使TO置1
         WDTResetInit();    //并执行初始化程序WDTResetInit()
    } else {      //非WDT溢出复位
         POR = 1;     //软件置位POR与BOR
         BOR = 1;
         CLRWDT();
         NonWDTResetInit();   //执行初始化程序NonWDTResetInit()
   }

   while(1); //等待WDT溢出
}

请大家帮我看下我的程序哪里出问题了,先谢谢大家了!
沙发
systemchip| | 2010-4-18 18:29 | 只看该作者
How can I use the TO and PD bits to determine the cause of reset on PIC devices?
Some PIC devices have TO and PD bits in the STATUS register that can be used to
determine the cause of a reset. However the state of these bits are soon overwritten
after the reset has occurred and program execution has resumed.

The --RUNTIME suboption "resetbits" can be used to preserve these bits, and the
entire STATUS register, in variables that can be examined later in your program. If you
are using MPLAB IDE, this option can be specified by enabling the Backup reset
condition flags checkbox in the Linker tab of the Build Options dialog.

For full details of the names and types of the variables used, check your compiler manual
in the section called Status Register Preservation.

--多看看PICC 的FQA,上面有很多有用的信息.
http://www.htsoft.com/support/faqs.php

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
XIZI330 + 1 我很赞同
板凳
XIZI330|  楼主 | 2010-4-19 08:44 | 只看该作者
本帖最后由 XIZI330 于 2010-4-19 09:35 编辑

你好,systemchip,非常感谢你的点拨!

我按照PICC手册上的说明,在源代码中添加了2行声明:
           extern bit __powerdown;
           extern bit __timeout;
并在编译选项里选中了"Backup reset condition flags"
修改后的代码示例如下:
/*
***********************************
#include <htc.h>
__CONFIG(XT & WDTEN &  PWRTEN &  BOREN &  LVPDIS);
extern bit __powerdown;
extern bit __timeout;

void main (void)
{
     _delay(1);
     if (POR && BOR && !__timeout && __powerdown) { //是WDT溢出复位吗?
         WDTResetInit();    //并执行初始化程序WDTResetInit()
     } else {      //非WDT溢出复位
         POR = 1;     //软件置位POR与BOR
         BOR = 1;
         NonWDTResetInit();   //执行初始化程序NonWDTResetInit()
    }
    CLRWDT();
    while(1); //等待WDT溢出
}
**************************************
*/
但是当我编译时出现了错误提示:symbol "___timeout" is defined more than once.... 两个位变量都出现了一样的错误提示.
这又是什么原因啊?还请你再指点我下,谢谢啦!

使用特权

评论回复
地板
systemchip| | 2010-4-19 09:24 | 只看该作者
看看有没有重复定义....

使用特权

评论回复
5
XIZI330|  楼主 | 2010-4-19 09:34 | 只看该作者
本帖最后由 XIZI330 于 2010-4-19 09:37 编辑

这两个位变量在我的程序中是没有用到的,我没有定义过他们,只是根据hi-tech c 的手册上的说明加了这两句声明语句,然后在程序中使用了它们.

使用特权

评论回复
6
XIZI330|  楼主 | 2010-4-19 13:35 | 只看该作者
暂时问题解决了,我使用了声明__resetbits的方法,同时定义了2个位变量,用来存放__resetbits中的对应的TO及PD位.具体如下:
/*
*****************************
extern unsigned char __resetbits;
bit _powerdown;
bit _timeout;
void main (void)
{
     _delay(1);
     _timeout        = (__resetbits & (1<<4)) >> 4;
     _powerdown         = (__resetbits & (1<<3)) >> 3;
     if (POR && BOR && !__timeout && __powerdown) { //是WDT溢出复位吗?
         WDTResetInit();    //并执行初始化程序WDTResetInit()
     } else {      //非WDT溢出复位
      POR = 1;     //软件置位POR与BOR
         BOR = 1;
         NonWDTResetInit();   //执行初始化程序NonWDTResetInit()
    }
    CLRWDT();
    while(1); //等待WDT溢出
}
*****************
*/

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝