Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11 Программирование микроконтроллеров.pptx
Скачиваний:
24
Добавлен:
19.01.2023
Размер:
739.71 Кб
Скачать

Программирование микроконтроллеров

Функции цифрового ввода-вывода языка Arduino Wiring

Функция pinMode().

•Описание: конфигурирует режим работы линии порта микроконтроллера, связанной с указанным контактом: как вход либо как выход.

•Синтаксис: pinMode(pin, mode);

•Параметры:

•pin – номер контакта, режим работы которого будет конфигурироваться;

•mode – режим работы линии порта, связанной с контактом pin. Принимает значения INPUT (линия порта работает на вход, подтягивающий резистор отключен), OUTPUT (линия порта работает на выход) или INPUT_PULLUP (линия порта работает на вход, внутренний подтягивающий резистор с сопротивлением 47 кОм подключен к линии порта и к линии питания микроконтроллера Vcc (+3.3В)). Режим INPUT_PULLUP используется для подключения ко входу микроконтроллера кнопки с подтягивающим резистором, в том числе кнопки PUSH2.

•Возвращаемое значение: нет.

•Пример: pinMode(13, OUTPUT); // устанавливаем режим работы контакта 13 как "выход".

Функция digitalWrite().

•Описание: отправляет на цифровой контакт значение HIGH или LOW. Если функцией pinMode() контакт был установлен в режим выхода (OUTPUT), то для значения HIGH напряжение на нем будет примерно равно напряжению питания микроконтроллера +3.3В (VCC), и для LOW – примерно 0В (GND, земля). При этом выходной ток линии порта может достигать значения 20 мА, что достаточно для свечения маломощного светодиода.

•Синтаксис: digitalWrite(pin, value);

Программирование микроконтроллеров

Параметры:

pin – номер контакта;

value – значение HIGH или LOW.

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

Пример: digitalWrite(14, HIGH); // включаем светодиод, подключенный к выводу 14.

Функция digitalRead().

Описание: считывает значение с заданного цифрового контакта: HIGH или LOW. Если контакт ни к чему не присоединен, функция digitalRead() может вернуть случайную величину, как HIGH, так и LOW. Такая ситуация может возникнуть, если, например, кнопка подключена к входному контакту микроконтроллера без подтягивающего резистора, т.к. в этом случае входная линия порта будет находиться в высокоимпедансном состоянии (входное сопротивление более 1 МОм).

Синтаксис: digitalRead(pin);

Параметры: pin – номер контакта.

Возвращаемое значение: HIGH или LOW, тип int.

Пример: val = digitalRead(7); // считываем значение со входа 7 в целочисленную переменную val.

Программирование микроконтроллеров

Функции языка Arduino Wiring для работы со временем

Функция delay().

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

Синтаксис: delay(ms);

•Параметры: ms - количество миллисекунд, на которое приостанавливается выполнение программы (тип unsigned long).

•Возвращаемое значение: нет.

•Пример: delay(1000); // ждем 1 секунду.

Функция delayMicroseconds().

Описание: приостанавливает выполнение программы на указанный промежуток времени (в микросекундах). Наибольшее число, позволяющее сформировать точную задержку - 16383. Для создания задержек длительностью больше, чем несколько тысяч микросекунд, используйте функцию delay(). Данная функция работает с высокой точностью в диапазоне от 3 микросекунд и выше. При более коротких задержках точная работа функции delayMicroseconds() не гарантируется.

Синтаксис: delayMicroseconds(us);

•Параметры: us - количество микросекунд, на которое приостанавливается выполнение программы (тип unsigned int).

Программирование микроконтроллеров

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

Пример: delayMicroseconds(50); // задержка в 50 микросекунд.

Функция millis().

Описание: Возвращает количество миллисекунд, прошедшее с момента запуска платформой данной программы. Это число переполнится (и счет снова начнется от нуля) примерно через 50 дней.

Синтаксис: unsigned long millis().

Параметры: входные параметры отсутствуют.

Возвращает: значение типа unsigned long.

Функция micros().

Описание: Возвращает количество микросекунд, прошедшее с момента запуска платформой данной программы. Это число переполнится (и счет снова начнется от нуля) примерно через 70 минут. На платформах с тактовой частотой 16МГц эта функция выполняется за 4 микросекунды и возвращаемый результат идет с поправкой плюс 4 микросекунды.

Синтаксис: unsigned long micros().

Параметры: входные параметры отсутствуют.

Возвращает: значение типа unsigned long. Могут возникать ошибки, если программист попытается совершить математическими операции с переменными других типов.

Пример программы – управление красным светодиодом от кнопки: Examples -> 02.Digital -> Button

Программирование микроконтроллеров

Здесь объявленные константы представляют собой номера выводов микроконтроллера, к которым подключены кнопка с символическим именем PUSH2 и зеленый светодиод с символическим именем GREEN_LED.

В процедуре setup() соответствующие этим выводам линии порта P1 настраиваются соответственно на ввод с подтягивающим резистором и на вывод.

