Лабораторная работа № 1. Изучение микроконтроллера MSP430. Расширенный ввод-вывод и прерывания 1. Цель работы Изучение основных характеристик и архитектуры микроконтроллера MSP430. Изучение основных приемов программирования микроконтроллера MSP430 с помощью функций расширенного ввода-вывода данных и обработки внешних прерываний. 2. Задачи Создание программ управления цифровыми и аналоговыми линиями порта ввода-вывода для отладочного модуля MSP430 LaunchPad с помощью среды программирования Energia. Прошивка микроконтроллера и проверка работы программ. 3. Теоретическая часть Расширенный ввод-вывод микроконтроллера MSP-430 обеспечивается специализированными функциями языка программирования высокого уровня Arduino, который используется в среде программирования отладочного модуля MSP430 LaunchPad Energia. К их числу относятся функции управления частотой выходной последовательности прямоугольных импульсов Tone() и NoTone(), функции последовательного ввода и вывода данных через цифровые выводы порта ShiftIn() и ShiftOut(), функция измерения длительности импульса на цифровом входе PulseIn(). К расширенному вводу-выводу можно также отнести такую операцию с аналоговыми выводами порта, как измерение температуры с помощью внутреннего датчика температуры. Функция ShiftOut(). Описание: Побитово выводит байт данных. Начинает со старшего и заканчивает младшим битом (или в обратном порядке). Каждый бит передается на вывод данных по тактирующему импульсу, показывающему, что бит доступен для чтения. Данный метод известен как синхронный последовательный протокол и это отличный способ связать микроконтроллер с датчиками и другими микроконтроллерами. Два устройста остаются синхронизованными и могут общаться на максимальных скоростях, зависящих от тактовой частоты. Синтаксис: shiftOut(dataPin, cPin, bitOrder, value) Параметры: dataPin: вывод, по которому будут персылаться данные (тип int); cPin: тактирующий вход, состояние его будет изменяться как только следующий бит будет готов к отправке (тип int); bitOrder: этот параметр устанавливает, в каком порядке пересылаются биты: MSBFIRST – первым пересылается старший бит; LSBFIRST – первым пересылается младший бит; value: данные для передачи (тип byte). dataPin и cPin должны быть сконфигурированы как выходные при помощи функции pinMode(). Функция shiftOut() может передать 1 байт (8 бит), поэтому для передачи значений, больших 255, требуется два шага. Пример – передача двухбайтового числа: int data = 500; // передаем старшие 8 бит shiftOut(dataPin, cPin, MSBFIRST, (data >> 8)); // и младшие 8 бит shiftOut(dataPin, cPin, MSBFIRST, data); В этом примере выражение data >> 8 означает сдвиг числа вправо на 8 разрядов. В результате такого сдвига старший байт двухбайтового числа data перемещается на место младшего байта, он и передается первым вызовом функции shiftOut(). Второй вызов этой функции передает младший байт исходного двухбайтового числа data. Функция 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 имеют встроенный датчик температуры. К их числу относятся и микроконтроллеры, поставляемые в комплекте с отладочной платой LaunchPad EXP-430G2: MSP430G2452 и MSP430G2553. Последний микроконтроллер (MSP430G2553), поставляемый в комплекте с LaunchPad, имеет прошивку демонстрационной программы измерения температуры. Поскольку датчик температуры – встроенный, измеряется температура корпуса микроконтроллера. Программа работает следующим образом: при подаче питания на плату начинают мигать светодиоды; если нажать кнопку на линии порта P1.3 (PUSH2), то температура начинает считываться, первый результат после нажатия запоминается как эталонный и в сэмулированный асинхронный приемо-передатчик (COM-порт) передается значение 248 для индикации нажатия; текущее значение температуры, выраженное в градусах Фаренгейта, выдается в COM-порт; если текущая измеренная температура больше эталонного значения — повышается яркость свечения красного светодиода, если меньше — зеленого. Датчик температуры для измерений подключается ко входу аналогоцифрового преобразователя (АЦП). Для этого используется фиксированный аналоговый вход АЦП с номером INCHx = 10102. При конфигурировании АЦП на измерение температуры нужно установить величину опорного напряжения. Типичная передаточная характеристика датчика температуры приведена на рис. 1.1. При использовании датчика температуры время выборки должно быть не менее 30 мкс. Этот датчик имеет большую погрешность смещения и для получения абсолютных значений температуры требует калибровки. Рис. 1.1. Типичная передаточная характеристика встроенного датчика температуры: TA – температура, V – выходное напряжение датчика. Для работы с датчиком температуры используются следующие функции языка 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(TEMPSENSOR); // чтение датчика температуры Serial.println(val); // передача значения через COM-порт Delay(100); // задержка 100 миллисекунд } Полученное от функции analogRead(TEMPSENSOR) целое значение [0 .. 1023] нужно преобразовать в действительное значение температуры [ 0C]. Зависимость напряжения на выходе температурного датчика от температуры задается формулой: V = 0.00355 * TA + 0.986. (1.1) Из нее можно получить формулу для преобразования напряжения в температуру: TA = V / 0.00355 - 277.75. (1.2) Если опорное напряжение АЦП Vref ≠ 0, то преобразование входного напряжения АЦП V в его выходной код A подчиняется зависимости: A = 1023 * V / Vref. (1.3) При величине опорного напряжения Vref = 1.5В получим: V = A * 0.0014663. (1.4) Подставим это выражение в формулу для температуры (1.2) и получим: TA = A * 0.413 - 277.75. (1.5) По этой формуле целое значение кода A преобразуется в действительное значение температуры TA, которое нужно представлять переменной в форме с плавающей запятой. Однако операции с плавающей точкой в микроконтроллере выполняются медленно и требуют значительной памяти, поэтому лучше выполнить преобразование значений к целому типу с последующим выделением отдельно целой части и дробной части требуемого результата. Такое преобразование можно выполнить умножением и делением правой части (1.5) на 65536 (216). В результате: TA = (A * 27069 - 18202393) / 65536. (1.6) При вычислениях в программе деление на 65536 эквивалентно сдвигу числа на 16 разрядов вправо, поэтому формула (1.6) для записи на языке Arduino приобретает вид: TA = (A * 27069 - 18202393) >> 16. (1.7) Для округления результата к выражению в скобках следует добавить 0.5 * 65536. Получим: TA = (A * 27069 - 18202393 + 32768) >> 16. (1.8) Тогда TA[0C] = (A * 27069 - 18169625) >> 16. (1.9) Для преобразования выходного кода АЦП в температуру в градусах Кельвина и в градусах Фаренгейта можно пользоваться аналогичными формулами: TA[0K] = (A * 27069 - 268467) >> 16, (1.10) TA[0F] = (A * 48724 - 30634388) >> 16. (1.11) Пример программы, которая измеряет температуру и выдает на каждое измерение два значения: измеренное и усредненное по последним 4 измерениям. #define NUMBER 4 // константа – размер массива int ledState = HIGH; // статус светодиодов uint8_t i = 0; // целочисленная переменная, представленная без знака в 1 байте uint32_t average = 0; // беззнаковое целое в 4 байтах – накопленная сумма, // среднее значение uint32_t values[NUMBER]; // массив измеренных значений uint8_t j = 0; // счетчик элементов массива boolean flag = false; // признак необходимости печатать среднее значение void setup() { pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); analogReference(INTERNAL1V5); // величина опорного напряжения 1.5В analogRead(TEMPSENSOR); // первое чтение датчика обычно с ошибкой Serial.begin(9600); pinMode(PUSH2, INPUT_PULLUP); digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, LOW); Serial.print("\n\n\n*** MSP430 Thermometer \n"); Serial.print("Press PUSH2 to end\n"); Serial.print("instant\taverage\n"); // 1 колонка – измерение, 2 колонка – ср. значение for (j=0; j<NUMBER; j++) values[j]=0; // обнуление элементов массива average = 0; // обнуление суммы j=0; } // процедура печати целого числа как десятичного с 1 десятичным разрядом void printDec(uint32_t ui) { // ui умножено на 10 Serial.print(ui/10, DEC); // целая часть Serial.print("."); Serial.print(ui%10, DEC); // дробная часть – остаток от деления на 10 } void loop() { ledState = !ledState; // инверсия статуса светодиодов // LEDs: green = готовность; red = измерение digitalWrite(flag ? GREEN_LED : RED_LED, ledState); // если flag == true, то GREEN_LED устанавливается в состояние RED_LED, // иначе в состояние ledState if (i == 10) { // 9 тактов измерений по 100 мс пропускаются, измерение через 1 с i = 0; // формула для расчета результата измерения и накопление суммы average -= values[j]; // вычесть из суммы предыдущее значение values[j] = ((uint32_t)analogRead(TEMPSENSOR)*27069 - 18169625) *10 >> 16; average += values[j]; // сложить с суммой новое значением // Печать измерения printDec(values[j]); Serial.print("\t"); // печать среднего значения if (flag) printDec(average/NUMBER); Serial.print("\n"); j++; // инкремент индекса массива if (j==NUMBER) flag=true; // когда массив 4 измерений заполнен, можно печатать // средние значения j %= NUMBER; // j принимает значение остатка от деления на 4 } // проверка кнопки и прекращение измерений if (digitalRead(PUSH2)==LOW) { Serial.print("\n\n*** End \n"); Serial.end(); while(true); // бесконечный цикл } delay(100); // задержка 100 мс – длительность такта i++; // инкремент счетчика тактов } Прерывания. В микроконтроллерах MSP430 имеется три типа прерываний: сброс системы; немаскируемые (NMI); маскируемые. Приоритеты прерываний фиксированы и зависят от местонахождения конкретного модуля в цепочке, как показано на рис. 1.2. Чем ближе расположен модуль к ЦПУ, тем выше приоритет его прерывания. Приоритеты определяют порядок обработки прерываний при одновременной генерации нескольких запросов. Рис. 1.2. Приоритеты прерываний Немаскируемые прерывания (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.4), составляет 5 (MSP430X) или 6 (MSP430) тактов ЦПУ. Рис. 1.4. Обработка запроса на прерывание Обработка запроса на прерывание производится в следующей последовательности: 1. Ожидается завершение команды, исполняемой в данный момент. 2. Содержимое счётчика команд PC, указывающего на следующую команду, помещается в стек. 3. Содержимое регистра состояния SR помещается в стек. 4. Если за время выполнения последней команды было сформировано несколько запросов на прерывание, то выбирается прерывание с наибольшим приоритетом. 5. Если прерывание имеет один источник, то флаг прерывания автоматически сбрасывается. Если прерывание может генерироваться несколькими источниками, то флаги прерывания остаются установленными для последующей обработки в программе. 6. Регистр состояния SR очищается. В результате процессор переходит из режима пониженного потребления в активный режим. Поскольку бит GIE сбрасывается, последующие прерывания запрещаются. 7. Содержимое вектора прерывания загружается в счётчик команд PC и начинается выполнение процедуры обработки прерывания, расположенной по этому адресу. Возврат из прерывания Процедура обработки прерывания всегда завершается командой: RETI (возврат из процедуры обработки прерывания). Для возврата из прерывания требуется 5 (MSP430) или 3 (MSP430X) такта ЦПУ, необходимых для выполнения следующих действий (рис. 1.5): 1. Восстановление содержимого регистра SR из стека. В результате вступают в действие все предыдущие установки битов GIE, CPUOFF и пр., независимо от их установок, использовавшихся в процедуре обработки прерывания. 2. Содержимое счётчика команд PC извлекается из стека, и выполнение программы продолжается с того места, где она была прервана. Рис. 1.5. Возврат из прерывания. Вложенные прерывания Вложенные прерывания разрешаются установкой бита GIE в процедуре обработки прерывания. При этом любое прерывание, возникшее во время выполнения процедуры обработки прерывания, прервёт её выполнение, независимо от приоритетов обслуживаемого и нового прерываний. Векторы прерываний Векторы прерываний и вектор сброса располагаются в диапазоне адресов 0FFFh…0FFC0h, как показано в табл. 1.1. Таблица 2.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-порт нужно выдать измеренное значение времени нажатия в миллисекундах. 7.3. Написать, отладить и протестировать программу, которая должна фиксировать состояние датчика вибраций. Подобрать порог срабатывания, при котором устойчиво фиксируются вибрации (постукивание по датчику). При превышении уровнем вибраций установленного порога программа должна осуществить сигнализацию светодиодом и выдачу уровня зафиксированных вибраций в COM-порт. 7.4. Написать, отладить и протестировать программу обработки внешнего прерывания. 7.5. Написать, отладить и протестировать программу измерения температуры с помощью встроенного в микроконтроллер датчика. Программа должны работать по алгоритму демонстрационной программы, приведенному в разделе 3, и выдавать в COM-порт значения метки времени, текущего измерения температуры, среднего значения температуры по 5 измерениям в градусах Цельсия, Кельвина и Фаренгейта. 8. Методика выполнения задания 8.1. Настройку программной среды Energia производить в соответствии с указаниями раздела 5 Лабораторной работы № 1 по курсу «Микропроцессорные системы управления». 8.2. Изучить пример использования функции puiseIn() в разделе 3. 8.3. В качестве датчика вибраций использовать пьезокерамический излучатель. Подключить пьезокерамический излучатель между выводами 20 (GND) и 15 (аналоговый вход A7) микроконтроллера. Изучить пример Examples/Sensors/Knock. 8.4. Изучить пример обработки прерывания в разделе 3. Придумать и реализовать световые и звуковые эффекты, выдаваемые программой до и после прерывания. 8.5. Изучить пример программы измерения температуры в разделе 3. 9. Требования к содержанию и оформлению отчета Отчет по лабораторной работе должен содержать: краткие теоретические сведения; формулировку задания на лабораторную работу; описание последовательности выполнения работы; изображения рабочих окон с текстами программ; тексты программ, не помещающихся в рабочем окне; выводы по лабораторной работе.