Программирование микроконтроллеров семейства pic начинающим

Как программировать многоядерные микроконтроллеры

Tutorial

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

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

Работа

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

Финансово трудно придётся новичкам (до 1 года опыта): зарплата в районе 20 тыс. рублей в месяц для программиста МК. Это вполне реальная цифра в регионах. Зато если вы живёте в столице, у вас есть опыт работы с популярным видом МК (от 3 лет активной деятельности) и голова на плечах, то вполне можно рассчитывать и на 150 тыс. рублей в месяц. В целом, не сказать, что конкуренция за места у данных разработчиков высокая, но с течением времени она неизбежно растёт.

Опять же, для людей с опытом есть вариант поискать счастье за границей. Особенно если у вас уже есть опыт полноценной работы. Дело в том, что в России идея IoT пока не слишком развивается. Да и вообще автоматизация пока не затрагивает небольшие системы. А в США, Японии и других развитых странах хороший разработчик ПО для МК — на вес золота. Правда, придётся учитывать иной уровень конкуренции и серьёзные требования по производительности труда.

Схема программатора

Теперь о схеме программатора.
Первоначальная схема программатора не предусматривала поддержки USB и
содержала 2 разъёма COM9.
 Один разъём служит для подключения JDM программатора и
подключив
к нему компьютер можно программировать микроконтроллеры с помощью
программ IS-Prog , PonyProg или других программ, в которых реализована
поддержка JDM программатора.
 Второй разъём предназначен для работы со специально
разработанным
протоколом обмена. С его помощью можно программировать микроконтроллеры
Microchip или микросхемы памяти типа 24Cxxx.
 Для подключения USB переходника добавлен третий разъём COM9 (
на
плате расположен посередине ). От этого разъёма использовано всего 3
контакта. RXD, TXD и общий(масса). Выводы от разъёма подключены
напрямую к соответствующим выводам микроконтроллера программатора.
Рис. 5 Схема программатора

Первоначально плата программатора не содержала разъёма под переходник
USB — на фотографии видно, что этот разъём стоит посередине.
Рис. 6  Плата программатора

Программное обеспечение программатора пока не доработано полностью.
Испытан программатор только с микроконтроллерами PIC16F628A и PIC16F84.

Эффективное применение DLMS/COSEM в больших системах с ограниченными ресурсами

Перевод

DLMS/COSEM – это ведущий мировой стандарт (IEC/EN 62056, EN 13757), регламентирующий обмен данными с интеллектуальными устройствами. В настоящее время применяется, преимущественно, в интеллектуальных системах учёта потребления. Как правило такие системы состоят из головной подсистемы, которая собирает данные с миллионов устройств, а также управляет этими устройствами, используя для этих целей различные среды передачи данных.

DLMS/COSEM включает в себя три основные составляющие: (1) объектная модель COSEM, с помощью которой описывается функциональность конечного устройства; (2) прикладной уровень DLMS, который определяет сервисы для доступа к объектам COSEM; и (3) коммуникационные профили, которые определяют то, как эти сервисы могут быть переданы через различные среды передачи данных. Кроме того, DLMS/COSEM основан на клиент-серверной архитектуре, где головная подсистема выполняет роль клиента, посылающего запросы конечному устройству, а конечное устройство – роль сервера, посылающего ответы на запросы клиента.

Некоторые сети связи и устройства, реализующие DLMS/COSEM, обладают достаточными ресурсами, но DLMS/COSEM всё чаще применяется там, где эти ресурсы ограничены. Ресурсы устройства могут быть ограничены его возможностью обработки и хранения данных или питанием от встроенных батарей в течении всего срока его службы. Сети связи могут быть ограничены по количеству и длине передаваемых пакетов данных, а ограниченность системы может быть обусловлена требованием соответствия заданным уровням обслуживания.

DLMS/COSEM был разработан с акцентом на эффективность, что позволяет успешно применять его в условиях ограниченности ресурсов, о которых было сказано выше. По мере распространения DLMS/COSEM в новые области применения, также развивались и способы повышения его эффективности, о которых и пойдёт речь в этой заметке.

Компиляция программы

Написанный нами код на Си еще вовсе не понятен микроконтроллеру, поскольку МК понимает команды только в двоичной (или шестнадцатеричной) системе, которая представляет собой набор нулей и единиц. Поэтому Си-шный код нужно преобразовать в нули и единицы. Для этого применяется специальная программа, называемая компилятор, а сам процесс преобразования кода называется компиляция.

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

Для прошивки МК применяется устройство, называемое программатор. В зависимости от типа программатора вход его подключается к COM или USB порту, а выход к определенным выводам микроконтроллера.

Существует широкий выбор программаторов и отладочных плат, однако нас вполне устроит самый простой программатор , который в Китае стоит не более 3 $.

После того, как микроконтроллер прошит, выполняется отладка и тестирование программы на реальном устройстве или, как еще говорят, на «железе».

Теперь давайте подытожим этапы программирования микроконтроллеров.

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

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

Семейства микроконтроллеров

Чаще всего встречаются микроконтроллеры следующих семейств:

  • MSP430 (TI);
  • ARM (ARM Limited);
  • MCS 51 (INTEL);
  • STMB (STMicroelectronics);
  • PIC (Microchip);
  • AVR (Atmel);
  • RL78 (Renesas Electronics).

Одной из наиболее популярных в электронной промышленности является продукция компании Atmel, построенная на базе RISC-ядра. Первые микросхемы, разработанные в 1995 году, относятся к группе Classic. Изучать программирование микроконтроллеров AVR для начинающих желательно на более современных моделях:

  • Mega — семейство мощных микросхем с развитой архитектурой.
  • Tiny — недорогие изделия, имеющие восемь выводов.

Необходимо помнить, что совместимость систем команд сохраняется лишь при переносе программы с малопроизводительного МК на более мощный.

Изделия компании «Атмел» просты и понятны. Однако для использования всего функционала придется разработать программное обеспечение. Приступать к программированию микроконтроллеров AVR для начинающих рекомендуется с загрузки специализированной среды Atmel Studio. Актуальная версия предоставляется официальным сайтом производителя на бесплатной основе. Для разработки ПО в этой среде дополнительные программные компоненты не требуются.

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

Низкоуровневое программирование STM32: от включения питания до «Hello, World»

Перевод

В этом материале я хочу рассказать о том, как писать программы для микроконтроллеров (Microcontroller Unit, MCU) Cortex-M, вроде STM32, используя лишь набор инструментов ARM и документацию, подготовленную STMicroelectronics. У некоторых читателей может появиться вопрос о том, почему кому-то это может понадобиться. Если вам эта идея, на первый взгляд, не показалась очень уж страшной, то, возможно, вам будет интересно то, о чём пойдёт речь в этом материале. И, кстати, подумаем о том, кому и зачем это может пригодиться.
Конечно, разрабатывать программы для MCU STM32 можно с помощью существующих фреймворков. Это может быть ST HAL, обычный CMSIS, или даже что-то, более близкое к Arduino. Но… что тут увлекательного? Ведь, в итоге, тот, кто пользуется каким-то фреймворком, полностью зависим от документации к нему и от его разработчиков. И, с другой стороны, если документация к STM32 кажется кому-то, работающему с этой платформой, так сказать, бредом сивой кобылы, то можно ли говорить о том, что этот человек по-настоящему понимает данную платформу?
Поэтому давайте поговорим о низкоуровневом программировании STM32 и доберёмся от включения питания STM32 до «Hello, World».

Где применяется

Благодаря своей универсальности PIC-контроллер может быть применён практически где угодно. Сами микроконтроллеры можно встретить в холодильниках, телевизорах, стиральных машинках. Но линейка продукции РІС имеет ту особенность, что схемы на PIC-контроллерах популярны среди радиолюбителей и робототехников-самоучек. С их помощью можно легко настроить работу узла или всего приспособления. Способствует такой популярности разумная цена, легкость программирования и значительное количество учебного материала.

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

Необходимый набор программ

Существует множество полезных и удобных программ для программирования МК. Они бывают как платные, так и бесплатные. Среди них можно выделить три основных:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Все эти программы относятся к IDE – Integrated Development Environment – интегрированная среда разработки. В них можно писать код, компилировать и отлаживать его.

Следует обратить внимание на Code Vision AVR. Эта IDE позволяет упростить и ускорить написание кода

