Прерывание

В 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КОм.
  • Кнопка.
  • Провода.
  • Макетная плата (можно навесу).
СХЕМА ПОДКЛЮЧЕНИЯ
Untitled Sketch_button
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).

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