程序有点稀烂,大牛不要笑话。
其实程序有bug的,7K一下可以精确到0.1Hz
但是到了7-8K就会多出100多
到了9K以上就无法显示,其实是无法进入定时器中断。程序里面捕获的中断优先级比定时器高。
不知道是不是因为优先级的原因使频率高了无法进入定时器中断。
下面是程序:
#include <msp430x14x.h>
#include "Lcd1602.h"
#include "page.h"
#define CPU_F ((double)800000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
unsigned int Cap_Tar,Cap_first,Cap_last,Cap_num,flag=0;
float F,f;
unsigned int push,KEY,K;
void Init_CLK(void)
{
unsigned int index;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
{
;
}
} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2 SMCLK 8分频
}
void Capture_Init(void)
{
P1DIR &=~BIT2; //TA1
P1SEL |=BIT2;
TACCR0=40000; //every intrupt 5ms;
TACCTL1 =CAP+CM_1+CCIS_0+SCS;//+CCIE; //Capture , pos. edge,CCIxA ,同步,捕获中断开
TACTL = TASSEL_2+TACLR+MC_1;//MC_1 //SMCLK,L up to CCR0
// TACCTL1 |=CCIE;
// TACTL |=TAIE;
}
void IO_Init(void)
{
P1SEL &=~(BIT6+BIT7);
P1DIR &=~(BIT3+BIT5);
P1DIR |=BIT6+BIT7;
P1OUT |=BIT6;
P1OUT |=BIT7;
P1SEL &=~(BIT3+BIT5);
P1IE |=BIT3+BIT5;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
Init_CLK();
IO_Init();
init_lcd_port();
Capture_Init();
lcd_init();//液晶初始化
_EINT(); //开总中断
display_tem_fre2(0x92,0);
while(1)
{
display_tem_fre2(0x92,F);
}
}
#pragma vector=TIMERA1_VECTOR //
__interrupt void Timer_A1(void)
{
switch(TAIV)
{
case 2:
if(Cap_Tar==0)
{
P2OUT &=~BIT0;
//TACTL |=TACLR;
push=0;
flag=0;
Cap_first=TACCR1;
Cap_Tar++;
}
else
{
Cap_last=TACCR1;
if(Cap_Tar==65535)
flag++;
Cap_Tar++;
}
break;
case 4: break;
case 10: //定时器中断 大于9K后进不去
push++;
if(Cap_Tar==0)
push=0;
if(push==51)
{
K++;
if(K==2)
{
TACTL &=~TAIE;
TACCTL1 &=~CCIE;
K=0;
}
Cap_num =Cap_Tar-1;
F = (Cap_num+flag*65535)*8000000.0/(50*40000+Cap_last-Cap_first); // f=N/T ,T=200ms
Cap_Tar =0;
push=0;
flag=0;
P1OUT ^=BIT6;
}
break;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
delay_ms(100);
if(((P1IFG&BIT3)>>3)) //按键按下后捕获
{
P1IFG &=~BIT3;
TACTL |=TAIE;
TACCTL1 |=CCIE;
TACTL |=TACLR;
}
}
想做到1M ,还差很远呢,希望有高手帮忙分析下。
上面的7K一下可以精确到0.1HZ
谢谢啦!