Однако программа платная.

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

Языки программирования

По своей структуре языки программирования микроконтроллеров мало отличаются от тех, что используются для персональных компьютеров. Среди них выделяют группы низкого и высокого уровня. Современные программисты в основном используют С/С++ и Ассемблер. Между приверженцами этих языков ведутся бесконечные споры о том, какой из них лучше.

Низкоуровневый Ассемблер в последнее время сдает позиции. Он использует прямые инструкции, обращенные непосредственно к чипу. Поэтому от программиста требуется безукоризненное знание системных команд процессора. Написание ПО на Ассемблере занимает значительное время. Главным преимуществом языка является высокая скорость исполнения готовой программы.

На самом деле, можно использовать практически любые языки программирования микроконтроллеров. Но популярнее всех С/С++. Это язык высокого уровня, позволяющий работать с максимальным комфортом. Более того, в разработке архитектуры AVR принимали участие создатели Си. Поэтому микросхемы производства «Атмел» адаптированы именно к этому языку.

С/С++ — это гармоничное сочетание низкоуровневых и высокоуровневых возможностей. Поэтому в код можно внедрить вставки на Ассемблере. Готовый программный продукт легко читается и модифицируется. Скорость разработки достаточно высокая. При этом доскональное изучение архитектуры МК и системы команд ЦП не требуется. Компиляторы Си снабжаются библиотеками внушительного размера, что облегчает работу программиста.

Нужно отметить, что выбор оптимального языка программирования зависит также от аппаратного обеспечения. При малом количестве оперативной памяти использовать высокоуровневый Си нецелесообразно. В данном случае больше подойдет Ассемблер. Он обеспечивает максимальное быстродействие за счет короткого кода программы. Универсальной среды программирования не существует, но в большинстве бесплатных и коммерческих приложений можно использовать как Ассемблер, так и С/С++.

Затерянные в тумане, или Увлекательные приключения в мире АПР *

* АПР — аэропоника с пневматическим распылением

Уже почти год назад мой друг, в качестве хобби выращивавший дома клубнику, увлёк меня этой идеей. Я решил изучить практику высокотехнологичного сельского хозяйства, а затем методом проб и ошибок начал строить установку для безсубстратного выращивания клубники в закрытых помещениях — естественно, с желанием довести до состояния, при котором её можно масштабировать, а само выращивание будет максимально автоматизированным.

Вышло ли из этого что-то и что конкретно — под катом. Сразу предупрежу: статья огромная, потому что материала много. И очень много фото.

Сверхдлинное преобразование Фурье на FPGA

Всем привет!
В этой статье я хочу рассказать про реализацию алгоритма сверхдлинного быстрого преобразования Фурье на ПЛИС. Написать эту статью меня побудило желание поделиться личным практическим опытом, который не хотелось бы потерять, оставив информацию только у себя в голове. А поскольку я больше не занимаюсь задачами цифровой обработки сигналов на ПЛИС, то я просто обязан передать доступные мне знания.
В этой статье показана невозможность реализации «классической» схемы очень длинного БПФ даже на самых современных кристаллах ПЛИС. Также пошагово рассмотрена основная идея алгоритма: от математической составляющей до создания законченного решения на базе ПЛИС с использованием внешней DDR-памяти. Статья затронет тонкости проектирования многоканальных систем обработки для подобного класса задач и, в частности, опишет мой практический опыт.

Низковольтное программирование LVP из PicKit2

Цель данной статьи – показать, как внутрисхемно прошивать микроконтроллер (далее МК) в режиме низковольтного программирования с использованием PicKit2. Показаны схемы включения и особенности работы в программе PICkit 2 Programmer v2.61 .

Традиционно для прошивания к микроконтроллеру подключают 5 линий:

Vpp – напряжения программирования (обычно на уровне +13 вольт);

Vdd – напряжение питания +5 вольт;

Vss – общая линия (минус питания);

PGD – «программинг дата» или данные;

PGC – » программинг клок» или тактирование.

Аналогичные линии наблюдаем и на микроконтроллере.

Всё бы хорошо, если бы в один прекрасный момент не потребовалась сделать устройство с микроконтроллером в корпусе SOIC(или вовсе по идеологии микроконтроллер припаян к плате в любом корпусе).

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

