Логический анализатор на msp430 launchpad

Уроки MSP430 LaunchPad. Урок 07: Жмем кнопки

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

Кнопки, один из простейших способов ввода, и их полезно изучить, дабы больше узнать о работе периферии.
Много разных кнопок и переключателей можно найти в продаже, и много способов как их присоединять к MSP430. Здесь рассмотрим те, что обычно называют «микрики». На плате LaunchPad есть две таких кнопки. Одна присоединена к выводу P1.

3 (в левом нижнем углу платы) и другая к выводу RST/SBWTDIO (вывод 16 на корпусе DIP).
Если посмотреть схему LaunchPad, то можно увидеть, что кнопки включены между соответствующим выводом микроконтроллера и землей. Заметьте, что одновременно эти выводы подключены к питанию (Vcc), через резисторы 47кОм.

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

Таким образом, не нажатая кнопка, это логическая единица, нажатая, это логический ноль.

(В LaunchPad версии 1.5, не впаяны R34 и С24, есть только места для их самостоятельной распайки. – Прим. пер.).

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

Какой бы проект платы вы самостоятельно не разрабатывали, не забывайте про резисторы подтяжки. Высокое сопротивление резисторов подтяжки (такое как 47 кОм на LaunchPad) необходимо для того, что бы избежать утечки тока при нажатии кнопок. В идеале, нам необходимо просто изменить потенциал вывода, не тратя на это никакой энергии.

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

Но, как замечено теми, кто разрабатывает реальные устройства, это плохая практика, использовать эти внутренние резисторы, для подключения кнопок. С установленными резисторами, использовать кнопки на микроконтроллере чрезвычайно просто. Давайте продемонстрируем это, написав программу, которая несколько раз мигает красным светодиодом на выводе P1.

0, а после нажатия кнопки, несколько раз мигает зеленым светодиодом на выводе P1.6 Нажатие кнопки еще раз возвращает мигание красного и так далее. Для этой программы нам нужно настроить выводы светодиодов P1.0 и P1.6 на выход, а вывод кнопки P1.3, на вход. Используем код конфигурирования выводов из программы-мигалки.

Так же нам понадобится переменная счетчика циклов, и второй счетчик для контроля количества вспышек после нажатия кнопки. Нам необходимо заставить MSP430 периодично проверять состояние кнопки, это называется «опрос».

Когда программа достигает места, где необходимо дождаться нажатия кнопки пользователем, она проверяет и проверяет кнопку раз за разом, пока не заметит, что кнопка нажата. Мы сделаем это, используя логическую операцию для проверки значения в регистре P1IN. Т.к. кнопка подключена к выводу P1.

3, третий бит регистра P1IN сообщит нам, что кнопка нажата (логический ноль) или не нажата (логическая единица). Остальные биты в P1IN могут иметь любое значение. Так как же нам извлечь только значение бита 3? Простейший способ, это использование оператор & (логическое И) который будет работать так: (x & 0 == 0), (x & 1 == x), т.е.

P1IN & BIT3 (0b00001000) вернет 0b0000x000, где x, это значение бита 3 в регистре P1IN. Важно понимать, что результат не 0 или 1, а 0 или 0b00001000, что является значением BIT3. Т.к. 0 сигнализирует о нажатии кнопки, мы можем опрашивать регистр P1IN в цикле, который продолжается пока (P1IN & BIT3) == BIT3, или, что равнозначно, пока (P1IN & BIT3) != 0.

Я написал свою версию программы pushy_G2211.c (листинг приведен в конце статьи – Прим. пер.). А вам рекомендую, попробовать написать программу самостоятельно, а потом сравнить с моей. Пара нововведений, относительно мигалки, это использование команды #define в заголовке, и заключение повторяющегося участка кода в функцию.

Если вы не понимаете, что это такое, то изучите основы языка Си, по любой хорошей методичке или книге. Например, этой. По сути, #define позволяет мне заменить имя BIT0, на что-то более конкретное, в данном случае на red_LED. Это не меняет значение BIT0, его все-еще можно использовать в коде.

Вы даже можете присвоить BIT0 два разных имени, например если у вас есть по светодиоду на P1.0 и на P2.0, нулевых выводах двух разных шин одного микроконтроллера. Функция delay(), так же делает код более читабельным, и демонстрирует мощь инкапсуляции. Т.к. функция delay(), чрезвычайно распространенная, я могу поместить ее в библиотеку, и вызывать во всех своих программах, избегая необходимости набирать один и тот же код много раз. Я рекомендую вам использовать эти и другие методы программирования как можно больше, что бы писать легкие для понимания и легко модифицируемые программы.

Данная программа, не идеальна, и ее логика не подойдет для любых ситуаций. Что произойдет, если вы нажмете кнопку в момент, когда светодиод горит? Т.к. ввод проверяется только в цикле while(), ничего не произойдет.

Если у вас рефлексы ниндзя, и вы будете жать кнопку точно в моменты до, и после ее опроса, программа никогда не узнает, что кнопка была нажата. А что случится, если нажать и не отпускать кнопку? Решением этих проблем, будут — прерывания. Это тема следующего урока.

Пока вы изучили самый примитивный способ использования кнопок.

Упражнение 1: Скопируйте программу в новый проект CCS и попробуйте загрузить в G2211. Пройдитесь по коду отладчиком. (Не забудьте уменьшить задержки в циклах опроса кнопки и мигания).

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

Упражнение 2: Мы не обсудили работу второй кнопки (RST) на LaunchPad. Попробуйте нажать ее, пока мигает красный светодиод. Что она делает? Пока что, LaunchPad сконфигурирован на использование этой кнопки единственным способом, это полезный инструмент, особенно если вам необходимо перезапустить вашу программу.

