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.

[参考译文] MSP430FR2355:P1IN 未捕获???

Guru**** 2538955 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/898219/msp430fr2355-p1in-not-capturing

器件型号:MSP430FR2355

你好。

我正在尝试每1/10秒捕获 P2IN 和 PI1N…TIMER2在后台运行并收集引脚历史记录。  如果按键 Port1矢量被命中、则启动2秒计时器(TIMER0 ISR)。  在2秒计时器到期后、我立即禁用 TIMER2 ISR 并查看历史记录数组。  它永远不会显示 P1IN 状态的变化...P1IN 被配置为一个带有下拉电阻器的输入。  如果我在 TIMER2 ISR 中放置了一个断点、在这里我将指向历史记录开头的指针复位以进行翻转、我可以看到历史记录中的变化、显示它已读取 P1IN....please。有人可以向我解释为什么在 TIMER0中禁用 TIMER2后中断时、历史记录是为什么的 阵列恢复为00???  我使用的是 MSP430FR2355EVM 板。  还有一个简短的话术...如果我在2秒的时间内保持3.3V 至 P1引脚之一、所有历史记录都会显示它已捕获...但是、我想知道为什么>1/10s 和<2s、我看不到任何捕获?

#pragma vector=TIMER2_B0_vector // CCIE 每隔十分之一秒
__interrupt void m100SecondTimerB2 (void)
//滚动计数器...在20次点击后或2秒复位 计时器关闭
{
TB2CCR0 += TENTHSEC;
*pHistory =(无符号)((P2IN << 8)|(P1IN));
*pHistory &=~(0xF701);//屏蔽未使用的引脚
pHistore++;
if (pHistory > history + 19)
pHistory =历史记录;
}

//#pragma vector=TIMER0_B0_vector // CCIE 每隔十分之一的秒
__interrupt void m100SecondTimer (void)
{
TB0CCR0 += TENTHSEC;
*pHistory =(无符号)((P2IN << 8)|(P1IN));
*pHistory &=~(0xF701);//屏蔽未使用的引脚
pHistory++;
}*/

#pragma vector=TIMER0_B1_vector // TBIE 溢出_中断
失效二级计时器(空)
{
switch (__evo_in_range (TB0IV、TB0IV_TBIFG))
{
案例 TB0IV_NONE:break; //无中断
案例 TB0IV_TBCCR1:break; // CCR1未使用
案例 TB0IV_TBCCR2:中断; //未使用 CCR2
案例 TB0IV_TBIFG: //溢出
远程= T;
TB2CCTL0 &=~CCIE;
pHistory =历史记录;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 ISR 和唤醒、在 main 中处理
中断;
默认值:break;
}
}

//ISR、用于开/关按钮
#pragma vector=Port1_vector
__interrupt void indicatorButtons(void)
{
launchTimerSeq();
开关(__evo_in_range (P1IV、16))
{
案例4://P1.1
指示器^= SW1;
P1IFG &=~BIT1;
中断;
判例6://P1.2
指示器^= SW2;
P1IFG &=~BIT2;
中断;
判例8://P1.3
指示器^= SW3;
P1IFG &=~BIT3;
中断;
判例10://P1.4
指示器^= SW4;
P1IFG &=~BIT4;
中断;
判例12://P1.5
指示器^= SW5;
P1IFG &=~BIT4;
中断;
判例14://P1.6
指示器^= SW6;
P1IFG &=~BIT6;
中断;
判例16://P1.7
指示器^=全部;
P1IFG &=~BIT7;
中断;
默认值:
中断;
}
} 

任何想法…

谢谢你

