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

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

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

RSS свернуть / развернуть

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