请教MC9S12DG128B的中断优先问题

[复制链接]
5450|16
 楼主| yetboy 发表于 2007-6-27 11:52 | 显示全部楼层 |阅读模式
我用了PT0-PT3测量脉冲,单个测量都没问题。但假如4个脉冲一起来时,就只有PT0能进入中断了。其它的均没反应。<br /><br />我在网上看到一些资料,里面提到默认状态下,进入了中断,I位自动置1,禁止了其他可屏蔽中断。所以我在每段中服程序里面都加了EnableInterrupts。但仍然没有效果,不知道是不是漏了哪里。希望各位指点一下。<br />
张明峰 发表于 2007-6-27 19:36 | 显示全部楼层

你是怎么测量脉冲的?

如果用TIM模块,则每一路输入都有各自的中断标志,中断处理应该不会遗漏。
 楼主| yetboy 发表于 2007-6-28 14:44 | 显示全部楼层

不行哦

就是用了TIM模块,我专门做过实验,当一个信号同时输到几个通道时,就只能有一个通道有中断。我用的是PT0-PT4,只有PT0能产生中断。
张明峰 发表于 2007-6-28 16:02 | 显示全部楼层

TIM中断处理

如果你用的是IOC0-4通道(PT0-4引脚)的输入捕捉功能测量脉冲,则尝试:<br />1)TSCR1寄存器的TFFCA位“置1”,使用中断标志快速清除方法。<br />2)在各通道的中断服务程序中不要去读写中断标志寄存器T**1<br />3)只在中断服务程序中读通道数据寄存器TCx(16位),只要读了这个寄存器,对应通道的中断标志将自动清除。
 楼主| yetboy 发表于 2007-6-29 17:32 | 显示全部楼层

晕了

TFFCA置1好像没什么效果,只要不清T**1位,就不断地进入中断。唯有先扫描查询各个口的方法凑合着用先了。
张明峰 发表于 2007-7-3 20:54 | 显示全部楼层

说不通

我验证过多通道比较输出时的中断处理,软件清除某一位中断标志的方法肯定不行(寄存器“读-修改-写”的问题)。通过使能T**1间接清除中断标志是唯一可行的办法。
 楼主| yetboy 发表于 2007-7-20 11:36 | 显示全部楼层

前段时间忙其它去了,现在把这段程序贴出来,让大家看看

#include&nbsp;&lthidef.h&gt<br />#include&nbsp;&ltstring.h&gt&nbsp;&nbsp;<br />#include&nbsp;&ltmc9s12dg128.h&gt<br />#pragma&nbsp;LINK_INFO&nbsp;DERIVATIVE&nbsp;&quot;mc9s12dg128b&quot;<br /><br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;8&nbsp;void&nbsp;TIME0_ISR(void){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T**1_C0F&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清标志位<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB_BIT0&nbsp;=&nbsp;!PORTB_BIT0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTB口相应的位取反,上升下降沿均取反<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;9&nbsp;void&nbsp;TIME1_ISR(void){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T**1_C1F&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB_BIT1&nbsp;=&nbsp;!PORTB_BIT1;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />}<br /><br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;10&nbsp;void&nbsp;TIME2_ISR(void){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T**1_C2F&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB_BIT2&nbsp;=&nbsp;!PORTB_BIT2;<br /><br />}<br /><br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;11&nbsp;void&nbsp;TIME3_ISR(void){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T**1_C3F&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB_BIT3&nbsp;=&nbsp;!PORTB_BIT3;<br /><br />}<br /><br />static&nbsp;void&nbsp;TIMERInit(void)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TIE&nbsp;=&nbsp;0X0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启用中断<br />&nbsp;&nbsp;&nbsp;&nbsp;TSCR2&nbsp;=&nbsp;0X02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//4分频得到2M时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;TIOS&nbsp;=&nbsp;0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置输入通道<br />&nbsp;&nbsp;&nbsp;&nbsp;TSCR1&nbsp;=&nbsp;0X80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开计时器<br />&nbsp;&nbsp;&nbsp;&nbsp;TCTL4&nbsp;=&nbsp;0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0,1,2,3通道捕捉上升,下降沿<br />&nbsp;&nbsp;&nbsp;&nbsp;T**1&nbsp;=&nbsp;0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清标志位<br /><br />}<br /><br /><br />void&nbsp;main(void)&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;DDRB&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;PORTB&nbsp;=&nbsp;0x00;<br /><br />&nbsp;&nbsp;TIMERInit();<br />&nbsp;&nbsp;INTCR_IRQEN&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;EnableInterrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />}
 楼主| yetboy 发表于 2007-7-20 11:40 | 显示全部楼层

以上程序各位有兴趣可以验证一下

置于张教主说的间接清除中断标志T**1,具体操作不太明白,希望指点迷津。
张明峰 发表于 2007-7-20 16:09 | 显示全部楼层

5楼时根本就没有照4楼说的改

static&nbsp;void&nbsp;TIMERInit(void)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TIE&nbsp;=&nbsp;0X0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启用中断<br />&nbsp;&nbsp;&nbsp;&nbsp;TSCR2&nbsp;=&nbsp;0X02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//4分频得到2M时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;TIOS&nbsp;=&nbsp;0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置输入通道<br />&nbsp;&nbsp;&nbsp;&nbsp;TSCR1&nbsp;=&nbsp;<font color=#FF0000>0X90</font>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开计时器,&nbsp;TFFCA=1<br />&nbsp;&nbsp;&nbsp;&nbsp;TCTL4&nbsp;=&nbsp;0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0,1,2,3通道捕捉上升,下降沿<br />&nbsp;&nbsp;&nbsp;&nbsp;T**1&nbsp;=&nbsp;0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清标志位<br /><br />}<br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;8&nbsp;void&nbsp;TIME0_ISR(void){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000FF>//T**1_C0F&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清标志位<br />&nbsp;&nbsp;&nbsp;&nbsp;//说了不能直接清中断标志,还是不听</font><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF0000>TC0;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读一次捕捉寄存器,自动清除对应中断标志<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PORTB_BIT0&nbsp;=&nbsp;!PORTB_BIT0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTB口相应的位取反,上升下降沿均取反<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />其他中断服务程序类似。<br />
 楼主| yetboy 发表于 2007-7-21 09:49 | 显示全部楼层

问题解决了,谢谢!

原来当初打开了TFFCA=1,但没有读TCx,所以使程序不断地进入中断。原来还要读一次TCx的,呵呵。
张明峰 发表于 2007-7-23 16:23 | 显示全部楼层

其实答案已经在4楼了

居然还不能早点照着样子自己搞定?
asyahe 发表于 2007-8-4 16:50 | 显示全部楼层

佩服一下

  
asyahe 发表于 2007-8-9 10:10 | 显示全部楼层

张教主雄起

  
luciatian 发表于 2011-2-24 16:03 | 显示全部楼层
好不容易搜到这样一篇帖子,跟我先前遇到的问题一样。兄弟伙,这个方法光是输入捕捉倒是没有问题,但是如果要用到定时器中断的时候就完了,程序一直执行的是定时器中断程序,进不了主程序,这个问题怎么解决?
lremindan 发表于 2013-4-17 16:47 | 显示全部楼层
张明峰 发表于 2007-7-20 16:09
static&nbsp;void&nbsp;TIMERInit(void)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;TIE&nbsp;=&nbsp;0X0F;&nbsp;&nbsp ...

你好,读TCx只要写TCx;就可以了吗?为什么我写了这句编译出错,说:Result not used
街边道人 发表于 2013-5-3 09:39 | 显示全部楼层
各位,我想用这个芯片去做EPS的ECU,谁有相关的控制电路图。
changjiaxing 发表于 2014-1-22 14:06 | 显示全部楼层
佩服佩服
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部