打印

请教MC9S12DG128B的中断优先问题

[复制链接]
3955|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yetboy|  楼主 | 2007-6-27 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了PT0-PT3测量脉冲,单个测量都没问题。但假如4个脉冲一起来时,就只有PT0能进入中断了。其它的均没反应。

我在网上看到一些资料,里面提到默认状态下,进入了中断,I位自动置1,禁止了其他可屏蔽中断。所以我在每段中服程序里面都加了EnableInterrupts。但仍然没有效果,不知道是不是漏了哪里。希望各位指点一下。

相关帖子

沙发
张明峰| | 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引脚)的输入捕捉功能测量脉冲,则尝试:
1)TSCR1寄存器的TFFCA位“置1”,使用中断标志快速清除方法。
2)在各通道的中断服务程序中不要去读写中断标志寄存器T**1
3)只在中断服务程序中读通道数据寄存器TCx(16位),只要读了这个寄存器,对应通道的中断标志将自动清除。

使用特权

评论回复
5
yetboy|  楼主 | 2007-6-29 17:32 | 只看该作者

晕了

TFFCA置1好像没什么效果,只要不清T**1位,就不断地进入中断。唯有先扫描查询各个口的方法凑合着用先了。

使用特权

评论回复
6
张明峰| | 2007-7-3 20:54 | 只看该作者

说不通

我验证过多通道比较输出时的中断处理,软件清除某一位中断标志的方法肯定不行(寄存器“读-修改-写”的问题)。通过使能T**1间接清除中断标志是唯一可行的办法。

使用特权

评论回复
7
yetboy|  楼主 | 2007-7-20 11:36 | 只看该作者

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

#include <hidef.h>
#include <string.h>  
#include <mc9s12dg128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
interrupt 8 void TIME0_ISR(void){

    T**1_C0F = 1;                              //清标志位
    PORTB_BIT0 = !PORTB_BIT0;                   //PORTB口相应的位取反,上升下降沿均取反
    
}


#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
interrupt 9 void TIME1_ISR(void){

    T**1_C1F = 1;
    PORTB_BIT1 = !PORTB_BIT1;    

}


#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
interrupt 10 void TIME2_ISR(void){

    T**1_C2F = 1;
    PORTB_BIT2 = !PORTB_BIT2;

}


#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
interrupt 11 void TIME3_ISR(void){

    T**1_C3F = 1;
    PORTB_BIT3 = !PORTB_BIT3;

}

static void TIMERInit(void) {

    TIE = 0X0F;           //启用中断
    TSCR2 = 0X02;           //4分频得到2M时钟
    TIOS = 0X00;            //设置输入通道
    TSCR1 = 0X80;            //打开计时器
    TCTL4 = 0XFF;           //0,1,2,3通道捕捉上升,下降沿
    T**1 = 0XFF;           //清标志位

}


void main(void) {
 
  DDRB = 0xFF;            
  PORTB = 0x00;

  TIMERInit();
  INTCR_IRQEN = 0;

  EnableInterrupts;
                                             
  while(1)
  {
      ;         

  }
  
}

使用特权

评论回复
8
yetboy|  楼主 | 2007-7-20 11:40 | 只看该作者

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

置于张教主说的间接清除中断标志T**1,具体操作不太明白,希望指点迷津。

使用特权

评论回复
9
张明峰| | 2007-7-20 16:09 | 只看该作者

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

static void TIMERInit(void) {

    TIE = 0X0F;           //启用中断
    TSCR2 = 0X02;           //4分频得到2M时钟
    TIOS = 0X00;            //设置输入通道
    TSCR1 = 0X90;            //打开计时器, TFFCA=1
    TCTL4 = 0XFF;           //0,1,2,3通道捕捉上升,下降沿
    T**1 = 0XFF;           //清标志位

}

#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
interrupt 8 void TIME0_ISR(void){

    //T**1_C0F = 1;                              //清标志位
    //说了不能直接清中断标志,还是不听


    TC0;                  //读一次捕捉寄存器,自动清除对应中断标志

    PORTB_BIT0 = !PORTB_BIT0;                   //PORTB口相应的位取反,上升下降沿均取反
    
}

其他中断服务程序类似。

使用特权

评论回复
10
yetboy|  楼主 | 2007-7-21 09:49 | 只看该作者

问题解决了,谢谢!

原来当初打开了TFFCA=1,但没有读TCx,所以使程序不断地进入中断。原来还要读一次TCx的,呵呵。

使用特权

评论回复
11
张明峰| | 2007-7-23 16:23 | 只看该作者

其实答案已经在4楼了

居然还不能早点照着样子自己搞定?

使用特权

评论回复
12
asyahe| | 2007-8-4 16:50 | 只看该作者

佩服一下

使用特权

评论回复
13
asyahe| | 2007-8-9 10:10 | 只看该作者

张教主雄起

使用特权

评论回复
14
luciatian| | 2011-2-24 16:03 | 只看该作者
好不容易搜到这样一篇帖子,跟我先前遇到的问题一样。兄弟伙,这个方法光是输入捕捉倒是没有问题,但是如果要用到定时器中断的时候就完了,程序一直执行的是定时器中断程序,进不了主程序,这个问题怎么解决?

使用特权

评论回复
15
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

使用特权

评论回复
16
街边道人| | 2013-5-3 09:39 | 只看该作者
各位,我想用这个芯片去做EPS的ECU,谁有相关的控制电路图。

使用特权

评论回复
17
changjiaxing| | 2014-1-22 14:06 | 只看该作者
佩服佩服

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