打印

中断中调用函数,if语句的怪问题

[复制链接]
3591|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
潘红民|  楼主 | 2007-9-27 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断中调用一函数,
语名,减到0不再往向减,事实上>0的判断不起作用.一直执行--操作.
    if ( (SignalFilterTimer.B0_TimerOFF>0) )
          SignalFilterTimer.B0_TimerOFF--;

注:编译器为HI-TECHPICC-18pro9.61inpicc18.exe(demo)不知正版软件能否解决这个问题.


void SignalFilterTimerDec(void)
{

    if ( (SignalScanStatus.Bits.B0 == SCAN_FILTER_EN)&&(SignalFilterTimer.B0_TimerON>0) )
          SignalFilterTimer.B0_TimerON--;
          
    if ( (SignalFilterTimer.B0_TimerOFF>0) )
          SignalFilterTimer.B0_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B1 == SCAN_FILTER_EN)&&(SignalFilterTimer.B1_TimerON>0) )
          SignalFilterTimer.B1_TimerON--; 
          
    if (  SignalFilterTimer.B1_TimerOFF>0)
          SignalFilterTimer.B1_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B2 == SCAN_FILTER_EN)&&(SignalFilterTimer.B2_TimerON>0) )
          SignalFilterTimer.B2_TimerON--;
          
    if (  SignalFilterTimer.B2_TimerOFF>0)
          SignalFilterTimer.B2_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B3 == SCAN_FILTER_EN)&&(SignalFilterTimer.B3_TimerON>0) )
          SignalFilterTimer.B3_TimerON--;
          
    if (  SignalFilterTimer.B3_TimerOFF>0)
          SignalFilterTimer.B3_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B4 == SCAN_FILTER_EN)&&(SignalFilterTimer.B4_TimerON>0) )
          SignalFilterTimer.B4_TimerON--;
          
    if (  SignalFilterTimer.B4_TimerOFF>0)
          SignalFilterTimer.B4_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B5 == SCAN_FILTER_EN)&&(SignalFilterTimer.B5_TimerON>0) ) 
          SignalFilterTimer.B5_TimerON--;
          
    if (  SignalFilterTimer.B5_TimerOFF>0)
          SignalFilterTimer.B5_TimerOFF--;
          
          
          
    if ( (SignalScanStatus.Bits.B6 == SCAN_FILTER_EN)&&(SignalFilterTimer.B6_TimerON>0) )
          SignalFilterTimer.B6_TimerON--;
          
    if (  SignalFilterTimer.B6_TimerOFF>0)
          SignalFilterTimer.B6_TimerOFF--;
          
    if ( (SignalScanStatus.Bits.B7 == SCAN_FILTER_EN)&&(SignalFilterTimer.B7_TimerON>0) )
            SignalFilterTimer.B7_TimerON--;
            
    if ( SignalFilterTimer.B7_TimerOFF>0)    
        SignalFilterTimer.B7_TimerOFF--;




}
沙发
潘红民|  楼主 | 2007-9-27 16:13 | 只看该作者

如果将程序函数放在main中调用一切正常

好像问题就出在中断中,

使用特权

评论回复
板凳
潘红民|  楼主 | 2007-9-27 16:46 | 只看该作者

W寄存器我看它为0还能执行aca6语句

  AC9E    0100     MOVLB 0
  ACA0    5184     MOVF 0x84, W, BANKED
  ACA2    1183     IORWF 0x83, W, BANKED
  ACA4    E003     BZ 0xacac
108:                         SignalFilterTimer.B0_TimerOFF--;
  ACA6    0783     DECF 0x83, F, BANKED
  ACA8    A0D8     BTFSS 0xfd8, 0, ACCESS
  ACAA    0784     DECF 0x84, F, BANKED

使用特权

评论回复
地板
兰天白云| | 2007-9-29 15:51 | 只看该作者

如果=0 到0xACAC, 不执行aca6语句

  AC9E    0100     MOVLB 0
  ACA0    5184     MOVF 0x84, W, BANKED
  ACA2    1183     IORWF 0x83, W, BANKED
  ACA4    E003     BZ 0xacac

如果=0 到0xACAC, 不执行aca6语句

使用特权

评论回复
5
machunshui| | 2007-10-1 21:01 | 只看该作者

用仿真器看

SignalFilterTimer.B0_TimerOFF还在什么地方被赋值?????
仔细检查,
不要轻易怀疑编译器.

使用特权

评论回复
6
judge| | 2007-10-6 19:27 | 只看该作者

可能是INT类型吧。有可能会出问题,作者没有注意了。

使用特权

评论回复
7
computer00| | 2007-10-6 19:32 | 只看该作者

加volatile试试

使用特权

评论回复
8
zgl7903| | 2007-10-6 21:45 | 只看该作者

软件调一下阿

SignalFilterTimer.B0_TimerOFF = 0; //设置个不成立的条件,看看是否还会减
if ( SignalFilterTimer.B0_TimerOFF > 0 )
  SignalFilterTimer.B0_TimerOFF--;

个人认为是在中断外其它地方也访问到了这个值,把其它地方的操作先屏蔽掉看看,如果非得在中断和中断外都要访问这个值,应该在中断外访问这个值前关中断,操作完后恢复中断,以避免数据的共享冲突。

使用特权

评论回复
9
zhaoyu2005| | 2007-10-7 10:33 | 只看该作者

根据描述,明显就是有别的地方修改这个值了,导致条件一

还是找一下程序里的毛病吧,怀疑人家编译器,你还不够资格,人家的软件不是一个人写的,并且是经过验证的

使用特权

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

本版积分规则

4

主题

25

帖子

1

粉丝