Мистер "Х" или ATXmega (на примере ATXmega32A4) быстрый старт.

AVR
Отмазки

Около года назад понадобилось мне соорудить девайс на основе ATXmega32A4, что в общем-то удалось, правда при изготовлении его я был дико огорчён полным отсутствием статей по данной серии МК, что спешу исправить. Сразу скажу, что статья из разряда «быстрый старт», так что на очень подробное описание тут рассчитывать не стоит. Отдельно хочу поблагодарить наших лающих товарищей за отличный перевод документации по серии Xmega. Ну к сути.

Суть

По сравнению с сериями ATmega и ATtiny ATXmega приобрела довольно много дичайше приятных плюшек, а именно:

Тактовая частота до 32МГц.

Арифметико-логическое устройство (АЛУ). Теперь знаковые числа наши друзья, ибо МК умеет работать с ними хардварно!

Многоуровневый (а именно 3х уровневый) контроллер прерываний.

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

Программно-отладочный 4х проводной интерфейс PDI (2 провода из которых земля и питание). Шить и отлаживать через один и тот же маленький разъём дико круто по-моему :)

И ещё много плюшек о которых можно прочитать у наших лающих товарищей

Так же теперь абсолютно необязательно ставить RC цепочку на RESET пин, но резюком в 10КОм подтянут к питанию надо.

Единственное что может слегка смутить новичка, при переходе с классических AVR контроллеров — это то, что серия Xmega требует для питания 3,3в. Спешу вас успокоить, это требование не так сурово как кажется. Проведя ряд бесчеловечных экспериментов было установлено, что МК прекрасно работает хоть от 4,2в, кратковременно было подано 5в, МК даже не чихнул. Так-же подавались сигналы уровнем в 5в, и МК совершенно спокойно с ними работал, не теряя работоспособности.

Система тактирования
Отличительные особенности

Быстрое время запуска
Безопасное переключение синхронизации во время работы
Внутренние генераторы:
Внутренний RC-генератор частоты 32 МГц с возможностью автоматической калибровки
Внутренний RC-генератор частоты 2 МГц с возможностью автоматической калибровки
Внутренний калиброванный RC-генератор частоты 32 кГц
32 кГц-ый сверхмалопотребляющий генератор (ULP-генератор)
Внешние источники синхронизации
Кварцевый генератор частоты 0.4…16 МГц
Кварцевый генератор частоты 32.768 кГц
Внешний сигнал синхронизации
ФАПЧ с внутренними и внешними источниками синхронизации и коэффициентом умножения частоты от 1 до 31
Делители частоты синхронизации с коэффициентом деления от 1 до 2048
Быстродействующая синхронизация УВВ, в 2 и 4 раза превышающая частоту синхронизации ЦПУ
Автоматическая калибровка внутренних генераторов
Обнаружение отказа кварцевого генератора

При запуске или сбросе МК стартует от внутреннего RC-генератора с частотой 2 МГц. А дальше мы в коде уже выбираем то, что нам надо (если надо конечно). Лично мне хватило внутреннего RC-генератора с частотой 32 МГц, ибо его стабильность удовлетворяла всем моим потребностям.

Делается это так:

OSC_CTRL = (1<<OSC_RC32MEN_bp);//разрешаем работу внутреннего тактового генератора 32MHz
while(!(OSC_STATUS & (1<<OSC_RC32MRDY_bp))) // Ожидание готовности внутреннего тактового генератора 32MHz
;
CCP = 0xD8; //Разрешение записи в защищённый регистр
CLK_CTRL = (1<<CLK_SCLKSEL0_bp); //Выбор внутреннего тактового генератора 32MHz


Тут всё просто:
С начала мы включаем работу внутреннего тактового генератора 32MHz, и он типа запускается, а мы ждём в цикле пока он не подготовится, тобиш его частота не установится, и он станет пригоден для использования, о чём нам сообщит бит RC32MRDY. Затем мы записываем значение в регистр CCP, тем самым давая возможность нам потревожить регистр CLK_CTRL, являющийся защищённым. Но тут тоже есть плюшка! Чтобы разрешить изменение защищенного регистра ввода-вывода или выполнить защищенную инструкцию в течение интервала времени, составляющего не более 4 циклов инструкции ЦПУ, в регистр CCP необходимо записать корректную сигнатуру. Все прерывания, возникшие по ходу этого интервала времени, игнорируются, а по его истечении — обрабатываются с учетом уровня и приоритета. Вот как раз 0xD8 и разрешает нам в течении последующих 4х циклов менять значение защищённого регистра. Разрешение получили, и в регистре CLK_CTRL говорим «тактуйся от выбранного источника (в нашем случае это внутренний тактовый генератор 32MHz)».

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

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

Порты ввода-вывода

И так, нужную частоту мы выбрали теперь надо сделать своеобразный «Hello, world!» в стиле МК, а именно поморгать светодиодом. А для этого нам нужно научиться работать с портами ввода-вывода.

В серии Xmega работа с портами подобна работе с портами в классических AVR, но есть много дополнительных дичайше приятных плюше, а именно:

Раздельная настройка функций входов и выходов на каждом выводе МК
Гибкая конфигурация выводов через специальный регистр конфигурации выводов
Синхронный и/или асинхронный контроль входов с возможностями генерации прерываний и событий
Возможность асинхронного возобновления работы МК
Гибкая конфигурация выходного драйвера и подтяжки логических уровней:
Двухтактный выход
Подтягивание к плюса или минусу питания
Выход «монтажное И»
Выход «монтажное ИЛИ»
Адаптивная подтяжка
Инвертированный ввод/вывод
Управление скоростью фронтов
Гибкое маскирование выводов
Возможность одновременной настройки нескольких выводов с одинаковыми конфигурационными параметрами
Поддержка операций типа «чтение-модификация-запись»
Регистры переключения/сброса/установки бит регистров OUT и DIR
Возможность вывода синхронизации на линии порта
Выход канала события 0 на 7-ой линии портов
Отображение регистров портов (виртуальные порты) с битно-адресуемом пространстве памяти ввода-вывода


Для работы с портами у нас есть 3 регистра. Назначение линии ввода-вывода настраивается из программы пользователя. У каждого порта предусмотрены следующие регистры управления линиями в/в: регистр направления (DIR), регистр вывода данных (OUT). Для опроса состояния линий в/в предусмотрен регистр ввода данных (IN), а дополнительные возможности каждой линии в/в можно настроить через регистр конфигурации линии ввода-вывода (PINnCTRL, где n-номер линии в/в).

Направление линии n задается через отдельный бит DIRn регистра направления DIR. Если бит DIRn сделать равным единице, то линия n будет работать, как выход. Если же бит DIRn сделать равным нулю, то линия будет работать, как вход. Если линия настроена, как выход, то бит OUTn регистра OUT будет определять ее состояние. Запись единицы в бит OUTn приводит к установлению на линии n высокого уровня, а запись нуля — низкого уровня.

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

У регистров DIR и OUT есть дополнительные регистры SET, CLR, GL где SET — установить значение, CLR — очистить значение, GL — инвертировать значение нужного бита просто записью единицы в нужный нам бит одного из этих регистров, в зависимости от того, что нам надо. Всё это не запрещает нам работать с регистрами DIR и OUT как в классических AVR.
что я собственно и сделал по началу изучения эти МК:

PORTC_DIR = (1<<PIN4_bp); // Устанавливаем 4й бит порта C на выход
PORTC_OUT = (1<<PIN4_bp); // Устанавливаем 4й бит порта С в единицу 


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

Подробнее про порты ввода-вывода можно почитать тут

Многоуровневый контроллер прерываний

Раз мы уже затронули работу с прерываниями, то стоит рассказать о том, каким образом с этими прерываниями работать.
И так, у нас есть 2 вида разрешения прерываний. Глобальное разрешение, которое делается установкой бита в регистре SREG:

CPU_SREG |= (1<<CPU_I_bp);//глобльное разрешение прерываний

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

PMIC_CTRL = (1<<PMIC_HILVLEN_bp)|(1<<PMIC_MEDLVLEN_bp)|(1<<PMIC_LOLVLEN_bp);//разрешаем все виды прерываний

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

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

Ещё отмазки

Данную статью прошу считать вводной частью по МК серии Xmega. Её целью было задать первый старт для тех, кому хотелось бы изучить данную серию МК.
Лично мне данная серия очень понравилась лёгкостью работы с ней, своей шустростью и довольно терпимому отношению к бесчеловечным экспериментам.
В следующей статье подробно рассмотрим работу с разнообразными интерфейсам данного МК.
  • +7
  • 22 апреля 2013, 15:43
  • zloiMOZG

