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.

[参考译文] CCS/MSP430FR6989:捕获/比较中断不适用于 HR-S04超声波传感器

Guru**** 2874300 points

Other Parts Discussed in Thread: MSP430FR6989

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/865667/ccs-msp430fr6989-capture-compare-interrupt-not-working-with-hr-s04-ultrasonic-sensor

器件型号: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 事件。 这让我感到困惑、因为许多其他人能够运行上述代码、并且他们说它可以为他们正常运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Alex、

    请给我几个工作日来了解这一点、然后我会再回来。 感谢您的耐心等待。

    此致、

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    我认为、如果您通读 您在帖子中提到的器件系列用户指南的第25章、将会有所帮助。 在浏览该章时、您会注意到有两个不同的中断向量与16位 Timer_A 模块相关联。 当 TAxCCR0上发生一个输入捕捉事件并且定时器被正确配置时、CCIFG 标志被置位、相应的 TAxCCR0中断向量被执行。 TAxIV 中断向量为其他定时器捕捉/比较通道供源、因此 CCR0通道上的事件不会触发 TAxIV 中断。

    您提到上述代码适用于其他人、但不适用于您、唯一的区别是您的源代码实施了不同的通信策略来发送数据。 您是否曾尝试将代码剥离为计时器功能、以查看是否能够在尝试加入附加功能之前先让代码自行运行?

    P.S. 对于未来的代码上传、请使用"插入代码"工具、以便在尝试调试时更易于阅读。

    此致、

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、感谢您的详尽回答。

    我会对您的回复做出反馈、因为这可能会更好地阅读。 从现在开始、我将使用代码函数;这实际上是我在这里发布的第一篇文章、因此我甚至不知道该功能。  

    在通信协议方面、我在其他项目中使用了完全相同的协议/设置、但当时情况良好、我唯一想说的是、如果我在 UART 初始化块中以不同于主函数的方式配置计时器、那么这种情况下会发生变化。 我合并了 UART 函数、除了在代码中插入断点之外、我不知道如何测试代码来检查中断。 您是否会有任何创意想法?

    我将按照您的建议在系列用户指南中详细阅读、看看我是否能找到任何内容。 在平均时间内、您是否在计时器配置或 UART 配置中看到任何可能会导致问题的东西? 我将使用插入代码函数将其复制/粘贴到这里、以便它更具可读性。  

    void timer_init()
    {
    //将计时器 A0配置为读取回波信号:
    Timer A 捕获/比较控制0 =>
    捕捉模式:1 -双边沿+
    捕获同步+
    捕捉输入选择0 => P1.5 +
    捕获模式+
    捕获比较中断使能*/
    TA0CCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;
    TA0CCTL0 &=~ CCIFG;
    
    /* Timer A 控制配置=>
    计时器 A 时钟源选择:1 - SMClock +
    Timer A 模式控制:2 -连续向上+
    Timer A 时钟输入分频器0 -无分频器*/
    TA0CTL |= tassel_2 + MC_2 + ID_0;
    }
    
    void initialize_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;
    } 

    再次感谢您付出的时间和努力。 这确实有助于对事物产生第二种关注。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在另一个传感器上运行了代码、另一个传感器工作正常。 我想我第一次在坏的传感器上运行它。  

    感谢您的所有帮助。