智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: 冷生
打印 上一主题 下一主题

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

[复制链接]

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
跳转到指定楼层
1#
发表于 2020-4-2 09:35:24 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冷生 于 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。。
请求大神指导一下




回复

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
2#
 楼主| 发表于 2020-4-2 11:20:49 | 显示全部楼层
优乐美 发表于 2020-4-2 09:55
XS128是个不错的单片机

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

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
3#
 楼主| 发表于 2020-4-2 13:47:50 | 显示全部楼层
本帖最后由 冷生 于 2020-4-2 13:53 编辑
cs538138 发表于 2020-4-2 13:03
XS128是个不错的单片机,就是太老了

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

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
4#
 楼主| 发表于 2020-4-2 22:25:39 | 显示全部楼层
本帖最后由 冷生 于 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已经是执行用户中断程序)
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
5#
 楼主| 发表于 2020-4-3 14:41:05 | 显示全部楼层
QQQDB 发表于 2020-4-3 11:05
中断应该得有优先级顺序的,如果两个中断同时触发且优先级一样,会有一个中断被顶掉。但如果优先级不同,假 ...

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

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

回复 支持 1 反对 0

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
6#
 楼主| 发表于 2020-4-17 13:17:31 | 显示全部楼层
zfyzfy 发表于 2020-4-4 08:06
把    TFLG1_C2F=1; //清中断标志位  改成TFLG1=0x04;
把    TFLG1_C6F=1; //清中断标志位  改成TFLG1=0x4 ...

感谢!   我回去就试试看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-6 07:40 , Processed in 0.099441 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表