打印

中断的冲突吗???

[复制链接]
2142|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rocchiu|  楼主 | 2007-1-31 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大虾们一问题:我用INT0下降沿中断来计数旋转编码器的脉冲数,T0的中断是定时5MS进行读AD转换数据和键盘扫描,现在如果把T0设置高优先级,那么INT0只中断一次,我再用手旋转那编码器程序就不执行了,显示也不显示了(液晶显示),如果正常的话,我想计数也会有丢失的.我设置INT0高优先级,也是一转那编码器程序就不显示了,看们够也复位了,但是看那计数变量居然在计数.怎么搞的呀,前辈们指点下,我这里谢了.

相关帖子

沙发
wzj4392234| | 2007-1-31 15:08 | 只看该作者

^_^

要不你不要在程序设置中断优先级看下
让他由硬件来确定

使用特权

评论回复
板凳
jt4117| | 2007-1-31 15:25 | 只看该作者

中断欠套要用堆栈保护变量值

使用特权

评论回复
地板
rocchiu|  楼主 | 2007-1-31 15:34 | 只看该作者

ai

关键的是不设置优先级也一样的

使用特权

评论回复
5
wzj4392234| | 2007-1-31 16:33 | 只看该作者

c还是汇编

你是用C语言编写还是用汇编写的程序
如果你用汇编写的话需要考虑中断嵌套保护变量值
如果你用C写的话用个using 1 using 2应该可以了,其他的C51编译器会给你弄好

使用特权

评论回复
6
conwh| | 2007-1-31 17:36 | 只看该作者

可能还是软件上的问题

使用特权

评论回复
7
rocchiu|  楼主 | 2007-2-1 08:28 | 只看该作者

用的是C

我用的是C语言,INT0用的是
void exint0(void) interrupt 0 using 0
{if(pulseB==1)
     {f_zhengzhuan=1;jishu++;}
 else
     {f_fanzhuan=1;jishu--;}
}
T0的中断程序是
void     timer0(void) interrupt 1 using 1            //set interrupt mode
{

uchar code_h;
uchar code_l;
uchar k;
uchar i;
TH0=0xdf;
TL0=0x73;
/******************************************/
_nop_();
_SCLK=0;
_SDI=0;
_CS=0;
if(_SDO==1) goto NEXT0;//等待转换结束

_nop_();

for(i=0;i<8;i++)//8个清串口时钟
{_SCLK=1;
_nop_();
_SCLK=0;
}

for(i=0;i<32;i++)
  {data_ad<<=1;
   _SCLK=1;
   if(_SDO)
   data_ad|=0x01;
   _nop_();
   _SCLK=0;
   _nop_();
  }
  /***************************************/
  data_ad=data_ad>>8;
  if((data_ad&0x00800000)==0x00800000)
              { data_ad=~data_ad;
              data_ad=data_ad&0x00ffffff;
               data_ad=0-data_ad;}
  Data_Filter[m]=data_ad;
  //Data_Filter[m]=Data_Filter[m]>>8;
    m++;
    if(m>9) m=0;
    V0=0;
    for(k=0;k<10;k++)
    V0=V0+Data_Filter[k];
   V0=V0/10;
   tmp3=V0;
 /************************/
NEXT0:
P2=0xF0;
if((P2&0xF0)!=0xF0)
{
  if(f_shake==1)
  {
    f_shake=0;
        return;
  }
  if((P2&0xF0)!=0xF0)
  {
    code_h=0xFE;
        while((code_h&0x10)!=0)
         {
        P2=code_h;
              if((P2&0xF0)!=0xF0)
           {
            code_l=(P2&0xF0|0x0F);
               keycode=((~code_h)+(~code_l));
            f_shake=1;
            }
        else
          code_h=(code_h<<1)|0x01;
        }
   }
}
}
不论优先级怎么的设置我的中断都不能很好的工作,好象有冲突,如果我用一个中断就能很好的工作,没有问题的,前辈们,帮我看看,我错在哪呀?谢谢!

使用特权

评论回复
8
wzj4392234| | 2007-2-1 09:08 | 只看该作者

goto可能有问题

你把goto去掉,接别的跳转语句看行不行,C51一般不用goto

使用特权

评论回复
9
berg| | 2007-2-1 09:25 | 只看该作者

RE

手动清除中断标志位。

使用特权

评论回复
10
szzhengjin| | 2007-2-1 16:21 | 只看该作者

C语言中断里声明变量,90%出问题

中断内的临时变量会重用于外部其它函数的临时变量空间内,你想一下结果会怎么样,

你把那几个变量定义为全局后看看

使用特权

评论回复
11
甄蔡组合| | 2007-2-1 18:51 | 只看该作者

小小的建议

9楼说的对你的TF位一定要软件清0 否则总是溢出中断。你的中断程序太乱了,这样会浪费很多时间。在变程是不要用goto语句 ,我以前也用过很容易出错。

前几天我也在用中断嵌套 不用设中断优先级 51会自己默认,除非是处理很重要的事情。例如 急停什么的。 

使用特权

评论回复
12
rocchiu|  楼主 | 2007-2-3 08:21 | 只看该作者

非常感谢大家

非常感谢大家的帮助,我来按照你们说的改改,如果有新的意见,希望大家继续说出来,谢谢

使用特权

评论回复
13
rocchiu|  楼主 | 2007-2-3 09:51 | 只看该作者

T0中断已该

我的T0中断现在已改,只是键盘的扫描
void     timer0(void) interrupt 1 using 1            //set interrupt mode
{

 uchar code_h;
 uchar code_l;

 TH0=0xfe;
 TL0=0x0b;


 P2=0xF0;
 if((P2&0xF0)!=0xF0)
 {
  if(f_shake==1)
  {
    f_shake=0;
        return;
  }
  if((P2&0xF0)!=0xF0)
  {
    code_h=0xFE;
        while((code_h&0x10)!=0)
         {
        P2=code_h;
              if((P2&0xF0)!=0xF0)
           {
            code_l=(P2&0xF0|0x0F);
               keycode=((~code_h)+(~code_l));
            f_shake=1;
            }
         else
          code_h=(code_h<<1)|0x01;
        }
   }
 }
}
我在编码器计数的外部中断0的最后设置一断点,程序运行的时候我旋转编码器,进入中断0,继续运行,再旋转又进入中断0,再继续....,也就是说我在外部中断0设置断点的时候,运行程序,旋转编码器,程序运行正确,也能正确的计数,但是我把断点取消掉,运行程序的时候,我旋转编码器,程序就乱了,老是复位,当复位几次后,我再旋转编码器,发现不复位了,显示正常,我以为程序正常了,谁知道来看看中断0里的计数变量,发现其为0,也就是说没有发生外部中断0,怎么搞的呢

使用特权

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

本版积分规则

18

主题

37

帖子

0

粉丝