Комментарии (61)

RSS свернуть / развернуть
Поддержка операций типа «чтение-модификация-запись» — Если честно не думал что это преимущество. Может знающие подскажут где это можно использовать.
0
Быстрое (одна команда, одно ререключение) и безопасное (нет искажения других пинов, установленных в прерывании в промежуток между чтением и записью) переключение выводов, не затрагивая остальные пины порта.
0
Ничего не перепутали? Может просто написали не так. Но уж точно «чтение-модификация-запись» это не одна команда — одно переключение.
0
Поддержка операций типа «чтение-модификация-запись»
Означает, что всё это дело производится аппаратно, условно говоря за один такт (LPC и STM32 требуется 1 такт шины ВВ, за мегу не скажу). Выполнение операции не может быть прервано/вытеснено, либо получаете все 3 действия, либо ничего. Короче атомарная операция.
+1
атмелу тотже 1 такт, уточнение :)
0
В свое время (в 2010 году), когда я начинал осваивать atxmega, пригодились примеры отсюда: ссылка

Из интересного на atxmega показалась система событий — можно передавать события от одного периферийного модуля другому, причем комбинаций довольно много.
0
На этих ребят чтото не наткнулся, наверное потому что наткнулся на наших лающих товарищей, ну а когда наткнулся, то уже по нима и работал. Но человек я ленивый, по этому решил себе подобным рассказать в форме «смори какая фишка», заинтересовывать так сказать.
0
Да все уже поняли про ваших гавов. Зачем столько ссылок в одном посте и в комментах ещё?
-1
так букв не жалко :)
0
Гав не рекламлю, нафиг рекламу вообще:) Изначально не хотел на них ссылаццо, а запихнуть их ман в PDF и прикрепить сюда, но
человек я ленивый...
+1
Atmel отрубил в нем поддержку старых SPI программаторов и чип в народ не пошел. На чем они выстрелили в нулевых на том же и пролетели с хмегой. А покупать айс3 ради хмеги? Да нах если есть халявные отладки для кортексов которые рвут эту хмегу как тузик тряпку по всем пунктам.
+1
Xmega спокойно шъётся хоть драконом, хоть AVRISP mkII. Хотя есть мудрость про фломастеры :)
0
Ну это надо покупать что то. Или городить еще один программатор. Опять же он не отлаживает. В общем нафиг не нужно оказалось. Тем более, что хмеги дорогие еще. Они, кстати pin-2-pin совместимы со старыми мегами? Если бы были, то это бы их хоть как то оправдывало. Если нет, то увы.
0
стареете батенька брюсжите:)
0
На самом деле отсутствие отладки действительно очень мешает. Именно для работы с Xmega я собрал клон AVRISP mkII (дракон казался дороговат), собрал на Xmega единственную конструкцию — телевизор, после чего перешел на STM32. Там и отладчик — DISCOVERY, доставшаяся бесплатно по конкурсу, и наличие StdPeriph_Lib (несмотря на всю ее корявость), и большое сообщество — куча примеров и проектов.
+3
ну мне было попроще, у меня дракон валяется в количестве 2х штук:)
0
кстати клоны AVRISP mkII тоже шъют Xmega на ура :)
+1
Вообще главная на мой взгляд проблема X серии в наличии в них криптомодуля. Пу сути они являются микросхемами двойного назначения. Например с фарнела в Россию их привезти очень затруднительно, мы покупали у поставщиков в России. А по поводу цен, тут вы не правы, меги и Хмеги в одной ценовой категории :)
0
Так прошивка через любимый SPI выключена у всей линейки ATXMega, а не только у чипа из статьи? Смотрю, например, документацию на ATXMega128 — там упоминается прошивка только через PDI и JTAG.
0
Да, именно так, вся Х серия шъётся и отлаживается через PDI или JTAG.
0
Черт. Вот это облом.
0
Ну и давайте не забывать что тут выкладываются статьи для того чтобы кому то да пригодилось, а не для того, чтобы заставить кого то пересесть на то, о чём пишут :)
+1
Так же теперь абсолютно необязательно ставить RC цепочку на RESET пин, но резюком в 10КОм подтянут к питанию надо.
Так и у AVR не обязательно — есть настройка фузами, да и подтягивать не надо — уже подтянут (достаточно емкость влепить).
0
  • avatar
  • DVF
  • 22 апреля 2013, 20:21
