Лабораторная работа № 1. Изучение микроконтроллера MSP430. Расширенный ввод-вывод и прерывания 1. Цель работы Изучение основных характеристик и архитектуры микроконтроллера MSP430. Изучение основных приемов программирования микроконтроллера MSP430 с помощью функций расширенного ввода-вывода данных и обработки внешних прерываний. 2. Задачи Создание программ управления цифровыми и аналоговыми линиями порта ввода-вывода для отладочного модуля MSP430 LaunchPad с помощью среды программирования Energia. Прошивка микроконтроллера и проверка работы программ. 3. Теоретическая часть 3.1. Расширенный ввод-вывод микроконтроллера MSP-430. Расширенный ввод-вывод микроконтроллера MSP-430 обеспечивается специализированными функциями языка программирования высокого уровня Arduino, который используется в среде программирования отладочного модуля MSP430 LaunchPad Energia. К их числу относятся функции управления частотой выходной последовательности прямоугольных импульсов Tone() и NoTone(), функции последовательного ввода и вывода данных через цифровые выводы порта ShiftIn() и ShiftOut(), функция измерения длительности импульса на цифровом входе PulseIn(). К расширенному вводу-выводу можно также отнести операции с аналоговыми выводами порта. Функция pulseIn(). Описание: Измеряет длину импульса (HIGH или LOW). например, если HIGH, то pulseIn() будет ждать, когда на входе будет значение HIGH, запустит счет, после чего будет ждать, когда на входе установится значение LOW и выключит отсчет времени. Возвращает: длину импульса в микросекундах или 0, если за определенное время ни одного импульса не пришло. Функция нормально работает при длине импульса от 10 мкс до 3 минут. Синтаксис: pulseIn(pin, value) или pulseIn(pin, value, timeout) Параметры: pin: номер вывода микроконтроллера, на котором мы хотим измерить длину импульса (тип int); value: тип измеряемого импульса - HIGH или LOW (тип int); timeout (опционально): число микросекунд ожидания импульса (по умолчанию 1 минута. Тип unsigned long. Пример: int pin = 7; // номер вывода, на котором ожидается импульс unsigned long duration; // переменная для приема значения длительности void setup() { pinMode(pin, INPUT); // вывод pin настраивается на цифровой ввод } void loop() { duration = pulseIn(pin, HIGH); // вызов функции для измерения длительности } Для измерения уровня входного аналогового сигнала с помощью встроенного аналого-цифрового преобразователя микроконтроллера MSP430 используются следующие функции языка Arduino. Функция analogReference(type) Описание: Устанавливает опорное напряжение для аналоговых входов. Функция analogRead() вернет 1023 для входного уровня, равного опорному напряжению или превышающего его. Параметры: type: тип используемого опорного напряжения (DEFAULT, INTERNAL1V5, INTERNAL2V5 или EXTERNAL). Они означают: DEFAULT: значение опорного напряжения по умолчанию – величина напряжения питания микроконтроллера (VCC) ~ 3.3В … 3.6В; INTERNAL1V5: внутреннее опорное напряжение (от внутреннего источника опорного напряжения ИОН) величиной 1.5В; INTERNAL2V5: внутреннее опорное напряжение величиной 2.5В; EXTERNAL: внешнее опорное напряжение от источника, подключенного к выводу VREF платы. Функция analogRead() Описание: Читает входное значение с определенного аналогового вывода. Синтаксис: analogRead(pin); Параметры: pin: номер аналогового входа, который следует прочесть (от A0 до A7 на большинстве платформ). Если в качестве параметра указать символическое имя TEMPSENSOR, то будет прочитано значение со встроенного датчика температуры. Возвращает: int (0 … 1023) – целое число, представляющее собой выходной код АЦП. Пример: int val = 0; // переменная для сохранения прочитанного значения void setup() { Serial.begin(9600); // настройка COM-порта } void loop() { val = analogRead(A0); // чтение аналогового входа A0 Serial.println(val); // передача значения через COM-порт Delay(100); // задержка 100 миллисекунд } 3.2. Прерывания. В микроконтроллерах MSP430 имеется три типа прерываний: сброс системы; немаскируемые (NMI); маскируемые. Приоритеты прерываний фиксированы и зависят от местонахождения конкретного модуля в цепочке, как показано на рис. 1.1. Чем ближе расположен модуль к ЦПУ, тем выше приоритет его прерывания. Приоритеты определяют порядок обработки прерываний при одновременной генерации нескольких запросов. Рис. 1.1. Приоритеты прерываний Немаскируемые прерывания (NMI) Немаскируемые прерывания NMI не маскируются битом общего разрешения прерываний (GIE), однако могут быть по отдельности разрешены/запрещены при помощи индивидуальных битов разрешения прерывания (NMIE, ACCVIE, OFIE). При возникновении немаскируемого прерывания все биты разрешения этого прерывания автоматически сбрасываются. Выполнение программы продолжается с адреса, содержащегося в векторе немаскируемого прерывания, 0FFFCh. Для повторного разрешения прерывания пользовательская программа должна снова установить требуемые биты. Немаскируемое прерывание может быть вызвано тремя событиями: появление активного фронта на выводе RST/NMI при конфигурации последнего в режиме NMI; возникновение неисправности тактового генератора; нарушение доступа к флэш-памяти. Вывод RST/NMI При включении микроконтроллера вывод RST/NMI конфигурируется как вход аппаратного сброса. Назначение этого вывода задаётся в регистре управления сторожевого таймера WDTCTL. Если вывод RST/NMI используется в качестве входа сброса, то ЦПУ будет удерживаться в состоянии сброса до тех пор, пока на этом выводе будет присутствовать сигнал НИЗКОГО уровня. При подаче на вход сигнала ВЫСОКОГО уровня ЦПУ начинает выполнять программу с адреса, хранящегося в векторе сброса (0FFFEh). Одновременно с этим устанавливается флаг RSTIF. Если вывод RST/NMI сконфигурирован в программе как вход немаскируемого прерывания, то появление на этом выводе активного фронта (задаётся битом WDTNMIES) при установленном бите NMIIE вызывает генерацию немаскируемого прерывания. Также устанавливается флаг NMIIFG. Нарушение доступа к флэш-памяти При нарушении доступа к флэш-памяти устанавливается флаг ACCVIFG. Генерация немаскируемого прерывания при возникновении такой ситуации разрешается установкой бита ACCVIE. В процедуре обработки немаскируемого прерывания можно проверить флаг ACCVIFG, чтобы определить, было ли прерывание вызвано именно нарушением доступа к флэш-памяти. Неисправность тактового генератора Сигнал неисправности генератора позволяет предотвратить ошибки, связанные с неправильным функционированием кварцевого генератора. Генерация немаскируемого прерывания при обнаружении неисправности генератора разрешается установкой бита OFIE. В процедуре обработки немаскируемого прерывания можно проверить флаг OFIFG, чтобы определить, было ли прерывание вызвано именно сбоем в работе генератора. Маскируемые прерывания Маскируемые прерывания генерируются периферийными устройствами, имеющими такую возможность. В том числе, маскируемое прерывание может генерироваться по переполнению сторожевого таймера при работе последнего в режиме интервального таймера. Прерывания от каждого из источников могут быть запрещены с помощью индивидуальных битов разрешения прерываний. Кроме того, все маскируемые прерывания могут быть запрещены с помощью бита общего разрешения прерываний GIE регистра состояния (SR). Обработка прерывания При возникновении запроса прерывания от периферийного устройства, если установлены бит разрешения прерывания от этого устройства и бит общего разрешения прерываний GIE, вызывается процедура обработки прерывания. Для вызова обработчика немаскируемого прерывания достаточно установленного индивидуального бита разрешения конкретного прерывания. Принятие запроса прерывания Задержка обработки прерывания, т.е. время с момента принятия запроса прерывания до начала выполнения первой команды процедуры обработки прерывания (рис. 1.2), составляет 5 (MSP430X) или 6 (MSP430) тактов ЦПУ. Рис. 1.2. Обработка запроса на прерывание Обработка запроса на прерывание производится в следующей последовательности: 1. Ожидается завершение команды, исполняемой в данный момент. 2. Содержимое счётчика команд PC, указывающего на следующую команду, помещается в стек. 3. Содержимое регистра состояния SR помещается в стек. 4. Если за время выполнения последней команды было сформировано несколько запросов на прерывание, то выбирается прерывание с наибольшим приоритетом. 5. Если прерывание имеет один источник, то флаг прерывания автоматически сбрасывается. Если прерывание может генерироваться несколькими источниками, то флаги прерывания остаются установленными для последующей обработки в программе. 6. Регистр состояния SR очищается. В результате процессор переходит из режима пониженного потребления в активный режим. Поскольку бит GIE сбрасывается, последующие прерывания запрещаются. 7. Содержимое вектора прерывания загружается в счётчик команд PC и начинается выполнение процедуры обработки прерывания, расположенной по этому адресу. Возврат из прерывания Процедура обработки прерывания всегда завершается командой: RETI (возврат из процедуры обработки прерывания). Для возврата из прерывания требуется 5 (MSP430) или 3 (MSP430X) такта ЦПУ, необходимых для выполнения следующих действий (рис. 1.3): 1. Восстановление содержимого регистра SR из стека. В результате вступают в действие все предыдущие установки битов GIE, CPUOFF и пр., независимо от их установок, использовавшихся в процедуре обработки прерывания. 2. Содержимое счётчика команд PC извлекается из стека, и выполнение программы продолжается с того места, где она была прервана. Рис. 1.3. Возврат из прерывания. Вложенные прерывания Вложенные прерывания разрешаются установкой бита GIE в процедуре обработки прерывания. При этом любое прерывание, возникшее во время выполнения процедуры обработки прерывания, прервёт её выполнение, независимо от приоритетов обслуживаемого и нового прерываний. Векторы прерываний Векторы прерываний и вектор сброса располагаются в диапазоне адресов 0FFFh…0FFC0h, как показано в табл. 1.1. Таблица 1.1. Источники, флаги и векторы прерываний Источник прерывания Включение питания, внешний сброс, сторожевой таймер, пароль флэш-памяти, выборка команды по некорректному адресу NMI_прерывание, неисправность генератора, нарушение доступа к флэш-памяти Определяется устройством Определяется устройством Определяется устройством Сторожевой таймер Определяется устройством Определяется устройством Флаг прерывания PORIFG RSTIFG WDTIFG KEYV Системное прерывание Сброс Адрес Приоритет 0FFFEh 31, высший NMIIFG OFIFG ACCVIFG Немаскируемое Немаскируемое Немаскируемое 0FFFCh 30 0FFFAh 29 0FFF8h 28 0FFF6h 27 0FFF4h 0FFF2h 26 25 0FFC0h 0, низший WDTIFG Маскируемое Каждый вектор программируется пользователем посредством записи в него 16-битного адреса соответствующей процедуры обработки прерывания. Полный перечень векторов прерывания приводится в справочной документации на конкретные модели микроконтроллеров. Рекомендуется предусматривать процедуры обработки прерываний для всех прерываний, реализованных в конкретном микроконтроллере. При этом все неиспользуемые в программе вектора могут указывать на пустой обработчик прерывания, содержащий единственную команду RETI. Незадействованные вектора прерываний при необходимости можно использовать для размещения программного кода. Некоторые биты включения периферийных модулей, биты разрешения прерываний и флаги прерываний находятся в регистрах специальных функций (SFR). Эти регистры являются 8-битными и располагаются в младших адресах адресного пространства. Обращаться к регистрам специальных функций необходимо с помощью команд, работающих с однобайтными операндами. Конфигурация области SFR приводится в справочной документации на конкретные модели микроконтроллеров. Порты P1 и P2 поддерживают внешние прерывания. Для каждого из выводов портов P1 и P2 можно индивидуально разрешить прерывание и сконфигурировать его так, чтобы оно генерировалось по нарастающему или спадающему фронту входного сигнала. Все линии ввода/вывода порта P1 назначены одному вектору прерываний, а все линии порта P2 — другому вектору. Функции языка Arduino для работы с прерываниями Функция attachInterrupt(interrupt, function, mode) Описание: Определяет функцию, которая будет вызвана при срабатывании внешнего прерывания. Заменяет привязанную ранее функцию. Большинство платформ имеют два внешних прерывания: с номерами 0 (на цифровом входе 2 – P1_2, вывод 4) и 1(на цифровом входе 3 – P1_3, вывод 5, PUSH2). Параметры: interrupt: номер прерывания (тип int); function: функция, вызываемся при срабатывании прерывания. Следует учесть, что функция не должна иметь параметров и ничего не возвращать. Такая функция называется обработчиком прерывания. mode: определяет, на что должно срабатывать прерывание. Четыре константы устанавливают определеное действие: LOW: срабатывание прерывания, когда на цифровом входе присутствует низкий уровень напряжения, CHANGE: срабатывание прерывания каждый раз при изменении уровня напряжения на цифровом входе; RISING: срабатывание прерывания по фронту - когда состояние цифрового входа вывода изменяется от LOW к HIGH; FALLING: срабатывание прерывания по спаду - когда состояние цифрового входа изменяется от HIGH к LOW. Примечание: Внутри функций обработки прерывания функция delay() не работает, и значение, возвращаемое функцией millis(), не инкрементируется. Передаваемые по последовательному порту данные могут быть потеряны. Следует объявить как volatile любые перемены, модифицируемые в обработчике прерывания. Использование прерываний: Прерывания отлично подходят для создания автоматических действий в программах и могут решать некоторые временные проблемы. Показательной задачей с использованием прерываний является программа управления объектом с энкодером. Нужно быть уверенным, что ни один импульс от энкодера не будет потерян, однако сложно написать программу, выполняющую кроме слежения что-то еще. Подключив выход энкодера на внешнее прерывание, можно с легкостью решить эту проблему. Пример: volatile int state = HIGH; volatile int flag = HIGH; int count = 0; void setup() { Serial.begin(9600); pinMode(GREEN_LED, OUTPUT); digitalWrite(GREEN_LED, state); pinMode(PUSH2, INPUT_PULLUP); attachInterrupt(PUSH2, blink, FALLING); // Прерывание вызывается, когда // происходит нажатие кнопки PUSH2 } void loop() { digitalWrite(GREEN_LED, state); //Светодиод устанавливается в состояние state if(flag) { count++; // инкремент количества прерываний Serial.println(count); // вывод количества прерываний в COM-порт flag = LOW; } } void blink() // процедура обработки прерывания { state = !state; flag = HIGH; } Функция detachInterrupt(interrupt) Описание: Выключает объявленное ранее прерывание. Параметры interrupt: номер отключаемого прерывания (0 или 1). Функция noInterrupts() Описание: Деактивирует прерывания. Прерывания можно после снова активировать функцией interrupts(). Прерывания обычно решают важные задачи, и по умолчанию активированы. Однако, некоторые функции не могут работать, пока прерывания активированы, и входные данные могут быть проигнорированы. Прерывания могут повлиять на время-зависимые функции, вы можете деактивировать прерывания при выполнении критически важных функций. Функция interrupts() Описание: реактивирует прерывание (после того, как оно было деактивировано функцией noInterrupts()). Пример: void setup() {} void loop() { noInterrupts(); // здесь записывается код для критических, время-зависимых операций interrupts(); // здесь записывается другой код } 4. Меры безопасности Во время выполнения лабораторной работы необходимо: соблюдать правила включения и выключения вычислительной техники; не подключать кабели, разъемы и другую аппаратуру к компьютеру, не относящиеся к лабораторной установке; при включенном напряжении сети не отключать, не подключать и не трогать кабели, соединяющие различные устройства компьютера; в случае обнаруженной неисправности в работе оборудования или нарушения правил техники безопасности сообщить руководителю лабораторной работы; не пытаться самостоятельно устранить неисправности в работе аппаратуры; по окончании работы привести в порядок рабочее место. ВНИМАНИЕ! При работе за компьютером необходимо помнить: к каждому рабочему месту подведено опасное для жизни напряжение. Поэтому во время работы надо быть предельно внимательным и соблюдать все требования техники безопасности! 5. Описание лабораторной установки Лабораторная установка представляет собой плату отладочного модуля MSP430 LaunchPad (MSP-EXP430G2). Плата LaunchPad подключается к порту USB компьютера с помощью прилагаемого кабеля. В состав лабораторной установки входит также пьезокерамический излучатель, предназначенный для изучения звуковых эффектов. 6. Описание используемых программных комплексов Для программирования отладочного модуля MSP430 LaunchPad (MSPEXP430G2) в лабораторной работе используется среда разработки Energia. Для поддержки операций с последовательным интерфейсом в составе среды Energia имеется специализированный модуль Serial Monitor. Вызов окна Serial Monitor производится либо из меню Tools/Serial Monitor, либо с помощью кнопки Serial Monitor на панели инструментов. 7. Задание 7.1. Подключить отладочный модуль MSP430 LaunchPad с установленным в DIP-гнездо микроконтроллером MSP430G2452 при помощи кабеля к разъему порта USB компьютера. Запустить среду разработки Energia. Произвести настройку связи среды разработки Energia с отладочным модулем LaunchPad. 7.2. Написать, отладить и протестировать программу измерения длительности нажатия кнопки PUSH2 с использованием функции pulseIn(). Перед началом измерения программа должна выдавать в COM-порт приглашение для нажатия кнопки и произвести мигание красным светодиодом. После измерения, если кнопка действительно была нажата, в COM-порт нужно выдать измеренное значение времени нажатия в миллисекундах и мигнуть зеленым светодиодом. В противном случае – выдать в COM-порт сообщение об отсутствии нажатия кнопке. 7.3. Написать, отладить и протестировать программу, которая должна фиксировать состояние датчика вибраций. Подобрать порог срабатывания, при котором устойчиво фиксируются вибрации (постукивание по датчику). При превышении уровнем вибраций установленного порога программа должна осуществить сигнализацию светодиодом и выдачу уровня зафиксированных вибраций в COM-порт. 7.4. Написать, отладить и протестировать программу обработки внешнего прерывания. 8. Методика выполнения задания 8.1. Настройку программной среды Energia производить в соответствии с указаниями раздела 5 Лабораторной работы № 1 по курсу «Микропроцессорные системы управления». 8.2. Изучить пример использования функции puiseIn() в разделе 3. 8.3. В качестве датчика вибраций использовать пьезокерамический излучатель. Подключить пьезокерамический излучатель между выводами 20 (GND) и 15 (аналоговый вход A7) микроконтроллера. Изучить пример Examples/Sensors/Knock. 8.4. Изучить пример обработки прерывания в разделе 3. Придумать и реализовать световые и звуковые эффекты, выдаваемые основной программой до и после обработки прерывания. 9. Требования к содержанию и оформлению отчета Отчет по лабораторной работе должен содержать: краткие теоретические сведения; формулировку задания на лабораторную работу; описание последовательности выполнения работы; изображения рабочих окон с текстами программ; тексты программ, не помещающихся в рабочем окне; выводы по лабораторной работе. 10. Контрольные вопросы 10.1. Для чего предназначены функции расширенного ввода-вывода? 10.2. Какие функции языка Arduino используются для работы с АЦП микроконтроллеров MSP430? 10.3. Какие виды прерываний имеются в микроконтроллерах MSP430? 10.4. Как определяются приоритеты прерываний в микроконтроллерах MSP430? 10.5. Какие прерывания являются немаскируемыми? 10.6. Какие прерывания являются маскируемыми? 10.7. Как производится обработка прерывания? 10.8. Как назначаются векторы прерываний в микроконтроллерах MSP430? 10.9. Какие функции языка Arduino используются при обработке прерываний? 11. Критерии оценки выполнения лабораторной работы Лабораторная работа считается выполненной в том случае, если: студент выполнил все задания в соответствии с представленной методикой; результаты выполнения работы, представленные в виде отчета, соответствуют предъявленным к ним требованиям; студент правильно ответил на все контрольные вопросы и может интерпретировать полученные результаты.