Steve

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

    历史记录从什么意义上"恢复"为0? 是否有非0条目、但当您断点时、它们都已被清除? 尝试在 main()的第二行设置断点,以防出现意外重置。

    P1.x 上连接了哪种类型的开关? 它们是两位还是瞬时的? 端口中断识别开关状态中的变化、而不是电平、此外、大多数物理开关还需要某种形式的去抖。

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

    你好 Bruce。。。。

    我会尽最大努力回答...我已经缩小了项目的范围以了解这一点,并附上了完整的代码(减去函数详细信息)...我也很乐意发送这些代码。

    1. 历史在开始时根据定义被清零..... 在此测试代码中、我在 TIMERB0关闭后执行 memset。   

    2. 如果我在 pHistory = history 时在 TIMER2内断开、我会看到 P1发生变化。  但是、如果我移除这个断点并将一个置于 TIMER0中的 pHistory = History、所有更改都消失了、我看到0x00 (基本上是 IOConfig 宏的下拉菜单)...如果我更改为上拉、我会得到它们、即0xFE (位0是输出)。

    3.由于 main 中存在问题,我从 main 恢复到 TIMER0中,所以我要备份到这里的源代码

    好 的、我使用的是 EVAL 板、没有开关(是的、我知道去抖)。  我只需使用一根跳线、然后沿着 P1引脚敲击它、即可看到它们每隔十分之一秒就会记录变化(即记录历史记录)。  我知道端口1矢量是纯中断驱动的。

    5. 基本上,我要做的是有一个运行背景(即 TIMER2)不断地测量 PIN。  当 P1 IRQ 关闭时。 我想启动两秒钟的计时器来验证是否有任何引脚被置为有效2秒钟。  在主代码中、我将查看历史记录、并在任何具有2秒保持时间的引脚上查看通过或失败。  我也不想丢失我捕获的其他引脚状态、该状态可能在2秒以内、因为它也有值。。。。此外、一旦我在 main 中唤醒并执行此任务、我想重新启用开关设置。。。。在此代码中、您看不到我禁用 P1 但在 TIMER0中、我很可能会冻结捕获的边沿。

    希望这对我有所帮助…我真的很难用这些 PxIN…他们不是很友好使用…如果我只关心它们,TIMER2可以正常工作,但试图从 P1上抓取边缘似乎会把一切都烧毁

    谢谢

    Steve

    #include 
    #include 
    #include 
    #include "rc.h"
    #include "LPRSnot.h"
    
    volatile unsigned int history[20]={0}、* pHistory;
    volatile char indicator = 0xFE;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    pHistory =历史记录[0];
    IOconfig;
    initClockTo16MHz();
    initTimerB0();
    initTimerB2();
    _bis_SR_register (LPM3_bits + GIE);
    }
    
    #pragma vector=TIMER2_B0_vector // CCIE 每秒的十分之一
    __interrupt void m100SecondTimerB2 (void)
    //滚动计数器...在20次点击后或2秒复位 计时器关闭
    {
    TB2CCR0 += TENTHSEC;
    *pHistory =(无符号)(P1IN);
    *pHistory &=~(0x01);//屏蔽未使用的引脚
    pHistore++;
    if (pHistory > history + 19)
    pHistory =历史记录;
    }
    
    #pragma vector=TIMER0_B1_vector // TBIE 溢出__interrupt
    void twoSecondTimer (void)
    {
    switch (__evo_in_range (TB0IV、TB0IV_TBIFG))
    {
    案例 TB0IV_NONE:break; //无中断
    案例 TB0IV_TBCCR1:break; // CCR1未使用
    案例 TB0IV_TBCCR2:中断; //未使用 CCR2
    案例 TB0IV_TBIFG: //溢出
    pHistory =历史记录;
    memset (history,0,20*sizeof (history));
    中断;
    默认值:break;
    }
    }
    
    //ISR、用于开/关按钮
    #pragma vector=Port1_vector
    __interrupt void indicatorButtons(void)
    {
    TB2CCTL0 |= CCIE;
    launchTimerSeq();
    开关(__evo_in_range (P1IV、16))
    {
    案例4://P1.1
    指示器^= SW1;
    P1IFG &=~BIT1;
    中断;
    判例6://P1.2
    指示器^= SW2;
    P1IFG &=~BIT2;
    中断;
    判例8://P1.3
    指示器^= SW3;
    P1IFG &=~BIT3;
    中断;
    判例10://P1.4
    指示器^= SW4;
    P1IFG &=~BIT4;
    中断;
    判例12://P1.5
    指示器^= SW5;
    P1IFG &=~BIT4;
    中断;
    判例14://P1.6
    指示器^= SW6;
    P1IFG &=~BIT6;
    中断;
    判例16://P1.7
    指示器^=全部;
    P1IFG &=~BIT7;
    中断;
    默认值:
    中断;
    }
    }
    

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

    This looks suspicious. sizeof(history)==(20*2), so this runs far off the end. That may or may not bear on your symptom, but it's a good way to produce random results.

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

    没有 sir....checked 这是因为我最初有20个字段...事实证明 memset 需要该字段中的一个字节,而历史记录是一个整数...当我放置20时,只有一半的数组被清除。

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

    我建议:

    >         memset(history, 0, sizeof(history));

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

    还可以……我会尝试一下,但它仍然不能解决我的问题……这条线被推迟到代码中,试图尝试东西… 有什么关于 PxIN 的想法吗?

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

    我建议您在决定它不会修复任何问题之前尝试一下它。 一种可能是通过 pHistory 进行写入、而您在位置0进行记录。 这可能会导致复位(这将触发您在 main[2]中设置的断点)、但在任何情况下、它永远不会重新计数到&history[0]。

    您提到过、您是通过将(3V3)导线触碰其中一个 P1.x 引脚来进行测试的。 请记住、当您触摸引脚和拔下导线时、您都会看到反弹。 您没有显示 launchTimerSeq、但我猜它会重置计时器(因此您可以得到完整的2秒)。 每次引脚退回时都会发生这种情况、因此、一般来说、您的所有历史记录[]条目都是相同的;如果您在2秒内移除该线、则所有条目都将为0。 尝试将导线保持在接触位置2秒钟。

    [编辑:少量措辞修正。]

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

    是的,我遇到了我多次进入 P1矢量的事实...我认为这是一个大问题 我现在只允许定时器启动一次......

    感谢你的帮助。