да и подтягивать не надо — уже подтянут (достаточно емкость влепить).
По моему наоборот — емкость не нужна (есть внутренние POR и BOD), а вот резистор необязателен (есть подтяжка внутри), но рекомендуется для большей помехоустойчивости.
0
Емкость нужна, если есть желание выполнить задержку отличную от фузовских. По сути не резистор выступает в роли помехозащищенности Reset. Емкость, стоит подвесить для усиления усиления эффекта защищенности, так как этот вход выполнен на элементе триггера Шмитта.
0
Жалко, что не прикрутят редактирование постов…
0
Программно-отладочный 4х проводной интерфейс PDI (2 провода из которых земля и питание). Шить и отлаживать через один и тот же маленький разъём дико круто по-моему :)
Только не ново. У того же микрочипа давно, у силабса, у MSP430, а у кортексов так и изначально. Ну и закрытый он, в отличие от конкурентов, так что про отладку без фирменного железа можно забыть. Тогда как PK2/EC3/MSPFET легко собираются по вполне официальным данным производителя, а разных отладок для кортексов и вовсе столько, что глаза разбегаются.
Так же теперь абсолютно необязательно ставить RC цепочку на RESET пин, но резюком в 10КОм подтянут к питанию надо.
У меня дежавю. Точно такое же я читал в старой-престарой статье о преимуществах AT90 перед AT89. Другими словами — у обычных AVR тоже ж RC-цепь не нужна.
0
  • avatar
  • Vga
  • 22 апреля 2013, 20:22
Клонирование EC3 не совсем официально — схема-то открыта, но прошивку пришлось добывать «шпионским» методом (выкусыванием из «USB Debug Adapter Firmware Reset»). То же самое, только в профиль, здесь повторили с ST-Link.
0
Ну тут я особо не вникал. Только слышал где-то краем уха, что сам силабс вовсе не против.
0
Да, во всяком случае никаких мер противодействия наподобие «бана» скомпрометированных серийников не предпринимают, а прошивка клона была выложена на silabs.ru (сей ресурс, однако, помер).
Цена вопроса: комплектация на клон $10-15, оригинал — 40. В общем, интерес скорее спортивный, чем денежный.
Есть подозрение, что с силабсовскими кортексами (SIM3xxx)эта железка тоже дружит, проверить пока не представился случай.
0
Мне все в них нравится, но пока ктонить не разжует, как юзать I2C (TWI), так же просто, как и в обычных авр, я этот контроллер из коробки не достану((( Помогите с I2C))
0
Через 3-4 дня выложу рассказ про все интерфейсы что юзал сам I2C там тоже есть :)
0
ждууу, черт меня побери!!!
0
По поводу RC цепочки.
1. Резистор даёт нам более жёсткую потяжку резета, ибо мега сбрасывается хоть пальце без него, ибо внутренняя подтяжка довольно таки фиговая.
2. Кондюк вместе с резюком оабразуют RC цепочку дающею нам задержку при старте, это нужно для того чтобы МК стартонул поле прохождения всех переходных процессов после подачи питания.
В Хмеге временную задержку можно выставить фьюзами, по этому кондей не нужен.

С уважением ваш кЭп.
0
В обычных AVR тоже настройка задержки есть же. Разве что в XMEGA диапазон настройки шире, быть может.
0
Кстати, сейчас подумал, а как физически фузами эта задержка выполнена? Тоже подключением определенной емкости?
0
Ну, судя по значениям задержки в стиле «многотыщтактов» — счетчиком. Вот как сделано "+ N ms" — хз. Возможно тоже счетчик, только с независимым тактированием (от ватчдога скажем).
0
Ну, так переходные процессы не такие уж и долгие, чтобы ставить емкость. Все равно эти "+ N ms" не имеют жесткого нормирования.
0
Честно сказать, я тебя не понял.
0
Ну, есть переходные процессы. Ставим емкость на Reset, чтобы переждать их. При установке Fuse на 0 ms мы все равно имеем задержку на N ms, а если не ставим, то МК несколько раз на переходных «резетится» так быстро, что не успеет инициализироваться. Вот и выходит, что при установке Fuse на 0 ms мы имеем те же N ms задержки. Ну, а если настраиваем задержку на N ms, то она перекроет время переходных процессов. Вот и получается, что емкость не нужна. Другое дело, если нам надо немного «помочь» триггеру Шмитта для увеличения длительности гистерезиса, если на резет лезет помеха в процессе работы МК (ну, например испытание на статику). При всем хорошем мы еще одного помощника забыли — это BOD.
0
Вообще, AFAIK все эти задержки отсчитываются только после того, как питание МК вышло на требуемый уровень и POR разрешил работу. Так что переходные процессы по питанию МК проходят еще до начала отсчета этой задержки. Она нужна, чтобы выждать «окончательной» стабилизации питания и дать время на инициализацию прочим элементам схемы, а также на стабилизацию кварцевого генератора.
0
Ну и наоборот — если они длинные, мы не получим короткого старта, повесив емкость.
0
Или от частоты тактирования?
0
Тоже планирую заюзать Xmega за счет бОльшего количества UART'ов, надо мне 3 минимум, а в AVR только 128 мега этим богата.
0
Как раз будет вам откуда брать инициализацию уарта:) Кстати можете не загонятся по поводу кварца, от внутреннего 32х мегагерцового генератора Х мега работает отлично, у с уартом тоже :)
0
А там по скорости разве круглый кварц подойдет? Да и все-таки у внешнего частота не сильно меняется от температуры.
Кстати, встроенная криптография для чего вообще там?
0
А может там для 32МГц высококачественная керамика стоит. Для COG конденсаторов, например, видели ТКЕ?
0
Мало того что там высококачественная керамика, встроенные генераторы имеют самокалибровку. Но даже не вводя калибровочные кривуленки этот МК работает на удивление стабильно.

Чуть посже расскажу об этом, или самостоятельно моно почитать в по ссылкам в статье.
0
Например, для организации криптозащищенного бутлоадера, или защищенного канала передачи данных итд итп.
0
О, сейчас на xmega32a4 сижу. После всяких котексов — отдых мозгу. Руки сами пишут. Всем аврщикам советую. Ядро — почти avr, периферия — почти M0.
0
  • avatar
  • psv
  • 23 апреля 2013, 10:41
Побольше кошерных подробностей. Замутили проект с использованием xmega32u4. Глаза разбегаются!
0
Пишу:) Откопал свои наработки годичной давности, где я всё усердно каментил чуть ли не рассказами, и по ним сейчас в черновиках набиваю потихонечку.
0
Вот тут кое какие есть примеры mpcontrol.ru/index.php?option=com_content&view=article&id=53&Itemid=36
0
Вы досихпор «парите» AVR?! Тогда мы идем к вам...!!!
-1
Прошу прощения, написание 2й части немного задерживается, из-за возросшего количества работы.
0
XMega действительно можно шить по PDI программатором USBASP с преобразователем уровней на 3.3В? Кто-нибудь пробовал?
0
Та ничего особенного. Каждому прерыванию присваивается уровень проиритета (low, medium. high). Прерывание с более высоким приоритетом может выполнение прервать менее проритетное. Только и всего. Ссылка есть.
И чем это круто?
Сейчас в этом нет ничего необычного — у Cortex-ов бывает до 32 уровней вложенности(может и больше бывает — не попадались).
0
Круто это тем, что бывают ситуации, что вам ну просто очень надо обработать какое нибудь прерывание, в тот момент когда вы уже находитесь в обработчике другого прерывания. В серии тини и мега, в обработчиках флаг разрешения прерывания снимался, и если такая надобность у вас всё таки появлялась, ты вы входя в обработчик разрешали там прерывания. Тут вам этого делать не надо, просто делаем то прерывание, которое должно сработать во время обработки другого прерывания (ох понаписал блин) более высокого уровня, и всё:)
0
вообщем зашёл в тупик… как подцепить дисплей к wh 1604a к atXmege я про аппаратную часть… тоесть согласование уровней… есть рабочие решения?
0
Решение есть — не парить себе мозги ))) Дисплей будет работать с уровнями 3,3 В, только питание ему (дисплею) дайте 5 В.
0
Соглашусь к комментатором:) Мало того Хмега ваще чихать хотела на то, что мы ей в порт 5в сигнал пошлём:) Переварит и не подавится:)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.