Other Parts Discussed in Thread: MSP430FR6989
工具/软件:Code Composer Studio
我目前正在尝试将 HR-S04超声波距离传感器连接到 MSP430FR6989。 我曾多次发现本的代码是在哪里编写的、但本应该适用于他人的代码对我不起作用。 我的方案与其他人使用的方案之间的一个区别是、我没有要打印的外部 LCD、而是尝试将输出显示到 Launchpad 上的板载 LCD、 或者(因为这对我不起作用)我尝试通过 UART 将其写入终端。 以下是我的代码以及我对可能存在的问题的猜测:
#include
#include
#define redLED BIT0
#define greenLED BIT7
#define US_TRIG BIT4
#define US_echo 位5
#define flags_Term UCA1IFG
#define RXFLAG UCRXIFG
#define TXFLAG UCTXIFG
#define TERM_TXBUFFER UCA1TXBUF
#define TERM_RXBUFFER UCA1RXBUF
unsigned int up_counter = 0、down_counter、distance _cm = 0、count = 0;
void initial_term_UART (void)
{
P3SEL1 &=~(BIT4|BIT5);
P3SEL0 |=(BIT4|BIT5);
UCA1CTLW0 |= UCSSEL_2;
UCA1BRW = 8;
UCA1MCTLW = UCBRS3 | UCBRS2| UCBRS0 | UCBRS6_H | UCBRS5_H;
UCA1MCTLW =~UCOS16;
UCA1CTLW0 &=~ UCSWRST;
UCA1IE |= UCRXIE;
UCA1IFG &=~RXFLAG;
}
空 UART_WRITE_CHAR_TERM (无符号字符通道)
{
//等待任何正在进行的传输完成
while ((flags_term & TXFLAG)=0){}
//将字节写入发送缓冲区
TERM_TXBUFFER =通道;
}
void UART_digit_SEP_TERM (unsigned int n)
{
无符号 int 数字;
如果(n >= 10000)
{
数字=(n/10000)% 10;
UART_WRITE_CHAR_TERM (数字+"0");
}
如果(n >= 1000)
{
数字=(n/1000)% 10;
UART_WRITE_CHAR_TERM (数字+"0");
}
如果(n >= 100)
{
数字=(n/100)% 10;
UART_WRITE_CHAR_TERM (数字+"0");
}
如果(n >= 10)
{
数字=(n/10)% 10;
UART_WRITE_CHAR_TERM (数字+"0");
}
数字=(n % 10);
UART_WRITE_CHAR_TERM (数字+"0");
UART_WRITE_CHAR_TERM ('');
}
#pragma vector = TIMER0_A0_vector
_interrupt void TimerA0_ISR (void)
{
P1OUT ^=红色 LED;
P9OUT ^=绿色 LED;
IF (TA0CCTL0和 CCI) //我不确定这是否正确、因为 CCI 是 TA0CCTL0寄存器中的第二位、如果排除"!=0 "、或者其他等效可能不正确
{
UP_COUNTER = TA0CCR0; //将计数器复制到变量
}
其他
{
Distance_cm =(TA0CCR0 - UP_COUNTER)/58;
UART_Digit_SEP_Term (Distance_cm);
UART_WRITE_CHAR_TERM ('\n');
UART_WRITE_CHAR_TERM ('\r\n');
}
}
/*
#pragma vector = TIMER0_A1_vector
_interrupt void T0A1_ISR ()
{
P1OUT ^=红色 LED;
P9OUT ^=绿色 LED;
TA0CTL &=~TAIFG;
}//我知道计时器没有针对翻转事件进行设置,但我包括了此 ISR,以防我不知道任何奇怪的情况
*
void timer_init()
{
TA0CCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;
TA0CCTL0 &=~ CCIFG;
TA0CTL |= tassel_2 + MC_2 + ID_0;
}
int main()
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
PM5CTL0 &= ~LOCKLPM5;
P1DIR |= redLED + US_TRIG;
P9DIR |=绿色 LED;
P1OUT &=~(reddLED | US_TRIG);
P9OUT |=绿色 LED;
P1DIR &=~US_ECHO; //传感器回波的输入方向
P1SEL1 |= US_ECHO; //从端口1将 US_echo 设置为计时器的触发器
P1SEL0 |= US_ECHO;
//初始化用于超声波距离感应的计时器
timer_init();
initialize_term_UART();
enable_interrupts ();
while (1)
{
//测量距离
P1OUT |= US_TRIG; //断言
_DELAY_CYCLES (15); // 10us 宽
P1OUT &=~US_TRIG; //断言
_DELAY_CYCLES (50000); // 0.5sec 测量周期
}
}
我在用户指南(slau367o)中发现 TAIV 中断寄存器只具有通过 TAxCCR6对 TAxCCR1进行的捕捉/比较(即不包含 TA0CCR0)、这让我怀疑 CCI 技术是否与 TA0.0一起工作。
当我在调试模式下运行上述程序时、 永远不会进入 TIMER0_A0_VECTOR ISR、这会告诉我中断的配置不正确、或者正如我在 TA0.0上所说的那样、无法处理 CCIE 事件。 这让我感到困惑、因为许多其他人能够运行上述代码、并且他们说它可以为他们正常运行。