/*
* 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取反。
本人初来乍到,不知道这程序究竟错在哪儿,期待得到解答!谢谢!~ 。。~