В Arduino есть две функции для работы с прерываниями. Это attachInterrupt и DetachInterrupt.
Плата Arduino Uno имеет два внешних прерывания с номерами 0 (на digital pin 2) и 1 (на digital pin 3). Arduino Mega имеет дополнительно ещё четыре:
с номерами 2 (pin 21), 3 (pin 20), 4 (pin 19) и 5 (pin 18).
- void attachInterrupt(uint8_t, void (*)(void), int mode);
Описание:
Определяет, какую функцию вызывать, когда происходит внешнее прерывание.
Замещает предыдущую функцию, если таковая была привязана к данному прерыванию.Вызов:
1 | attachInterrupt(interrupt, function, mode); |
Параметры:
interrupt: номер прерывания (int)
function: функция, которая должны вызываться при прерывании. Функция не должна принимать параметров и не должна ничего возвращать.
mode: определяет, когда должно сработать прерывание. Определены следующие константы:
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
Возвращаемое значение:
ничего
ПРИМЕР: светодиод, подключённый к digital pin 13 будет изменять своё состояние при изменении напряжения на digital pin 2.
- Плата Arduino Uno.
- Один светодиод.
- Два резистора сопротивлением 220-270 Ом и 100КОм.
- Кнопка.
- Провода.
- Макетная плата (можно навесу).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 при объявлении переменной, программист просит компилятор не оптимизировать эту переменную. Т.е. значение переменной могут изменять разные части программы — обработчики прерываний, подпрограммы, функции.
- void detachInterrupt(uint8_t);
Описание:
Отключает указанное прерывание.
Вызов:
1 | detachInterrupt(interrupt); |
Параметры:
interrupt: номер прерывания для отключения (0 или 1).
Возвращаемое значение:
ничего