程序利用两个定时器做频率测试,精度要求不高。测试的是以KHZ为单位的方波。串口助手显示测量结果
程序如下:
#include "msp430x21x2.h"
volatile unsigned char fCounter;
volatile unsigned int tCounter;
unsigned char mark=0;
//unsigned char pcString []="当前频率:";
#define delay10us _NOP(),_NOP(),_NOP(),_NOP(),_NOP()
void Usart_PutChar(unsigned char cTXData) //字节发送函数
{
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = cTXData; // TX -> RXed character
}
void Usart_PutString(unsigned char *pcString)
{
while (*pcString)
{
Usart_PutChar(*pcString++);
}
//Usart_PutChar(0x0D);
//Usart_PutChar(0x0A); //结尾发送回车换行
}
void main()
{
WDTCTL =WDTPW+WDTHOLD; //关狗
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If calibration constants erased do not load, trap CPU!!
}
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ
DCOCTL = CALDCO_1MHZ; //设定DCO 为1MHZ
P1DIR &=~BIT0;
P1SEL |=BIT0; //P1.0配置为定时器时TA0钟输入
P1SEL2 &=~BIT0;
P3SEL= BIT5+BIT4;
UCA0CTL1 |= UCSWRST;
UCA0CTL1 |=UCSSEL_2; //SMCLK
UCA0BR0 = 104; //9600波特率
UCA0BR1 = 0;
UCA0MCTL =UCBRS_1;
UCA0CTL1 &=~UCSWRST;
IE2 |=UCA0RXIE; //接收中断使能*/
TA1CTL=TASSEL_2+TAIE;
TA1CCR0=1000; //TA1比较中断定时1ms
TA1CCTL0=CCIE;
TA0CTL =TASSEL_0+TAIE;
__bis_SR_register(GIE);
TA0CTL |=MC_2;
TA1CTL|=MC_1;
while(1)
{
if(mark ==1)
{
Usart_PutString("当前频率:");
Usart_PutChar(tCounter/1000+0x30);
Usart_PutChar(tCounter%1000/100+0x30);
Usart_PutChar(tCounter%1000%100/10+0x30);
Usart_PutChar(tCounter%1000%100%10+0x30);
Usart_PutString("KHZ");
Usart_PutChar(0x0D);
Usart_PutChar(0x0A); //结尾发送回车换行
for(int i=0;i<100;i++)
for(int k=0;k<100;k++)
delay10us;
fCounter=0;
TAR=0;
TA1R=0;
TA0CTL|=MC_2;//Timer0_Star
TA1CTL|=MC_1;//Timer1 Star
mark=0;
}
}
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void)
{
switch (__even_in_range(TA0IV, 10)) // Efficient switch-implementation
{
case 2:
break; // TA0CCR1 used
case 4:
break; // TA0CCR2 not used
case 10:
fCounter++;
break;
}
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0(void)
{
TA0CTL&=~MC_2;//Timer0_Stop
TA1CTL&=~MC_1;//Timer1 Stop
tCounter=TAR;
mark=1;
//P1OUT^=BIT0;
}
问题:
1.在调试时,在Timer1_A0(void)的中断内部mark=1;句设置断点,然后全速跑,测试显示正常。但是如果取消该断点全速运行的话程序一直在while()循环中的if(mark==1)处停止,似乎无法进入Timer1_A0(void)中断,不知是何原因。
2、对该系列的TA0和TA1他们的中断向量是否一样,都有TAXCCR0,TAXCCR1和溢出中断呢?
[
本帖最后由 jiangwei0802 于 2011-6-17 00:09 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>