Avrstudio 4. cmsis для avr. структура для gpio

Структуры, перечисления

Немного очевидных вещей, которые не так часто используются в AVR микроконтроллерах, зато достаточно популярны при написании кода для STM32. В частности для настройки периферии посредством библиотеки standart peripheral library (SPL)

Рассмотрим следующий кусок кода:

typedef enum{low=9600, mid=19200, high=57600}speed;
speed SPEED;
SPEED = low;
printf(“%d
“, SPEED);

Пофантазируем. Представьте себе ситуацию: вы сделали некое устройство, пускай это будет абстрактный датчик температуры, который передает данные по uart.

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

Допустим датчик может корректно работать только на трех скоростях uart 9600, 19200 и 57600.

Можно пытаться объяснить этот момент в документации, но кто будет ее читать?Поэтому гораздо правильнее написать такой код, чтобы пользователь не мог ошибиться. В этом очень здорово могут помочь перечисления.

Вернемся к нашему куску кода. Есть некое перечисление, о чем нам говорит ключевое слово enum, название которого speed. Назвать перечисление мы вольны как угодно.

typedef enum{low=9600, mid=19200, high=57600}speed;

Далее по коду мы выделяем память
speed SPEED;

Теперь у нас есть переменная SPEED, которая может принимать только 3 значения low, mid, high. Соответственно когда мы присваиваем SPEED = low; то переменная SPEED становится равной 9600.

Если мы попытаемся записать в SPEED все что угодно, кроме low, mid, high, то проект не скомпилится и вылезет ошибка.

Таким образом, у того кто будет использовать вашу библиотеку шанс ошибиться намного меньше.

Пример из реальной жизни. Все кто использовал SPL для создания проектов для STM32 совершенно точно видел подобные куски кода

GPIO_InitTypeDef PA10_setup;
PA10_setup.GPIO_Mode = GPIO_Mode_Out_PP;
PA10_setup.GPIO_Pin = GPIO_Pin_10;
PA10_setup.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &PA10_setup);

Выколите мне глаза, кричали ониНо на деле, если взглянуть в инклюды, то все просто например PA10_setup.GPIO_Speed это всего навсего перечисление, выглядит оно так:

typedef enum
{ GPIO_Speed_10MHz, GPIO_Speed_2MHz, GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

Периодически народ спрашивает, откуда ты берешь все эти значения для инициализации? Да вот же они! Все возможные варианты. Достаточно понимать что ищешь. Тоже самое с остальными настройками.

Теперь перейдем к структурам. Знаете ли вы что такое массив? Это объединение нескольких одинаковых переменных под одним именем. Например, вы измерили 3 раза температуру за окном. Это удобно и понятно, все 3 температуры относятся к некому одному объекту и имеют одинаковый тип данных char. char temp[3];

temp[0] = 25, temp[1] = 15, temp[2] = 10.

Но иногда может быть так, что нужно привязать к одному объекту, переменные разного типа данных char, int и т.п. Типичный пример, у человека есть рост, вес и цвет волос. Рост и вес типа char, а цвет волос кодируется 3 байтами (RGB). В этом случае удобно использовать структуры.

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

#include “stdafx.h”
int _tmain(int argc, _TCHAR* argv[])
{ struct DOG //структура DOG, с помощью которой можно составить описание собаки { char gender; //возраст int weight; //вес char *color; //цвет (указатель) };
  struct DOG sharik; //выделяем память под шарика struct DOG bobik; //выделяем память под бобика
  sharik.gender = 2; //возраст шарика 2 года sharik.weight = 17; //вес 17 кг sharik.color = “black”; //цвет черный
  bobik.gender = 5; //возраст шарика 5 лет bobik.weight = 15; //вес 15 кг bobik.color = “white”; //цвет белый
  printf(“Sharik:
weight: %d, gender: %d, color: %s

“, sharik.weight, sharik.gender, sharik.color); printf(“==============================================

“); printf(“Bobik:
weight: %d, gender: %d, color: %s

“, bobik.weight, bobik.gender, bobik.color); printf(“==============================================

“); return 0;
}

Результат

Программа полна коментов, но все же поясним. Вначале создается структура с именем DOG, т.е. собака. Все собаки имеют общие признаки возраст, вес и цвет. Соответственно 3 переменных.

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

Доступ к переменным осуществляется через точку.

Очевидно, что если делать подобную программу без структуры, она скорее всего содержала бы кучу переменных типа char sharik_gender, sharik_weight. Поэтому программа со структурами выглядит намного нагляднее и понятнее. Кроме того, существует несколько хитростей, благодаря которым можно сильно упростить разбор протоколов, но об этом в другой раз, когда сам хорошо овладею

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

typedef struct //создаем синоним структуры под именем DOG { char gender; //возраст int weight; //вес char *color; //цвет } DOG; //теперь можно обращаться без ключевого имени struct
  DOG sharik; //выделяем память под шарика DOG bobik; //выделяем память под бобика

Собственно вернемся к изначальной цели, откуда мне взять все эти настройки для периферии STM. Возьмем наш пример и GPIO, заходим в stm32f10x_gpio.h и находим ту самую структуру.

typedef struct
{ uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */   GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */   GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef;

Из структуры GPIO_InitTypeDef можно сразу догадаться, что GPIO_Pin — номер ножки, GPIO_Speed — скорость ножки, GPIO_Mode — тип режима ножки. В итоге GPIO_InitTypeDef позволяет полностью описать настройку ножки. Обратите внимание, что для разных типов мк она может немного отличаться.

Дальнейшие наши действия — прошерстить файл и найти описание элементов структуры.

Например для GPIO_Pin, можно найти кучу дефайнов с комментами, думаю тут даже нечего пояснять

#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ #define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */

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

выход пуш-пул

typedef enum
{ GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

GPIO_Speed тоже перечисление, о чем уже упоминалось выше typedef enum { GPIO_Speed_10MHz, GPIO_Speed_2MHz, GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

В итоге после заполнения всех элементов структуру, мы передаем в функцию GPIO_Init указатель на структуру и говорим для какого порта эти настройки. Внутри этой функции, просто напросто соответствующие переменные из структуры, заносятся в регистры.
GPIO_Init(GPIOA, &PA10_setup);

Сложно ли это все? Пожалуй, когда первый раз читаешь, то да. Но вдумайтесь, можно ли сделать проще и при этом универсально? Довольно сложно придумать что то еще. Настоятельно рекомендую поковырять все эти вещи, в какой нить Visual C++ или чем то аналогичном.

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

Источник: http://avr-start.ru/?p=3602

Библиотека CMSIS

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

Стандартизуя интерфейсы всех продуктов производителей микроконтроллеров с ядром Cortex-M, можно сократить процесс создания нового проекта или переноса старого на микроконтроллер другого производителя.

ARM CMSIS – это независимый от производителя уровень аппаратной абстракции для серии ядер Cortex-M, а также интерфейс отладчика (англ. debugger). CMSIS предоставляет последовательные и простые интерфейсы для ядра, его периферии и операционных систем реального времени.

Библиотека CMSIS включает в себя следующие компоненты:

  • CMSIS-CORE: API для ядра Cortex-M и периферии. Эта часть предоставляет стандартизированный интерфейс для Cortex-M0, Cortex-M3, Cortex-M4, SC000, и SC300. Включает в себя также дополнительные SIMD-инструкции для Cortex-M4.
  • CMSIS-Driver: определяет основные драйверы интерфейсов периферии. Содержит API для операционных систем реального времени (ОСРВ, или англ. Real-Time operating systems – RTOS) и соединяет микроконтроллер с промежуточным ПО, таким как стек коммуникации, файловая система или графический интерфейс.
  • CMSIS-DSP: коллекция из более чем 60 функций для различных типов данных (относятся к обработке сигналов, DSP – digital signal processor): с фиксированной точкой (q7, q15, q31) и с плавающей точкой (32 бита). Библиотека доступна для Cortex-M0, Cortex-M3, и Cortex-M4. Реализация библиотеки для Cortex-M4 оптимизирована c использованием SIMD-инструкций.
  • CMSIS-RTOS API: общий API для систем реального времени. Эта часть предоставляет стандартизированный программный интерфейс для того, чтобы большинство программных шаблонов, промежуточного ПО, библиотек и других компонентов RTOS-систем могли работать на Cortex-ядре.
  • CMSIS-DAP (Debug Access Port): стандартизованное программное обеспечение для отладчика (Debug Unit), которое подключает CoreSight Debug Access Port. CMSIS-DAP поставляется отдельно и используется для интеграции (на отладочных платах). Мы будем использовать только CMSIS-CORE.

В нашей работе понадобится документ, предоставляемый компанией ARM – Cortex-M3 Devices Generic User Guide, который можно найти на сайте infocenter.arm.

com (или скачать pdf-версию, нажав на ссылку внизу страницы). В данном документе описываются регистры самого ядра – нам потребуются регистры встроенного (во все Cortex-M ядра) простого таймера SysTick.

Сохраните этот документ, мы будем использовать его уже совсем скоро!

Наше основное внимание будет сосредоточено на CMSIS-CORE. В дальнейшем мы познакомимся со Standard Periferal Library от компании ST, но сейчас рассмотрим CMSIS чуточку ближе.

Назначение файлов

Файл startup_.s (где вместо подставляется идентификатор фирмы-производителя, это stm32, и серия микроконтроллера, для нас это 100) включает в себя:

  • обработчик (англ. handler) сброса, который выполняется после сброса микроконтроллера и вызывает функцию SystemInit();
  • установку значений для Main Stack Pointer (MSP);
  • векторы исключений для Cortex-M-ядер с функциями;
  • векторы прерываний (о них мы поговорим позже).

Все обработчики прерываний имеют названия _IRQHandler. Пример:

g_pfnVectors: .word _eram .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler .word BusFault_Handler .word UsageFault_Handler .word 0 .word 0 .word 0 .word 0 .word SVC_Handler .word DebugMon_Handler .word 0 .word PendSV_Handler .word SysTick_Handler .word WWDG_IRQHandler .word PVD_IRQHandler .word TAMPER_IRQHandler .word RTC_IRQHandler .word FLASH_IRQHandler .word RCC_IRQHandler .word EXTI0_IRQHandler

Файл startup_stm32f10x.s может отличаться в зависимости от среды разработки; для IAR он принимает следующий вид:

__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler # Reset Handler DCD NMI_Handler # NMI Handler
DCD HardFault_Handler # Hard Fault Handler
DCD 0 # Reserved
DCD 0 # Reserved
DCD 0 # Reserved
DCD 0 # Reserved
DCD 0 # Reserved
DCD 0 # Reserved
DCD 0 # Reserved
DCD SVC_Handler # SVCall Handler
DCD 0 # Reserved
DCD 0 # Reserved
DCD PendSV_Handler # PendSV Handler
DCD SysTick_Handler # SysTick Handler # External Interrupts
DCD WWDG_IRQHandler # Window Watchdog
DCD PVD_IRQHandler # PVD through EXTI Line detect
DCD RTC_IRQHandler # RTC through EXTI Line
DCD FLASH_IRQHandler # FLASH

Файлы system_stm32f10x.c и system_stm32f10x.h предоставляют минимальные наборы функций для конфигурации системы тактирования.

  • void SystemCoreClockUpdate(void) – обновляет переменную SystemCoreClock и должна быть вызвана каждый раз, когда тактовая частота меняется во время работы.
  • void SystemInit(void) – инициализирует микроконтроллер, а именно систему тактирования (в частности PLL), содержит переменную, хранящую тактовую частоту, и вызывается в startup_.s
  • uint32_t SystemCoreClock – переменная отвечает за частоту тактирования и обеспечивает работу таймера SysTick.

Для работы ядра требуются файлы:

  • core_.h (для Cortex-M3 это core_cm3.h) – предоставляет доступ к регистрам ядра и его периферии;
  • core_cmInstr.h (нам не требуется) – специальные инструкции Cortex-M;
  • core_cmFunc.h (нам не требуется) – функции доступа к периферии ядра Cortex-M;
  • core_cm4_simd.h (нам не требуется) – SIMD-инструкции для Cortex-M4.

И последний файл, который нас будет интересовать больше всего – это заголовочный файл микроконтроллера .h (в нашем случае это stm32f10x.h). Он содержит перечисление IRQn_Type, где описываются все возможные исключения и прерывания.

typedef enum IRQn {
/* Cortex-M3 Processor Exceptions Numbers */
NonMaskableInt_IRQn = -14,
MemoryManagement_IRQn = -12,
BusFault_IRQn = -11,
UsageFault_IRQn = -10,
SVCall_IRQn = -5,
DebugMonitor_IRQn = -4,
PendSV_IRQn = -2,
SysTick_IRQn = -1, /* STM32 specific Interrupt Numbers */
WWDG_IRQn = 0,
PVD_IRQn = 1,
TAMPER_IRQn = 2,
RTC_IRQn = 3,
FLASH_IRQn = 4,
RCC_IRQn = 5,
EXTI0_IRQn = 6,

Отрицательные значения обозначают исключения ядра (внутренние прерывания), а не отрицательные специфические для микроконтроллера исключительные ситуации (внешние прерывания). Таблица векторов прерываний находится в файле startup_system32f10x.s. Кроме всего прочего, в данном файле находятся так называемые маски, о которых будет сказано позже. Пример:

#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001)

На этом наше знакомство завершено, пора настроить среду разработки и приступить к программированию.

Источник: http://stm32.chrns.com/post/148790052979/cmsis

Структуры и объединения

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

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

 

Структура – это особая форма слияния нескольких переменных, называемых полями структуры, в единое целое.

 Для определения структуры используется ключевое слово struct. Шаблон определения структуры следующий:

struct {; ; … ; ;};

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

struct {int a; long b; char c;} st;

 Этот пример показывает, как объявляется переменная st типа структура с полями а (типа int), b (типа long) и с (типа char). Обращение к переменным-полям структуры осуществляется через так называемую точечную нотацию, когда поле структуры отделяется от ее идентификатора точкой: st.a позволит обратиться к полю, а переменной st, а st.c – к полю ее полю с.

Ничто не препятствует объявить массив таких структур:

struct {int a; long b; char c;} st[5];

  Этот пример определяет массив st, состоящий из 5-и элементов, каждый из которых имеет поля a, b и с соответствующих типов. Точечная нотация продолжает действовать и при обращении к элементам массива структур: st[1].a – поле a второго элемента массива, st[4].c – поле с последнего элемента.

Так же ничто не препятствует определить структуру как тип, и использовать для определения новых переменных уже этот тип:

typedef struct { int a; long b; char c;} strc;<\p>

strc st;<\p>

strc arr_st[5]; Язык Си считается самым низкоуровневым языком среди высокоуровневых. Под этим следует понимать, что язык позволяет получить возможность практически так же манипулировать данными, как и ассемблер. Одной из таких «низкоуровневых» возможностей являются объединения.

По виду описания объединение (определяемое ключевым словом union) очень похоже на структуру:

union { int a; long b; char c;} uni;

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

для вышеприведенного примера будет выделено 4 байта для переменной uni. При этом при обращении к uni.b будет задействована вся эта область, при обращении к uni.a – только первые 2 байта этой области, а uni.c позволит оперировать лишь первым байтом.

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

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

Источник: http://radio-hobby.org/modules/instruction/winavr-i-avr-studio/struktury-i-obyedineniya

Среда разработки AVR Studio 4

В ниже приведенном руководстве описывается установка среды разработки AVR для операционной системы Windows.

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

1. AVR Studio

AVRS tudio 4 IDE (Integrated Development Environment) – это программа, которая предназначена для написания программного кода и загрузки его в микроконтроллер. Последняя версия AVR Studio находится на веб-сайте производителя Atmel.

2. WinAVR WinAVR является GNU-GCC компилятором для микроконтроллеров AVR.Это свободное программное обеспечение, которое можно найти на сайте Sourceforge. При инсталляции WinAVR предлагает имя каталога, которое также содержит номер версии, но директория должна быть изменена вручную:

C:WinAVR

3. Библиотека Домашней Лаборатории

Библиотека Домашней Лаборатории содержит функции, облегчающие использование AVR и устройств комплекта Домашней Лаборатории. Последняя версия библиотеки находится на сайте Домашней Лаборатории.

Библиотека должна быть обязательно установлена в том же каталоге, где WinAVR.

4. Драйвер виртуального COM порта

Драйвер позволяет подключить к компьютеру программатор JTAG ICE. Драйвер должен быть установлен до подключения к компьютеру программатора. Имя установочной программы 'CDM x.xx.xx.

exe», где «х» обозначает версию. Затем необходимо подключить программатор к компьютеру через USB интерфейс, и позволить Windows выполнит автоматическую установку.

В строке состояния должно появиться примерно такое сообщение:

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

Некоторые версии AVR Studio признают программатор ICE JTAG, только в последовательных портах COM1 … COM9 и функцию отладки позволяют использовать только последовательные порты COM1 … COM4. Пользователь имеет возможность изменить порядковый номер порта, использую инструмент Device Manager.

Посмотри процедуру на сайте.

Посмотри процедуру на веб-сайте

Следующее руководство описывает установку среды разработки версии 5 Домашней Лаборатории (Контроллер v1 – ATmega2561) и использование еёв операционной системы Windows.

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

1. AVR Studio

AVR Studio 4 IDE (Integrated Development Environment) – это программа, которая предназначена для написания программного кода и загрузки его в микроконтроллер. Последняя версия AVR Studio находится на веб-сайте производителя Atmel. Обычно для AVR Studio выдается пакет обновлений (Service Pack – SP). Всегда рекомендуется после установки AVRStudio добавить и самый новый пакет обновлений.

2. WinAVR

WinAVR является GNU-GCC компилятором для микроконтроллеров AVR. Это свободное программное обеспечение, которое можно найти на сайте Sourceforge. При инсталляции WinAVR предлагает имя каталога, которое также содержит номер версии, но директория должна быть изменена вручную:

C:WinAVR

3. Библиотека Домашней Лаборатории

Библиотека Домашней Лаборатории содержит функции, облегчающие использование AVR и устройств комплекта Домашней Лаборатории. Последняя версия библиотеки находится на сайте Домашней Лаборатории.

Библиотека должна быть обязательно установлена в том же каталоге, где WinAVR. Для Домашней Лаборатории (Controllerboardv1.x) снабженной контроллером ATmega2561 подходит homelab_library_v2.x.

Homelab library v2.1

4. JTAG интерфейс

JTAG интерфейс – HappyJTAG2 представляет собой интерфейс между программатором и AVR Studio. Программа упакована в ZIP файл, и достаточно только распаковать в нужную папку, к примеру,C:  WinAVR (отдельно устанавливать программное обеспечение не нужно) HappyJTAG2 for HomeLab

5. Драйвер программатора

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

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

Источник: http://home.roboticlab.eu/ru/examples/setup/avrstudio

AVR для начинающих.Урок 3.Порты ввода/вывода

Итак, продолжим знакомство с микроконтроллерами!

Сегодня мы рассмотрим такую важную тему как порты ввода/вывода. С ними мы столкнулись уже в предыдущем уроке, когда зажигали светодиод. Взаимодействие микроконтроллера с внешними устройствами, происходит именно благодаря портам ввода/вывода (Порты I/O(Input/Output)).

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

I/O порт микроконтроллера AVR в программном виде представляет из себя 3 регистра, которые непосредственно отвечают за его работу. Так как микроконтроллеры AVR 8 разрядные, ножки контроллера для удобства были сгруппированы в порты по 8 штук.

То есть, ножки контроллера PB0-PB7 являются портом B микроконтроллера AtMega8. Точно так же с выводами PD0-PD7, которые являются портом D.

Каждой ножке соответствует бит в управляющих регистрах. То есть ножке под номером 4 (Например PB4) соответствует 4 бит в регистрах PORTB,DDRB,PINB.

Каждая ножка порта может быть как портом ввода, так и портом вывода. То есть, мы можем либо управлять чем либо (например зажигать светодиод), либо принимать данные с чего либо (например обрабатывать нажатие кнопки).

За работу порта отвечает 3 регистра:

Каждый из данных регистров 8 разрядный. То есть, каждый бит данного регистра регулирует работу одной ножки контроллера. Рассмотрим каждый из данных регистров подробнее.

Рассматривать будем на примере порта B микроконтроллера AtMega8.

DDRB:

Каждый бит регистра DDRB отвечает за режим работы соответствующей ножки (PB0-PB7). Записав 0 в соответствующий бит, мы настраиваем соответствующую ножку в режим входа. То есть, теперь мы сможем считывать с неё входящие с внешних устройств данные. Записав в соответствующий бит 1 мы установим ножку в режим вывода, что позволит нам управлять чем либо (Например зажигать светодиод).

Читайте также  Bluetooth модуль HC-05 для AVR.

Пример кода на C(Настройка ножки PD4 на вывод):

Пример кода на ASM(Настройка ножки PD4 на вывод):

PORTB:

При настройке соответствующего вывода на вывод, регистр PORTB управляет состоянием данной ножки.

То есть установив 1 в соответствующем бите регистра, мы подадим логическую 1 на вывод контроллера (Около +5 вольт), тем самым мы, например, зажигаем светодиод, подав на него +5v.

Установив 0 в соответствующем бите регистра PORTB, мы установим логический 0 на выводе контроллера (Около 0 вольт), тем самым, например, мы гасим светодиод, подав на него около 0v, что прекратит протекание электрического тока через него.

Пример кода на C(установим ножку PB3 в состояние вывода и подадим на нее логическую единицу):

Пример кода на Ассемблере(установим ножку PB3 в состояние вывода и подадим на нее логическую единицу):

PINB:

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

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

Следующий пример поможет Вам лучше понять описанное выше:

Читайте также  Стабилизаторы напряжения 5в.

Соберем следующую цепь

Номинал резистора R1, вы уже можете рассчитать самостоятельно!

Создадим в Atmel Studio новый проект на удобном Вам языке.

С:

#include // подключаем заголовочные файлыDDRB|=(1

Источник: http://mkprog.ru/avr/avr-dlya-nachinayushhih-urok-3-porty-vvoda-vyvoda.html

CMSIS

CMSIS-RTOS: Deterministic real-time software execution

A super-loop concept is only adequate for simple embedded applications. Cortex-M microcontrollers are designed for real-time operating systems that give you resource and time control.

CMSIS-RTOS is an API that enables consistent software layers with middleware and library components. Keil RTX5 is based on CMSIS-RTOS and runs on every Cortex-M device. It is the proven reference implementation that is easy to learn and use. A FreeRTOS adaptation using the CMSIS-RTOS API is available on GitHub.

CMSIS-NN: Collection of efficient neural network kernels

Neural networks and machine learning are functions that are being pushed into the end node if IoT applications.

The neural network kernels of the CMSIS-NN library help to maximize the performance and minimize the memory footprint of neural networks on Cortex-M processor cores.

CMSIS-DSP: Fast implementation of digital signal processing

Developing a real-time digital signal processing (DSP) system is not trivial as the DSP algorithms heavily rely on complex mathematical operations that are even time-critical.

CMSIS-DSP library is a rich collection of DSP functions that are optimized by ARM for the various Cortex-M processor cores. CMSIS-DSP is widely used in the industry and enables also optimized C code generation from MATLAB®. The ASN Filter Designer generates CMSIS-DSP code that you can directly use in your application.

CMSIS-Driver: Generic peripheral interfaces for middleware and application code

Interfacing microcontroller peripherals with middleware or generic application code can be challenging as each device is different.

Ready-to use CMSIS-Driver interfaces are today available for many microcontroller families and avoid cumbersome and time consuming driver porting. Refer to the CMSIS Workshop for more information.

CMSIS-CORE: Consistent system startup and peripheral access

System startup, processor core access, and peripheral definitions are essential for every embedded application.

The standardized CMSIS-CORE is implemented for Cortex-A and Cortex-M based devices and makes it easy to get started with a new device or migrate software across devices. Refer to “Using CMSIS in Embedded Applications” for more information.

CMSIS-Pack: Easy access to reusable software components

Previously, software modules were hard to integrate as the source and header files had unclear requirements, inconsistent documentation, or missing license information.

CMSIS-Pack simplifies software reuse as it defines the structure of a Software Pack. This file collection includes source, header, and library files along with documentation, dependencies to other software or hardware, source code templates, and example projects.

CMSIS-SVD: Consistent view to device and peripherals

The µVision Debugger offers for every supported microcontroller detailed views to the device peripherals which display the current register state.

These views are enabled by CMSIS-SVD files that are provided by the silicon vendors. These files ensure that the debugger view matches the actual implementation of the device peripherals.

CMSIS-DAP: Connectivity to low-cost evaluation hardware

Inexpensive development boards are available from many microcontroller vendors. Frequently, a low-cost debug unit is included, but different interfaces need a specific tool setup.

CMSIS-DAP is a standardized interface to the Cortex debug access port (DAP) and is used by many starter kits and supported by various debuggers. The µVision Debugger includes an easy-to-use CMSIS-DAP interface to support flash programming and run-control debugging.

CMSIS-Zone: Simplify the configuration of modern embedded systems

Today, many microcontrollers offer multiple cores and additional MPUs. Modern Armv8-M based microcontrollers allow great flexibility in handling secure and non-secure programming. Thus, System partitioning can become a complex task.

CMSIS-Zone defines methods to describe system resources and to partition these resources into multiple projects and execution areas.

Источник: http://www2.keil.com/mdk5/cmsis

IAR + AVR Studio

Возьмем для эксперимента проект ring.rar. Он простой и в нем задействовано прерывание.Открываем его в IARе.Выбираем конфигурацию Debug.Задаем настройки проекта  Project > Options  пункт Linker вкладка Output.Снимаем галочку Override default, если она установлена.

Выбираем радио-кнопку Other, а в выпадающем списке Output Format > ubrof  8(forced)Кликаем Ок, компилируем проект.Если все прошло без ошибок, ищите в папке проекта > Debug > Exe файл ring1.dbgЗапускаем AVR Studio.Откроется Project Wizard. Если не открылся – запускаем его вручную Project > Project Wizard.

Кликаем Open и указываем путь к файлу ring1.dbg.Студия предложит сохранить файл ring1_dbg.aps в папке проекта. Соглашаемся.Затем откроется окно выбора отладочной платформы и микроконтроллера – выбираем  AVR Simulator и ATMega8535Жмем Finish.Итак, проект открылся и уже запущен режим отладки.

   В центре экрана редактор кода. Желтая стрелка указывает на текущую выполняемую строчку программы. Сейчас она в начале функции main. С правой стороны – внутренности чипа – порты, таймеры, АЦП и т.п. Можно просматривать их значения, а также устанавливать по своему усмотрению.

  С левой стороны – вкладка Processor. Вторая вкладка в этом окне – Project. Она отображает структуру проекта.

   Не буду вдаваться в подробности отладки в AVR Studio, остановлюсь только на нескольких моментах.

   Пошаговое выполнение программы происходит при нажатии кнопки F11 (Step Into) . Можно выполнять  программу на си, а можно на ассемблере. По умолчанию открыт сишный файл, ассемблерный открывается через меню View > Disassembler или с помощью иконки Toggle Disassembler Window.   Step Into   Toggle Disassembler Window   Кнопка F5 (Run)  запускает выполнение программы в непрерывном режиме. Это имеет смысл, если в программе расставлены breakpoint`ы (точки остановки). Например, мы хотим проверить выполнение кода в прерывании таймера. Как до него добраться? Ставим курсор в начало прерывания и нажимаем F9 (Toggle breakpoint). Слева от курсора появится красный кружок, это и есть breakpoint. Запускаем программу в непрерывном режиме – F5. Программа будет выполняться до тех пор, пока не произойдет прерывание таймера.     Run Toggle Breakpoint

  Чтобы убрать breakpoint,  нужно поставить рядом с ним курсор и снова нажать F9. Все breakpoint`ы убираются нажатием на иконку Remove all Program Breakpoints.

 Remove all Program Breakpoints

   Можно запускать выполнение программы до курсора. Ставим курсор в нужное место и нажимаем Ctrl + F10 ( Run to Cursor).

 Run to Cursor 

   Переход в начало программы происходит при нажатии Shift + F5 (Reset).

   Reset

   В процессе отладки часто требуется наблюдать, как меняются значения переменных или регистров. Для этих целей в отладчике AVR Studio есть окно Watch. Чтобы его открыть, выберете View > Watch или кликните по иконке Toggle Watch Windows. Окно Watch представляет собой таблицу из 4-ех колонок: Name, Value, Type, Location. Имя, значение, тип и расположение в памяти соответственно. Toggle Watch Windows   Добавить переменную в таблицу можно двумя способами. Кликнуть левой кнопкой мышки в первом столбце и в открывшеся поле ввести имя переменной.  Или выделить нужную переменную в окне редактора кода, навести на нее курсор и, удерживая левую кнопку мышки, перетащить переменную в окно Watch.     Также в AVR Studio есть окна для наблюдения за содержимым памяти (Data, EEPROM, I/O, Program, Register). Открывается в меню View > Memory Window или с помощью иконки Toggle Memory Window.

 Toggle Memory Window

   Наблюдение за ОЗУ может дать информацию о степени использования стека. Здесь есть один момент. Компилятор IAR использует 2 стека – RSTACK и CSTACK.

  RSTACK или return address stack – предназначен для сохранения адресов возврата при вызове функций, прерываний. Указателем стека адресов возврата является специальный регистр SP (Stack Pointer).

  CSTACK или data stack – для сохранения авто переменных в функциях, параметров функций. Указателем стека данных является регистровая пара YH:YL.

  Значения регистров SP и Y отображаются в AVR Studio с левой стороны на вкладке Processor.

  Размеры обоих стеков задаются в IARe  – Options > General Options > System.

   И последнее. Если вы попытаетесь изменить код программы из AVR Studio, у вас ничего не получится. Код программы нужно менять в IARe. Вносим изменения, компилируем проект и переключаемся в студию. Она тут же предложит вам обновить открытые файлы.

Источник: http://chipenable.ru/index.php/item/40

Интерфейс stk500 в avr studio 4 и программирование микроконтроллера

Интерфейс STK500 в AVR Studio 4

В качестве программного приложения для связи с платой STK500 используется AVR Studio 4. Выполнение команды Tools; STK500 из меню AVR Studio приводит к открытию окна пользовательского интерфейса STK500, показанного на рис. 1.19.

Рис. 1.19. Окно программирования пользовательского интерфейса STK500

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

Установки окна Program (программирование). Окно программирования разделено на пять областей.

В поле программируемого устройства Device из раскрывающегося списка необходимо выбрать тип целевого микроконтроллера. Кнопка Erase Device осуществляет стирание памяти микроконтроллера (Flash и EEPROM).

В поле Programming Mode задается режим программирования. Установка флажка Erase Device Before Programming активизирует полезную функцию стирания памяти программ перед программированием, а при установке флажка Verify Device After Programming STK500 будет выполнять проверку правильности записанной информации не только во Flash-память, но и в EEPROM.

Поле программирования памяти Flash. Если необходимый hex- файл хранится отдельно, используется кнопка Input HEX File (входной hex-файл). После нажатия указывается путь к файлу и его имя. Файл должен быть создан в формате Intel-hex или extended Intel-hex.

Поле программирования EEPROM. Если необходимый hex- файл хранится отдельно, используется кнопка Input HEX File (входной hex-файл). После нажатия указывается путь к файлу и его имя. Файл должен быть создан в формате Intel-hex или extended Intel-hex.

Поле истории. Поле истории находится внизу окна пользовательского интерфейса STK500. В нем отображается диалог между AVR Studio 4 и STK500. При выполнении каждой команды содержимое данного поля обновляется.

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

Окно LockBits установки битов защиты программы. Окно LockBits показывает, какие режимы защиты программы доступны для выбора при заданном типе микроконтроллера. Все биты защиты доступны как в режиме ISP-программирования, так и в режиме программирования повышенным напряжением. Режим защиты задается комбинацией нескольких битов защиты.

Окно прочих установок Advanced. Окно Advanced представляет собой два поля для идентификации параметров микроконтроллера, не вошедших в предыдущие окна.

Поле сигнатурных байтов Signature Bytes. Нажатие на кнопку считывания сигнатуры Read Signature приводит к считыванию из микроконтроллера и отображению сигнатурных байтов. Сигнатурные байты используют для идентификации микросхемы и ее производителя. После считывания сигнатуры программа проверяет ее на соответствие выбранному типу микроконтроллера.

Поле калибровочного байта генератора Oscillator Calibration Byte. Калибровочный байт записывается в микроконтроллер на стадии производства, поэтому доступен только для чтения. Он используется в программе при записи в регистр OSCCAL для подстройки номинальной частоты встроенного RC-генератора.

Считывание калибровочного байта. Нажатие на кнопку Read Cal Byte приводит к отображению на экране его значения в текстовом поле Value. Если данная опция выделена серым цветом, то это означает, что в выбранном микроконтроллере нет встроенного подстраиваемого RC-генератора.

Запись калибровочного байта.

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

Адрес задается в текстовом поле Write Address. С помощью переключателя Flash, Еергот выбирается получатель данных, а затем нажимается кнопка Write to Memory для записи калибровочного байта по указанному адресу.

Окно настроек платы Board. В окне Board (рис. 1.20) можно изменить рабочие условия на плате STK500. Для изменения доступны следующие параметры: VTARGET, AREF и частота генератора.

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

Рис. 1.20. Окно управления платой

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

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

Из раскрывающегося списка можно выбрать фиксированные частоты 32,7 кГц, 1,23 1,84, 3,69 МГц (максимальная частота) или вообще остановить генератор (stopped). Чтение;запись частот генератора осуществляется нажатием соответствующих кнопок Read Osc и Write Osc.

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

Действия представлены в виде списка в порядке очередности выполнения при активизации. Для разрешения выполнения действия его необходимо пометить флажком.

Например, если отмечено только действие Program FLASH, то после нажатия кнопки Start будет произведена запись во Flash-память в соответствии с настройками в окне Program.

Все действия используют настройки в пределах пользовательского интерфейса STK500, Проверка выполненных действий может быть осуществлена благодаря использованию функции записи в журнал Log to file, которая все действия записывает в текстовый файл.

https://www.youtube.com/watch?v=dqAe7g1pgbo

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

Запись процесса автопрограммирования в журнал. При активизации функции Log to file все выполняемые действия будут записаны в текстовый файл. Выбрать или создать файл можно нажатием кнопки Browse, в дальнейшем следует указать путь и имя имеющегося или создаваемого файла. Последовательность выполняемых действий будет фиксироваться в файле, который можно просмотреть.

Источник: http://nauchebe.net/2011/02/interfejs-stk500-v-avr-studio-4-i-programmirovanie-mikrokontrollera/

Среда разработки AVR studio для микроконтроллеров AVR и Arduino

IDE – это интегрированная среда разработки, в состав которой включены разные шаблоны, библиотеки и функции отладчика. Если говорить о микроконтроллерах фирмы ATMEL, с 2004 для них разрабатывался мощный программный пакет AVR studio.

Первые версии

В первых версиях студии присутствовал ассемблер для AVR, вы можете его извлечь из первых сборок, однако позже этот проект был заброшен, а в качестве основного языка избран C AVR. Компилятором был платный и очень серьезный продукт IAR. Вы можете скачать бесплатный WINAVR, для этого после установки студии нужно проинсталлировать его.

Обратите внимание! Лучше это делать только после установки AVR studio 4 и других версий.

Долгое время фигурировала AVR studio 4 (на фото выше). Многие разработчики микроконтроллеров сталкивались с ней. Позже IDE модернизировали до AVR studio 5. Кроме интерфейса, особых изменений не было, а уже потом компания разработчик сделала ребрендинг продукта и изменила название на Atmel studio 6.

Среда AVR studio 5 поддерживала следующие микроконтроллеры:

Atmel studio 6 отличалась от AVR studio 5 значительно, самые заметные нововведения версии:

  1. Microsoft Visual Studio 2010 стал работать с семейством AVR.
  2. Улучшенная, по сравнению с AVR studio 5, подсветка синтаксиса.
  3. Добавлены подсказки и автозавершение набора команд, что ускоряет процесс разработки.
  4. В целом, вся работа среды стала надежнее.
  5. Добавлена поддержка ARM Cortex-M.
  6. WinAVR не нужно больше устанавливать отдельно, GCC теперь устанавливается в процессе инсталляции, в отличие от младших версий.

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

Среду разработки кардинально использовал Visual Studio Isolated Shell 2015; с одной стороны, это решение не поддерживается на Windows XP, с другой – эти меры были предприняты для улучшения как внешнего вида программы, так и функционального.

Пожалуй, самым знаменательным стало добавление поддержки Arduino в Atmel studio 7. Это значит, что вы можете перейти от набора простейших скетчей к использованию всех функций C, отладки, симулятора МК и прочим функциям. Совмещение Arduino и Atmel studio 7 дало новый виток в развитии этой простой обучающей платформы.

Изучение Atmel studio с Arduino даст возможность перейти к полному и продуктивному освоению и более глубокому знакомству с сердцем ардуины – микроконтроллером Atmega.

Дополнительно с сайта Atmel можно скачать пакет для работы и подключения LCD. В качестве примера для освоения можно использовать LCD 1602, в интернете по нему много уроков, а разработчику на дисплее доступно 16 символов и 2 строки.

С чего начать освоение?

Начинать стоит, конечно же, с покупки программатора; самый бюджетный – это – USBASP. Программатор USBASP не поддерживается в Atmel Studio 7.

Как выглядит USBASP

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

«avrdude -c usbasp -p atmega32 -U flash:w:название файла с прошивкой.hex -U lfuse:w:0x6a:m -U hfuse:w:0xff:m»

и подключить его поддержку, создав профиль в atmel studio 7 (title – external tools), а в пункт Arguments ввести «-c usbasp -p atmega32 -U flash:w:$(TargetName).hex» и так для каждого типа используемых вами микроконтроллеров.

Только таким образом можно связать студио и программатор USBASP. Будьте внимательны при перепрошивке – вы можете повредить сигнатуру микроконтроллера, а восстановить её можно будет только 12 В (высоковольтным) программатором.

Какую литературу использовать для обучения?

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

Больше интересного ↓

Источник: https://ArduinoPlus.ru/avr-studio-sreda-razrabotki/

Ссылка на основную публикацию
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}