/* pushy_G2211: простое демо работы с кнопкой на * выводе микроконтроллера. */ #include #define red_LED BIT0 #define grn_LED BIT6 #define BTN BIT3 void delay(void); void main(void) { unsigned int flash; WDTCTL = WDTPW + WDTHOLD; P1OUT = 0; P1DIR |= red_LED + grn_LED; // Выводы светодиодов на выход // Если у вас LaunchPad версии 1.5, используйте эти две строчки // P1REN |= BTN; //разрешаем подтяжку // P1OUT |= BTN; //подтяжка вывода P1.3 вверх for (;;) { for (flash=0; flash

Источник: http://we.easyelectronics.ru/msp430/uroki-msp430-launchpad-urok-07-zhmem-knopki.html

MSP430, учимся программировать и отлаживать железо

Сегодня, уважаемый хабрапользователь, я постараюсь заполнить некоторый пробел, образовавшийся в статьях об MSP430, а именно азы и подход к программированию устройств на данном микроконтроллере. Эта статья прежде всего направлена на новичков, поскольку я буду рассматривать ряд достаточно простых задач, таких как работа с SPI, мигание лампочкой и отладка в proteus.

Введение

В данной статье будет рассмотрено устройство, в основу которого легла отладочная плата eZ430-RF2500. На плате находится микроконтроллер MSP430F2274 и беспроводной модуль CC2500, который, надо заметить, не будет рассмотрен далее. Моим коллегой, Соколовым С. А.

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

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

Что нам потребуется

Среда разработки

Для начала нужно скачать и установить среду разработки и компилятор. На сегодняшний день существует три варианта — Code Composer Studio, IAR Embedded Workbench for TI MSP430 и mspgcc.
Я буду использовать Workbench KickStart Edition. KickStart бесплатный, он имеет ограничение по количеству кода, но для изучения этого более чем достаточно.

Средство отладки

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

Понять причины того, почему же устройство отказывается работать часто помогает Proteus. В нём можно найти очень многие микроконтроллеры MSP430.

К сожалению MSP430F2274 в Proteus не оказалось, но имеется аналог — MSP430F2272, его и будем использовать.

Приступим к написанию кода

Создание проекта

На данном этапе сложностей возникнуть не должно. В качестве языка программирования выбираем C++.

  • Заменяем стандартный #include «io430.h» на #include «msp430f2274.h» (заголовочный файл для нашего микроконтроллера);
  • В свойствах проекта на вкладке Debugger выбираем Driver: FET Debugger;
  • На вкладке General Options в окне Device выбираем MSP430F2274;
  • Для того чтобы убедиться, что всё сделано правильно нажимаем Ctrl+D (Download and Debug). Как только контроллер прошивка загрузится нажимаем F5 для её выполнения.

В случае если нужно скомпилировать файл для Proteus, на вкладке Debugger в окне Driver выбираем Simulator, а на вкладке Linker Output в окне Format ставим Other и Output format выбираем intel-standart, а в окне Output file меняем расширение на hex.

Работа с портами

Первое, что стоит освоить в микроконтроллере — это работа с портами. Давайте рассмотрим небольшой пример.

PxDIR отвечает за направление порта 1.

Когда конкретный бит данного регистра установлен в 0, соответствующий пин работает на вход. И наоборот, если соответствующий бит установлена в 1, то пин работает на выход. В примере фигурируют 3 пина: P1.

2 — кнопка, P1.0 — красный светодиод, P1.1 — зеленый светодиод.

PxREN включает внутренний резистор подтяжки. Кнопка замыкает пин на землю, и, соответственно, переводит его в состояние нуля. Когда кнопка не нажата пин ни к чему не подключен и для обеспечения логической единицы на нём требуется подключить его через резистор к питанию, что и делает регистр P1REN.

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

PxSEL выбирает функцию пина. В datasheet на изображении микроконтроллера функции обычно указывают через знак «/».

Например на рисунке P2.7 работает как обычный пин в случае, если P2SEL имеет 0 в соответствующем разряде. По умолчанию, в данном случае, там установлена единица, что означает, что эта лапка предназначена для подключения внешнего часового кварцевого резонатора.

Константы BIT0..BITF содержатся в файле msp430f2274.h и представляют собой 16-ти разрядные слова в заданном разряде которых содержится 1, все остальные разряды содержат 0.

Надо заметить, что файл msp430f2274.h содержит много полезной информации. Там находятся все константы контроллера с комментариями на английском.

В примере используются побитовые операции Си, «|=» установит соответствующий значению справа бит в регистре слева в единицу, а «&= ~» напротив установит его в 0. Что получилось:

Работа с SPI

Сразу начну с примера В примере запрашивается значение регистра по адресу 0x8F, там содержится код, который идентифицирует устройство. Этот код указан в datasheet.

Это позволяет убедиться в том, что обмен данными произошел. В случае успеха включаем красный светодиод. Соответственно все остальные устройства подключенные к SPI необходимо отключить от интерфейса.

Для этого CS на них устанавливается в единицу.

Заключение

В следующий раз постараюсь рассказать подробнее про работу с LIS331DLH, добраться до прерываний, поработать со встроенным в программатор мостом USB-UART и рассказать немного про watchdog.

Я надеюсь, что эта статья оказалась полезна тебе, читатель.

Источник: https://habr.com/post/137205/

MSP430 и ADC. Использование АЦП

Продолжаем с учебным курсом по микроконтроллерам MSP430 и сегодня настало время разобрать работу модуля аналого-цифрового преобразователя. По традиции сначала теория, потом практика, так что приступаем!

Итак, микроконтроллеры MSP430 имеют в своем составе периферийный модуль ADC10, который представляет из себя 10-битный аналого-цифровой преобразователь (АЦП). А у некоторых контроллеров их целых два – 10 и 12-битный. К основным особенностям можно отнести то, что преобразование может быть запущено при помощи сигнала от таймера A.

Естественно, для работы АЦП необходимо опорное напряжение. MSP430 дает возможность использовать один из двух внутренних источников опорного напряжения (на 1.5 В и на 2.

5 В) или внешний источник опорного напряжения.  Вообще ADC10 может работать с двумя источниками опорного напряжения, верхнее напряжение может принимать значения от 1.

4 В до значения напряжения питания, а нижнее – от нуля до 1.2 В.

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

АЦП в MSP430 может работать в одном из четырех режимов:

  • однократное преобразование сигнала с одного из каналов
  • однократное преобразование сигналов с нескольких входов
  • повторяющиеся преобразования сигнала с одного из входов
  • и повторяющиеся преобразования с нескольких каналов

Режим нужно выбирать в соответствии с имеющейся задачей, мы, например, когда будем писать пример программы, задействуем первый из перечисленных режимов. Но не будем забегать вперед, сначала обсудим какие регистры отвечают за работу АЦП.

Регистр ADC10CTL0.

Регистр контроля и управления

Источник: https://microtechnics.ru/msp430-i-adc-ispolzovanie-acp/

TI LaunchPad MSP430 – Популярная робототехника

Микроконтроллерные платформы TI LaunchPad представляют собой вполне удачную попытку крупной компании разработать свой собственный аналог Arduino.

Всего линейка Texas Instruments LaunchPad насчитывает три устройства:

  • MSP430 – на базе 16-битных микроконтроллеров семейства MSP430G2x с тактовой частотой 16МГц;
  • C2000 – использует 32-битные микроконтроллеры C2000 Piccolo 28x с тактовой частотой 60МГц;
  • Stellaris – на основе 32-битных Stellaris LM4F с архитектурой ARM Cortex MF4 и частотой 80МГц.

Данная статья посвящена самой младшей модели MSP430, которая была мной успешно приобретена и опробована некоторое время назад.

Макетная плата TI LaunchPad MSP430 снабжена сокетом DIP-20 и поставляется в наборе с двумя микроконтроллерами серии MSP430G2x. Чипы отличаются друг от друга количеством памяти, числом выводов и набором последовательных портов. Ниже представлена сравнительная таблица этих двух устройств:

 MSP430G2553  MSP430G2452
 Тактовая частота  16МГц   16МГц
 Flash  16Кб  8Кб
 SRAM  512б  256б
 Цифровые входы/выходы  24  16
 Таймеры  2  1
 Последовательный порт  USCI — I2C, SPI, HW UART  USI — I2C, SPI
 АЦП  8 x 10бит  8 x 10бит

Помимо перечисленного в таблице, контроллер имеет в своем составе датчик температуры, сторожевой таймер и компаратор. Встроенные 16-битные таймеры имеют поддержку ШИМ. На плате также размещаются два светодиода на контактах P1.0 и P1.6, кнопка сброса и кнопка в разрыв вывода P1.3.

Приобрести данное устройство можно в собственном интернет-магазине TI (estore.ti.com) по чрезвычайно низкой цене – $4.30. Доставка включена в стоимость товара, что достаточно необычно для “неазиатского” магазина. А что самое удивительное, два устройства были доставлены мне всего за одну неделю посредством весьма недешевой почтовой службы FedEx.

Подозреваю что стоимость доставки раз в пять превысила стоимость товара. Такое транжирство американцев можно объяснить либо засилием внутрикорпоративной бюрократии в TI, либо попыткой посодействовать популяризации своей платформы. И если это было последнее, то оно сработало – мы заказали еще 4 подобных контроллера, а также два устройства из серии Stellars.

      
Как можно заметить, упаковка от TI разительно отличается от формата поставки китайских компонентов. Подобное, кстати, наблюдалось и при покупке контроллера mbed.

Стандартная комплектация LaunchPad MSP430 включает в себя следующие элементы.

  1. Макетную плату с установленным MSP430G2553.
  2. Микроконтроллер MSP430G2452.
  3. Внешний кварцевый резонатор на 32КГц.
  4. Два 10-контактных переходника мама-папа.
  5. Провод USB-miniUSB.
  6. Инструкцию.
  7. Два стикера с логотипом LaunchPad.

Размеры устройства – 66мм x 51мм. Расстояние между выводами как и положено 2.54мм (0.1''). Расстояние между рядами – 45мм.

Для составления программ TI рекомендует использовать свой родной IDE Code Composer Studio, либо сторонний платный IAR и систему с открытыми исходным кодом MSPGCC.

При этом, дабы не открывать платный функционал IDE каждому встречному, CCS имеет особый тип лицензии для MSP430 устройств, имеющий ограничение по размеру программы – 16Кб. Также имеется особая Free лицензия для контроллеров на базе Stellaris (и ряда других).

Поскольку разбираться с установкой MSPGCC совсем не хотелось, я решил установить CCS 5.1. К тому же, как уже говорилось, никаких ограничений по работе с MSP430 данный продукт не имеет. 

На wiki-сайте TI имеется подробная инструкция по установке IDE и по созданию первого проекта для MSP430. Вкратце,  алгоритм программирования устройства выглядит следующим образом.

В общем то все достаточно легко и просто, без привлечения программаторов.

