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

 

Как работать с прерываниями в 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, прерывания



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

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

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