智能车制作

标题: 【问题】9S12XS的ECT模块,两个中断同时其中一个被忽略。什么情况 [打印本页]

作者: 冷生    时间: 2020-4-2 09:35
标题: 【问题】9S12XS的ECT模块,两个中断同时其中一个被忽略。什么情况
本帖最后由 冷生 于 2020-4-2 09:38 编辑

9S12XS的ECT做了一个通道输入捕捉,另一个通道输出比较。。
分开都是没问题,同时也问题不大。。但是信号到了某些频率时,就开始其中一个中断不执行。
后来测试:做了两个输出比较,给同样的TC寄存器值,应该是同时触发中断,结果又总是一个执行一个不执行(中断号靠前的执行 靠后的直接不执行)。。。
理论上中断应该是一个执行,另一个等着第一个中断完了就开始。。我遇到这个情况很诡异啊?
有没有大神遇到过的?求指教
ECT初始化:(初始化中未开输出比较的中断,在输入捕捉中根据需要,对C赋值和开对应通道中断)
void ECT0_Init(void)             {           
  PPST_PPST0 = 0;                //set pull-up
  PERT_PERT0 = 1;                //enable pull-up
  DDRT_DDRT0 = 0;                //PT0 as input
  DDRT_DDRT1 = 1;
  DDRT_DDRT2 = 1;
  DDRT_DDRT6 = 1;

  TSCR1=0x88;                   //使能定时器 使用精确分频               
  PTPSR=31;                     //精确分频 32 80/32=2.5mhz ,TSCR2分频无效

  TIOS_IOS0=0;                  //通道0为输入捕捉 ch0 IC
  
  TIOS_IOS2=1;                  //ch2 fuc:输出比较
  TIOS_IOS6=1;                  //ch6 fuc:输出比较
  OCPD=0xFf;

  TCTL4=0x01;                   //IC0捕捉上升沿
  TIE_C0I=1;                    //通道0输入捕捉中断允许
  TSCR2=0x86;                   //b7:允许溢出中断,分频系数64
}

对应输出比较的通道中断:
void interrupt 10 Timer2_Output_C(void)
{    Testcount++;       
      TIE_C2I=0;     //dissable the OC2
      TFLG1_C2F=1;//清中断标志位
}
//#pragma CODE_SEG DEFAULT
void interrupt 14 Timer6_Output_C(void)
{      Testcount--;      
      TIE_C6I=0;     //dissable the OC6
      TFLG1_C6F=1; //清中断标志位
}

理论上,同时开启2/6两个通道的输出比较,给TC寄存器一样的值,两个中断会同时触发,然后先后执行。最后Testcount值应该是定值不变。
实际试验发现testcount一直在增加,相当于第二个中断没有进入过。
但是如果给TC寄存器赋不一样的值,这个testcount值就能保持不变。。。
这种类似的中断的冲突,有没有大神遇到过T_T。。
请求大神指导一下





作者: 优乐美    时间: 2020-4-2 09:55
XS128是个不错的单片机
作者: 冷生    时间: 2020-4-2 11:20
优乐美 发表于 2020-4-2 09:55
XS128是个不错的单片机

是挺好的,就是个别时候遇到一些奇葩情况。。。。 其他型号又不了解,没办法随便换

作者: cs538138    时间: 2020-4-2 13:03
XS128是个不错的单片机,就是太老了
作者: 冷生    时间: 2020-4-2 13:47
本帖最后由 冷生 于 2020-4-2 13:53 编辑
cs538138 发表于 2020-4-2 13:03
XS128是个不错的单片机,就是太老了

啊  尴尬 是的是的。。十几年前用的,没有与时俱进 惭愧惭愧。。
看看有没有大神 依稀记得小时候遇到过类似情况

作者: aytc100    时间: 2020-4-2 18:02
这俩中断是同一个中断入口吧。进去之后再做判断到底是哪个中断发生了。所以两个中断同时发生的时候,处理完中断号靠前的中断函数后,会同时清理中断号靠后的中断函数标志位。
所以你要么换个中断方式,要么进入中断后同时读取两个中断标志位,再依次执行中断函数试试
作者: 冷生    时间: 2020-4-2 22:25
本帖最后由 冷生 于 2020-4-2 22:33 编辑
aytc100 发表于 2020-4-2 18:02
这俩中断是同一个中断入口吧。进去之后再做判断到底是哪个中断发生了。所以两个中断同时发生的时候,处理完 ...


