以下程序是TimerA的双路捕获测速程序,请问如果直接把TimerA改成TimerB需要注意什么?(也就是把所有A改成B)或者说可以直接改么?会出现什么问题? 跪谢!
#include <msp430x14x.h>
#include "TA.h"
#include "cry1602.h"
/***************************************************************
捕获模块的应用,用P1^3和P12作为外部的脉冲的捕获输入端,实现小车速度检测。
volatile
***************************************************************/
volatile unsigned int new_cap1=0;
unsigned int old_cap1=0;
unsigned int cap_diff1=0;
unsigned int diff_array1[16]; // 记录两个上升沿的计数间隔。
unsigned int capture_array1[16]; // 记录各个上升沿到达时的TCCR0的值。
unsigned long int sum_diff1=0;
volatile unsigned int ave_diff1; //脉冲周期的平均值
unsigned char index1=0;
unsigned char cap_flag1=0;
unsigned char i,j=0;
volatile unsigned int new_cap2=0;
unsigned int old_cap2=0;
unsigned int cap_diff2=0;
unsigned int diff_array2[16]; // 记录两个上升沿的计数间隔。
unsigned int capture_array2[16]; // 记录各个上升沿到达时的TCCR0的值。
unsigned long int sum_diff2=0;
volatile unsigned int ave_diff2; //脉冲周期的平均值
unsigned char index2=0;
unsigned char cap_flag2=0;
//P6DIR|=BIT0;
void TimerA(void)
{
P1SEL |= (BIT3+BIT2); // 选择P1^3和P1^2作为外部计数脉冲的输入端
// P6DIR|=BIT0;
CCTL1 = CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.2)
// + Capture Mode + Interrupt
CCTL2 = CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.3)
// + Capture Mode + Interrupt
TACTL = TASSEL_2 + MC_2+ID_3; // SMCLK + Continuous Mode + divide 8
}
/*****************************************************************************
定时器A中断函数
多中断中断源:CC1~2 TA
******************************************************************************/
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1()
{
//以下为参考处理程序,不使用的中断源应当删除
switch (__even_in_range(TAIV, 10))
{
case 2:
{ //捕获/比较1中断
new_cap1 = TACCR1;
cap_diff1 = new_cap1 - old_cap1;
diff_array1[index1] = cap_diff1;
capture_array1[index1++] = new_cap1;
if (index1 == 5)
{
//P6OUT ^=0X01;
cap_flag1=1;
index1 = 0;
for(i=0;i<5;i++)
{
sum_diff1 +=diff_array1[i];
}
ave_diff1=sum_diff1/5;
sum_diff1=0;
}
else
{
cap_flag1=0;
}
old_cap1 = new_cap1;
// LPM0_EXIT; //退出中断后退出低功耗模式
break;
}
case 4:
{ //捕获/比较2中断
//init_p2();
// P6OUT ^=0X01;
new_cap2 = TACCR2;
cap_diff2 = new_cap2 - old_cap2;
diff_array2[index2] = cap_diff2;
capture_array2[index2++] = new_cap2;
if (index2 == 5)
{
cap_flag2=1;
index2 = 0;
for(i=0;i<5;i++)
{
sum_diff2+=diff_array2[i];
}
ave_diff2=sum_diff2/5;
sum_diff2=0;
}
else
{
cap_flag2=0;
}
old_cap2 = new_cap2;
// LPM0_EXIT;
break;
}
}
// if((cap_flag1==1)||(cap_flag2==1))
// {
// P6DIR &=~(BIT0);
LPM0_EXIT; //退出中断后退出低功耗模式。
// }
}
|