智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 12637|回复: 14
打印 上一主题 下一主题

[其他] 【问题】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 小时
推荐
 楼主| 发表于 2020-4-3 14:41:05 | 只看该作者
QQQDB 发表于 2020-4-3 11:05
中断应该得有优先级顺序的,如果两个中断同时触发且优先级一样,会有一个中断被顶掉。但如果优先级不同,假 ...

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

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

回复 支持 1 反对 0

使用道具 举报

13

主题

96

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2964
QQ
威望
1586
贡献
1092
兑换币
1048
注册时间
2014-4-9
在线时间
143 小时
毕业学校
山达电子工作室
2#
发表于 2020-4-2 09:55:55 | 只看该作者
XS128是个不错的单片机
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

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

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

使用道具 举报

3

主题

346

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7322

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章

威望
3769
贡献
2657
兑换币
2483
注册时间
2016-5-3
在线时间
448 小时
4#
发表于 2020-4-2 13:03:03 | 只看该作者
XS128是个不错的单片机,就是太老了
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

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

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

使用道具 举报

56

主题

4914

帖子

3

精华

顶级版主

北京科技大学智能汽车队公共主页管理员

Rank: 11Rank: 11Rank: 11Rank: 11

积分
56131

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
19568
贡献
13933
兑换币
3365
注册时间
2010-7-22
在线时间
11315 小时
6#
发表于 2020-4-2 18:02:05 | 只看该作者
这俩中断是同一个中断入口吧。进去之后再做判断到底是哪个中断发生了。所以两个中断同时发生的时候,处理完中断号靠前的中断函数后,会同时清理中断号靠后的中断函数标志位。
所以你要么换个中断方式,要么进入中断后同时读取两个中断标志位,再依次执行中断函数试试
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
34
威望
24
贡献
10
兑换币
12
注册时间
2020-4-2
在线时间
0 小时
7#
 楼主| 发表于 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已经是执行用户中断程序)
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
威望
202
贡献
117
兑换币
132
注册时间
2020-3-11
在线时间
0 小时
8#
发表于 2020-4-3 11:05:34 | 只看该作者
中断应该得有优先级顺序的,如果两个中断同时触发且优先级一样,会有一个中断被顶掉。但如果优先级不同,假设现在正在执行中断1,当中断2触发后会先停止中断1,运行中断2,等到中断2运行结束再回到中断1停止位置,继续执行中断1
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
威望
202
贡献
117
兑换币
132
注册时间
2020-3-11
在线时间
0 小时
10#
发表于 2020-4-3 15:00:44 | 只看该作者
冷生 发表于 2020-4-3 14:41
是的。初始状态下,这些可屏蔽中断优先级同为1级,提高了其中一个或两个优先级(分别设置不同级别)之后 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 19:44 , Processed in 0.056200 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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