Как реализовать флаги прерываний в C, используя микроконтроллер? - PullRequest
2 голосов
/ 22 мая 2019

Я создал проект с использованием 16-битного микроконтроллера Thunderbird12, аналогичного семейству 9s12 / Freescale 68HC12. Он делает несколько вещей, но в основном включает внешний водяной насос. Все работает нормально, кроме того, что мне нужно реализовать прерывание. Я хочу иметь возможность остановить двигатель с помощью прерывания через кнопку.

Я установил кнопку, которая устанавливает высокий уровень на выводе 0 порта P при нажатии. Используя 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(), он будет работать нормально, но мне нужно иметь возможность вызывать флаг где угодно. Я не уверен, что мне не хватает. Любая помощь будет оценена!

Ответы [ 2 ]

4 голосов
/ 22 мая 2019

Предполагая, что вызов прерывания работает нормально.

  1. Измените переменную int interruptFlag; на volatile int interruptFlag;.Это сделано для того, чтобы компилятор не оптимизировал условие if в main.
  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. Вам необходимо добавить условие if в main в цикле while (1), так как прерывание может произойти в любое время.

    while(1)
    { 
        if(interruptFlag == 1)
        {
            ...
        }
    }
    
0 голосов
/ 22 мая 2019

Если вы все еще не можете получить прерывание для запуска, после того, как другие предложили, вы должны проверить, включены ли глобальные прерывания или прерывания для определенной части (GPIO), так как в большинстве uc настройка GPIO для генерации прерываний не позволяет перебивает

...