多谢!版主 看了你的说法,就去看了数据表。确实像是类似你说的这样的情况。(另外也测试了换了IRQ中断代替其中一个中断,让他们遇上一起时候,也还是会偶然冲突)
161页 中断的章节有2段。
A CPU interrupt vector is not supplied until the CPU requests it. Therefore, it is possible that a higher
priority interrupt request could override the original exception which caused the CPU to request the vector.
In this case, the CPU will receive the highest priority vector and the system will process this exception
instead of the original request.
If the interrupt source is unknown (for example, in the case where an interrupt request becomes inactive
after the interrupt has been recognized, but prior to the vector request), the vector address supplied to the
CPU will default to that of the spurious interrupt vector.

NOTE
Care must be taken to ensure that all exception requests remain active until
the system begins execution of the applicable service routine; otherwise, the
exception request may not get processed at all or the result may be a
spurious interrupt request (vector at address (vector base + 0x0010)).

意思好像就是两个中断来的很近,有可能一个中断被inactive了,但是还没来得及执行,另一个中断过来然后把它顶替了。
他也建议一定要注意执行中断完之前要保持active  。。
如果理解是这个意思的话,我再想想其他办法看看
不知道这个Inactive 的动作是哪里操作的,应该不是在中断程序里的清零flag(因为清FLAG已经是执行用户中断程序)

作者: QQQDB    时间: 2020-4-3 11:05
中断应该得有优先级顺序的,如果两个中断同时触发且优先级一样,会有一个中断被顶掉。但如果优先级不同,假设现在正在执行中断1,当中断2触发后会先停止中断1,运行中断2,等到中断2运行结束再回到中断1停止位置,继续执行中断1
作者: 冷生    时间: 2020-4-3 14:41
QQQDB 发表于 2020-4-3 11:05
中断应该得有优先级顺序的,如果两个中断同时触发且优先级一样,会有一个中断被顶掉。但如果优先级不同,假 ...

是的。初始状态下,这些可屏蔽中断优先级同为1级,提高了其中一个或两个优先级(分别设置不同级别)之后,这个被提升最高中断看起来没有被打消失了,不过偶尔另一个比他低的中断还是会被打消失。

最后采取了折中办法:
1 优先保证一个重要中断优先级高一些(假设为A),不至于被打消失;
2 在这个优先的A中断里加入对其他中断(假设为B们)动作时间点的确认语句,A发生时,如时机也适合B们触发(可能被打消失的范围内),则强制执行B们里的指令;
验证结果,暂没有看到中断的缺失导致的丢失任务了。
但这个方法感觉还是比较LOW,临时对应一下。如果有大神有好的办法(比如其他单片机的高级功能),也欢迎给分享一下
。感谢


作者: QQQDB    时间: 2020-4-3 15:00
冷生 发表于 2020-4-3 14:41
是的。初始状态下,这些可屏蔽中断优先级同为1级,提高了其中一个或两个优先级(分别设置不同级别)之后 ...

正常情况下,如果两个中断均为定时器中断,只要这两个定时器中断的时间间隔能够使中断内的语句被执行完,是不会被顶掉的。如果设置了优先级仍然偶尔会被顶掉,建议延长其中某一个中断的中断触发时间。

作者: zfyzfy    时间: 2020-4-4 07:56
楼主试一下 把这句  TFLG1_C2F=1;//清中断标志位  改成TFLG1=0x04;
作者: zfyzfy    时间: 2020-4-4 07:58
楼主试一下把  TFLG1_C2F=1;//清中断标志位 改成TFLG1=0x04;    把TFLG1_C6F=1; //清中断标志位   这句改成TFLG1=0x40;试试
作者: zfyzfy    时间: 2020-4-4 08:01
楼主试一下把  TFLG1_C2F=1;//清中断标志位  改成 TFLG1=0x04;
把TFLG1_C6F=1; //清中断标志位  这句改成  TFLG1=0x40;
试试
作者: zfyzfy    时间: 2020-4-4 08:06
本帖最后由 zfyzfy 于 2020-4-4 08:11 编辑

把    TFLG1_C2F=1; //清中断标志位  改成TFLG1=0x04;
把    TFLG1_C6F=1; //清中断标志位  改成TFLG1=0x40;
这两个中断共用一个寄存器,会产生冲突,我之前用PIT开两个中断也出现过类似的情况

作者: 冷生    时间: 2020-4-17 13:17
zfyzfy 发表于 2020-4-4 08:06
把    TFLG1_C2F=1; //清中断标志位  改成TFLG1=0x04;
把    TFLG1_C6F=1; //清中断标志位  改成TFLG1=0x4 ...

感谢!   我回去就试试看




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2