MSP430F5418端口中断发生在从高到低和从低到高的转换中

时间:2011-07-02 14:22:38

标签: c embedded msp430

我已将MSP430F5418 P2.5设置为从高到低转换。但我正在接受从低到高和从高到低转换的中断。请在下面的我的代码片段。


    P2OUT |= BIT5   /* Enable P2.5 internal resistances */
    P2REN |= BIT5   /* Set up P2.5 as pull-Up resistances */

    P2IES |= BIT5;    
    P2IE  |= BIT5;    
    P2IFG &= ~BIT5;   /* P2.5 IFG cleared */


#pragma vector=PORT2_VECTOR
__interrupt void port2_interrupt (void)
{
    switch (P2IV)
    {
        case 0x0CU:
        {
            /* Do something here */
            P2IFG &= ~BIT5;
            break;
        }
        default:
        {
            /* No Action */
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

汉斯,我没有使用开关来断言引脚。它实际上是由另一个处理器完成的。我在TI(德州仪器)论坛上得到了一个答复,即在从低到高的转换过程中可能存在隐藏的从高到低的信号,反之亦然。

所以,我修改了我的代码如下,它工作正常。

...

 P2OUT |= BIT5 ;   /* Enable P2.5 internal resistance */
 P2REN |= BIT5;    /* Set up P2.5  as pull-up resistance */

 P2IES |= BIT5;    /* Sets P2IFG for high to low transition */
 P2IE  |= BIT5;    /* P2.5 interrupt enabled */
 P2IFG &= ~BIT5;   /* P2.5 IFG cleared */
...

#pragma vector=PORT2_VECTOR
__interrupt void port2_isr (void)
{
    switch (P2IV)
    {
        case 0x0CU:
        {
            TA1CCTL0 &= ~CCIE;
            TA1CCR0 = 0U;
            TA1CCTL0 |= CCIE;
            TA1CCTL0 &= ~CCIFG;
            TA1CCR0 = TA1R + 15U;
            P2IFG &= ~BIT5;
            break;
        }
        ...
        ...
    }
}

#pragma vector = TIMER1_A0_VECTOR    /*  Timer1_A3 CC0 */
static __interrupt void _timer1_ao_isr (void)
{
    TA1CCTL0 &= ~CCIE;
    if ((P2IN & BIT5) == 0U)
    {
       // Got a valid high-to-low assert here!!!
    }
}

答案 1 :(得分:0)

实际上不是一个答案,只是一个建议,将你的变量重命名为更有意义的东西,两个月后你就不会记得BIT5是你检查从高到低转换的引脚。您可以使用define将BIT5重命名为HIGH_TO_LOW_PIN。您可以使用计时器设置执行相同的操作,将其重构为更有意义的内容。