6202|16

51

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

msp430g2553TACCTL0无法进入中断 [复制链接]

使用launchpad捕获外部脉冲;TACTL做定时时钟,TACCTL0捕获脉冲;但捕获中断始终进不去,外部脉冲由信号发生器提供1K的信号,下面是程序,大家帮我参考下:
#include

unsigned  int Cap_Tar;
unsigned  int Cap_First;
unsigned  int Cap_Last;
unsigned  int time;
unsigned  int pulse;
unsigned  int F;
char  flag=0;
int main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗
  P1DIR |=  0X41;
  
  P1DIR &=  ~BIT1;                          //设置P1.1为输入
  P1SEL |=  BIT1;                           //P1.1给外设TA0使用
  //P1REN |=  BIT1;
  
  TACTL = TASSEL_1 + MC_2 + TAIE;           // 时钟源选择 ACLK,计数模式选择连续计数模式,主计数器计满中断允许
  
  TACCTL0 = CM_1  + SCS + CCIS_0  + CAP + CCIE;
  //上升沿捕获+CCI0A(P1.1)+捕获模式+中断使能
  
  while(1)
  {
    _BIS_SR(LPM3_bits + GIE);                 // 进入低功耗模式3,打开全局中断
    if(flag==1)
      {
        P1OUT ^=  0X40;
        flag=0;
      }
  }
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  if(Cap_Tar==0)
  {
    Cap_First = TACCR0; //捕获时间阀值内第一个上升沿的TAR
    Cap_Tar++;
    flag=1;
  }
  else
  {
    Cap_Last  = TACCR0;   
    Cap_Tar++;
    flag=1;
  }
}

// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TA0IV )
  {
  case  2:break;
  case 10:
    {
      if(Cap_Tar==0)
      {
        pulse=0;                              //脉冲数为0
        
      }
      else
      {
        pulse = Cap_Tar - 1;                  //计算脉冲数
        time  = Cap_Last  - Cap_First;        //计算脉冲周期
        Cap_Tar = 0;                          //清零
        Cap_Last= 0;
        Cap_First=0;
      }
      LPM3_EXIT;
    }
    //P1OUT ^= 0x41;                   // 主计数器计满溢出
           break;
}
}

最新回复

把LPM3页去掉,调试终止的时候看看停在那里。 估计是有什么没注意的小问题包括硬件,只是没注意到可能 那么简单的几句通不过? 还是有经验的大侠说说处理方法吧  详情 回复 发表于 2013-5-17 14:54
 
点赞 关注(1)

回复
举报

51

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
我用P1.0来测试是否进入中断,官方例程中并没有捕获的相关程序,就参考了一些其他的程序,但是依旧没有什么效果,谁帮我看看,是程序问题,还是其他的问题?谢谢啦

点评

什么意思?测试是否进入中段用开发环境调试不就可以看出来了?最简单的是将光标放置在中段里,运行到光标处,这样不可以么?  详情 回复 发表于 2013-5-17 09:45
p1.0是时钟信号输入端不是不捕捉信号输入复用端口吧?是否是p1.1?  详情 回复 发表于 2013-5-17 09:44
 
 

回复

298

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
检查你的ACLK有吗,再检查输入的捕获信号对不对

点评

我用的下面这个程序,测试的ACLK时钟, #include int main( void ) { WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 P1SEL |= 0x06; // P1.1 - P1.2的功能  详情 回复 发表于 2013-5-16 10:43
 
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

4
 

回复 板凳 yunhaiking 的帖子

我用的下面这个程序,测试的ACLK时钟,
#include

int main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗
  P1SEL |= 0x06;                            // P1.1 - P1.2的功能选择
  P1DIR |= 0x07;                            // P1.0 - P1.2 方向
  CCTL0 = OUTMOD_4 + CCIE;                  // CCR0 选择比较模式4,使能中断
  CCTL1 = OUTMOD_4 + CCIE;                  // CCR1 选择比较模式4,使能中断
  TACTL = TASSEL_1 + MC_2 + TAIE;           // 时钟源选择 ACLK,计数模式选择连续
计数模式,主计数器计满中断允许

  _BIS_SR(LPM3_bits + GIE);                 // 进入低功耗模式3,打开全局中断

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  CCR0 += 4;                                //给CCR0赋初始值  8.192KHZ
}

// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TA0IV )
  {
  case  2: CCR1 += 16;                      // 给CCR1赋初始值   2.048KHZ
           break;
  case 10: P1OUT ^= 0x01;                   // 主计数器计满溢出  5HZ
           break;
}
}

除了BIT0是2s状态改变一次外,设置的输出管脚频率,用示波器测量,结果是实际数据的1/2,不知是不是我换算错了。

点评

那说明ACLK没错啊,换算错了,依照实际结果来  详情 回复 发表于 2013-5-16 11:04
 
 
 

回复

298

帖子

2

TA的资源

纯净的硅(中级)

5
 

回复 4楼 断桥 的帖子

那说明ACLK没错啊,换算错了,依照实际结果来

点评

嗯,但是为什么就是无法进入中断呢,可以用P1.6来测试是否进入中断吧? 只要设置为捕获模式,中断就进不去,不清楚是什么原因。  详情 回复 发表于 2013-5-16 11:06
 
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

6
 

回复 5楼 yunhaiking 的帖子

嗯,但是为什么就是无法进入中断呢,可以用P1.6来测试是否进入中断吧?  只要设置为捕获模式,中断就进不去,不清楚是什么原因。

点评

不清楚了,试官方给的例程,看能不能进捕获中断  详情 回复 发表于 2013-5-16 11:19
 
 
 

回复

298

帖子

2

TA的资源

纯净的硅(中级)

7
 

回复 6楼 断桥 的帖子

不清楚了,试官方给的例程,看能不能进捕获中断

点评

官方没有关于捕获的例程,所以也没有比较正规的参考程序。  详情 回复 发表于 2013-5-16 13:55
 
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

8
 

回复 7楼 yunhaiking 的帖子

官方没有关于捕获的例程,所以也没有比较正规的参考程序。
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

9
 
原帖由 断桥 于 2013-5-16 10:06 发表
我用P1.0来测试是否进入中断,官方例程中并没有捕获的相关程序,就参考了一些其他的程序,但是依旧没有什么效果,谁帮我看看,是程序问题,还是其他的问题?谢谢啦
p1.0是时钟信号输入端不是不捕捉信号输入复用端口吧?是否是p1.1?

点评

P1.1是捕获信号输入端,P1.0是一个状态灯,进入中断后点亮的。 光标那个是很方便,试过的,进不去:Sad:  详情 回复 发表于 2013-5-17 10:54
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

10
 
原帖由 断桥 于 2013-5-16 10:06 发表
我用P1.0来测试是否进入中断,官方例程中并没有捕获的相关程序,就参考了一些其他的程序,但是依旧没有什么效果,谁帮我看看,是程序问题,还是其他的问题?谢谢啦

什么意思?测试是否进入中段用开发环境调试不就可以看出来了?最简单的是将光标放置在中段里,运行到光标处,这样不可以么?
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

11
 
ACLK可以通过p1.0脚直接测呀
ACLK时钟源没有配置到底频率是多少?晶体还是能够自动切换到VLO?

点评

ACLK是晶体,32768HZ,这个不会错。  详情 回复 发表于 2013-5-17 10:55
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

12
 

回复 9楼 wangfuchong 的帖子

P1.1是捕获信号输入端,P1.0是一个状态灯,进入中断后点亮的。  光标那个是很方便,试过的,进不去
 
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

13
 

回复 11楼 wangfuchong 的帖子

ACLK是晶体,32768HZ,这个不会错。
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

14
 
你程序不完整吧,没仔细看

遇到这种情况,只有一步步查
首先还是通过P1.0通过功能引脚设置直接输出ALCK用示波器看到底什么波形多少频率
你的晶体震荡失效检测程序是没有的

把无关的程序删掉,一步一步调试,例如看看相关的标志位。
捕捉端口先使能上下拉电阻,程序运行起来后再加输入信号

点评

嗯,我测试一下。  详情 回复 发表于 2013-5-17 13:33
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

15
 

回复 14楼 wangfuchong 的帖子

嗯,我测试一下。
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

16
 
把LPM3页去掉,调试终止的时候看看停在那里。
估计是有什么没注意的小问题包括硬件,只是没注意到可能
那么简单的几句通不过?
还是有经验的大侠说说处理方法吧
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

51

帖子

1

TA的资源

一粒金砂(中级)

17
 
昨下午解决了,谢谢。程序使正确的,;是信号发生器产生频率的幅度不对。用TTL端口输出就可以,把50Ω端口输出幅度调到5v也可以。之前我一直用3v的幅度。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表