Ардуино мега пины прерывания

attachInterrupt()

Description

Digital Pins With Interrupts

The first parameter to attachInterrupt() is an interrupt number. Normally you should use digitalPinToInterrupt(pin) to translate the actual digital pin to the specific interrupt number. For example, if you connect to pin 3, use digitalPinToInterrupt(3) as the first parameter to attachInterrupt() .

Uno, Nano, Mini, other 328-based

Uno WiFi Rev.2, Nano Every

all digital pins

Mega, Mega2560, MegaADK

2, 3, 18, 19, 20, 21 (pins 20 & 21 are not available to use for interrupts while they are used for I2C communication)

Micro, Leonardo, other 32u4-based

all digital pins, except 4

MKR Family boards

0, 1, 4, 5, 6, 7, 8, 9, A1, A2

2, 3, 9, 10, 11, 13, A1, A5, A7

Nano 33 BLE, Nano 33 BLE Sense

all digital pins

all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE)

Notes and Warnings

Note
Inside the attached function, delay() won’t work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. See the section on ISRs below for more information.

Using Interrupts

Interrupts are useful for making things happen automatically in microcontroller programs and can help solve timing problems. Good tasks for using an interrupt may include reading a rotary encoder, or monitoring user input.

If you wanted to ensure that a program always caught the pulses from a rotary encoder, so that it never misses a pulse, it would make it very tricky to write a program to do anything else, because the program would need to constantly poll the sensor lines for the encoder, in order to catch pulses when they occurred. Other sensors have a similar interface dynamic too, such as trying to read a sound sensor that is trying to catch a click, or an infrared slot sensor (photo-interrupter) trying to catch a coin drop. In all of these situations, using an interrupt can free the microcontroller to get some other work done while not missing the input.

About Interrupt Service Routines

ISRs are special kinds of functions that have some unique limitations most other functions do not have. An ISR cannot have any parameters, and they shouldn’t return anything.

Generally, an ISR should be as short and fast as possible. If your sketch uses multiple ISRs, only one can run at a time, other interrupts will be executed after the current one finishes in an order that depends on the priority they have. millis() relies on interrupts to count, so it will never increment inside an ISR. Since delay() requires interrupts to work, it will not work if called inside an ISR. micros() works initially but will start behaving erratically after 1-2 ms. delayMicroseconds() does not use any counter, so it will work as normal.

Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as volatile .

For more information on interrupts, see Nick Gammon’s notes.

Syntax

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (recommended)
attachInterrupt(interrupt, ISR, mode) (not recommended)
attachInterrupt(pin, ISR, mode) (Not recommended. Additionally, this syntax only works on Arduino SAMD Boards, Uno WiFi Rev2, Due, and 101.)

Parameters

interrupt : the number of the interrupt. Allowed data types: int .
pin : the Arduino pin number.
ISR : the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode : defines when the interrupt should be triggered. Four constants are predefined as valid values:

LOW to trigger the interrupt whenever the pin is low,

CHANGE to trigger the interrupt whenever the pin changes value

RISING to trigger when the pin goes from low to high,

FALLING for when the pin goes from high to low.

The Due, Zero and MKR1000 boards allow also:

HIGH to trigger the interrupt whenever the pin is high.

Источник

Arduino.ru

attachInterrupt(interrupt, function, mode)

Задает функцию обработки внешнего прерывания, то есть функция, которая будет вызвана по внешнему прерыванию. Если до это была задана другая функция, то назначается новая. Большинство контроллеров Arduino умеют обрабатывать до двух внешних прерываний, пронумерованных так: 0 (на цифровом порту 2) и 1 (на цифровом порту 3). Arduino Mega обрабатывает дополнительно еще четыра прерывания: 2 (порт 21), 3 (порт 20), 4 (порт 19) и 5 (порт 18).

Board Digital Pins Usable For Interrupts
Плата int.0 int.1 int.2 int.3 int.4 int.5
UNO, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7

Arduino Due имеет мощные возможности обработки прерываний, что позволяет прикрепить функцию прерывания для всех доступных контактов. Вы можете напрямую указать порт(пин) в attachInterrupt ().

Параметры

interrupt: номер прерывания (int)
или pin: номер цифрового порта (только для Arduino Due)

function: функция, вызваемая прерыванием, функция должна быть без параметров и не возвращать значений. В англоязычной документации употребляется термин interrupt service routine для такой функции.

mode задает режим обработки прерывания. Допустимо использование следующих констанст:

  • LOW вызывает прерывание, когда на порту LOW
  • CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
  • RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
  • FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW

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

Замечание по использованию

Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются. Возможна потеря данный передаваемых по последовательному соединению (Serial data) в момент выполнения функциии обработки прерывания. Переменные, изменяемые в функции, должным быть объявлены как volatile.

Использование перерываний

Прерывания обычно используют для задач, которые должны быть выполнены автоматически при наступление какого либо внешнего воздействия. Например, считывание значения энкодера (датчика угла) или реакция на действия пользователя.

