|
我写的是430单片机测频率的程序,定时1S,用捕获计算脉冲的个数。程序比较简单,但是就是测频率没显示,难道是哪个寄存器设置错误?
求解于高手。
#include <MSP430x26x.h>
unsigned int Ts_width,Plus_times;
unsigned char overflow;
void Init_CLK(void);
void main (void)
{
WDTCTL = WDTPW+WDTHOLD; //关闭看门狗定时器
Init_CLK();
P1DIR &=~BIT2; //设置P1.2方向为输入
P1SEL |= BIT2; //设置P1.2端口为功能模块使用
TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC_0; //定时器A时钟信号选择SMCLK,1M,同时停止定时器A
CCTL1 = CM_1+SCS+CAP+CCIE+CCIS_0; //输入上升沿捕获,CCI1A为捕获信号源
CCR0=5000-1; //定时5ms
_EINT(); //中断允许
while(1)
{
//显示频率,这里略写
}
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{
case 2: //捕获中断
{
Plus_times++; //记下脉冲个数
TACTL |=MC_1; //开定时器
}
break;
case 10:
overflow++;
if(overflow==200) //定时1S到
{
CCTL1 &=CM_0; //禁止捕获
overflow=0;
Ts_width=Plus_times;
Plus_times=0;
CCTL1 |=CM_1; //捕获允许
}
break;
default:
break;
}
}
/*****************高频时钟初始化**************************/
void Init_CLK(void)
{
unsigned int iq0;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG)); // 判断XT2是否起振,起振,则为0
BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK为XT2,8M
}
显示部分绝对没问题,大家帮忙看看我的捕获模块怎么错了。
I am新手,请老手们赐解! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|