最近自己上网找了一个测频率的程序 主要是利用timeA的捕获模式来测量
然后自己加了个UART的传值CODE进去 卻发现UART传到计算机都只显示出FF 不知道为甚么 請各位高手帮帮忙 解惑一下
程序如下:
#include "msp430x14x.h"
unsigned int start,end;
unsigned int width; //==用于存放脉宽==
unsigned int period; //==用于存放周期==
unsigned int frequency; //==用于存放频率==
void process(void); //==函数声明==
void delay(); //==延时函数==
void InitSys(); //==初始化时钟==
void uart_init (void);
/******************************************************************
主函数
******************************************************************/
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //==关狗==
InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==
P1DIR&=~BIT1;
P1SEL = BIT1; //==设置P1.1端口为功能模块使用,即做捕获源==
TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==
TACCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源==
_EINT(); //==开全局中断允许==
uart_init();
while(1)
{
process();
delay();
}
}
/*******************************************************
初始化时钟
*******************************************************/
void InitSys()
{ unsigned int i;
//--- 使用XT2振荡器 ---
BCSCTL1&=~XT2OFF; //==打开XT2振荡器==
do
{
IFG1 &= ~OFIFG; //==清除振荡器失效标志==
for (i = 0xFF; i > 0; i--); //==延时,等待XT2起振==
}
while ((IFG1 & OFIFG) != 0); //==判断XT2是否起振==
BCSCTL2 =SELM_2+SELS; //==选择MCLK=SMCLK为XT2,8M==
}
/*******************************************************
延时函数
*******************************************************/
void delay()
{
unsigned int i;
unsigned int j=10;
for(i=10;i>0;i--)
{
while(j--);
}
}
/********************************************************************
数据处理
********************************************************************/
void process(void)
{
while(end<start);
//while(end<start)的话就让其一直等待下去,直到end>start
width = end-start; //==实际脉冲宽度的计算==
period = 2* width;
frequency=1000000/period;
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready? 判断发送是否完成
TXBUF1 =frequency ; //将数据写入TXBUF中
}
/********************************************************************
传值设定
********************************************************************/
void uart_init(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0xC0; // P3.4,5 = USART0 TXD/RXD
ME2 |= UTXE1 + URXE1; // Enable USART0 TXD/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL1; // UCLK = SMCLK
UBR01 = 0x68; // uart1 1000000Hz 9606bps *
UBR11 = 0x00; //
UMCTL1 = 0x04; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine
IE2 |= URXIE1; // Enable USART0 RX interrupt
}
/*******************************************************************
中断处理函数
*******************************************************************/
#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==
__interrupt void timer_a(void)
{
switch(TAIV) //==向量查询==
{ case 2: //==捕获中断==
if(TACCTL1&CM0) //==捕获到上升沿==
{
TACCTL1=(TACCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==
start=TAR; //==记录初始时间==
}
else if (TACCTL1&CM1) //==捕获到下降沿==
{
TACCTL1=(TACCTL1&(~CM1))|CM0; //==更变设置为上升沿触发==
end=TAR; //==用start,end,overflow计算脉冲宽度==
}
break;
default:
break;
}
}
/*******************************************************************
中断传值函数
*******************************************************************/
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready?
TXBUF1 = RXBUF1; // RXBUF0 to TXBUF0
}