Приветствую Вас ГостьПятница, 03.05.2024, 10:30

AVR & ARDUINO




Каталог статей

Главная » Статьи » Справочник

attachInterrupt()

Описание

Задает функцию, которую необходимо вызвать при возникновении внешнего прерывания. Заменяет предыдущую функцию, если таковая была ранее ассоциирована с прерыванием. В большинстве плат Arduino существует два внешних прерывания: номер 0 (цифровой контакт 2) и 1 (цифровой контакт 3). Номера контактов для внешних прерываний, доступные в тех или иных платах Arduino, приведены в таблице ниже:

Плата int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3        
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7  
Due (см. ниже)

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

Синтаксис

 attachInterrupt(interrupt, ISR, mode);
 attachInterrupt(pin, ISR, mode); // (только для Arduino Due)

Параметры

interrupt - номер прерывания (int).

pin - номер контакта (только для Arduino Due).

ISR - имя функции, которая будет вызвана при поступлении прерывания; эта функция не должна принимать параметров и не должна ничего возвращать. Такие функции также известны как обработчики прерываний (interrupt service routine).

mode - определяет условие, при котором должно срабатывать прерывание. Обычно может принимать одно из четырех предопределенных значений:

  • LOW - прерывание будет срабатывать всякий раз, когда на контакте присутствует низкий уровень сигнала;
  • CHANGE - прерывание генерируется при смене уровня на входе контакта;
  • RISING - прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий;
  • FALLING - прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий;

В Arduino Due доступно еще одно значение:

  • HIGH - прерывание будет срабатывать всякий раз, когда на контакте присутствует высокий уровень сигнала (только для Arduino Due).

 

Возвращаемые значения

нет

Примечание

Внутри функции-обработчика прерывания функция delay() не будет работать; значения, возвращаемые функцией millis(), не будут увеличиваться. Также будут потеряны данные, полученные по последовательному интерфейсу во время выполнения обработчика прерывания. Любые переменные, которые изменяются внутри функции обработчика должны быть объявлены как volatile.

Использование прерываний

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

В программе, от которой требуется постоянно обрабатывать сигнал от датчика вращения (не пропуская при этом ни единого импульса), очень сложно реализовать еще какую-либо функциональность помимо опроса. Это объясняется тем, что для своевременной обработки поступающих импульсов, программа должна постоянно опрашивать контакты, к которым подключен энкодер. При работе с другими типами датчиков часто требуется подобный динамический интерфейс: например, при опросе звукового датчика с целью различить щелчок, или при работе с инфракрасным щелевым датчиком (фото-прерывателем) для распознавания момента броска монеты. Во всех этих примерах использование прерываний позволит разгрузить микроконтроллер для выполнения другой работы, при этом не теряя контроль над поступающими сигналами.

Об обработчиках прерываний

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

Как правило обработчики должны быть максимально короткими и быстрыми насколько это возможно. Если ваш скетч использует несколько обработчиков, то в каждый момент времени может работать только один, другие прерывания будут игнорироваться (выключены) до тех пор, пока текущий обработчик не будет закончен. Так delay() и millis() не будут работать, пока выполняется обработчик прерывания. А вот функция delayMicroseconds(), которая не зависит от прерываний, будет работать как ожидалось.

Обычно для передачи данных между обработчиками прерываний и основной программой используются глобальные переменные. Чтобы убедиться, что переменные, используемые в обработчике обновляются правильно, объявляйте их как volatile.

Для большей информации см. Nick Gammon's notes.

Пример

int pin = 13;
volatile int state = LOW;

void setup()
{
 pinMode(pin, OUTPUT);
 attachInterrupt(0, blink, CHANGE);
}

void loop()
{
 digitalWrite(pin, state);
}

void blink()
{
 state = !state;
}

Смотрите также:

detachInterrupt()


Справочник

Материалы взяты с официального сайта проекта Arduino и представлены по лицензии Creative Commons Attribution-ShareAlike 3.0 License.



Источник: http://arduino.cc/en/Reference/AttachInterrupt
Категория: Справочник | Добавил: magi (31.01.2015)
Просмотров: 2720 | Теги: прерывание | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Поиск
Вход на сайт
На правах рекламы

Мы переезжаем на сайт Arduino по-русски