Выбрать главу

Обратите внимание на отсутствие какого-либо кода в функции loop. В общем случае эта функция может содержать код, выполняющийся, пока не произошло прерывание. Сама подпрограмма обработки прерываний просто включает светодиод L.

Когда вы будете экспериментировать, после сброса Arduino светодиод L должен погаснуть. А после нажатия на кнопку — сразу зажечься и оставаться зажженным до следующего сброса.

Поэкспериментировав, попробуйте изменить последний аргумент в вызове attachInterrupt на RISING и выгрузите измененный скетч. После перезапуска Arduino светодиод должен оставаться погашенным, потому что напряжение на контакте хотя и имеет уровень HIGH, но с момента перезапуска оставалось на этом уровне. До этого момента напряжение на контакте не падало до уровня LOW, чтобы потом подняться (rising) до уровня HIGH.

После нажатия и удержания кнопки в нажатом состоянии светодиод должен оставаться погашенным, пока вы ее не отпустите. Отпускание кнопки вызовет прерывание, связанное с контактом D2, потому что, пока кнопка удерживалась нажатой, уровень напряжения на контакте был равен LOW, а после отпускания поднялся до HIGH.

Если во время опробования выяснится, что происходящее у вас не соответствует описанию, приведенному ранее, это, скорее всего, обусловлено эффектом дребезга контактов в кнопке. Этот эффект вызывается тем, что кнопка не обеспечивает четкий переход между состояниями «включено»/«выключено», вместо этого в момент нажатия происходит многократный переход между этими состояниями, пока не зафиксируется состояние «включено». Попробуйте нажимать кнопку энергичнее, это должно помочь получить четкий переход между состояниями без эффекта дребезга.

Другой способ опробовать этот вариант скетча — нажать кнопку и, удерживая ее, нажать и отпустить кнопку сброса Reset на плате Arduino. Затем, когда скетч запустится, отпустить кнопку на макетной плате, и светодиод L загорится.

Контакты с поддержкой прерываний

Вернемся теперь к проблеме именования прерываний. В табл. 3.1 перечислены наиболее распространенные модели плат Arduino и приведено соответствие номеров прерываний и контактов в них.

Таблица 3.1. Контакты с поддержкой прерываний в разных моделях Arduino

Модель Номер прерывания Примечания
0 1 2 3 4 5
Uno D2 D3
Leonardo D3 D2 D0 D1 D7 Действительно, по сравнению с Uno первые два прерывания назначены разным контактам
Mega2560 D2 D3 D21 D20 D19 D18
Due Вместо номеров прерываний функции attachInterrupt следует передавать номера контактов

Смена контактов первых двух прерываний в Uno и Leonardo создает ловушку, в которую легко попасть. В модели Due вместо номеров прерываний функции attachInterrupt следует передавать номера контактов, что выглядит более логично.

Режимы прерываний

Режимы прерываний RISING (по положительному перепаду) и FALLING (по отрицательному перепаду), использовавшиеся в предыдущем примере, чаще всего используются на практике. Однако существует еще несколько режимов. Эти режимы перечислены и описаны в табл. 3.2.

Таблица 3.2. Режимы прерываний

Режим Действие Описание
LOW Прерывание генерируется при уровне напряжения LOW В этом режиме подпрограмма обработки прерываний будет вызываться постоянно, пока на контакте сохраняется низкий уровень напряжения
RISING Прерывание генерируется при положительном перепаде напряжения, с уровня LOW до уровня HIGH
FALLING Прерывание генерируется при отрицательном перепаде напряжения, с уровня HIGH до уровня LOW
HIGH Прерывание генерируется при уровне напряжения HIGH Этот режим поддерживается только в модели Arduino Due и, подобно режиму LOW, редко используется на практике