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.

测量频率的程序 之前有问过 但还有点问题



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

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

但范例程序是P1.2  不知道是不是程序有写错或是要改哪个参数

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

以下是我新改好的程序

#include "msp430x14x.h" 

unsigned int start,end; 

unsigned int width; //==用于存放脉宽==

unsigned int period; //==用于存放周期==

unsigned int frequency; //==用于存放频率==

unsigned int fy[7]; //==用于存放频率显示数据==

char chfy[7];

void transmit_data(void); 

 

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计数模式为连续增计模式==      

CCTL1 = CM_1+SCS+CAP+CCIE;//+CCIS_1; //==输入上升沿捕获,CCI0B为捕获信号源==    

_EINT(); //==开全局中断允许==        

uart_init();     

while(1)      

{         

process();

transmit_data();

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;           

 

fy[6]=frequency/1000000;     

fy[5]=(frequency-1000000*fy[6])/100000;     

fy[4]=(frequency-1000000*fy[6]-100000*fy[5])/10000;     

fy[3]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/1000;     

fy[2]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3])/100;    

fy[1]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3]-100*fy[2])/10;    

fy[0]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3]-100*fy[2]-10*fy[1]);

 

chfy[6]=fy[6];

chfy[5]=fy[5];

chfy[4]=fy[4];

chfy[3]=fy[3];

chfy[2]=fy[2];

chfy[1]=fy[1];

chfy[0]=fy[0];

 

 

}

 

 

/********************************************************************

 传值设定 

 ********************************************************************/

void uart_init(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P3SEL |= 0xC0;                            // P3.4,5 = USART0 TXD/RXD

  P3DIR |= 0x40;

  UCTL1=SWRST;

  UTCTL1|=SSEL0;

  UBR01=0x03;

  UBR11=0x00;

  UMCTL1=0x4a;

  UCTL1=CHAR;

  IFG2&=~UTXIFG1;

  IE2|=URXIE1;

  ME2|=URXE1+UTXE1;

 

}

 

void transmit_data(void)

 

{

 

unsigned char z;

 

for(z=0;z<7;z++)

 

{

 

TXBUF1=chfy[z];

while (!(IFG2 & UTXIFG1));

//while((UTCTL1&TXEPT)!=TXEPT);

 

}

}

 

/*******************************************************************

中断处理函数 

*******************************************************************/

#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==

__interrupt void timer_a(void)

{   

switch(TAIV) //==向量查询==  

{ case 2: //==捕获中断==        

if(CCTL1&CM0) //==捕获到上升沿==         

{             

CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==           

start=TAR; //==记录初始时间==                    

}             

else if (CCTL1&CM1) //==捕获到下降沿==        

{             

CCTL1=(CCTL1&(~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

}