Так, если вы хотите считывать значения энкодера без использования прерываний, то написать программу, которая бы не пропускала ни одного импульса, практически невозможно, такая программа должна будет практически все время считывать значения с датчика, чтобы не пропусть импульс. На другие операции просто не останется процессорного времени. Это же относится и к другим датчикам, выдающим короткий импульс. В таких задачах использования внешних прерываний позволяет разгрузить процессор для других операций и не пропустить ожидаемый сигнал.

Источник

attachInterrupt() / Arduino

Описание

Цифровые выводы с прерываниями

Первый параметр attachInterrupt() – это номер прерывания. Как правило, вы должны использовать digitalPinToInterrupt(pin) для перевода реального цифрового вывода в конкретный номер прерывания. Например, если вы подключаетесь к выводу 3, используйте digitalPinToInterrupt(3) в качестве первого параметра attachInterrupt() .

Плата Цифровые выводы, используемые для прерываний
Uno, Nano, Mini, other 328-based 2, 3
Uno WiFi Rev.2 все цифровые выводы
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7
Zero все цифровые выводы, кроме 4
MKR Family boards 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due все цифровые выводы
101 все цифровые выводы (Выводы 2, 5, 7, 8, 10, 11, 12, 13 работают только с CHANGE)

Примечания и предупреждения

Внутри прикрепленной функции delay() работать не будет, а значение, возвращаемое millis() , не будет увеличиваться. Последовательные данные, принятые во время выполнения этой функции, могут быть потеряны. Вы должны объявлять как volatile любые переменные, которые вы изменяете в прикрепленной функции. Дополнительную информацию смотрите в разделе об обработчиках прерываний ниже.

Использование прерываний

Прерывания полезны для того, чтобы всё в программах микроконтроллеров происходило автоматически, и могут помочь решить проблемы с синхронизацией. Подходящие задачи для использования прерываний включают в себя считывание поворотного энкодера или мониторинг пользовательского ввода данных.

Если вы хотите обеспечить, чтобы программа всегда будет захватывать импульсы от поворотного энкодера, так чтобы она никогда не пропускала их, было бы сложно написать последовательно выполняемую программу, которая делала бы что-либо еще, потому что программе необходимо было бы постоянно выполнять опрос линий датчика, идущих от энкодера, чтобы отлавливать импульсы при их появлении. Другие датчики также имеют аналогичную динамику интерфейса, например, попытка прочитать звуковой датчик, который пытается отловить щелчок, или инфракрасный датчик (фотопрерыватель), который пытается отследить падение монеты. Во всех этих ситуациях использование прерывания может освободить микроконтроллер для выполнения какой-либо другой работы, не пропуская ввода данных.

О функциях обработчиков прерываний (ISR)

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

Как правило, ISR должна быть как можно короче и быстрее. Если ваш скетч использует несколько ISR, одновременно может быть запущен только один обработчик, другие прерывания будут обрабатываться после того, как текущий будет завершен, в зависимости от своего приоритета. millis() полагается на прерывания для счета, поэтому она никогда не будет инкрементироваться во время выполнения ISR. Поскольку delay() требует для работы прерываний, эта функция не будет работать, если будет вызвана внутри ISR. Функция micros() изначально работает, но начнет вести себя беспорядочно через 1-2 мс. Функция delayMicroseconds() не использует счетчиков, поэтому будет работать нормально.

Обычно глобальные переменные используются для передачи данных между ISR и основной программой. Чтобы убедиться, что переменные, используемые ISR и основной программой, обновляются правильно, объявляйте их как volatile (изменчивыми).

Синтаксис

Параметры

interrupt : номер прерывания ( int ).

pin : номер вывода (только для Arduino Due, Zero, MKR1000).

ISR : функция обработчика прерывания, которая вызывается, когда происходит прерывание; данная функция должна не принимать никаких параметров и ничего не возвращать.

mode : определяет, когда должно быть запущено прерывание. В качестве допустимых значений предопределены четыре константы:

  • LOW , чтобы вызывать прерывание, когда на выводе низкий логический уровень;
  • CHANGE , чтобы вызывать прерывание всякий раз, когда меняется состояние на выводе;
  • RISING для запуска, когда состояние на выводе переходит от низкого к высокому;
  • FALLING , когда состояние на выводе переходит от высокого к низкому.

Платы Due, Zero и MKR1000 также поддерживают:

  • HIGH , чтобы вызывать прерывание всякий раз, когда на выводе высокий логический уровень.

Возвращает

Пример кода

Номера прерываний

Обычно вы должны использовать digitalPinToInterrupt(pin) , а не помещать в свой скетч непосредственно номер прерывания. Конкретные выводы с прерываниями и их сопоставление с номером прерывания зависят от каждого типа платы. Прямое использование номеров прерываний может показаться простым, но оно может вызвать проблемы совместимости, когда ваш скетч будет запускаться на другой плате.

Однако более старые скетчи часто используют прямые номера прерываний. Часто использовались 0 (для цифрового вывода 2) или 1 (для цифрвого вывода 3). В приведенной ниже таблице показаны доступные выводы прерывний на различных платах.

Обратите внимание, что в приведенной ниже таблице номера прерываний это числа, которые должны быть переданы attachInterrupt() . По историческим причинам эта нумерация не всегда соответствует прерываниям на чипе ATmega (например, int.0 соответствует INT4 на чипе ATmega2560).

Соответствие номеров выводов номерам прерываний на платах Arduino

Плата INT.0 INT.1 INT.2 INT.3 INT.4 INT.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
На базе 32u4 (например, Leonardo, Micro) 3 2 0 1 7

Для плата Uno WiFiRev.2, Due, Zero, семейства MKR и 101 номер прерывания = номер вывода.

Источник

Arduino

Внешние прерывания

Прерывание (interrupt) — это сигнал, сообщающий процессору о наступлении некоторого события, требующего немедленной обработки. Процессор приостанавливает текущую активность, сохраняя свое состояние, передает управление обработчику прерывания, после чего возвращает управление в прерванный код.

Для работы с прерываниями в Arduino есть 2 функции:

Функция attachInterrupt()

Описание

Задает функцию, которая будет вызвана по внешнему прерыванию. Если функция уже была задана, то она будет заменена на новую. Рекомендуется использовать функцию digitalPinToInterrupt(pin) для перевода номера пина в номер прерывания. Например, если вы подключены к пину 3, используйте digitalPinToInterrupt(3) в качестве первого параметра attachInterrupt() .

Плата Arduino Пины, используемые для прерываний
Arduino Uno, Arduino Nano, Arduino Mini и остальные на ATmega328 2, 3
Arduino Mega, Arduino Mega2560 2, 3, 18, 19, 20, 21
Arduino Micro, Arduino Leonardo и остальные на ATmega32U4 0, 1, 2, 3, 7
Arduino Zero все цифровые пины кроме 4
Arduino Due все цифровые пины

Прерывания полезны, когда нужно читать значения с некоторых датчиков или обслуживать ввода пользователя.

ISR (Interrupt Service Routine) — это особые функции, которые имеют некоторые уникальные ограничения, которых нет у большинства других функций. ISR не может иметь никаких параметров, и они не должны ничего возвращать.

Как правило, функция ISR должна быть максимально короткой и быстрой. Если в одной программе задано несколько ISR-функций, то одновременно выполняться может только одна, остальные будут выполняться после завершения текущей в порядке, заданным приоритетом. Функция millis() использует прерывания для подсчета, поэтому возвращаемое ей значение не будет увеличиваться внутри ISR. Поскольку функции delay() для работы требуются прерывания, он тоже не будет работать. micros() сначала будет работает, но через 1-2 мс начнет возвращать неверный беспорядочный результат. delayMicroseconds() не использует счетчик, поэтому она будет работать как обычно.

Обычно для передачи данных между функциями ISR и основной программой используются глобальные переменные. Чтобы быть уверенными, что переменные, общие для ISR и основной программы, будут работать правильно, следует объявить их как volatile .

Синтаксис

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) — правильное использование

attachInterrupt(interrupt, ISR, mode) — так использовать не рекомендуется

attachInterrupt(pin, ISR, mode) — так использовать не рекомендуется (только для плат Arduino SAMD, Arduino Uno WiFi Rev2, Arduino Due, Arduino 101)

Параметры

interrupt — номер прерывания

pin — номер пина

ISR — функция для вызова при возникновении прерывания; эта функция не должна принимать никаких параметров и ничего не должна возвращать; эту функцию иногда называют процедурой обработки прерываний

mode — определяет, когда прерывание должно быть запущено

Допустимые значения параметра mode :

  • LOW — вызов прерывания когда на пине значение LOW
  • CHANGE — вызов прерывания когда на пине меняется значение
  • RISING — вызов когда значение переходит от LOW к HIGH
  • FALLING — вызов когда значение переходит от HIGH к LOW
  • HIGH (доступно только для Arduino Due, Arduino Zero) — вызов прерывания когда на пине значение HIGH
Возвращаемое значение
Пример

Зажигаем и гасим встроенный светодиод при изменении сигнала на 2 пине:

Примечания

Внутри функции, вызываемой по прерыванию, функции delay() работать не будет, а возвращаемое функцией millis() значение не будет увеличиваться. Последовательные данные, полученные во время использования функции, могут быть потеряны. Вы должны объявить как volatile любые переменные, которые вы изменяете в функции.

Функция detachInterrupt()

Описание
Синтаксис

detachInterrupt(digitalPinToInterrupt(pin)) — правильное использование

detachInterrupt(interrupt) — так использовать не рекомендуется

detachInterrupt(pin) — так использовать не рекомендуется (только для плат Arduino SAMD, Arduino Uno WiFi Rev2, Arduino Due, Arduino 101)

Параметры

interrupt — номер прерывания, которое нужно отключить

Источник

Adblock
detector