Случай, когда организация MCLRне требуется. Банально отключается в битах конфигурации и линия вовсе может использоваться на вход. Строго говоря, MCLRвсё равно присутствует в неявном виде в МК. Присутствует в PIC16F627, PIC16F628, PIC16F627А, PIC16F628А, PIC16F648А. В данном случае всё просто, легко организовать высоковольтное программирование при условии, что по линии Vddсхема потребляет не больше, чем может дать программатор и USB. Либо Vdd отключаем от схемы в момент программирования.

Случай организации MCLRпутем объединения с плюсовой линией питания. И никак иначе. Для работы МК требуется сформировать высокий уровень после подачи питания. Для программирования однозначно требуется перемычка, чтобы Vppотключить от Vddна время высоковольтного программирования. Требования к питанию по Vdd как и предыдущем случае.

PIC16F77, PIC16F873, PIC16F874, PIC16F876, PIC16F877 (и они же с индексом А).

В данном случае Vppотделяем от Vddдиодом. Одновременно на MCLRв рабочем режиме обеспечивается потенциал высокого уровня. В отдельных случаях решение может быть оправданным. Лично мне не нравится распиновка для такого решения, где 1 вывод MCLRVpp, а 20 вывод Vdd(очень неудобно разводить в одном слое). Нам же документация навяливает еще более неудобное включение см. включение из документации к PicKit2.

И, наконец, случай, когда используется низковольтное LVPпрограммирование (линия Vppвовсе не нужна). Для режима LVPзадействуется вывод PGM (настраивается на выход и в режиме LVPне может использоваться как цифровая линия). Не будет секретом, что МК с завода выпускаются с включенным режимом LVP, который может быть переключен в HVPтолько при высоковольтном программировании (т.е. случайно это сделать не получится). Для перевода МК в режим программирования на PGMнужно установить высокий уровень (для рабочего режима и подтягиваем PGMк минусу). Далее рассмотрим подключение МК к PicKit2 и недокументированную греблю граблями.

Будем считать, что к этому моменту у вас сделаны следующие подключения микроконтроллера к PicKit2:

–общая линия Vss (до сих пор не знаю, нужно ли все Vss на МК к земле подключать или достаточно одну из Vss; кто может сослаться на официальный источник – дайте знать);

– линия PGC;

–линия PGD;

– линию PGMподключить к Auxiliary (как посоветовал Help-ReadMe).

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

Теперь рассмотрим работу в оболочке PICkit 2 Programmer v2.61 (из MPLABне получилось в режиме LVPсоединиться с МК).
К этому моменту устройство соединено 4мя проводами, питание на устройство подано, запускаем PICkit 2 Programmer v2.61.
И тишина – в автомате PICkit2 не видит МК; одно радует, что не ругается.

Ставимручнойвыбор – меню Programmer – Manual Device Select (ставимгалочку).

Для моего микроконтроллера (PIC16F876A) не лишним будет клацнуть DeviceFamily – Midrange – Standard.

В выпадающем списке выбираем наш МК

Выбрали. Так и хочется нажать кнопку Read и проверить жизнеспособность. Нажимаем.
Наблюдаем грустную надпись «No device detected».

И только после этого в меню Toolsстановится активным пункт UseLVPProgramEntry на которым мы ставим галочку. Ок. Поставили.

После этого в главном окне мы наблюдаем несколько бодрых сообщений.

Всё, теперь можно читать и шить, в том числе шить с защитой (CPCPD).

Полезные ссылки:Попробуй сделать печатную плату на кухнеУзнай как прошить микроконтроллер прошивкойНаучись программировать и делать прошивкиЗадай вопрос или найди ответ в форуме

STM32 и бесконтактный датчик температуры MLX90614. Подключение по I2C

Датчик MLX90614 — это датчик с бесконтактным считыванием температуры объекта посредством приема и преобразования инфракрасного излучения. Он умеет работать в трех режимах: термостат, ШИМ выход и SMBus. В режиме термостат датчику не требуется контроллер, он просто держит температуру в заданных пределах, управляя драйвером нагрузки открытым стоком

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

