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.

[参考译文] MSP430G2553:如果几乎同时触发、则端口1标志'丢失

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1259526/msp430g2553-port-1-flag-s-being-missed-if-triggered-nearly-simultaneously

器件型号:MSP430G2553

如标题所述、我将使用 P1.1和 P1.2来触发端口1中断服务例程、在下降沿触发。 请参见传入波形下降沿的屏幕截图。

在本例中、它们之间的间隔大约为3微秒。 当它们之间的间隔在~5微秒内时、无论哪一秒出现、似乎都不会发出它的标志。

端口1设置:

P1DIR &= ~(2 + 4);  //Set P1.1 & P1.2 to Input
P1IES |= (2 + 4);   //Interrupt Edge Selection - high to low (1->0)
P1IE |= (2 + 4);    //P1.1 & P1.2 Interrupt Enable
P1IFG &= ~(2 + 4);  //Clear Interrupt Flags

端口1 ISR

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
#else
#error Compiler not supported!
#endif
    {
    switch(P1IFG) {
        case 2: //P1.1
            doStuff();
            P1IFG &= ~(BIT1); //Clear IFG P1.1
            break;
        case 4: //P1.2
            doStuff();
            P1IFG &= ~(BIT2); //Clear IFG P1.2
            break;
        case 6: //BOTH P1.1, P1.2
            doStuff();
            P1IFG &= ~(BIT1+BIT2); //Clear IFG P1.1 and P1.2
            break;
        default:
        //do nothing
}

我对 MSP430中断架构的理解是、如果 P1IFG 中的另一位在 ISR 期间被提出、在 ISR 完成后、它应该立即重复其自身来处理下一个提出的标志。

g2553需要手动降低标志、因此它不是冗余的。

我之所以忽略它的理论是在"P1IFG &=~(BIT1)"的"读取、修改、写入"操作期间;此标志会在寄存器读入存储器后出现、这样、当修改后的数字被重新放入寄存器时、自升高后的标志会意外被清除。

我对这个理论有问题,但我目前没有更好的解释。

第二个中断标志未被发出有什么原因吗? 是不是有些后端架构问题?

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

    如何判断第二个标志未设置? 您是在调试器中查看 P1IFG,还是 DoStuff()以某种方式找出它?

    > 开关(P1IFG){

    为了确保你测试你认为你是什么,我建议:

    > 开关(P1IFG 和(BIT1|BIT2)){

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

    我将使用中断来通过记录时间戳并提出一个计算标志来测量传入波形的频率。 main()获取 oldtime - CurrentTime 的差异来找出波形周期。

    doStuff()处理两件事情:
    -将 TA0R 值记录到 CurrentTime 变量中
    -向 main ()发出一个标志,表示可以计算新的时间差。  

    我相当肯定的是、IFG 没有被提出、或者至少没有正确执行、因为偶尔会使用一个精确的双精度值来计算"双精度"持续时间。 "双精度"持续时间在"同步"边沿之后的下一个下降沿上计算、 这两个边沿之间的间隔为~5微秒。 (pic 1、原始发布)进一步测试确认了其存在、因为未检测到边缘、并且相应的 ISR 未处理数据。

    交换机(P1IFG &(BIT1|BIT2))[/报价]

    我来试一下、看看它是否有任何变化、所有其他 P1IE 位都被设置、使得其他 Port1端口不应提高标志、并且使用调试器、我从未见过任何其他位被提高、但仍然是一个增加有效性的好主意。

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

    主动:P1.1/.2为 TA0.0/.1。 是否考虑过使用计时器采集? 你的这些动作听起来很自然。

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

    如果可以的话,我会同意的。 我已经将计时器 A1和计时器 A0用于其他计时任务。

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

    我来试一下、看看它是否有任何变化、所有其他 P1IE 位都被设置、使得其他 Port1端口不应提高标志、并且使用调试器、我从未见过任何其他位被提高、但仍然是一个增加有效性的好主意。

    [/报价]

    更新了这个、观察到了相同的行为。 按位对其他可能的标志源进行与运算不会停止该问题。

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

    P1IFG 位 的出现与 P1IE 位无关。 对于您不感兴趣的内容、通常会设置 IFGs。

    您测量的信号速度有多快? 在调用 doStuff()之前,用战术(假设信号不抖动)清除 IFG 可能是明智的。

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

    如果要使用 IV 寄存器、则可以在此处使用 switch 语句。 但您不能因此跳过开关并直接测试 IFG 的位。

    至于在读取修改写入操作期间出现的边沿意外清除标志这一想法、可以是这样。 但这是不可能的。 "P1IFG &=~BIT1;"应转换为单个"BIC"指令。 对 P1IFG 的读取和写入将在顺序 MCLK 周期发生。 除非 P1IFG 中另一位的设置进入该间隙、否则它不能意外地被清除。

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

    信号本身速度不是很快。 传入波形 在0到几百 Hz 之间移动。 主要的复杂问题是我有两个通过端口1捕获的波形、由于这两个波形的频率略有不同、它们滑入和滑出相位、因此所选下沿之间的时间会有很大差异。

    如果波形1和波形2相对同相、以至于它们的下降沿彼此相差不到~5微秒、则会出现问题。 它们与 PORT1_ISR 函数正常之间的任何较长时间。

    我会将 IFG 清除移至开始位置、我同意它可能会有所帮助。