如何使用微控制器在C中实现中断标志



我已经使用了一个名为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()函数中,则可以正常工作,但是我需要能够在任何地方调用标志。我不确定我缺少什么。任何帮助将不胜感激!

假设中断呼叫正常。

  1. 将变量int interruptFlag;更改为volatile int interruptFlag;。这是为了避免通过编译器在MAIN中优化if条件。
  2. 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;
    }
    
  3. 如果您使用的是按钮,则应介绍访问机制以避免检测多个输入。

  4. 您需要在一段时间内(1(循环中添加IF条件,因为中断可能随时出现。

    while(1)
    { 
        if(interruptFlag == 1)
        {
            ...
        }
    }
    

如果您仍然无法中断开火,则在其他建议的事情之后,您应该检查是否在大多数UC设置中启用了特定零件(GPIO((GPIO(GPIO生成中断不会启用中断

最新更新