这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » int0,T0 大虾救命啊,我的int0和T0中断冲突了,怎么解决?

共2条 1/1 1 跳转至

int0,T0 大虾救命啊,我的int0和T0中断冲突了,怎么解决?

院士
2006-09-17 18:14:16     打赏
int0,T0 大虾救命啊,我的int0和T0中断冲突了,怎么解决?



关键词: 大虾     救命     我的     中断     冲突     怎么     解决    

院士
2006-12-22 22:43:00     打赏
2楼
问 大虾救命啊,我的int0T0中断冲突了,怎么解决?我的int0中断是大约100HZ的信号,TO是50HZ的定时中断,系统上电后,运行一会就会不工作了,中断都不执行了,我郁闷啊,我现在毛病都不知道在那里找,怎么解决,请大虾们,给点指点,在线等待,可以联系我的QQ:32181260 1: 这样试试想办法让你的中断处理程序短到不能再短!另外,中断可以设置优先级。 2: 还是不行优先级我也设置了,中断要保证实时采集,统计数据,所以不好弄短时间, 3: 呵呵,先把一个中断解决好 4: 频率比较低,应该不难解决的 5: 一个中断的时候是好的,2个一起开,就出问题了 6: 20ms定时中断你都做了些什么?是否两个中断处理程序里数据没有保护好? 7: 20MS做的是高精度数据运算20MS做的是高精度数据运算,long int adc 数据运算,
一个是加adc=adc+adc_get,一个是除法adc=adc/10;
我用keilc写的程序,看到汇编代码把寄存器组0,A,B,PSW,DPTR,SP入栈出栈了,其他的倒是没有什么,
int0 中断是采集AD转换器的值的,在定时中断里面求10次平均值,并得到需要的数据,好郁闷,有的机器可以工作,有的不可以工作,真是郁闷,程序都是一样的程序,板子也是一样,怪死了, 8: 试试把计算移到int0中断处理程序里看看你的adc既在20ms中断里用又在int0中断里用,这可能会有问题
9: 把单片机的工作频率抬高试试。可以把单片机的工作频率抬高试试。
还有,两个中断中是否调用了同一段子程序? 10: 没有调用同一个子程序,只是用了相同的一个变量没有调用同一个子程序,只是用了相同的一个全局变量来传递AD采样的结果,
也是signed long in型的变量,代会我把子程序发上来,大家看看 11: 才100Hz+50Hz也喊救命?! 12: 我现在把程序粘贴上,希望大家给我分析一下,看问题出在那里?我现在把程序粘贴上,希望大家给我分析一下,看问题出在那里?
///////////////////////////////////////////////////////
void cs5513_adc( ) interrupt 0
{
static  unsigned char i;//
  EA=0;

if(i>4){
           cs=0;
           clk=0;
           dout=1;
           adcreg83=0;
  if(dout==0){
      for(i=0;i<24;i++){
                adcreg83=adcreg83<<1;         
//                clk=1;      //时钟的上升沿可以读数据
        clk=1;      //时钟的上升沿可以读数据
        clk=1;      //时钟的上升沿可以读数据

                adcreg83=adcreg83|dout;

                if(i==4){if(dout==1)fuhao1=1;
                         else fuhao1=0;
                         }
//                clk=0;//时钟的下降沿把数据送出
                clk=0;//时钟的下降沿把数据送出
                clk=0;//时钟的下降沿把数据送出
                //if(i<23)ad=ad<<1;
                       }
         }

     cs=0;

    if(fuhao1==1)adcreg83=adcreg83|0xfff00000;            
    else adcreg83=adcreg83&0x0fffff;
        jingdu_buf=adcreg83;//1688;//adcreg83;
         i=0;
         led5513=~led5513;
              }
     i++;
     EA=1;
}//本中断程序里面的数据是long int idata 类型
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
void int_t0(void) interrupt 1//31 //display system variy
{   //EA=0;
    
    TR0=0;
        TH0=0xa6;TL0=0x00;//0.025s @11.0592MHZ osc
        ledt0=~ledt0;
    TR0=1;
           clear_dog();//
                    adcbuf=adcbuf+jingdu_buf;//采集压力;
                    
      if(lm331==8){
                       adcbuf=adcbuf/8;
                       adcreg1=adcbuf;
             adcbuf=0;
                       ledda=~ledda;
                     //////////////////////////////////////////////////////////////////////
                     if(speed_counter==5){//加荷速度的计算
                                          adcreg2=adcreg1-jieguo2;
                                          jieguo2=adcreg1;                                    speed_counter=0;
                                          }
                     speed_counter++;
///////////////////////////////////////////////////////////
         lm331=0;
         if(bei_guang_on)xxlvwei[1]=0;
    if(bei_guang){xxlvwei[1]++;lcd_on_off=0;}//背光控制
  if(xxlvwei[1]>3000){xxlvwei[1]ei_guang=0;bei_guang_on=0;}//背光控制
                    }
                     lm331++;
       if(buzzer==1){buzzerr=1;
                    lm31++;
                    bei_guang=1;//背光控制
                    xxlvwei[1]=0;//背光控制
                    if(lm31==5){lm31=0;buzzerr=0;buzzer=0;}
                   }
    EA=1;
    }
/////////////////////////////////////////////////// 13: 不一定要在中断中干的活拿到主程中进行比如背光延时等,没必要那么精确。发生中断时只设一个标致后退出,主程根据此标致进行处理过程。 14: 我看了编译的代码,是不超过中断益出时间的我看了编译的代码,是不超过中断益出时间的,为什么会中断冲突呢?
为什么一些电路板是好的,一些就不行了呢? 15: 楼上的大虾,可否留一下联系方式,我电话垂询 16: 没有调用同一个子程序,只是用了相同的一个变量这样可能会引起中断冲突!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]