共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |