Программирование Arduino — прерывания


10. Прерывания

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

Здесь уважаемый ДиХальт на доступных примерах объясняет, что такое Подпрограммы и прерывания 🙂

Arduino так же предоставляет свои функции для работы с прерываниями.
Эти функции объявлены в файле
\hardware\cores\arduino\wiring.h
и реализованы в файле
\hardware\cores\arduino\WInterrupts.c

Их всего две: attachInterrupt и DetachInterrupt.

void attachInterrupt(uint8_t, void (*)(void), int mode);

Описание:
Определяет, какую функцию вызывать, когда происходит внешнее прерывание.
Замещает предыдущую функцию, если таковая была привязана к данному прерыванию.
Большинство плат Arduino/Freeduino имеют два внешних прерывания с номерами 0 (на digital pin 2) и 1 (на digital pin 3). Arduino Mega имеет дополнительно ещё четыре:
с номерами 2 (pin 21), 3 (pin 20), 4 (pin 19) и 5 (pin 18).

Вызов:

attachInterrupt(interrupt, function, mode);

Параметры:
interrupt: номер прерывания (int)

function: функция, которая должны вызываться при прерывании. Функция не должна принимать параметров и не должна ничего возвращать.

mode: определяет, когда должно сработать прерывание. Определены следующие константы:
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)

Возвращаемое значение:
ничего

Пример:

//
// светодиод, подключённый к digital pin 13 будет изменять своё 
// состояние при изменении напряжения на digital pin 2
//
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);	             // порт как выход
  attachInterrupt(0, blink, CHANGE); // привязываем 0-е прерывание к функции blink().
}

void loop()
{
  digitalWrite(pin, state); 	     // выводим state  
}

void blink()
{
  state = !state; 		     // меняем значение на противоположное
}

Примечание относительно использования volatile:

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

http://ru.wikipedia.org/wiki/C++

указывая volatile при объявлении переменной, программист просит компилятор не оптимизировать эту переменную.

http://alenacpp.blogspot.com/2006/04/volatile.html

Т.о. переменная получается как бы «расшарена». Т.е. значение переменной могут изменять разные части программы — обработчики прерываний, подпрограммы, функции.

void detachInterrupt(uint8_t);

Описание:
Отключает указанное прерывание.

Вызов:

detachInterrupt(interrupt);

Параметры:
interrupt: номер прерывания для отключения (0 или 1).

Возвращаемое значение:
ничего

читать далее: 11. EEPROM

Ссылки
http://ru.wikipedia.org/wiki/IRQ
http://arduino.cc/en/Reference/AttachInterrupt

По теме
Библиотека TimerOne


0 комментариев на «“Программирование Arduino — прерывания”»

  1. Нашел библиотеку arduino-pinchangeint, которая позволяет обрабатывать прерывания от любых пинов arduino
    https://code.google.com/p/arduino-pinchangeint/

    Выдержка оттуда:
    What are Pin Change interrupts? The ATmega328p processor at the heart of the Arduino has two different kinds of interrupts: “external”, and “pin change”. There are only two external interrupt pins, INT0 and INT1, and they are mapped to Arduino pins 2 and 3. These interrupts can be set to trigger on RISING or FALLING signal edges, or on low level. The triggers are interpreted by hardware, and the interrupt is very fast. On the other hand there are only 2 such pins on the ATmega328p in the Arduino Uno and Duemilanove
    Проверил один пример — работает чудесно.

  2. Знаком с программированием AVR на ассемблере, а в Ардуино пока еще новичек, поэтому возник вопрос… А как же быть с остальными прерываниями, например прерывания от таймеров и т.п.? Есть ли в Ардуино библиотеки для обработки таких прерываний или для этого надо использовать какие-то не стандартные библиотеки?

    • Вот например: http://playground.arduino.cc/code/timer1
      Вообще, все что касается arduino, ищется на ура.
      У меня, например, еще не было случая, чтобы пришлось на форумах писать о проблеме.
      Обычно поищешь, почитаешь и все становиться понятно.

    • Большое спасибо за столь полезную ссылку, благодаря ей мир Ардуино в моем понимании увеличился в разы =)

    • Вы не поверите, но благодаря google он увеличится в google раз.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение