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.

[参考译文] MSP430F5524:if-else 环路不能正常工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/829384/msp430f5524-if-else-loop-not-working-properly

器件型号:MSP430F5524

(我之所以重新发布此帖子、是因为我第一次发布它时选择了问题出在 CCS 中。 我不知道这是不是这样,以及是否会让公众看到前一篇文章。)

我正面临一种非常奇怪的情况。 我正在函数内使用一系列 if-else 环路来确定不同 GPIO 下的信号变为低电平。 在输入断点(或实时执行)时、即使条件明显为 false、也会输入其中两个 if 循环。 为您提供一个示例、

uint08 val = P6IN & 0x40;//值为0x40或64。 输入信号也已在 CRO 中进行验证。 P6.6一直处于高电平

情况(I):

if (val ==45)

//程序流在此输入

情况(ii):

if (val!= 64)

//程序流在此输入

请找到所附的屏幕截图。 我已经尝试了多种其他方法来实现这一目标、例如仅执行 if ((P6IN & 0x40)!= 0x40)、但行为不变。 有趣的是、函数中的其他 if-else 环路工作正常。

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

    我真的无法从您的代码段中说出任何内容。 但我应该指出:

    if (keyProjOnOff)
    {
    keyProjOnOff = 0;
    }
    否则
    {
    keyProjOnOff = 1;
    }
    

    可以更轻松、更合议地写成"keyProjOnOff =!keyProjOnOff;

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

    1)每个 if()块为空。 您如何知道您的计划是如何输入的?

    2) 2)我看不到在哪里分配了"val"。 您发布的代码片段是否在某个位置可见? 尝试将其声明为"volatile"。

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

    你好 Bruce

    (1)我知道代码输入了它们、因为程序在输入断点后一直停留在那里。 您可以在 IF 部分的末尾记下绿色光标。 我最初想知道输入它们是因为正在从特定的 IF 环路部分内部调用另一个函数。 这只是发布目的的简单方案。

    (2)发布的代码片段可以看到"val"。 我将尝试将其声明为易失性并告知您、但原始代码具有 if ((P6IN & 0x40)!= 0x40){ }、其中代码用于输入、尽管引脚6.6持续处于高电平、但我已在示波器和 万用表上验证过该值。 P6.6没有其他地方发生变化。 P6.2也会观察到相同的行为。  

    我认为在检查输入引脚为高电平或低电平的情况时存在一些问题。 CCS 优化参数是否存在问题?

    谢谢

    Abhishek

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

    如果您怀疑代码生成有问题、请检查代码。 这几乎肯定是您编写的内容而不是代码生成器的问题。 当您的意思是"!"时、使用"|"的简单方法。

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

    尊敬的 David:

    我找不到代码明显有问题的地方。 可以通过其他方法编写相同的代码行、例如使用 switch case 语句、但这种代码方式已在其他 IF 部分中使用、并且一直正常工作。 在项目中的几乎所有位置、我们都以这种方式读取 GPIO 上的输入:  if ((P6IN & 0x40)!= 0x40){}来检测 P6.6变为低电平。 我最近才发现这种情况在一些地方不能如预期的那样运作。 线路是否存在不正确/技术不充分的问题? 我如何克服这个问题? 我曾考虑过几种方法、包括使用 switch case 语句、将 P6IN 寄存器的值保存在 全局变量或易失性变量中。 P6IN 无法配置为上升/下降沿中断、否则我本会这么做。

    谢谢

    Abhishek

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

    我希望 Schultz 先生提到的是汇编代码。

    在调试器中尝试"View->Disassembly"或"Build Settings->Compiler->Advanced->Assembler Options->Generate listing file"。  

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

    Abhishek、您好!

    我同意建议、仔细研究反汇编、包括单步执行代码并同时在引脚上应用相应的信号、您在该引脚上期望根据输入状态进行响应。 在 IDE 的寄存器窗口中、单步执行时应同时查看 P6IN 寄存器的状态、在执行的每个步骤上应反映实际的引脚信号状态、您可以在外部应用该状态。

    如果在 IDE 的寄存器窗口中看不到 P6.6输入状态在单步执行上得到正确反映、请检查是否确实选择了 GPIO 输入功能。 另请考虑一个潜在的硬件问题。 引脚是否可能会受到 ESD 损坏?

    至少在圆顶范围内、您可以使用 P6.6的比较器功能来检查这一点。 此 BTW 可能是处理中断的一种方法、它使用比较器输入来检查 P6.6输入状态、以防将其用于其他应用功能。

    此致、

    Peter

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

    您好、Peter、Bruce

    我目前没有这块板。 我将在收到后的一两天内更新您的信息。

    谢谢

    Abhishek

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

    您好、Abhishek、

    您这边有任何更新吗? 我们是否要关闭它?

    此致

    Peter