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.

[参考译文] 编译器:MSP430F149捕捉模式 Timer B

Guru**** 2559890 points
Other Parts Discussed in Thread: MSP430F149

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/593775/compiler-msp430f149-capture-mode-timer-b

主题中讨论的其他器件:MSP430F149

工具/软件:TI C/C++编译器

大家好!


谁可以帮助我解决中断问题:

void main (void)


P4SEL=BIT0;

P1DIR |= BIT0;

P1SEL &=~ BIT0;
P1SEL|=BIT0;
P1DIR &=~BIT0;
timerB_init();
_BIS_SR (LPM0_Bits+GIE);


void timerB_init()

TBCTL=MC_2+TBSSEL_1+TBCLR+TBIFG;
TBCCTL0=CM_1_SCS+CCIS_1+CAP+CCIE;

#pragma vector = TIMERB0_vector
_interrupt void TIMERB0_Vector_ISR (void)

P1OUT &=~0x01;

不管用。 我尝试进入中断部分、但没有发生。 请您解释一下、原因是什么?  

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

    您好、Nastya、

    首先、我认为您没有正确设置 TBCTL 寄存器。 你不应该设置 TBIFG 位。 我还希望您尝试设置 TBIE 位、当在捕获模式中使用 TBCCR0时、这也是不必要的。

    接下来、您选择了 CCI0B 上的上升沿来触发捕获、并随后导致中断发生。  在 MSP430F149上、这是 P2.2。 需要将该引脚正确设置为输入、以便计时器能够检测上升沿。 然后、您还需要应用上升沿来引起捕捉。

    最后、请查看 MSP430x13x、MSP430F14x、MSP430F15x、MSP430F16x 代码示例(修订版 S)。 这些代码示例展示了如何在捕获模式下正确使用 TimerA、这与使用 TimerB 的方式非常相似。

    此致、  
    Caleb Overbay

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

    感谢您的回答!
    "接下来、您选择了 CCI0B 上的上升沿来触发捕获、并随后导致中断发生。 在 MSP430F149上、这是 P2.2。 需要将该引脚正确设置为输入、以便计时器能够检测上升沿。 然后、您还需要应用上升沿来引起捕捉。"
    在数据表中、我找到了这个:
    "P4.0/TB0通用数字 I/O 引脚/ Timer_B、捕捉:CCI0A 或 CCI0B 输入、比较:Out0输出"-这是否意味着我可以将此引脚和 CCI0B 或 CCI0A 用于捕捉模式?

    在 slac - TA_22中、我找到了捕获模式的 exaple、但在该 exaple 中、我找不到中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请您能向我解释一下为什么我需要使用 TBIV?
    如果我需要使用 TBCCR0中断。
    遗憾的是、我没有找到正确的捕获模式示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nastya、

    在上一个链接中可以找到显示如何使用 TimerA 完成此操作的示例。 文件名为 fet140_TA_22.c

    "P4.0/TB0通用数字 I/O 引脚/ Timer_B、捕捉:CCI0A 或 CCI0B 输入、比较:Out0输出"-这是否意味着我可以将此引脚和 CCI0B 或 CCI0A 用于捕捉模式?
    答:如果您使用的是 TimerB、则应将 P4.0用于 CCI0B。 如果您使用的是 TimerA、则应将 P2.2用于 CCI0B。 这可以在数据表的"TIMER_A3"和"TIMER_B7"部分中看到。

    请您能向我解释一下为什么我需要使用 TBIV?
    答:当使用 TBCCR0时、您不需要使用 TBIV、因为它有自己的专用中断向量。

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、它不起作用
    我在代码中进行了更改。
    但它仍然无法正常工作。 原因是什么?

    void main (void)


    P4SEL=BIT0;

    P1DIR |= BIT0;

    P1SEL &=~ BIT0;
    P1SEL|=BIT0;
    P1DIR &=~BIT0;
    timerB_init();
    _BIS_SR (LPM0_Bits+GIE);


    void timerB_init()

    TBCTL=MC_2+TBSSEL_2+TBIE;
    TBCCTL0=CM_1_SCS+CCIS_2+CAP+CCIE;

    #pragma vector = TIMERB0_vector
    _interrupt void TIMERB0_Vector_ISR (void)

    P1OUT &=~0x01;

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

    您仍无法正确设置 CCI0B 输入的引脚。 您几乎没有对原始代码进行任何更改。 您也不需要使用 TBIE。

    如前所述:
    如果您使用的是 TimerB、则应将 P4.0用于 CCI0B。 如果您使用的是 TimerA、则应将 P2.2用于 CCI0B。 这可以在数据表的"TIMER_A3"和"TIMER_B7"部分中看到。

    此外、请不要忘记、您需要在该引脚上具有上升沿以触发捕获。

    最后、您对该项目的最终目标是什么? 您是否只是尝试以特定速率切换 GPIO? 如果是、则捕获模式不是使用计时器来完成此操作的适当方式。

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是:"您仍然没有正确设置 CCI0B 输入的引脚。 您几乎没有对原始代码进行任何更改。 您也不需要使用 TBIE。"?

    在示例中、我已经设置了- P4SEL=BIT0;或者我需要添加 P4DIR|=BIT0?

    关于 TBIE:在你之前的回答中你说:"我也希望你尝试设置 TBIE 位、当在捕获模式中使用 TBCCR0时、这也是不必要的"-好吧、我理解你的意思。 我要更改它。

    "最后、您对该项目的最终目标是什么? 您是否只是尝试以特定速率切换 GPIO? 如果是、则捕获模式不是使用计时器来完成此操作的适当方式。 "-我需要捕获来自超声波传感器的输入信号、然后测量发送和接收信号之间的时间。 但在本示例中、如果发生捕获、我将尝试点亮 LED。

    void main (void)


    P4SEL=BIT0;

    P1DIR |= BIT0;

    P1SEL &=~ BIT0;
    P1SEL|=BIT0;
    P1DIR &=~BIT0;
    timerB_init();
    _BIS_SR (LPM0_Bits+GIE);


    void timerB_init()

    TBCTL=MC_2+TBSSEL_2;
    TBCCTL0=CM_1_SCS+CCIS_2+CAP+CCIE;

    #pragma vector = TIMERB0_vector
    _interrupt void TIMERB0_Vector_ISR (void)

    P1OUT &=~0x01;

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

    您好、Nastya、  

    我附加了能够成功进入 P4.0上升沿的 TimerB 中断的代码。

    我注意到您的代码有两个主要问题:

    1. 您未在执行开始时禁用 WDT
      1. 因此、该部件很可能会不断复位
    2. 您将 TimerB 捕获输入设置为 GND、而不是 CCI0B
      1. 原始代码为:TBCCTL0=CM_1+SCS+CCIS_2+CAP+CCIE
      2. 更改为:TBCCTL0=CM_1_SCS+CCIS_1+CAP+CCIE

    这是我能够正确执行的一些通用代码。 请注意、我已确保 P4DIR 和 P4SEL 均已正确设置以及禁用 WDT。 请测试一下、并告诉我您的想法:

    void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    P4DIR &=~BIT0;
    P4SEL |= BIT0;
    
    timerB_init();
    _bis_SR_register (LPM0_bits + GIE); // LPM0 +启用全局 INT
    }
    
    void timerB_init()
    {
    TBCCTL0=CM_1_SCS+CCIS_1+CAP+CCIE;
    TBCTL=MC_2+TBSSEL_2;
    }
    
    #pragma vector = TIMERB0_vector
    __interrupt void TIMERB0_vector_ISR (void)
    {
    __no_operation();
    } 

    此致、  

    Caleb Overbay

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

    尊敬的 Caleb:

    感谢您的快速回复。

    我已经尝试过您的示例、但它仍然不会转至矢量中断。

    请向我解释、如果我尝试 在寄存器中初始化 TBCCTL0、原因是:

    在 TBCCTL0 - CAP = 1、但 CCIFG = 0且 TBCCTL4 - CAP=0且 CCIFG = 1?

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

    我不确定为什么会设置该中断标志。 作为实验、您能否尝试使用 TimerA 而不是 TimerB 来设置此功能?

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

    亲爱的、Caleb

    我尝试更改计时器、但没有任何变化。

    void timerB_init()

    TACCTL0=CM_1_SCS+CCIS_1+CAP+CCIE;
    TACTL=MC_2+TASSEL_2;

    #pragma vector = TIMERA0_vector
    _interrupt void TIMERA0_vector_ISR (void)

    //P1OUT ^= 0x01;
    __no_operation();

    void main (void)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    // Timer A

    P1DIR &=~BIT6;
    P1SEL |= BIT6;

    //LED

    P1DIR |= BIT0;
    P1SEL &=~BIT0;
    P1OUT |=BIT0;
    P1OUT &=~BIT0;

    timerB_init();
    _bis_SR_register (LPM0_bits + GIE);// LPM0 + Enable global INT

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

    您需要将 P2.2用于 TimerA CCI0B 输入、而不是 P1.6。

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

    尊敬的 Caleb:

    发生了什么。 请查看下图:

    请您向我解释一下这个问题以及如何解决这个问题?
    寄存器中的内容与 Timer B 中的内容相同

    #include "MSP430F149.h"

    #include "stdio.h"

    void timerB_init()

    TACCTL0=CM_1_SCS+CCIS_1+CAP+CCIE;
    TACTL=MC_2+TASSEL_2;

    #pragma vector = TIMERA0_vector
    _interrupt void TIMERA0_vector_ISR (void)

    P1OUT ^= 0x01;
    //__no_operation();

    void main (void)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    P2DIR &=~BIT2;
    P2SEL |= BIT2;

    //P4DIR &=~BIT0;
    //P4SEL |= BIT0;

    P1DIR |= BIT0;
    P1SEL &=~BIT0;
    //P1DIR &=~BIT0;
    P1OUT |=BIT0;
    P1OUT &=~BIT0;

    timerB_init();
    _bis_SR_register (LPM0_bits + GIE);// LPM0 + Enable global INT

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

    我已经尝试使用 Timer B 调试您的示例、但它现在也不起作用。
    发生什么事了? 如何解决此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nastya、

    我不确定是什么问题。 我已经测试了我提供的代码、并验证它是否正常工作。 我认为您应该返回到我提供的 fet140_t1_22.c 示例、并在您的设置中对其进行测试。 这是另一个已被验证可以正常工作的示例。 测试一下、让我知道结果。 如果无法正常工作、我们需要仔细检查您的测试程序。

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

    您是否能够解决此问题? 您是否还有未回答的问题?

    此致、
    Caleb Overbay