В процедуре loop() в бесконечном цикле производится чтение сигнала на кнопке и в зависимости от того, какое значение прочитано, светодиод либо включается, либо выключается.

Программирование микроконтроллеров

Обработка прерываний микроконтроллеров MSP-430

В микроконтроллерах MSP430 имеется три типа прерываний:

системное (PUC – сброс системы);

немаскируемые (NMI);

маскируемые.

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

Чем ближе расположен модуль к ЦПУ, тем выше приоритет его прерывания. Приоритеты определяют порядок обработки прерываний при одновременной генерации нескольких запросов.

Программирование микроконтроллеров

Немаскируемые прерывания NMI не маскируются битом общего разрешения прерываний (GIE), однако могут быть по отдельности разрешены/запрещены при помощи индивидуальных битов разрешения прерывания (NMIE, ACCVIE, OFIE).

При возникновении немаскируемого прерывания все биты разрешения этого прерывания автоматически сбрасываются. Выполнение программы продолжается с адреса, содержащегося в векторе немаскируемого прерывания, 0FFFCh. Для повторного разрешения прерывания пользовательская программа должна снова установить требуемые биты.

Немаскируемое прерывание может быть вызвано тремя событиями:

появление активного фронта на выводе RST/NMI при конфигурации последнего в режиме NMI;возникновение неисправности тактового генератора;нарушение доступа к флэш-памяти.

Маскируемые прерывания генерируются периферийными устройствами, имеющими такую возможность. В том числе, маскируемое прерывание может генерироваться по переполнению сторожевого таймера при работе последнего в режиме интервального таймера. Прерывания от каждого из источников могут быть запрещены с помощью индивидуальных битов разрешения прерываний. Кроме того, все маскируемые прерывания могут быть запрещены с помощью бита общего разрешения прерываний GIE регистра состояния (SR).

Обработка прерывания

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

Программирование микроконтроллеров

Обработка запроса на прерывание производится в следующей последовательности:

1)Ожидается завершение команды, исполняемой в данный момент.

2)Содержимое счётчика команд PC, указывающего на следующую команду, помещается в стек.

3)Содержимое регистра состояния SR помещается в стек.

4)Если за время выполнения последней команды было сформировано несколько запросов на прерывание, то выбирается прерывание с наибольшим приоритетом.

5)Если прерывание имеет один источник, то флаг прерывания автоматически сбрасывается. Если прерывание может генерироваться несколькими источниками, то флаги прерывания остаются установленными для последующей обработки в программе.

6)Регистр состояния SR очищается. В результате процессор переходит из режима пониженного потребления в активный режим. Поскольку бит GIE сбрасывается, последующие прерывания запрещаются.

7)Содержимое вектора прерывания загружается в счётчик команд PC и начинается выполнение процедуры обработки прерывания, расположенной по этому адресу.

Возврат из прерывания

Процедура обработки прерывания всегда завершается командой: RETI (возврат из процедуры обработки прерывания).

Программирование микроконтроллеров

Возврат из прерывания:

1.Восстановление содержимого регистра SR из стека. В результате вступают в действие все предыдущие установки битов GIE, CPUOFF и пр., независимо от их установок, использовавшихся в процедуре обработки прерывания.

2.Содержимое счётчика команд PC извлекается из стека, и выполнение программы продолжается с того места, где она была прервана.

Вложенные прерывания

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

Векторы прерываний

Векторы прерываний и вектор сброса располагаются в диапазоне адресов 0FFFEh…0FFC0h. Каждый вектор программируется пользователем посредством записи в него 16-битного адреса соответствующей процедуры обработки прерывания. Полный перечень векторов прерывания приводится в справочной документации на конкретные модели.

Порты P1 и P2 поддерживают внешние прерывания. Для каждого из выводов портов P1 и P2 можно индивидуально разрешить прерывание и сконфигурировать его так, чтобы оно генерировалось по нарастающему или спадающему фронту входного сигнала. Все линии ввода/вывода порта P1 назначены одному вектору прерываний, а все линии порта P2 — другому вектору.

Программирование микроконтроллеров

Функции языка Arduino Wiring для работы с прерываниями

attachInterrupt(interrupt, function, mode) Описание:

Определяет функцию, которая будет вызвана при срабатывании внешнего прерывания. Заменяет привязанную ранее функцию. Большинство платформ имеют два внешних прерывания: с номерами 0 (на цифровом выводе 2) и 1 (на цифровом выводе 5 – P1_3, PUSH2).

Параметры

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

function: функция вызываемся при срабатывании прерывания. Следует учесть, что функция не должна иметь параметров и ничего не возвращать. Такая функция называется обработчиком прерывания. mode определяет, на что должно срабатывать прерывание. Четыре константы устанавливают действие: LOW - срабатывание прерывания, когда на выводе низкий уровень напряжения,

CHANGE - срабатывание прерывания каждый раз при изменении уровня напряжения на выводе, RISING - срабатывание прерывания по фронту - когда состояние вывода изменяется от LOW к HIGH, FALLING - срабатывание прерывания по спаду - когда состояние вывода изменяется от HIGH к LOW.

Примечание:

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