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.

[参考译文] MSP430F2011:关于P1IV的基本问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1100564/msp430f2011-basic-question-on-p1iv

部件号:MSP430F2011

我有以下ISR用于端口1 .....我遇到了交换机问题。  如果我进入ISR,但仅设置了BI既 可以使用交换机,也可以使用BIT4或BIT5,但如果我进入ISR,BIT4和BIT5都设置了,则交换机跳转到默认位置,而不会执行。  这让我想知道ISR中怎么可能有一个交换机,因为您必须有128个单独的案例语句,一个用于位0到7的每一迭代以及所有组合。   例如,在 以下情况下,P1矢量如何处理(PI1FG = 11万)?

#pragma vector=PORT1_VECTOR
__interrupt void inputs(void)
{
    switch( P1IFG )
    {
    case 4:
        //trigger 1
        P1IE &= ~BIT2;
        P1IFG &= ~BIT2;
        ISR.trig1 = true;
        break;
    case 16:
        //trigger 2
        P1IE &= ~BIT4;
        P1IFG &= ~BIT4;
        ISR.trig2 = true;
        break;
    case 32:
        //debug mode enable debounce
        P1IE &= ~BIT5;
        P1IES ^= BIT5;
        P1IFG &= ~BIT5;
        CCR0 = (TAR + DEBOUNCE); //~~50ms
        CCTL0 &= ~CCIFG;
        CCTL0 |= CCIE;
        break;
    default:
        break;
    }
    LPM3_EXIT;
}

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

    在具有静脉输液寄存器的硬件上,您可以使用类似的case语句,因为它一次只返回一个值。 在处理IFG寄存器时,您不能使用类似的case。 它的使用更容易,更高效:

    if(P1IFG & BIT4) 
      {}
    if(P1IFG & BIT5)
      {}

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

    谢谢David。。

    这也是我找到的路径...然而...我发现你必须使用  

    否则,如果  

    如果在这两种情况下都使用IF,则当您进入ISR时,它将评估这两个IF语句,而不考虑启用

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

    如果测试顺序与IE设置匹配,则使用"else if"仅解决当IE标志不是时设置IFG标志的问题。 如果使用禁用的IE位设置中断标志是一个问题,则必须在“IF”语句中包括IE寄存器。 "IF (P1IE和P1IFG & BIT5)"