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/MSP430F5438A:msp430f5438a 计时器捕获模式和 HC-sr04传感器控制

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/801046/ccs-msp430f5438a-msp430f5438a-timer-capture-mode-and-hc-sr04-sensor-control

器件型号:MSP430F5438A

工具/软件:Code Composer Studio

/*
* USER_TIMER.c
*
*创建日期:2013。 3.27.
*作者:mcssol
*

#include "user_timer.h"
extern unsigned int upcounter;
extern unsigned int 距离;
extern void ReadSonar();
空 Init_timer_A (空)

/*TRIGGER 引脚设置(P1.3)*/
P1DIR |= 0x08;
P1OUT &=~(0x08);
/*echo 引脚设置(P4.0)*/
P4DIR &=~(0x01);
P4SEL |= 0x01;

TA0CTL = tassel_1 + MC_1;
TA0CCTL0 = CCIE;
TA0CCR0 = 327;

TB0CTL = TBSSEL_1 + MC_1;// ACLK、upcount_mode、清除 TAR
TB0CCTL0 = CM_3 + SCS + CCIS_1 + CAP + CCIE;



#pragma vector=TIMER0_A0_VECTOR
_interrupt void TIMER0_A0_ISR (void)

ReadSonar();
IF (CCIFG&TB0CCTL0)

upcounter=0;
UART_A1_msg ("upcounter:");
UART_A1_Xmit ((upcounter/100)%10+'0');

UART_A1_Xmit ((upcounter/10)%10+'0');
UART_A1_Xmit (upcounter%10+'0');
UART_A1_xmit ('\n');
UART_A1_xmit ('\r\n');

其他

upcounter++;
UART_A1_msg ("upcounter:");
UART_A1_Xmit ((upcounter/100)%10+'0');
UART_A1_Xmit ((upcounter/10)%10+'0');
UART_A1_Xmit (upcounter%10+'0');
UART_A1_xmit ('\n');
UART_A1_xmit ('\r\n');
距离=(upcounter*1000)/58;
UART_A1_msg ("距离(厘米):");
UART_A1_Xmit ((距离/100)%10+'0');
UART_A1_Xmit ((距离/10)%10+'0');
UART_A1_Xmit (距离%10+'0');
UART_A1_xmit ('\n');
UART_A1_xmit ('\r\n');

上述代码旨在用于接收超声波传感器的值并使用计时器捕获模式测量距离。 Timer A 在10ms 内以时间间隔进行计数、而 Timer B 正在尝试捕获和计算距离。 但是、在索具边缘将向上计数器初始化为0、当它成为下降沿时、向上计数器将停止、并且不会尝试计算到该值的距离。 请解决此问题。

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

    器件型号:MSP430F5438A

    工具/软件:Code Composer Studio

    #include "user_timer.h"
    extern unsigned int upcounter;
    extern unsigned int 距离;
    extern void ReadSonar();
    空 Init_timer_A (空)

    /*TRIGGER 引脚设置(P1.3)*/
    P1DIR |= 0x08;
    P1OUT &=~(0x08);
    /*echo 引脚设置(P4.0)*/
    P4DIR &=~(0x01);
    P4SEL |= 0x01;

    TA0CTL = tassel_1 + MC_1;
    TA0CCTL0 = CCIE;
    TA0CCR0 = 327;

    TB0CTL = TBSSEL_1 + MC_1;// ACLK、upcount_mode、清除 TAR
    TB0CCTL0 = CM_3 + SCS + CCIS_1 + CAP + CCIE;



    #pragma vector=TIMER0_A0_VECTOR
    _interrupt void TIMER0_A0_ISR (void)

    ReadSonar();
    IF (CCIFG&TB0CCTL0)

    upcounter=0;
    UART_A1_msg ("upcounter:");
    UART_A1_Xmit ((upcounter/100)%10+'0');

    UART_A1_Xmit ((upcounter/10)%10+'0');
    UART_A1_Xmit (upcounter%10+'0');
    UART_A1_xmit ('\n');
    UART_A1_xmit ('\r\n');

    其他

    upcounter++;
    UART_A1_msg ("upcounter:");
    UART_A1_Xmit ((upcounter/100)%10+'0');
    UART_A1_Xmit ((upcounter/10)%10+'0');
    UART_A1_Xmit (upcounter%10+'0');
    UART_A1_xmit ('\n');
    UART_A1_xmit ('\r\n');
    距离=(upcounter*1000)/58;
    UART_A1_msg ("距离(厘米):");
    UART_A1_Xmit ((距离/100)%10+'0');
    UART_A1_Xmit ((距离/10)%10+'0');
    UART_A1_Xmit (距离%10+'0');
    UART_A1_xmit ('\n');
    UART_A1_xmit ('\r\n');

    上述代码旨在用于接收超声波传感器的值并使用计时器捕获模式测量距离。 Timer A 在10ms 内以时间间隔进行计数、而 Timer B 正在尝试捕获和计算距离。 但是、在索具边缘将向上计数器初始化为0、当它成为下降沿时、向上计数器将停止、并且不会尝试计算到该值的距离。 请解决此问题。

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

    我已经将您的线程合并为一个、因为它们看起来非常相似。

    您能不能满足计时器应该做什么? 计时器 A 每10ms 触发一次以发送 UART 消息、而计时器 B 应测量声纳?

    我想您的主要问题是 UART 调试命令。 这些消息最可能需要超过10ms 才能传输所有这些消息、因此您会不断地进入 ISR、而 Timer B 正在运行、并在发生这种情况时在后台进行更改。

    如果您希望保留 UART 命令用于调试、我建议降低计时器 A 的速度。使用它只能每秒触发一次超声波测量、等等

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

    我很清楚答案。 但是、UART 确认它在串行通信中正常工作、但器件存在问题、需要确认从传感器接收到值并进行捕获的时刻。 换句话说、在上面的代码中、TB0CCTL0 ==我用 CCI 配置了捕捉代码、但是它不能正常运行。 我怀疑我有传感器故障、但它适用于 Addoino。 因此、我认为我知道表示 R监测 捕获时刻的语法表达式以及下降捕获时刻的语法。 如果有任何想法、请告诉我。

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

    我刚刚查看了您的 TB0初始化代码、对我来说这是可以的。

    我确实注意到您正在 Timer A 中断中检查 TB0 CCIFG。 您还启用了 TB0 CC 中断、因此您应该有一个单独的 Timer B ISR、该 ISR 将在捕获发生时触发。

    您有 TimerB ISR 吗? 您能否检查它是否正在触发捕捉?

    谢谢、
    JD