цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Как использовать прерывания Arduino для обнаружения пользовательского ввода



Как использовать прерывания Arduino для обнаружения пользовательского ввода

Автор: Mike(admin) от 23-11-2023, 03:55

Некоторым программам Arduino необходимо своевременно реагировать на конкретные важные события. Одним из примеров такого события является обнаружение нажатия кнопок. В идеале Arduino должен реагировать на ввод как можно скорее. Однако повторное считывание состояния цифрового контакта, к которому подключена кнопка, не является хорошим решением. Лучший способ добиться такого поведения – использовать прерывания Arduino. В данном материале рассмотрим различные типы прерываний и способы их использования в ваших собственных программах Arduino.


Как использовать прерывания Arduino для обнаружения пользовательского ввода

На платах на базе микроконтроллеров AVR, таких как Arduino UNO, вы можете использовать несколько прерываний в своих собственных скетчах Arduino. Обычно вы используете только два: прерывания по таймеру и аппаратные прерывания. Вы можете узнать больше о других типах прерываний и о том, когда микроконтроллер (МК) их вызывает, в документации на микроконтроллер вашего Arduino. Прерывания по таймеру – отличный способ избежать использования блокировки вызова функции delay() в вашей программе Arduino. Второй тип, называемый аппаратными прерываниями, позволяет реагировать на внешние события, которые изменяют состояние одного из контактов ввода/вывода общего назначения (GPIO) Arduino. Такими событиями могут быть нажатия кнопок, сигнал внешнего датчика о готовности считывать значения или начало последовательности передачи данных.


Хотя вам придется настраивать их по-разному, все прерывания работают одинаково. Сначала вы определяете, какое событие должно прослушивать оборудование. В случае прерываний по таймеру это может означать, что указанный период истек. Для аппаратных прерываний, которыми может быть переключение контакта GPIO с HIGH на LOW. Затем сообщите Arduino, что делать, как только он обнаружит это событие. Обычно это вызов функции, который в этом контексте обычно называется процедурой обработки прерываний (ISR). Как только оборудование обнаруживает событие, оно автоматически вызывает ISR, и МК выполняет ваш собственный код.


Во-первых, важно отметить, что некоторые платы Arduino не могут использовать прерывания на всех своих контактах GPIO. Пожалуйста, изучите документацию относительно этого. Как только вы определите, какие контакты ваш Arduino может использовать для обнаружения прерываний, будет время создать собственный ISR-обработчик и прикрепить прерывание к одному из контактов. В нашем примере мы будем использовать стандартную плату Arduino Uno. Следовательно, мы можем определять собственные прерывания, используя цифровые контакты 2 и 3.



volatile bool execute = false;

void setup()
{
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), onDetectInterrupt, FALLING);
}

void onDetectInterrupt()
{
  /* Arduino вызывает эту функцию, когда обнаруживает спадающий фронт на выводе 2 */
 
  execute = true;
}

void loop()
{
  /* Другой код */

  if(execute)
  {

	// Не забудьте сбросить флаг
	execute = false;
  }
}

Первая строка метода setup() инициализирует второй цифровой вывод в качестве входа, а также использует внутренние подтягивающие резисторы Arduino. Это означает, что вывод остается в состоянии ВЫСОКИЙ, пока он не будет активно подключен к GND, например, путем нажатия кнопки, которая переводит вывод в НИЗКИЙ уровень. Следующая строка функции setup() присоединяет прерывание ко второму контакту. Обратите внимание, как мы настроили его на обнаружение падающих фронтов. Вывод обычно находится в состоянии ВЫСОКИЙ, если его не перевести в низкий уровень, и когда это произойдет, мы желаем, чтобы Arduino вызывала пользовательскую функцию, чтобы отреагировать на это изменение состояния. В этом случае пользовательской функцией является метод onDetectInterrupt(), который вы можете найти между функциями setup() и loop(). Здесь мы устанавливаем только один флаг всякий раз, когда Arduino обнаруживает ввод. Метод loop() берет на себя все остальные задачи, которые должны произойти, когда Arduino обнаруживает прерывание.


В приведенном выше примере мы дали команду Arduino реагировать на спад фронтов, то есть всякий раз, когда сигнал на втором цифровом выводе переходит с ВЫСОКОГО на НИЗКИЙ. Альтернативно вы также можете использовать LOW, CHANGE и RISING на всех платах Arduino. Платы Due, Zero и MKR1000 также имеют режим HIGH. LOW запускает прерывание, пока выбранный вывод остается в состоянии LOW. Опция HIGH работает аналогично. CHANGE, FALLING и RISING запускают ISR всякий раз, когда изменяется состояние выбранного контакта.


Как использовать прерывания Arduino для обнаружения пользовательского ввода

Прерывания представляют собой отличный способ обнаружить внешние события и заставить Arduino оперативно реагировать, поэтому их нужно использовать в подобных случаях.




© digitrode.ru


Теги: Arduino, прерывания




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий