Atxmega128a1 au чем программировать

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

Отмазки

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

Суть

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

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

Многоуровневый (а именно 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 МГц, ибо его стабильность удовлетворяла всем моим потребностям.

Тут всё просто:
С начала мы включаем работу внутреннего тактового генератора 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.
что я собственно и сделал по началу изучения эти МК:

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

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

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

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

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

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

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

Ещё отмазки

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

Источник

Аппаратный модуль USB в ATXMega. Инструкция по реализации HID

Аппаратный модуль USB в восьмибитных микроконтроллерах от Atmel появился давно. Но четкого руководства «шаг за шагом» на русском языке для контроллеров семейства XMega я не нашел. Поэтому делюсь своим опытом. Опыт достаточно поверхностный, однако позволяет разработчикам, у которых нет возможности вникать в тонкости USB стека, в сжатые сроки обеспечить взаимодействие контроллера с компьютером по интерфейсу USB. На канале Atmel на YouTube есть ролики как это делается. Однако многим удобнее читать, нежели смотреть видео — для этих людей данный пост. Также, я опишу реализацию на стороне ПК.

ЖЕЛЕЗО. Я использовал контроллер ATXMega256A3BU. Это та же самая ATXMega256A3, но с аппаратно реализованным USB модулем. К слову, я думал, что они pin-to-pin совместимы, но это не полностью так, будьте внимательны! Выводы контроллера D+ и D- я подключил напрямую к соответствующим пинам на разъеме компьютера без всяких резисторов. В моем случае, правда, был не компьютер, а микросхема USB хаба, а потом уже компьютер, но я не думаю, что это существенно меняет дело.

СОФТ МИКРОКОНТРОЛЛЕРА. Для создания костяка прошивки, с уже реализованным программистами Atmel USB стеком, мы воспользуемся мастером ASF Wizard, который встроен в Atmel Studio 6 версии. Дня начала необходимо создать новый проект (File->New Project). Далее в открывшемся окне необходимо выбрать пункты, показанные на картинке.

После создания нового проекта нужно запустить ASF Wizard (меню ASF->ASF Wizard). Во вкладке Availble modules нужно найти USB Device (service), и нажать Add. После этого во вкладке Selected Modules появится USB Device (service), а напротив него выпадающий список. В нем выбираем hid_generic. После чего нажимаем на кнопку Summary, и на этом создание проекта закончено. Теперь он готов к тому, чтобы наполнить его смыслом. В основном файле проекта main.c мы увидим следующее содержание:

Функция board_init() инициализирует отладочную плату, XMEGA-A3BU Xplained. Так как у меня была не эта плата, а своя, я эту функцию выкинул. Далее нам понадобится функция для инициализации USB. Это udc_start(). Она объявлена где-то в недрах asf.h, так что спокойненько ее прописываем. Она инициализирует USB в соответствии с настройками, описанными в файле conf_usb.h.Этот файл находится в папке с проектом. Приведу те строки этого файла которые особо важны для настройки USB HID:

Имена дефайнов говорят сами за себя. Информации о том, что такое vendor id и product id в сети достаточно. UDI_HID_REPORT_IN_SIZE и UDI_HID_REPORT_OUT_SIZE — это размеры входного и выходного буферов соответственно. Функция my_callback_generic_report_out() вызывается в тот момент, когда получен пакет данных с компьютера. В ней можно обрабатывать полученные данные.

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

Скажу несколько слов о строчке sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC0). Дело в том, что функция sysclk_init() по умолчанию выключает тактирование большей части периферии. Я так и не смог разобраться, по какому принципу она это делает, но разобрался, как включить периферию обратно:) Можно использовать sysclk_enable_module(), и дописывать в нее в качестве аргументов то что надо включить. Что именно дописывать можно понять, если использовать поиск по всему проекту и в качестве параметра поиска указать sysclk_disable_module.

Если залить этот код в контроллер, и подключить его к компьютеру, то в диспетчере устройств появится HID-совместимое устройство. А в устройствах и принтерах устройство с тем названием которое было указано в строке #define USB_DEVICE_PRODUCT_NAME. В моем случае все выглядит вот так:

СОФТ ДЛЯ КОМПЬЮТЕРА.

Все тот же Atmel любезно предоставляет нам примеры как это сделать на стороне компа. Они выполнены в Visual Studio, в которой я не силен, так что мне пришлось переписать под C++ Builder. По этому поводу коллеги говорили мне: «изыди». Но чем богаты тем и рады. В общем привожу пример на билдере.

Далее в теле программы, например, при создании формы нужно написать следующее.

Теперь мы имеем функции для работы с HID устройсnвом. findHidDevice(VID, PID) ищет в системе устройство с соответствующими VID и PID. После этого с ними можно работать. writeData() отправляет массив на устройство. Использовать это все можно например так:

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

Ну и конечно в конце обязательно видео, как это работает у меня. Видеокамера с регулируемым зумом, фокусом и диафрагмой.

Источник

Превращаем Arduino в полноценный AVRISP программатор

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

Меня уже давно спрашивают — можно ли прошивать hex файлы при помощи Arduino? Изменять фьюзы? Считывать прошивку? И всякое такое… Ответ — можно, и я сегодня вам расскажу, как я это делаю.

(Данное видео дублирует представленную ниже информацию)

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

Небольшая предыстория:
Одного прекрасного дня, я наткнулся на отличный проект на ATtiny13, но увы автор выгрузил в сеть только hex-файл и схему, ну и конечно же, я так и не смог его попробовать в железе. Меня этот вопрос мучил всё больше и больше, и тут я случайно наткнулся на одно видео в сети, где автор утверждал, что он при помощи Arduino прошил другой микроконтроллер, имея только hex-файл, ну и схему, само собой. Именно он мне подсказал — используй SinaProg, но с Arduino’вскими файлами…

Загуглив на тему SinaProg, я скачал SinaProg 2.1.1.RUS, но он работать отказывался с Arduino, потому я закинул пару-тройку файлов из Arduino IDE в папку SinaProg 2.1.1\data\ и всё заработало.

Пройдёмся коротко по возможностям софта:

В блоке Hex-file выбираем hex или eep(первый — прошивка, второй — содержимое энергонезависимой памяти).

А той части, где кнопка «>», мы можем видеть всякие сообщения, типа «OK», или «ERROR», сама же кнопка «>» открывает логи Avrdude.

В блоке Flash есть кнопки:

Program — запись hex-файла в микроконтроллер(возможно, когда выбран Hex-file);
Verify — проверка прошивки, что в микроконтроллере, и hex-файла(проще говоря, их сравнение), если всё норм — программа говорит OK;
Read — считать hex-файл.

С блоком EEPROM всё по аналогии.

Далее блок Device, тут можно выбрать нужный микроконтроллер, вот весь список поддерживаемых(список выдрал из файла Device.txt, который лежит в папке SinaProg 2.1.1\data\):

Шутка, вон их сколько:

AT90CAN128
AT90CAN32
AT90CAN64
AT90PWM2
AT90PWM2B
AT90PWM3
AT90PWM3B
AT90USB1286
AT90USB1287
AT90USB162
AT90USB646
AT90USB647
AT90USB82
AT90s1200
AT90s2313
AT90s2323
AT90s2333
AT90s2343
AT90s4414
AT90s4433
AT90s4434
AT90s8515
AT90s8535
ATmega103
ATmega128
ATmega1280
ATmega1281
ATmega1284P
ATmega128RFA1
ATmega16
ATmega161
ATmega162
ATmega163
ATmega164P
ATmega168
ATmega169
ATmega2560
ATmega2561
ATmega32
ATmega324P
ATmega325
ATmega3250
ATmega328P
ATmega329
ATmega3290
ATmega3290P
ATmega329P
ATmega48
ATmega64
ATmega640
ATmega644
ATmega644P
ATmega645
ATmega6450
ATmega649
ATmega6490
ATmega8
ATmega8515
ATmega8535
ATmega88
ATtiny11
ATtiny12
ATtiny13
ATtiny15
ATtiny22 2343
ATtiny2313
ATtiny24
ATtiny25
ATtiny26
ATtiny261
ATtiny44
ATtiny45
ATtiny461
ATtiny84
ATtiny85
ATtiny861
ATtiny88
ATxmega64A1
ATxmega128A1
ATxmega128A1D
ATxmega192A1
ATxmega256A1
ATxmega64A3
ATxmega128A3
ATxmega192A3
ATxmega256A3
ATxmega256A3B
ATxmega16A4
ATxmega32A4
ATxmega64A4
ATxmega128A4

Как видите, есть все популярные микроконтроллеры фирмы ATmel, в частности ATmega328P, ATmega8, ATtiny13, ATtiny2313 и всякие другие…

Далее — кнопка Search, если её нажать, то программа попытается прочитать сигнатуры того микроконтроллера, который подключен к программатору, проще говоря, поищет микроконтроллер. Потом может ответить „OK“ или „ERROR“ в информационном блоке, если всё нормально, или нет, соответственно.

В блоке Fuses есть предустановки для ATmega8 для работы на разных частотах, но, увы, только для ATmega8 и ATmega32, можно добавить в файле Fuse.txt (который лежит в папке SinaProg 2.1.1\data\).

Есть кнопка Program — записать предустановки, смотрим на абзац выше.

А так же Advanced — лихая кнопка, после её нажатия можно увидеть вот такое окно:

Device signature — какие-то циферки, я так понял это идентификатор микроконтроллера, по ним программа опознаёт, что за микроконтроллер мы ей суём.

Информационная часть, всё как выше.

Чуть ниже идут фьюзы… если уж зачешется, то не забывайте их сначала считать кнопкой Read(чтобы не нарочно изменить важные фьюзы, например «SPIEN» или «RSTDSBL»), записать фьюзы — кнопка Write, кнопка Chip Erase стирает микроконтроллер, что-то примерно напоминает — форматирование флешки на компьютере(но фьюзы не устанавливаются по умолчанию, так что забывать об этом не стоит).

Пару слов о фьюз-битах — это такие как бы тонкие подстройки микроконтроллера, то частоту поднять, то убавить, то вкл/выкл тактирование от внутренней RC цепочки то ещё что-то… в общем, туда лезть только в крайнем случае, иначе можно заблокировать микроконтроллер(нашаманить так, что перестанет работать, серьёзно), и уже без Atmega fusebit doctor никак.

Вот первая ссылка с гугла по запросу «калькулятор фьюзов», но предупреждаю, тыкать что-то там, не зная зачем оно, и потом это записывать в микроконтроллер — ни к чему хорошему не приведёт, я-то знаю.

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

Итак, последний блок основного окна программы — Programmer, тут выбирается тип программатора, если вы используете Arduino в качестве программатора — ставьте всё, как у меня на скрине, только не COM19, это у меня такой, у вас, наверное, будет другой, в любом случае точно не COM1, первый это системный, актуален только для программаторов, которые подключаются к реальному COM порту, например, Программатор Громова. На ноутбуке COM-порта может не быть, а на компьютерах, как правило, COM-порт ещё есть, особенно тех, что постарше. Можно использовать и другой программатор, к примеру, USBASP, только не забываем выбрать его в списке, скорость для него я ставлю такую же как и в случае с AVRISP.

Список поддерживаемых программаторов:

Gromov
USBtiny
ALF
Arduino
AT ISP
AVR109
AVR910
AVR911
AVRISP
AVRISP 2
AVRISP mkII
AVRISP v2
Bascom
Blaster
BSD
Butterfly
C2N232I
DAPA
DASA
DASA 3
Dragon_DW
Dragon_HVSP
Dragon_ISP
Dragon_JTAG
Dragon_PP
DT006
ERE-ISP-AVR
Frank-STK200
Futurlec
JTAG 1
JTAG 1Slow
JTAG 2Slow
JTAG 2
JTAG 2Fast
JTAG 2ISP
JTAG 2dW
JTAG mkI
JTAG mkII
MIB510
pAVR
Picoweb
Pony-STK200
ponyser
SI Prog
SP12
STK200
STK500
STK500 HVSP
STK500 PP
STK500 v1
STK500 v2
STK600
STK600 HVSP
STK600 PP
USBasp
Xil

Лично я тестировал только на программаторах AVRISP(Arduino с прошитым скетчем ArduinoISP) и USBasp, на двух микроконтроллерах — ATmega8 и ATtiny13.

Чтобы можно было шить/читать/изменять фьюзы/ убить микроконтроллер при помощи Arduino, предварительно нужно зашить скетч ArduinoISP, подключив всё, как я писал, например вот тут:

Если в двух словах, то подключаем пины Reset, MOSI, MISO, SCK микроконтроллера, который будем прошивать/считывать прошивку/изменять фьюзы так, как указано в скетче в комментариях, а именно:

Вот пример подключения к ардуине ATmega8:

Ну и по аналогии… Ищем карту пинов, например, в даташите (техдокументация на МК) интересующего нас микроконтроллера, вот, к примеру, первая ссылка из гугла по запросу «ATmega8 pdf».

PS У меня было такое, что ATtiny13 перестала прошиваться, на попытки её программирования, после того, как я попробовал запустить её на частоте 128 kHz, откопал где-то вот такой, слегка модифицированный код ArduinoISP который заставляет прошивку/изменение фьюзов происходить медленнее в несколько раз и может ещё какая-то магия, не разбирался, честно.

Источник

AVR XMEGA – разгон, вольтмод и производительность SDRAM

AVR XMEGA – разгон, вольтмод и производительность SDRAM
Overclocking the AVR XMEGA: voltmode and SDRAM performance

Из серии «Моя борьба с микроконтроллерами»

Не любят производители микропроцессоров начинающих пользователей
Ложка технического дегтя в бочку меда XMEGA
Достоинства XMEGA
Что и как будем тестировать
Тесты на встроенном источнике тактовой частоты
Слава павшим героям
Что дает кварцевый резонатор
Подводим итоги

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

Любой бизнес, вырастая до некоторых размеров, перестает отвлекаться на мелкие вопросы и проблемы.

Ложка технического дегтя в бочку меда XMEGA
Помимо общих рассуждалок предыдущей главы, добавим несколько технических моментов, которые могут не очень понравиться конечным пользователям.
Открытый опубликованный список ошибок флагмана ATXMega128A1 даже для исправленной ревизии чипа «H» состоит из пары десятков наименований. Некоторые из них весьма существенны. А в ревизии чипа «G» вообще не функционирует загрузчик (bootloader). ATXMega16A4 номинирован списком в девять ошибок, основная доля которых связана с работой аналогового компаратора.
Судя по «XMEGA A MANUAL», оставлен резерв под серию ATXMega A0 в 144-выводном корпусе, так как рассказывается про 4-х портовую, не очень красиво звучащую на русском транслите, шину EBI (External Bus Interface). ATXMega128A1 имеет 100 выводов и 3-х портовую шину EBI. Это приводит к тому, что для шины данных SDRAM остается всего 4 бита. То есть, помимо мультеплексирования адреса и управления, дополнительные временные затраты будут и на мультиплексирование данных. Кроме того, 3-портовая шина не разрешает одновременное подключение SDRAM и SRAM (или параллельного LCD/NOR Flash). И последний минус по внешней шине — не поддерживаются «интеллектуальные» и burst-режимы (а именно с их помощью и получается максимальная производительность). По крайней мере, заголовочный файл свободен от настроечных опций под эти режимы, а в настолько продвинутый контроллер шины EBI не верится ни капли.
Будет ли ATXMega A0 воплощена в кремнии — неизвестно, если правильно помнится, была обещана USB-версия XMEGA на 2010 год. Пара недель у Atmel еще есть. Но и нынешний флагман пока не получил максимальной комплектации, если сравнивать со всеми выпускающимися моделями серии, например, нет входа для батарейного питания, поддерживающего бэкап-домен и RTC, а регистр RTC 16 разрядный, хотя ATXMega256A3B имеет 32-битный регистр.
Несмотря на гордые заявления Atmel, что серия XMEGA — это 8/16 бит МК (16-битная только внутренняя шина таймеров), с таким же успехом можно ATXMega256A3B назвать 32-битным микроконтроллером. Безусловно, вся серия XMEGA — это 8-битные МК.
Классический SPI в режиме мастера остался без поддержки DMA. Но в большинстве случаев с одним мастером на шине можно заменить SPI на USART в режиме мастер-SPI, при этом по максимальной частоте SPI_CLK никакого проигрыша не будет. Хотя пропускная способность из-за специфики USART незначительно упадет, не будут также доступны некоторые особенности протокола SPI, например, детектирование коллизий на шине.

Что и как будем тестировать
В качестве испытуемых будут выступать:
1) МК ATXMega128A1, установленный на Atmel XPLAIN. На этой плате установлена также микросхема памяти SDRAM Micron MT48LC16M4A2-75 плотностью 64 мегабита и организацией 4банка х 4Мбит х 4, то есть суммарно 8МБ. Остальные компоненты XPLAIN нас пока интересовать не будут.
2) МК ATXMega16A4 на двух платках собственного дизайна, версии 1 и 2. Так как платки получились не совсем удачными по конструкции, они подвергнутся самым жестким испытаниям, так как совсем не жалко.
В качестве программатора МК (отлаживать нам ничего не надо) используется AVR Dragon.
Для визуального контроля цифровых линий на бредборде установлен логический анализатор OLS.
Для питания оборудования в номинальном режиме используется напряжение +5VUSB от ПК, для вольтмода — регулируемый блок питания PXN-1505D с цифровым контролем напряжения и тока.

Если делители для получения частоты В и С установить на два (каждый), получим частоту В, равную 64МНz, а частоту С, то есть, частоту процессора МК, равную 32МНz. То есть, включится максимальный гарантированный по частотам рабочий режим.
С такими установками, изменяя в приведенной функции значение множителя единичным шагом от 16 и выше, будем получать приращение тактовой частоты процессора с шагом в 2MHz. Удвоенное значение (частота В) служит тактовой частотой для SDRAM на плате XPLAIN.
Установленная SDRAM рассчитана на 133MHz, поэтому ее возможности будут раскрыты лишь наполовину. Это даст возможность работать исключительно по настройке МК, так как даже самые скоростные опции будут находиться внутри допустимых границ для SDRAM. Разумеется, тайминги по рефрешу и прочим системным вещам надо соблюдать. Типовой вид записи единичного байта в 4-битную SDRAM приведен в описании «XMEGA A MANUAL», п.33.14:

Тесты на встроенном источнике тактовой частоты
На плате XPLAIN запускаем немного модифицированную программу из апнота «AVR1312: Using the XMEGA External Bus Interface», которую можно скачать с официального сайта Atmel. Модификация касается тактовой частоты процессора (как описано выше), так как в апноте все тактуется от 2MHz. Производительность при этом будет примерно 200 килобайт в секунду и это нам ничего, кроме расстройства, не даст. Плюс подправим тайминги на минимально возможные, а диапазон проверки поставим сразу на все 8 мегабайт. Чтобы не засорять графики, период рефреша увеличиваем до трех микросекунд.
Программа записывает во все ячейки памяти константу 0xA5, затем читает все ячейки и сравнивает считанное значение с 0xA5. В случае несовпадения увеличивается счетчик ошибок. В моем варианте выход из локального цикла осуществляется при первой же ошибке, начало записи, чтения, окончание чтения, а также наличие ошибки выводятся на светодиодную индикацию, так как пока никакой другой визуализатор не подключен. И все это крутится во внешнем бесконечном цикле.
Конечно, такой примитивный тест памяти — это только иллюстративный пример и не может называться тестом, но мы и тестируем не память, а МК с дополнительным контроллером памяти, что есть две большие разницы, да и ранее мы приняли за аксиому безупречность памяти.
Начинаем с круглого множителя 20. Это дает частоту A, равную 160MHz, частоту В (т.е. памяти) 80MHz, а процессор будет работать на 40MHz. Частоту процессора выведем на седьмой пин колодки порта D, где ее будет удобно подключить к анализатору OLS. В программу нужно будет добавить строчку:

реклама

Тактовая частота процессора — верхяя строчка, заодно с помощью OLS измеряем и ее значение. Во всплывающем окне слева внизу видим 40MHz, Duty cycle 40%. Частота, как мы и ожидали. Длительность тактовых импульсов гуляет — не так просто бывает сгенерировать или разделить частоту по произвольному множителю или делителю. Да и встроенная задающая RC цепь обычно стабильностью не блещет. Кроме того, максимальная частота A определена в документации как 128MHz, а у нас уже 160. То, что такая частота действительно присутствует, видно и по «вспышкам» и фазировке 80-мегагерцового такта SDRAM_CLK.
Аналогично «потоковой записи» в LCD, цикл записи в SDRAM также развернут, поэтому для каждого полубайта (шина данных 4 бита) требуется 320нс, что дает немногим более 1.5MBps. Если же оставить в теле цикла только одну операцию записи, производительность снижается еще на 60%.
Первый рубеж условно взят (все же реальную циркуляцию данных мы не проверяли).
Пытаемся взять 50MHz по процессору, множитель — 25. Не стартует, светодиоды не загораются.
Идем вниз. При множителе 24 стартует, но работает странно — светодиод ошибки не загорается. Но и светодиод начала цикла записи не горит. Индикация конца чтения есть, сигнал правильного чтения тоже. Смотрим, что творится на шине.
Вместо SDRAM_CLK выведен сигнал nCAS, но его частота, судя по графику, равна половине SDRAM_CLK, то есть, частоте процессора. Чего не может быть в принципе, и это говорит о проблемах на шине EBI:

Попробуем слегка помочь процессору свежим током. Предельное рабочее напряжение по референсному документу «XMEGA A MANUAL» и техническому описанию 3.6V. Хотя обычно в разделе абсолютных максимумов оно не называется рабочим. Но ничего другого обнаружить не удается. Для памяти Micron MT48LC16M4A2 не страшны и 4.5V, все остальные компоненты XPLAIN мне не жалко ни разу, да и доступны они в продаже, а вот 4-битная память SDRAM — дефицит.
Поднимаемся до 3.6V- ничего не меняется. Плавно (ручкой точной подстройки) идем вверх, на 3.83V вес взят:

Но интересно увидеть предел без повышения напряжения.
Снижая множитель, получаем работоспособность шины EBI (теоретическую) при значениях 22-23. Более детальная проверка шины и памяти предстоит в ближайшем будущем, а пока на скорую руку подключаем по последовательному интерфейсу LCD и запускаем программу, выводящую разноразмерные и разноцветные прямоугольники в непрерывном цикле. Так как LCD MI0283QT-2 работает с тактом SPI до 50MHz, возможные артефакты изображения на такте SPI 22-23MHz будут свидетельствовать о сбое в МК. Что и было изредка видно при множителе 23. Поэтому для дальнейшей работы оставлен множитель 22, дающий возможность работы МК на частоте 44MHz.

Cравним также мастер-SPI через USART и обычный SPI, так как обычный мастер на XMEGA не поддерживает DMA и мы для чтения SD флэш-карт будем использовать SPI через USART.
Сравнение происходило при множителе 20, то есть при такте 20MHz.
SPI:

Слава павшим героям
Как-то не повезло мне с изготовлением собственных печатных плат под XMEGA.

Что дает кварцевый резонатор
При осцилляторе, работающем от кварца, такт в 40MHz выглядит очень хорошо:

Следовательно, частота PLL 160MHz также красивая, скважность, правда не половинная, но она зависит от способов пересчета и примененных предустановок и не всегда будет получаться 50%.
Так как теперь исходная частота (8MHz) подается на PLL напрямую, без делителя на 4, то единичное изменение шага множителя приводит к изменению частоты процессора на 4MHz при суммарном делении частоты A на 4. Можно установить деление частоты A на 2, тогда можно давать приращения тактовой частоты по 2MHz.
Но такт 52MHz без повышения напряжения приводит к периодическому зависанию графического вывода, 50MHz — почти всегда хорошо, поэтому откатываемся еще на ступеньку назад, до 48MHz. Тактовая частота при этом выглядит так:

Пять импульсов по 20нс формируют 50MHz, а каждый шестой длится немного дольше, обеспечивая на продолжительном отрезке суммарную длительность импульсов, соответствующую равномерной частоте 48MHz. Можно сказать, что МК более 80% времени работает на частоте 50MHz.
Соответственно, работа SPI происходит на «средней» частоте 24MHz, что обеспечит чуть более 2MBps. SDRAM тактуется 96MHz и можно рассчитывать на реальную ПСП в районе четырех с половиной MBps. Но пока на такой частоте никто не гарантировал нормальную работоспособность контроллера шины EBI, это мы проверим в ближайшем будущем. За микроновскую SDRAM можно не опасаться — даже в этом случае мы используем чуть более 60% от ее расчетного быстродействия.
Все-таки, если не требуется частота PLL в 8*24 = 192MHz и для высокого разрешения таймеров хватит 192/2 = 96MHz, то лучше поставить множитель не 24, а 12, частоту CLKper2 уравнять с CLKper4 (96MHz), а для процессора получать такт делением CLKper2 на два.

Обсудить можно здесь.
На сегодня все,
Zauropod,
14 декабря 2010 года.

Источник

Операционные системы и программное обеспечение