This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

自己组了一个测量频率的程序 但传到计算机都显示不出值



最近自己上网找了一个测频率的程序 主要是利用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=SMCLKXT2,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
}

  • 把程序分段调试,先调试串口测试串口有没有问题,再去调试捕获得到的值,这样容易排查问题~

  • 我是有再想两种可能 第一种因为我是用RS232传值到计算机 一次只能传8bits 但是我的frequency是整数型别 为32bits 不知道这样会不会有影响

    第二种是他计算出来的frequency根本没有进去程序内 所以根本没有办法传

     

    不知道有哪一种可能 要怎么测试或解决???

  • 在TI的官网找你所使用的芯片的官方例程,然后下载测试串口,看看可以正常收发数据,然后在去测试算法测频的部分,

  • 我后来用了一个测试的程序改写如下 把数据处理的code代换 但发现还是只传FF或FC  这代表UART出了甚么问题??

    /********************************************************************
    資料處理
    ********************************************************************/
    void process(void)
    {

    char date[2]={0x09,0xAB};
    int i;
    while(1)
    {for(i=0;i<2;i++)

    while (!(IFG1 & UTXIFG0)); // USART1 TX buffer ready? 判斷發送是否完成
    TXBUF1 =date[i]; //將數據寫入TXBUF中
    delay();
    }
    }

  • 你的时钟多大,波特率计算是否正确?ti的例程我测试了,完全可以使用。我的uart都是例程改的。你在根据例程在试试吧!

  • 我是用smclk做timer 本来是8Mhz 之后除频变1Mhz 我的波特率是用此网站下去算的http://mspgcc.sourceforge.net/baudrate.html

    clock为8Mhz  Baudrate为9600

    您的意思是说您用了例程的uart之后 这个程序是可以测频或是可以跑的吗?

    因为我最近才刚开始碰 uart都是自己写的 你可以给我你测的uart或是告诉我在官网的哪里下载吗?

    一直麻烦您了 谢谢

  • 你好:

    这个应用中,可先在线调试,看频率测量是否正确,再调UART与PC通信代码。

    例程可在http://www.ti.com/tool/msp430ware中找到。下载msp430ware,里面有全部MSP430 MCU的参考例程。

    Regards,

    Hardy

  • 之前听大家的建议 弄了一个测试的串口程序 确定可以传出值来了 但是如果单纯给定值传值的话ok  只要开讯号产生器好像就没收到值

    因为我是用上缘下缘触发来算频率 感觉是讯号没有进去板子 我用来捕获模式的time A脚位为P1.1不知道是不是程序有写错

    因为原本的程序是用P1.2当脚位 我改成 P1.1之后 中断处理函数那边要不要改甚么东西??

    还是哪边有问题 可以再请各位高手看一下吗 谢谢