Так как этот протокол электрически и сигнально совместим с I2C мы будем работать с датчиком, используя аппаратный I2C. О нем и пойдет речь в данной статье. Все режимы датчика настраиваются записью в определенные ячейки EEPROM. По умолчанию датчик находится в режиме SMBus.

Структура и порядок написания программы

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

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

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

Здесь мы не будем сравнивать преимущества и недостатки написания программ на Ассемблере и Си. Со временем, приобретя некоторый опыт в программировании МК, вы сами для себя сделаете полезные выводы.

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

Медленный CrossWorks for ARM?

Перевод

На моей текущей работе мы используем CrossWorks for ARM IDE со встроенным GCC в качестве среды разработки приложений для встраиваемых систем. До недавнего времени никто не замечал проблем с этим, пока мы не начали работать над проектом у которого требования к выходу системы из спящего режима оказались «выше обычного».

  • наша пьезо-кнопка притягивает сенсорную линию к уровню нуля на 100-200 мс в случае, когда пользователь делает естественное касание и не пытается её продавить. Если бы использовалась обычная механическая кнопка, то наверняка проблема, о которой я хочу рассказать, осталась бы незамеченной, так как те экземпляры, с которыми я работал, прижимали сенсорную линию на 500+ мс.
  • схема включения пьезо-кнопки не предусматривала какую-либо аппаратную защиту от дребезга (причина сейчас уже не важна и к теме статьи не относится, поэтому эти детали опустим) и, как следствие, это привело к тому, что случались ложные пробуждения, которые нужно было отлавливать

О том, как мы обнаружили проблему и как с помощью небольших правок в реализации CRT (C Run-time) стандартной библиотеки CrossWorks for ARM добились ощутимого ускорения дальше.

Эта статья может быть особенна интересна тем, кто пользуется следующими средами разработки:

  • CrossWorks for ARM (очень вероятно, что все проекты для ARM Cortex-M ядер будут подвержены задержкам при старте)
  • Segger Embedded Studio (SES)

Микроконтроллеры PIC

Первые микроконтроллеры PIC появились во второй половине прошлого века. Быстрые 8-разрядные микросхемы компании Microchip мгновенно завоевали популярность. Двухшинная гарвардская архитектура обеспечивает беспрецедентную скорость. Ее разрабатывали на основе набора регистров, для которого характерно разделение шин.

Выбирая язык программирования микроконтроллеров PIC, необходимо учитывать, что в основе микросхем семейства лежит уникальная конструкция RISC-процессора. Симметричная система команд позволяет произвольно выбирать метод адресации, выполнять операции в любом регистре. На данный момент компания «Микрочип» выпускает 5 разновидностей МК, которые совместимы по программному коду:

  1. PIC18CXXX (75 команд, встроенный аппаратный стек);
  2. PIC17CXXX (58 команд 16-разрядного формата);
  3. PIC16CXXX (35 команд, большой набор периферийных устройств);
  4. PIC16C5X (33 команды 12-разрядного формата, корпуса с 18–28 выводами);
  5. PIC12CXXX (версии с 35 и 33 командами, интегрированный генератор).

В большинстве случаев МК PIC имеют однократно программируемую память. Встречаются более дорогие модели с Flash или ультрафиолетовым стиранием. Ассортимент из 500 наименований позволяет подобрать изделие для любой задачи. Сейчас производитель концентрирует усилия на развитии 32-разрядных версий с увеличенным объемом памяти.

Языки программирования микроконтроллеров PIC — это Ассемблер и Си. Для кодирования подходят любые интегрированные среды разработки (IDE). Программировать с их помощью очень удобно. Они автоматически переводят текст программы в машинный код

Важной характеристикой IDE является возможность пошаговой симуляции работы готового ПО. Мы рекомендуем пользоваться средой разработки MPLAB

Ее созданием занималась компания Microchip.

Перед началом работы в MPLAB советуем каждый раз заводить отдельную папку. Это нужно, чтобы не запутаться в файлах проектов. Интерфейс программы интуитивно понятный, и трудностей с ним возникнуть не должно. Для отладки используются фирменные отладчики Pickit, ICD, REAL ICE, IC PROG. В них имеется возможность просмотра содержимого памяти, установки контрольных точек.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий