This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

利用定时器的捕获功能,捕获ACLK信号,程序跑飞!求指导!

Other Parts Discussed in Thread: MSP430F5529

/*
 * TA_CAP.C
 *
 *  Created on: 2013-7-30
 *      Author: Administrator
 */
#include <stdint.h>
#include "msp430f5529.h"
#include "HAL_PMM.h"
#include "HAL_UCS.h"
#include "HAL_Board.h"
#include "HAL_Buttons.h"
#include "HAL_Cma3000.h"
#include "HAL_Dogs102x6.h"
#include "HAL_Menu.h"
#include "HAL_Wheel.h"

 

//
unsigned new_cap =0;
unsigned old_cap =0;
unsigned cap_diff =0;

unsigned int diff_array[16];
unsigned int capture_array[16];
unsigned char index =0;
unsigned char count =0;
//
void main(void)
{
  volatile unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;
  for (i=0;i<20000;i++)
    {}
//配置端口
  P8DIR |=BIT1;  //P8.1输出
 // P8OUT &=~0X02; //P8.1取反输出
  P1SEL |=BIT0+BIT1;   //P1.1为模块功能,即TA0,P1.0为模块功能,即ACLK信号输出
  P1DIR =0X01;
//配置时钟源
  UCSCTL5 |=DIVA__8;   //ACLK信号8分频
//配置定时器
  TA0CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE;
  //上升沿捕获+同步+CCI0A(P1.1)+捕获 模式+捕获模式使能
  TA0CTL = TASSEL_2 + MC_2;
  //选SMCLK为定时器时钟信号+连续计数模式

  _BIS_SR(LPM3_bits + GIE);
}

//进入中断服务程序
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
    {
  new_cap = TA0CCR0;
  cap_diff = new_cap - old_cap;
  diff_array[index] = cap_diff;
  capture_array[index++] = new_cap;
  if (index == 2)
  {
   index = 0;
   P8OUT ^= BIT1;
  }
  old_cap = new_cap;
  count++;
  if (count == 32)
  {
   count = 0;
   _nop();
  }
 }


          参考教程的一个例子,利用CCR0捕获/比较寄存器的捕获功能对ACLK/8信号进行捕获,捕获16次数据存到数组中,每次捕获数据是都将新旧数据比较,并将他们的差异存入数组中,再保存新数据,完成16次数据捕获后lED2取反。

         本人初来乍到,不知道这程序究竟错在哪儿,期待得到解答!谢谢!~ 。。~

  • li ma1,

    请问你是如何判定程序跑飞的?另外程序跑飞到哪里了?有何提示吗?

  • 你好!

             程序进入不了中断。程序要实现的功能是利用CCR0的捕获比较寄存器功能,对ACLK/8信号进行捕获,分别捕获16次数据存到数组中,并更新数组,完成16次数据捕获之后点亮LED。此外,这个程序是参照教程写的。~。。~

  • li ma1,

    进不了中断,不能说是程序跑飞了。

    1. 试着加上 reset TA0R:  TA0CTL |= TASSEL_2 + MC_2 + TACLR;        // SMCLK, Cont Mode; start timer

    2. 确定把输出的ACLK接到TImer对应的capture脚上了没有?

    3. 确认ACLK管脚有输出吗?

    4. 均确认后,在中断处理函数里设置断点,看看能不能进入中断。

    希望对你有帮助!O(∩_∩)O~

  • Li ma,

    你好!

      TA0CTL = TASSEL_2 + MC_2;
      //选SMCLK为定时器时钟信号+连续计数模式

      _BIS_SR(LPM3_bits + GIE);

    从这段代码中可以看到,TA0的时钟是SMCLK,但是后面进入了LPM3,LPM3中SMCLK是不工作的。

    Regards,

    Hardy

  • 另外,如果SMCLK和ACLK采用同一个时钟源,用SMCLK去测试ACLK是没有意义的。

    同一个时钟源如何能区分精度呢?