之前听大家的建议 弄了一个测试的串口程序 确定可以传出值来了 但是如果单纯給定值传值的话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
}