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.

[参考译文] CCS/MSP430G2452:中断问题

Guru**** 2511985 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/633566/ccs-msp430g2452-interrupt-issue

部件号:MSP430G2452

工具/软件:Code Composer Studio

您好,  

我是微控制器编程的新手,我的问题与中断有关。 我在端口1的不同端口上创建了两个中断,我的代码如下。

我的问题是,如果已执行另一个中断,我不想运行该中断。 我使用变量执行此操作,方法是在 第一个IF语句中提供“int variable =(variable +1);”。  

如何使用正确的语法,以便在未满足变量的情况下不能输入第二个中断?

谢谢!

#include <MSP40.0.h>#define motor BIT0

#define LED_M BIT6.
#define bowl BIT3.
#define container BIT4.
#define LED_C BIT7

内部主(无效)

WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
P1DIR ||(马达+ LED_M + LED_C);//将WFP 1.0 设置为输出方向
P1OUT &=~(马达+ LED_M);//将WFP 1.0 设置为0 (LED熄灭)
P1IE ||(碗+容器);// WFP 1.3 和1.4 中断已启用
P1IFG &=~(容器+碗);//WFP 1.4 & WFP 1.3 IFG已清除

__enable_interrupt ();//启用所有中断
const int变量=0;

对于(;;)


}
}

//端口1中断服务例程
#pragma vector=Port1_vector
__interrupt void Port_1_ISR(void)

IF (P1IFG和BIT4)
//容器

P1OUT ^=(LED_C);
INT变量=(变量+ 1);
P1IFG &=~容器;//已清除WFP 1.3 IFG
p1IES ^= container;//切换中断边缘,当WFP 1.3 从HitoLow和LowtoHigh转到时,将调用中断向量


}
IF (P1IFG & BIT3 & variable==0)
//碗

P1OUT ^=(电机+ LED_M);// WFP 1.0 和WFP 1.6 切换
P1IFG &=~碗;// WFP 1.3 IFG已清除
p1IES ^= bow;//切换中断边缘,当WFP 1.3 从HitoLow和LowtoHigh转过来时,将调用中断向量

}}

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

    首先,如果您在主函数中定义了“变量”,您将无法在ISR中访问它。 您需要将其设置为全局变量(将其声明为不在任何函数范围内),然后在ISR中更改其值时,您无需重新定义它(无"int")。 此外,您能否澄清您尝试在逻辑上做什么? 如果您在引脚1.4 上获得中断,这是否意味着您不想处理引脚1.3 上触发的中断,反之亦然?

    此外,您可以使用switch语句,而不是使用带有中断标志的位掩码,如以下位置的pin示例所示: www.ti.com/.../getliterature.tsp

    希望这能有所帮助,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弥敦道
    感谢您的回复。 我尝试做的是,当一个中断被标记时,优先处理一个中断,而不执行另一个中断。 我使用中断是因为我的传感器无法检测到PxIN或Pxsel到我的应用程序所需的灵敏度。 要澄清,只有在pp 1.4 中断启动(标志)时,我才不想执行WFP 1.3 ,直到我重置微控制器。 我正在尝试添加一个变量,该变量将在pg 1.4 中允许我不为pg 1.3 输入中断。 我不确定如何正确执行此操作,并且很难找到此示例。
    谢谢你
    -Tim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Tim,

    感谢您的澄清。 您的逻辑看起来很好,因为您将在端口1上为任何引脚输入相同的ISR,如果已1.4 触发了WFP的中断,则您的附加变量将阻止执行WFP 1.3 的IF语句。 我看到的唯一问题是,您需要将该变量声明为全局变量,并更新ISR中的值(否则,每次您离开ISR时,该值都将丢失)。 这是一个一般的C编码问题,因此MSP430示例不一定会有所帮助。 请尝试一下,看看它是否能满足您的目标。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nathans说了什么,另外:
    > IF (P1IFG & BIT3 & variable==0)
    此条件始终为假。 您可能需要
    > IF ((P1IFG和BIT3)&& variable==0)

    根据您的描述,禁用WFP 1.3 IE可能是一种更简单的方法,例如:
    如果(P1IFG和容器) P1IE &=~碗;//切勿再次触发碗(WFP 1.3)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    弥敦道  

    很棒,谢谢!

    -Tim

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