我已经使用了一个名为Thunderbird12的16位微控制器建立了一个项目,类似于9S12/Freescale 68hc12家族。它做了一些事情,但主要是打开外部水泵。一切正常,除了我需要实现中断。我希望能够通过按下按钮中断停止电动机。
我已经设置了将端口P的引脚0设置为高高的按钮。使用C,我已经初始化了硬件并编写了代码,但没有调用标志。请参阅下面的代码。
// Interrupt function
int interruptFlag;
void interrupt 56 WaterPumpRoutine() {
if ((PIFP & 0x01) == 0x01) { // check if pin 0 of port p is high (when button is pressed)
interruptFlag = 1; // set the flag to 1
}
// Main
void main() {
DDRP = 0x00; // set port P as input
PIEP = PIEP | 0x01; // enable interrupts on port P, pin 0
PERP = PERP | 0x01; // enable pull-up/down on port P, pin 0
if ( interruptFlag == 1)
PORTB = (PORTB & 0x00) // Here I'm turning off all the pins in Port B, which includes the pump.
}
如果将此代码PORTB = (PORTB & 0x00)
放入WaterPumpRoutine()
函数中,则可以正常工作,但是我需要能够在任何地方调用标志。我不确定我缺少什么。任何帮助将不胜感激!
假设中断呼叫正常。
- 将变量
int interruptFlag;
更改为volatile int interruptFlag;
。这是为了避免通过编译器在MAIN中优化if
条件。 -
在
main
中,您需要在某种情况下重置interruptFlag
。这取决于程序。也许您可以这样做。if ( interruptFlag == 1) { PORTB = (PORTB & 0x00) // Here I'm turning off all the pins in Port B, which includes the pump. interruptFlag = 0; }
-
如果您使用的是按钮,则应介绍访问机制以避免检测多个输入。
-
您需要在一段时间内(1(循环中添加IF条件,因为中断可能随时出现。
while(1) { if(interruptFlag == 1) { ... } }
如果您仍然无法中断开火,则在其他建议的事情之后,您应该检查是否在大多数UC设置中启用了特定零件(GPIO((GPIO(GPIO生成中断不会启用中断