CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Программирование 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
  • +1
  • 29 июля 2009, 15:19
  • admin

Комментарии (6)

RSS свернуть / развернуть
+
+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
Проверил один пример — работает чудесно.
avatar

GraninDm

  • 28 июня 2013, 10:34
+
0
Знаком с программированием AVR на ассемблере, а в Ардуино пока еще новичек, поэтому возник вопрос… А как же быть с остальными прерываниями, например прерывания от таймеров и т.п.? Есть ли в Ардуино библиотеки для обработки таких прерываний или для этого надо использовать какие-то не стандартные библиотеки?
avatar

Haamu

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

GraninDm

  • 5 июля 2013, 10:57
+
+1
Большое спасибо за столь полезную ссылку, благодаря ей мир Ардуино в моем понимании увеличился в разы =)
avatar

Haamu

  • 5 июля 2013, 14:52
+
+1
Вы не поверите, но благодаря google он увеличится в google раз.
avatar

GraninDm

  • 5 июля 2013, 15:06

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.