首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]各位大侠,如何设置两个中断的优先级

[求助]各位大侠,如何设置两个中断的优先级

我用的是DG128,想同时使用RTI和ECT0口的上升沿捕捉的中断。将RTI关了,ECT0可正常响应。开了RTI,并在ECT0的中断子程序将CRGINT 置零,最后再将CRGINT 置一,可ECTO仍不响应。两者周期设的也应该合理。望版主和各位大侠指点小弟。

[此贴子已经被作者于2007-6-20 22:07:21编辑过]

把你的整个project打包贴出来看看吧。
海纳百川  有容乃大
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

static int AD[13],AD2[13],Position[2]={0,0};
static int Speed_set,Speed_dtct,Es[3],Test1,Test2,Test3,sp_e ;
static int Kp,Ki,Kd,crit_es,inc_mduty,del_dgree;
static short Mduty;

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 timer4speed(void){
TFLG1=1;
CRGINT =0X00; //屏蔽rti中断
if(TC0>TC0H) sp_e=TC0-TC0H;
else sp_e=65535-TC0H+TC0;
Speed_dtct = 625000/sp_e;
PORTB=128;
CRGINT =0X80; //开rti中断
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 rti(void){
Kp=5;Ki=1;Kd=5;crit_es=-2;del_dgree=20;
CRGFLG = 0X80; //清零
CRGINT =0X00; //屏蔽rti中断
//加中断子程序
Es[0]= Speed_set - Speed_dtct;
inc_mduty =(Kp*(Es[0]-Es[1])+ Ki*Es[0] + Kd*(Es[0] - 2*Es[1] + E[2]))/1000;

if(inc_mduty<=-40)inc_mduty=-60;
else if(inc_mduty>=40)inc_mduty=60;
Mduty=Mduty+inc_mduty;

if(Mduty>=0){
if(Mduty<=200)pwm2(Mduty);
else pwm2(200);
}
else {
Mduty=60;
pwm2(Mduty);
} //防止溢出

Es[2] = Es[1];
Es[1] = Es[0];

Test1=Es[0];
Test2=Mduty;
Test3=inc_mduty;

//CRTINT=0X80;
//子程序结束
}
void main(void) {
/* put your own code here */
init();

Speed_set=1500;
Mduty=60;
PWME=7; //PWM使能
TSCR1 = 0X80; //ECT总使能
CRGINT = 0X80; //RTI使能
EnableInterrupts;
for(;;) {
} /* wait forever */
}


版主,我在RTI的子程序中将开RTI的语句注释了,现在两中断能响应,但我怀疑其正确性。
我的RTI中断的目的就是定时,而ECT的目的是测速。请您指点。

[此贴子已经被作者于2007-6-21 10:39:04编辑过]

你设置了RTI周期吗?是多数?
海纳百川  有容乃大
spm_init(){
//INITIAL RTI BLOCK
CRGINT =0X00;
RTICTL = 0X94;
CRGFLG = 0X80;

//INITIAL SPEED MEASURE BLOCK
TCTL4 = 0X01;
TSCR2 = 0x07;
ICSYS_BUFEN=1;
ICSYS_LATQ =0;
DLYCT = 0x02;
TIE=1;
//CRGINT = 0X80;
}
还是把整个project打包上传吧,不要只贴出主程序。
海纳百川  有容乃大
版主,问题解决了。果然是RTI周期设错了。应该是设为0x49,我粗心设成0X94了。麻烦你了。非常感谢!!
返回列表