#include "msp430x14x.h"
#include "iic.h"
unsigned int TA_OverflowCnt; //TA溢出次数存放变量
unsigned long int Period; //周期测量结果存放变量
unsigned int PervCapVal; //前一次捕获值存放变量
void display() //显示
{
// OLED_ShowString(0, 2, "haha:",16);
//OLED_ShowString(0, 0, "20",16);
//OLED_ShowChar(33, 0, '-',16);
//OLED_ShowChar(57, 0, '-',16);
// OLED_ShowChar(78, 2,':',16);
// OLED_ShowChar(102, 2,':',16);
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese( 16,0,1);
// OLED_ShowChar(32, 4,':',16);
//OLED_ShowString(0, 6, "new money:",16);
// OLED_ShowNum(0,4,TA_OverflowCnt,2,16);
OLED_ShowString(112,0,"HZ",16);
//OLED_ShowNum(0,6,3,5,16); //显示
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= BIT2; //P1.2设为第二功能(TA1),不同单片机可能不同
P1DIR &= ~(BIT2); //P1.2(TA1)设为输入(可省略)
TACTL= TASSEL_2+MC_2+TACLR+TAIE;
TACCTL1 =CAP + CM_3 +CCIS_1 + SCS + CCIE;
//捕获模块1启动,选择TA1(P1.2)管脚作为捕获源,上升沿捕获,同步捕获,开启捕获中断
Initial_LY096BG30(); //OLED初始化
OLED_Clear();
display();
_EINT(); //总中断允许
LPM0; //因为TimerA要用SMCLK,只能进入低功耗模式0休眠
}
#pragma vector = TIMERA1_VECTOR
__interrupt void TA_ISR(void) //Timer_A中断入口
{
switch(TAIV)
{
case 2: //比较/捕获模块1中断
Period = TA_OverflowCnt*65536 + TACCR1-PervCapVal; //计算周期
PervCapVal = TACCR1; //保存捕获值,供下一次使用
TA_OverflowCnt = 0; //溢出次数清零
OLED_ShowNum(0,2,Period,5,16); //显示
OLED_ShowNum(0,6,3,5,16); //显示
break;
case 4: break;
case 10: TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1
break;
}
}
进入不了这个中断,我查了一下手册 捕获模式:寄存器 CCRx 捕获了定时器 TAR 值时置位。
说明没有捕获到定时器TAR
case 2: //比较/捕获模块1中断
Period = TA_OverflowCnt*65536 + TACCR1-PervCapVal; //计算周期
PervCapVal = TACCR1; //保存捕获值,供下一次使用
TA_OverflowCnt = 0; //溢出次数清零
OLED_ShowNum(0,2,Period,5,16); //显示
OLED_ShowNum(0,6,3,5,16); //显示
break;
问题是:为什么捕获不了TAR中的值 我的oled ,脉冲输入没有问题
|