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.

[参考译文] MSP430F5438A:捕获程序问题

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1083410/msp430f5438a-capture-program-issue

部件号:MSP430F5438A
“线程:测试”中讨论的其它部件

大家好,团队

以下是客户可能需要您帮助的一些问题:

Q1.定时器 B 使用捕获功能,并设置为上升边缘捕获。 以下是编写中断程序的两种方法:

A.

#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)

  IF ( TB0CCTL0和 CCI ){//low level captured

   //过程
   TB0CCTL0 &=(~CCIFG);//clear 中断标志

 }

}

B.

#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)

   //过程
   TB0CCTL0 &=(~CCIFG);//clear 中断标志

}

如果设置为仅限上升边缘捕获,他们将无法在中断程序中判断并直接处理,即您不必使用“IF( TB0CCTL0 & CCI )”语句。 是这样吗?

问题2.  选择定时器 B 进行脉冲计数时,P4.7用作时钟输入,P4.0用作输入方波作为捕获信号。 当 TBSSEL =0时,选择外部时钟输入。 计数是否基于外部信号的上升或下降边缘?

请帮您检查此案例? 谢谢。

此致,

樱桃

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

    问题1:如果您只在其中一个边缘触发,则不需要检查 CCI。 也许您不应该检查 CCI (在本例中),因为您对事件非常感兴趣,而不是对钉状态感兴趣。 (这种区别不太可能与156:1比率有关,但可能会在较紧的位置发生。)

    Q2:计时器在输入时钟上升边缘计数[参考(例如) 用户指南(SLAU208Q)图18-3]

    未经请求:

    >    TB0CCTL0 &=(~CCIFG);//清除中断标志

    您不应该这样做(即删除此行)。 进入 ISR [参考用户指南第18.2.6.1节]后,CCIFG (仅适用于 CCR0)将被自动清除,因此,如果它现在处于打开状态,它将指示您不想丢失的另一个事件。 (在这里,这在您的案例中不太可能重要,但将来可能会如此。)

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

    大家好,布鲁斯,

    感谢你的帮助。

    客户测试结果如下:

    计数开始后,不计算第一个跨接边线,第二个跨接边线开始计数。 如果第一个跨接边线是上升边线,则随后的计数是下降边线计数。 如果第一个过渡边线是下降边线,则随后的计数是上升边线计数。

    请检查一下。 谢谢。

    此致,

    樱桃

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

    我用 F5529 (我没有 F5438A)和 TA1CLK (无法访问 P7.7/TB0CLK)尝试了类似的实验。 我发现,这种计数器的作用是上升的边缘。

    具体而言,该程序在 P1.2上生成单个上升边缘,P1.2通过配线连接到配置为 TA1CLK 的 P1.6,TA1R 计数为1 (LED 灯)。

    F5529/F5438A 或 TA1/TB0可能在这方面采取不同的行动,但您的结果似乎更有可能受到您尚未发布的代码的影响。

    ///
    #include <msp430.h>
    #define HZ  1000000UL
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
        P1OUT  &= ~BIT0;            // Launchpad LED, initially off
        P1DIR  |= BIT0;
        //  P1.2 is an ordinary GPIO, patched to P1.6
        P1OUT  &= ~BIT2;            // P1.2 output, initially low
        P1DIR  |= BIT2;             //  (patched to P1.6)
        //  P1.6 is TA1CLK, fed from P1.2
        P1SEL  |= BIT6;             // P1.6 as TA1CLK
        TA1CTL = TASSEL_0 | ID_0 | MC_2 | TACLR; // TA1CLK/1, Continuous [,clear]
        __delay_cycles(HZ/2);       // Dawdle for a half-second
        P1OUT  |= BIT2;             // Rising edge to TA1CLK
        __delay_cycles(10);         // Allow for wire delay
        if (TA1R != 0u)             // If it ticked,
            P1OUT |= BIT0;          //  light LED
        while (1)
        {
            LPM0;
        }
        /*NOTREACHED*/
        return 0;
    }