Прерывание (англ. 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, компилятор не должен применять средства оптимизации, изменяющие положение переменной в памяти (например, помещающие её в регистр) или полагающиеся на неизменность значения переменной в промежутке между двумя присваиваниями ей значения.
указывая volatile при объявлении переменной, программист просит компилятор не оптимизировать эту переменную.
Т.о. переменная получается как бы «расшарена». Т.е. значение переменной могут изменять разные части программы — обработчики прерываний, подпрограммы, функции.
void detachInterrupt(uint8_t);
Описание:
Отключает указанное прерывание.
Вызов:
detachInterrupt(interrupt);
Параметры:
interrupt: номер прерывания для отключения (0 или 1).
Комментарии (1)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.