Energia по своей сути является модифицированной версией Arduino IDE, разработанной специально для программирования LaunchPad MSP430. Интерфейс IDE полностью совпадает с прародителем, за исключением цвета. Таким образом, с помощью Energia вы можете легко использовать Arduino-вские скетчи для LaunchPad.Перед использованием Energia, потребуется установить драйвера для LaunchPad. Драйвера можно скачать со странички Energia на git-hub. Если у вас уже установлен TI CCS, то этот шаг можно опустить.

Затем необходимо скачать сам IDE, который также как и Arduino IDE поставляется в виде zip-архива. В распакованном архиве имеется исполняемый файл energia.exe, который и запускает Energia.

В меню “File / Examples” имеется практически такой же как в Arduino набор примеров простых программ. Готовая программа загружается на LaunchPad также с помощью кнопки “Upload” на панели инструментов. 

Единственным недостатком данного IDE является тот факт, что программировать с помощью него можно только младшую версию LaunchPad – MSP430. Если же возникнет необходимость  работы с LaunchPad C2000 или Stellaris, то потребуется использовать родной TI CCS, в котором кодирование представляется куда более сложным.

Как уже говорилось выше, на сайте TI имеется подробная инструкция по программированию LaunchPad для мигания встроенным светодиодом. Программа, разработанная в среде CCS, выглядит следующим образом:

#include

unsigned int i = 0;

void main( void ) {

    WDTCTL = WDTPW + WDTHOLD;

    P1DIR |= 0x01;

    while( 1 ) {

        P1OUT ^= 0x01;

        for( i=0; i

Источник: http://www.poprobot.ru/ideologia/kontroller/ti-launchpad-msp430

Интерфейс начального загрузчика для MSP430 на основе LaunchPad, использующего протокол UART

Журнал Компоненты TI , Выпуск 1, 2015 г

В статье описывается реализация недорогого интерфейса начального загрузчика (BSL) для микроконтроллера MSP430 на основе LaunchPad, использующего протокол UART.

Целью этой разработки является внедрение устройств MSP430 Value Line, имеющих менее двух модулей последовательного интерфейса, в качестве моста между программным инструментом начальной загрузки BSL Scripter и устройством MSP430, куда осуществляется загрузка.

Дополнительные материалы по проекту и исходный код программы, относящиеся к данной статье, можно загрузить с сайта.

Начальный загрузчик (BSL) микроконтроллера MSP430 — это программа, которая встроена в устройства MSP430 для считывания и изменения содержимого памяти MSP430, и которую можно использовать для изменения встроенного программного обеспечения. Большинство устройств MSP430 имеют возможность доступа к UART BSL через интерфейс UART. Исключение составляют устройства MSP430 с интерфейсом USB, которые имеют встроенную программу USB BSL [1].

UART BSL

Программу UART BSL можно вызвать, подав специальную входную последовательность сигналов BSL на контакты RST и TEST (в случае устройств, в которых контакты интерфейса JTAG объединены с другими контактами) или на контакт TCK (в случае устройств, имеющих отдельные контакты JTAG).

Входная последовательность сигналов BSL будет разной для устройств MSP430, в которых контакты JTAG объединены с контактами другого назначения, и устройств, имеющих специально выделенные контакты JTAG.

Отличие входных последовательностей сигналов BSL для этих двух типов устройств отражены на Рисунках 1 и 2.

Рисунок 1. Входная последовательность сигналов BSL для устройств сконтактами JTAG, объединёнными с другими контактами.

Кадры данных протокола UART BSL принципиально различны в случае BSL на основе ПЗУ и BSL на основе flash-памяти. Программа BSL на основе ПЗУ доступна в устройствах 1xx, 2xx, и 4xx, а BSL на основе flash-памяти имеется в устройствах 5xx и 6xx. Подробнее о протоколе BSL обоих типов программного обеспечения BSL в [2].

Рисунок 2. Входная последовательность сигналов BSL для устройствсо специально выделенными контактами JTAG.

Универсальный асинхронный приёмопередатчик (UART)

Универсальный асинхронный приёмопередатчик (UART) — это стандарт последовательной связи, который широко используется во встроенных системах.

Поскольку данные передаются последовательно и асинхронно (без всякого тактового сигнала), и приёмная, и передающая стороны вынуждены использовать одинаковые настройки скорости передачи данных (обычно она определяется как скорость передачи в бодах), количества битов данных и использования бита чётности. Стандартный кадр UART показан на Рисунке 3.

Рисунок 3. Кадр UART.

По умолчанию линия связи UART находится в состоянии отсутствия передачи, имея логический уровень «ВЫСОКИЙ». Обычно сигналом СТАРТОВОГО бита является первый переход из состояния «ВЫСОКОГО» логического уровня в состояние «НИЗКОГО» логического уровня. После передачи СТАРТОВОГО бита передаются биты данных.

В большинстве систем данные отправляются в формате с прямым порядком байтов (первым следует младший байт), а битов данных может быть 7 или 8. Перед СТОПОВЫМ битом может, при необходимости, отправляться бит чётности для проверки кадра.

Наконец, СТОПОВЫЙ бит обозначает конец кадра UART, представляя собой переход из состояния «НИЗКОГО» логического уровня в состояние «ВЫСОКОГО» логического уровня.

Комплект разработчика MSP-EXP430G2 Launchpad

Комплект разработчика MSPEXP430G2, известный под названием «Launchpad» — это недорогой комплект разработчика устройств MSP430G2xxx Value Line. Комплект разработчика имеет встроенный эмулятор интерфейса USB, который также можно использовать в качестве интерфейса UART (COM-ПОРТА) со скоростью передачи данных 9600 бод.

Реализация

В статье рассматривается микроконтроллер MSP430G2231 на плате MSP-EXP430G2 Launchpad и микроконтроллер MSP430F5438A, версии E, имеющий ошибку SYS10 (время между импульсами на контактах TEST и TCK должно быть менее 15 мкс), в качестве устройства MSP430 в комплекте разработчика MSP-TS430PZ5x100, куда осуществляется загрузка. На Рисунке 4 показана испытательная установка, представляющая собой соединение плат Launchpad и MSP-TS430PZ5x100.

Рисунок 4. Испытательная установка для интерфейса UART BSLна основе Launchpad.

Аппаратная реализация

Подключение аппаратного обеспечения

На Рис. 5 показано типовое аппаратное соединение между ПК, на котором работает программа BSL Scripter, платой MSP- EXP430G2 Launchpad и устройством MSP430, куда осуществляется начальная загрузка; в данном случае это MSP430F5438A на плате MSP- TS430PZ5x100.

Рисунок 5. Типовое аппаратное подключение интерфейса BSL на основе Launchpad.

Назначение контактов

Эта реализация системы требует использования всех контактов порта 1 (P1) микроконтроллера MSP430G2231. Помимо шести контактов, показанных на Рисунке 5, в Launchpad есть два других контакта, которые нужны для реализации интерфейса BSL.

Один контакт используется для определения типа устройства MSP430, куда осуществляется загрузка, указывая, является ли оно устройством, в котором контакты JTAG объединены с другими контактами, или же устройством со специально выделенными контактами JTAG.

Другой контакт, который подключается к кнопочному выключателю на плате, используется в качестве входа для формирования входной последовательности BSL. Изначально программа BSL Scripter использовала контакты DTR и RTS для формирования входной последовательности BSL в устройстве MSP430, куда осуществляется загрузка.

Но эти контакты не доступны в UART- соединении комплекта разработчика MSP-EXP430G2 Launchpad, поэтому необходимо использовать другой вход, чтобы заставить MSP430G2231 на плате Launchpad формировать входную последовательность BSL для устройства MSP430, в которое осуществляется загрузка. В Таблице 1 указано назначение контактов ввода/ вывода общего назначения (GPIO) MSP430G2231.

Таблица 1. Назначение контактов MSP430G2231.
Контакт GPIO Назначение
P1.0 Входной контакт для типа входной последовательности BSL. Высокий логический уровень на входе означает, что устройство, куда осуществляется загрузка, имеет контакты JTAG, объединённые с другими контактами, низкий логический уровень означает устройствосо специально выделенными контактами JTAG.
P1.1 Контакт передачи UART в ПК (подключается к контакту UART RX (приём) в ПК)
P1.2 Контакт приема UART от ПК (подключается к контакту UART TX (передача) в ПК)
P1.3 Вход кнопки для формирования входной последовательности BSL.
P1.4 Подключение контакта RST к устройству MSP430, куда осуществляется загрузка, дляформирования входной последовательности BSL
P1.5 Подключение контакта TEST и TCK к устройству MSP430, куда осуществляется загрузка,для формирования входной последовательности BSL
P1.6 Контакт приёма UART от устройства MSP430, куда осуществляется загрузка (подключаетсяк контакту BSL TX (передача) в устройстве MSP430, куда осуществляется загрузка)
P1.7 Контакт передачи UART в устройство MSP430, куда осуществляется загрузка (подключаетсяк контакту BSL RX (приём) в устройстве MSP430, куда осуществляется загрузка)

Программное обеспечение

Технология мостового соединения

Как указано в аннотации, цель данной работы заключается в реализации интерфейса BSL, которые служит мостом между интерфейсом UART ПК, на котором работает программный инструмент BSL Scripter, и устройством MSP430, куда осуществляется загрузка, при этом устройство MSP430 имеет менее двух последовательных интерфейсов.

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

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

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

Блок-схема

Реализация программного обеспечения интерфейса BSL на основе Launchpad показана на Рисунке 6.

Рисунок 6. Блок-схема реализации программного обеспечения интерфейсаBSL на основе Launchpad.

Использование интерфейса BSL на основе Launchpad

При использовании интерфейса BSL на основе Launchpad необходимо учитывать несколько аспектов:

  • Для правильной работы необходимо снять перемычки J5, соединяющие контакты P1.0 и P1.6 со встроенными светодиодами платы. 
  • По умолчанию программный инструмент BSL Scripter использует линии DTR и RTS для формирования входной последовательности BSL. В UART-соединении MSPEXP430G2 эти линии не предусмотрены, поэтому необходимо нажать переключатель S2 перед запуском программы BSL Scripter, чтобы сформировать входную последовательность BSL. 
  • UART-соединение MSP-EXP430G2 работает только со скоростью передачи данных 9600 бод. Поэтому невозможно запустить BSL Scripter со скоростями передачи данных, отличающимися от 9600 бод.

Литература

  1. wiki-страница BSL (MSP430): BSL (MSP430) wiki.
  2. Руководство пользователя по программированию MSP430 с помощью начального загрузчика (SLAU319).
  3. Руководство пользователя по семейству MSP430x5xx/MSP430x6xx (SLAU208).

Источник: https://www.rlocman.ru/review/article.html?di=181868

Создайте свое первое приложение для TI LaunchPad

В данной статье мы познакомимся с TI LaunchPad, который делает разработку приложений для микроконтроллеров MSP430 простой и быстрой.

Семейство микроконтроллеров MSP430 Texas Instruments занимает важное место в мере электроники: с одной стороны, отличаются ультранизким энергопотреблением, а с другой стороны, они предоставляют очень мощные возможности в плане переферийных устройств, размера памяти, скорости и простоты использования.

В данной статье мы познакомимся с TI LaunchPad, который делает разработку приложений для микроконтроллеров MSP430 простой и быстрой.

LaunchPad – это недорогой инструмент прототипирования устройств на MSP430, который обеспечивает эмуляцию на плате для программирования и отладки.

Существует много продвинутых версий LaunchPad, отличающихся различными периферийными устройствами, но мы будем использовать базовую версию под названием «оригинальный LaunchPad».

Аппаратная часть LaunchPad

LaunchPad представляет собой набор (приобрести можно здесь), который включает в себя следующее:

  • 1 x отладочная плата LaunchPad
  • 1 x микроконтроллер MSP430G2553IN20
  • 1 x микроконтроллер MSP430G2452IN20
  • 1 x кварц 32.768 кГц
  • 2 x 2.54 мм 1×10 разъем (мама)
  • 1 x кабель USB-A на Mini-USB
  • 2 x наклейка LaunchPad

На плате LaunchPad присутствуют секция эмуляции для программирования и отладки через USB, одна кнопка общего назначения, два светодиода общего назначения, одна кнопка сброса, два порта расширения и 20-пиновая панель для микроконтроллера.

Плата питается через mini-USB напряжением 5 В и преобразует его в 3,6 В с помощью LDO-регулятора. Чтобы работать, секция эмуляции и микроконтроллер нуждаются в напряжении с таким уровнем. Сеть 3,6 В помеченная как VCC, и проводники GND присутствуют на разъемах J1, J2 и J.

Секция эмуляции создает интерфейс между микроконтроллером и средой программирования.

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

Секции эмуляции также включают в себя преобразователь USB в UART, который может быть сконфигурирован для взаимодействия микроконтроллера с компьютером через последовательный канал связи.

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

LaunchPad поставляется с двумя 16-битными микроконтроллерами: MSP430G2452 и MSP430G2553. Они оба с 20 выводами. Основные свойства этих микроконтроллеров перечислены ниже, и выделены различия между ними.

Сравниваемый параметрMSP430G2452IN20MSP430G2553IN20
CPU MSP430 MSP430
Частота (МГц) 16 16
Энергонезависимая память (KB) 8 16
RAM (KB) 0.25 0.5
GPIO (входы/выходы общего назначения) 16 16
I2C 1 1
SPI 1 1
UART 1
АЦП ADC10 – 8 каналов ADC10 – 8 каналов
Компараторы (входы) 8 8
Таймеры – 16 бит 1 2
Минимальное напряжение питания 1.8 1.8
Максимальное напряжение питания 3.6 3.6
Потребление в активном режиме (мкА/МГц) 320 330
Потребление в режиме ожидания (режим LPM3) (мкА) 0.7 0.7
Время включения (мкс) 1.5 1.5
Дополнительные особенности Сторожевой таймер Датчик температурыПерезапуск по броску питания Сторожевой таймер Датчик температуры Перезапуск по броску питанияИнфракрасный порт
Специальные входы/выходы Емкостные сенсорные входы/выходы Емкостные сенсорные входы/выходы

Оба микроконтроллера имеют встроенные программируемые тактовые генераторы 16 МГц.

Кроме того, LaunchPad позволяет пользователю подключать внешний тактовый генератор, такой как часовой кварц 32,768 кГц или любой другой стандартный кварц до 16 МГц.

SMD площадки и площадки с отверстиями дают пользователю возможность использовать кварцы в разных корпусах. Если для кварца необходимы дополнительные конденсаторы, на плате для этих целей зарезервированы площадки C21 и C22.

Еще одной интересной особенностью микроконтроллеров является встроенный датчик температуры. Это линейный датчик, который выдает 3.55 мВ/C°. Выход датчика подключен внутри к одному из входов АЦП, и пользователь может выбрать, будет ли этот вход считывать температурные данные с датчика.

Все выводы микроконтроллера выведены на разъемы J1 и J2, чтобы при прототипировании можно было бы легко использовать выводы устройства. Площадки J1 и J2 поставляются в разобранном виде, поэтому вы можете подключить разъемы мама или папа в зависимости от того, что вам необходимо.

Инструменты программирования

Существует несколько вариантов выбора интегрированной среды разработки (IDE), доступных для LaunchPad для написания кода, прошивки устройства и для отладки.

Energia

Energia – это инструмент редактирования кода с открытым исходным кодом, разрабатываемый сообществом для LaunchPad. Она поддерживается на Mac OS, Windows и Linux. Energia использует Wiring и Arduino фреймворк, и поэтому ее пользовательский интерфейс почти такой же, как у Arduino IDE. Energia является полностью бесплатной и поддерживает все платы LaunchPad.

Code Composer Studio (CCS)

Code Composer Studio (CCS) – это профессиональный инструмент разработки, созданный TI, который так же поддерживает все платы LaunchPad.

Она может быть загружена и установлена на компьютер, или может использоваться облачная версия в веб-браузере. CCS поставляется с ограничением размера кода в 16 KB при свободном использовании.

Поскольку MSP430 на оригинальном LaunchPad максимум с 16 KB, это не является проблемой.

CCS Cloud позволяет разрабатывать, компилировать, прошивать и отлаживать код, всё в веб-браузере. В облачной среде есть и другие полезные функции, такие как просмотр и импортирование примеров из ресурсного центра MSP430, интеграция с GitHub, связь с LaunchPad через последовательный монитор и т.д.

Загружаемая и полнофункциональная версия CCS также доступна. Она основана на базе Eclipse и поддерживает все процессорные устройства TI, в том числе и LaunchPad. Перед загрузкой требуется регистрация на сайте TI.

Сторонние IDE

Существует много других сторонних инструментов разработки для LaunchPad. Keil и IAR Embedded Workbench являются полными наборами из компилятора и отладчика. GCC – компилятор с открытым исходным кодом, поддерживающий TI LaunchPad. Temboo – онлайн платформа для разработки, которая также поддерживает LaunchPad.

Простое приложение для LaunchPad

После краткого введения в аппаратную часть LaunchPad и инструменты разработки, мы можем создать наше первое приложение с помощью периферийных устройств на плате и Energia IDE. Мы будем использовать светодиоды и кнопки, чтобы продемонстрировать, как настроить направления портов, как прочитать состояние входа и как установить состояние выхода.

Запустите Energia и создайте новый скетч, используя меню Файл (File) → Новый (New). Появится новый файл скетча, содержащий пустые функции setup() и loop(). В функции setup() мы должны установить направления портов с помощью функции pinMode().

Выводы GREEN_LED и RED_LED должны быть выходами, а вывод PUSH2 для кнопки должен быть входом.

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

void setup() { // инициализация выводов, подключенных к светодиодам на плате, как выходы: pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT); // инициализация вывода, подключенного к кнопке на плате, как вход: pinMode(PUSH2, INPUT_PULLUP); }

В основном цикле состояние входа кнопки будем читать с помощью функции digitalRead(). Мы проверяем состояние кнопки, используя оператор if. Когда кнопка не нажата, функция digitalRead() возвращает 1, так как вывод PUSH2 подтянут внутренним резистором к высокому уровню. В этом состоянии зеленый светодиод мигает.

Мигание осуществляется периодическим включением и выключением светодиода с помощью функции digitalWrite() с интервалом в 100 мс. Функция delay() помогает нам задать нужный интервал времени ожидания. Когда кнопка нажата, она притягивает вывод PUSH2 к корпусу, и функция digitalRead() возвращает 0.

Теперь зеленый светодиод выключается, а красный светодиод начинает мигать.

void loop() { // проверяем, нажата ли кнопка. if (digitalRead(PUSH2)) { // мигаем зеленым светодиодом на выводе GREEN_LED: digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); delay(100); digitalWrite(GREEN_LED, LOW); delay(100); } else { // мигаем красным светодиодом на выводе RED_LED: digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, HIGH); delay(100); digitalWrite(RED_LED, LOW); delay(100); } }

Полный скетч приведен ниже.

Когда скетч готов, просто нажмите кнопку Проверить (Verify) для запуска компиляции. Если ошибок нет, Energia выдаст сообщение “Done compiling”. В противном случае ошибки будут перечислены на вкладке сообщений. После успешного завершения компиляции вы можете прошить свое устройство, нажав кнопку Загрузить (Upload).

Убедитесь, что вы уже выбрали правильный последовательный порт, к которому подключен ваш LaunchPad, с помощью меню Инструменты (Tools) → Последовательный порт (Serial Port) и правильную модель LaunchPad, которую вы используете (например, LaunchPad w/ MSP430G2353 (16MHZ)), с помощью меню Инструменты (Tools) → Плата (Board).

Код в действии вы можете увидеть на видео ниже.

Ссылки:

Оригинал статьи:

Источник: https://radioprog.ru/post/102

Программирование под MSP430

Режим отладки приложения, это одна из наиболее полезных возможностей при разработке ваших проектов. Что-ж, пришло время рассмотреть её поближе. Запустите CSS, откройте в нём мигалку и запустите режим отладки, кликнув на старого-доброго жука. Только в этот раз, не надо запускать приложение. Не жмите треугольник. Ведь нам нужен именно режим отладки. Сделали? Отлично.

Теперь на вашем экране должно быть примерно тоже, что и на картинке. По умолчанию, в режиме отладки, открывается 4 активных окна. С двумя из них, мы уже знакомы. Нижнее – различная информация о ходе работы IDE:  сообщения компилятора, или информация о загруженном коде. Там много всякой ерунды 🙂 Ну и среднее окно – собственно, это наш редактор. Его-то вы точно узнали.

Что касается оставшихся двух окон, “Debug” и “Variables/Expressions/Registers”. Тут на самом деле, тоже ничего сложного. Окно “Debug” показывает наше текущее положение в иерархии нашего проекта. Звучит не очень понятно, как и выглядит, но не забивайте себе голову. Просто напросто наша программа состоит всего из одного файла – main.

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

Play/Pause/Stop

Обратите внимание коллекцию иконок в окне отвечающем за отладку. Тут вы можете увидеть ту самую кнопку запуска приложения, которую нажимали в конце предыдущей лекции. Помимо неё тут присутствует кнопка “Пауза”(которая, кстати, не активна до тех пор, пока не нажмёте кнопку запуска), следом за ней идёт кнопка останова.

В общем, все как в вашем любимом аудио или видео плеере, до боли знакомые “Play”, “Pause” и “Stop” Не хватает только клавиш перемотки 🙂 Или… хватает? 

Теперь о клавишах перемотки. Их есть у нас 🙂 По крайней мере, ближайшие аналоги. Взглянем на следующее изображение. На нём изображен целый ряд иконок со стрелочками. Пока что, нас интересует только первая из них. Она называется “Step Into” что по русски звучит как “С шагом в …”.

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

Прежде чем мы приступим к отладке нашего кода, давайте внесём в код некоторые изменения. К примеру, в цикле, где организована задержка, поменяем число 60000 на 6. Особо догадливые, наверное, уже поняли зачем это, если вы не из их числа, то наберитесь немножко терпения. Скоро все станет очевидно.

Итак, после того как вы внесёте изменения в код, скомпилируйте и залейте в микроконтроллер обновленную версию мигалки.

Примечание переводчика: в оригинальной статье на скриншотах есть какая-то волшебная кнопка которая автоматически в режиме отладки компилирует измененный код и загружает новую версию приложения в MSP430.

В своей CCS я этой кнопки в упор не вижу, поэтому буду благодарен если вы мне её покажете. Если у вас её тоже нет, – действуйте по старинке. Останавливайте отладку, и заново загружайте код в МК.

Good Luck, sugarcubes :3

Ну что-ж, пришло время для использования нашей заветной кнопочки “перемотки”, она же “Step Into”. Когда вы её нажимаете, управление передается следующей строке вашего кода. Клик – строка. Клик – строка. Все просто и очень удобно. Таким образом вы можете пошагово проследить выполнение программы.

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

Кстати, вы уже заметили, что переменная count уже появилась в окне Variables? Нет? Так вот она там есть 🙂 CCS загружает эту информацию автоматически, ещё до начала отладки. Эта переменная, кстати, скорее всего имеет какое-нибудь совершенно случайное значение. Оно и верно, ведь переменная-то ещё не инициализирована.

Прежде чем мы “выполним” строку меняющую значение регистра WDTCTL, давайте взглянем на ещё одно крайне полезное окно. Кликните на менюшку View->Registers и вы увидите ещё одно окно, в котором содержатся все регистры вашего устройства.

(Это КРАЙНЕ полезная фича, обучаться работе с регистрами нашего микроконтроллера с помощью неё – просто сказка) Найдите в этом списке регистр Watchdog_Timer. Раскройте его и увидите тот самый регистр который вы вот-вот измените – WDTCTL. Отладчик показывает, что в данный момент, значение регистра WDTCTL – 0x6900 (помните, что префикс 0x означает шестнадцатеричные данные).

Раскройте и этот регистр, чтобы посмотреть на значения конкретных битов. Как вы видите, все они обнулены при включении нашего микроконтроллера. Это означает то, что при таких настройках, сторожевой таймер будет выполнять свои прямые обязанности, а именно – сбрасывать наш МК с определенным интервалом. Нужно ли нам это? Сейчас – нет. Как мы исправим наше положение? Правильно – нажмем 'Step Into' чтобы внести изменения в наш регистр.

Классно, правда? Значение WDTHOLD изменилось на 1(а само поле пожелтело, сигнализируя о том, что за этот такт в регистре что-то изменилось) а сам WDTCTL теперь равняется 0x6980. Ничего не настораживает? Хорошо если да.

Особо внимательные из вас должны помнить, что WDTCTL для изменения требует константу 0x5A(WDTPW), в то время как при попытке чтения этих битов, возвращаемое значение всегда 0x69. Вот такие пироги.

(Кстати, хотите выполнить форсированный сброс вашего микроконтроллера? Легко! Просто напишите с виду безобидную строку WDTCTL = WDTCTL.

Ведь правая часть этого выражения, подразумевает чтение значений, а чтение первых восьми битов этого регистра всегда возвращает 0x69, в то время как запись(левая часть) требует 0x5A. Таким образом, получается то, что WDTPW записывается неверный. Ну, а когда наш MSP430 получает некорректный пароль, он моментально сбрасывается. Мало ли чего)

Попробуйте, найдите регистры первого порта(P1) и выполните следующие две строчки кода. Посмотрите, как изменяются значения регистров. Завораживает =) Теперь, “курсор” отладчика должен стоять на строке который переключает состояние светодиода. То есть включает если он выключен, и выключает если включен. Всё просто.

Кстати, гляньте ещё разок на переменную count, она всё ещё содержит случайное значение. Настало время для знаменательного момента – жмём ещё раз F5(Step Into) и … он загорелся! Сейчас курсор отладчика располагается на строке с циклом for который выполняет нашу задержку. Жмём F5 и проходим первую итерацию цикла. Тут-то переменная count наконец-то инициализирована.

Как мы видим, она принимает значение 0. F5. Переменная count теперь 1. Таким образом, мы жмём F5 до тех пор(теперь прикиньте, если бы там до сих пор стояло 60000), пока не выйдем из цикла, перейдя на следующую итерацию вышестоящего for, где мы снова переключаем значение регистра P1OUT и выключаем светодиод.

В любой момент времени, вы можете нажать кнопку Run и сложить управление на плечи MSP430. Чтобы тот мигал самостоятельно, без вашего вмешательства. Есть один нюанс – вы этого не заметите.

Этот микроконтроллер достаточно быстр, чтобы ваш глаз попросту не заметил его подмигиваний с задержкой в 6 тактов 🙂 Как видите, отладчик  – крайне полезная вещь, но вам следует помнить, что он не всегда сможет вам помочь. MSP430 спроектирована для взаимодействия с окружающим миром.

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

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

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

Домашнее задание: попробуйте отладить код из лекции №04. Ведёт ли он себя так, как вы ожидали? Не забудьте изменить условие в цикле задержки, чтобы не жать F5 шестьдесят тысяч раз 🙂 Убедитесь, что программа работает в точности так, как вы запланировали. 

Перевёл и дополнил: Александр Мошкин

Оригинал статьи: Tutorial 06. Getting the Bugs Out
Следующая лекция:
Предыдущая лекция: Лекция №05. Загружаем программу

Источник: http://msp430-ru.blogspot.com/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}