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

 

Как работать с прерываниями в Arduino

Автор: Mike(admin) от 17-04-2017, 17:35

Прерывание – это метод, с помощью которого микроконтроллер перенаправляет программу с текущего пути выполнения кода в другую, специальную область кода, чтобы сделать некоторые важные вещи, требующие немедленной обработки. Код, который активируется для обработки всякий раз, когда происходит прерывание, называется обработчиком прерываний, в иностранных источниках этому термину соответствует аббревиатура ISR или Interrupt Service Routine. Как только прерывание происходит, контроллер прекращает свою текущую обработку и начинает выполнение кода ISR, он возвращается к предыдущей задаче лишь только после того, как закончит выполнение кода в ISR.


Как работать с прерываниями в Arduino

Поскольку основой платы Arduino является микроконтроллер (зачастую ATmega), то в Arduino также можно организовывать прерывания, что может быть полезно в некоторых задачах. В данном проекте будет реализован простой генератор переменной частоты с индикацией благодаря функции прерывания.


В среде разработки Arduino IDE предусмотрены некоторые функции, позволяющие использовать прерывания в микроконтроллере платы Arduino. В коде, написанном для этого проекта, используются функции attachInterrupt() и detachInterrupt(). Первая применяется для разрешения прерывания, а вторая для отключения уже включенного прерывания. Рассмотрим каждую функцию в отдельности.


Функция attachInterrupt() используется для разрешения прерывания на любом из двух внешних выводов прерываний, также в ней происходит настройка типа срабатывания и назначение ISR для появившегося прерывания. Функция имеет три переменные: первая – номер вывода, на котором ожидаются сигналы прерывания, вторая определяет функцию, которая может действовать как ISR. Третий параметр определяет метод срабатывания. Прототип функции задается следующим образом


Void attachInterrupt (interrupt_pin, isr_function, trigger_method);


Параметр interrupt_pin может принимать значение 0 (для включения прерывания на выводе 2) или 1 (для включения прерывания на выводе 3). Второй параметр указывает на функцию, которая должна быть организована как обработчик прерывания, то есть ISR. Третий параметр может принимать четыре значения: LOW (для запуска прерывания всякий раз, когда линия находится в низком логическо уровне), CHANGE (для запуска прерывания всякий раз, когда сигнал на линии изменяется), RISING (для запуска прерывания, когда сигнал на линии переходит от низкого к высокому уровню), FALLING (для запуска прерывания, когда сигнал на линии переходит от высокого к низкому уровню). Возвращаемый тип функции объявлен как void, и, следовательно, функция ничего не возвращает.


Функция detachInterrupt() несколько проще. В качестве аргумента здесь используется только значение линии с активированной возможностью прерывания. Этот аргумент может принимать значение 0 (для выключения прерывания на выводе 2) или 1 (для выключения прерывания на выводе 3).


Ниже представлен код для Arduino, в котором наглядно демонстрируется принцип функционирования прерываний. Здесь мы реализуем простейший генератор переменной частоты с помощью функций attachInterrupt() и tone(). Подключите светодиод на линию 6 и замкните линию 2 с линией 8, чтобы светодиод менял свое состояние.



int led = 6;                                         // номер линии с подключенным светодиодом
int led_state = 0;                                   // переменная состояния светодиода              
 
void setup()
{             
  pinMode(led, OUTPUT);                              // линия со светодиодом настраивается на выход
 
  attachInterrupt(0, glow, RISING);                 // разрешаем внешнее прерывание 0 с функцией glow в качестве ISR, прерывание по изменению уровня сигнала с низкого на высокий
  
  tone(8, 0.1);
}
 
void loop()
{
  digitalWrite(led, led_state);                      // включаем или выключаем светодиод в зависимости от состояния переменной led_state
}
 
// Обработчик прерывания ISR
void glow()
{
  led_state = !led_state;                             // инвертируем значение led_state
}
// Обработчик прерывания ISR



© digitrode.ru


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



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


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

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

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