共2条
1/1 1 跳转至页
int0,T0 大虾救命啊,我的int0和T0中断冲突了,怎么解决?

问
大虾救命啊,我的int0和T0中断冲突了,怎么解决?我的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: 没有调用同一个子程序,只是用了相同的一个变量这样可能会引起中断冲突!
一个是加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 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |