![]() |
![]() |
|
![]() |
|
|
Уголок радиолюбителя Форумы любителей электроники. См. также Железнодорожная связь, Электронная аппаратура ЖАТ |
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
#1 (ссылка) |
V.I.P.
![]() Регистрация: 14.05.2015
Сообщений: 255
Поблагодарил: 0 раз(а)
Поблагодарили 8 раз(а)
Фотоальбомы:
не добавлял
Репутация: 0
|
Тема: [06-2015] Особенности портов ввода-вывода микроконтроллера ATxmega и их настройка средствами BASCOM AVRОсобенности портов ввода-вывода микроконтроллера ATxmega и их настройка средствами BASCOM AVR А. САВЧЕНКО, пос. Зеленоградский Московской обл. Порты ввода—вывода микроконтроллеров AVR предшествовавших поколений традиционно имели по три регистра (DDR, PORT, PIN), в которых для каждой линии порта предусматривались разряды управления направлением передачи информации DDRn, выходной информации PORTn и разряды входной информации PINn (отображающие логические уровни на физических выводах микроконтроллера). Такая структура сохранена и в микроконтроллерах ATxmega, однако к ней добавлено много усовершенствований, о которых и рассказывает предлагаемая статья. В микроконтроллерах ATxmega изменены названия регистров DDR, PORT и PIN. Теперь они стали более логичными с точки зрения выполняемых ими функций: регистр направления получил название DIR, регистр выходной информации — OUT, регистр входной информации — IN. Обращение к регистру любого модуля микроконтроллера теперь осуществляется по схеме "условное наименование модуля_наиме-нование регистра". Например, в системе разработки программ BASCOM AVR строка, обеспечивающая вывод значения переменной А в порт В, ранее имевшая вид PORTB=A теперь выглядит так: PORTB_OUT = А Однако сохранена возможность обращения к регистрам DIR, OUT, IN по их "старым" именам, т. е. программные конструкции DDRB = 1, PORTB = А, А = PINB и другие подобные остаются допустимыми, что существенно облегчает перенос на микроконтроллеры ATxmega программ, разработанных для микроконтроллеров AVR ранних семейств. Чтобы более эффективно управлять портами на уровне отдельных разрядов для регистров направления и выходной информации, введены новые функции "установить" — SET, "очистить" — CLR и "переключить" — TGL. Для их реализации в порт добавлены специальные регистры. Например, запись логической единицы в разряд регистра OUTSET приведёт к установке в соответствующем разряде регистра OUT логической единицы, а в разряд регистра OUTCLR — логического нуля. Запись логической единицы в разряд регистра OUTTGL вызывает инверсию значения соответствующего разряда регистра OUT. Аналогичным образом единицы в разрядах регистров DIRSET, DIRCLR, DIRTGL изменяют состояние регистра DIR. Конфигурирование линий порта. Если в семействах микроконтроллеров ATtiny и ATmega возможности конфигурирования линий порта были довольно скромными (вход, выход и установка на отключённом от внешних источников сигнала входе высокого логического уровня с помощью встроенного резистора), то в семействе ATxmega эти возможности стали существенно шире. Для линии, сконфигурированной как вход, возможны следующие варианты поддержания логического уровня при отключённом внешнем источнике сигнала: — неопределённый; — высокий; — низкий; — адаптивный. В последнем случае при отключении источника сигнала на входе сохраняется логический уровень, который был установлен последним. Это даёт возможность избежать неопределённого состояния входа. Для линии, сконфигурированной как выход, можно задать следующие подрежимы работы: — двухтактный выход; — однотактный выход с открытым истоком; — однотактный выход с открытым истоком и внутренней нагрузкой, под-ключеннои к общему проводу; — однотактный выход с открытым стоком; — однотактный выход с открытым стоком и внутренней нагрузкой, подключённой к плюсу питания. Появилась возможность ограничить крутизну перепадов выходного сигнала, что снижает энергопотребление. Длительность перепадов при этом увеличивается примерно вдвое. Пользоваться такой возможностью следует с осторожностью. Если линия нагружена входом высокоскоростного устройства, то на "длинном" перепаде иногда наблюдается хаотическое изменение состояния входа, пока уровень напряжения на нём остаётся в интервале между логически низким и логически высоким. Следующим весьма полезным нововведением в конфигурировании линий порта является возможность инвертирования логического уровня сигнала при его вводе и выводе. Кроме того, в микроконтроллерах ATxmega существенно расширены возможности генерирования аппаратурой портов запросов прерывания и событий. Можно указать, какие изменения входных сигналов будут использоваться в этих целях. Для этого на каждой линии предусмотрен регистр PINnCTRL, структура которого представлена ниже. PINnCTRL — конфигурационный регистр линии п порта (например, для линии 3 порта В его полное имя PORTB_ PIN3CTRL). Имеет следующие разряды (в круглых скобках — номер разряда регистра): SRLEN (7) — признак включённого ограничения крутизны перепадов выходного сигнала. INVEN (6) — признак инвертирования входных и выходных сигналов. ОРС[5:3] (5—3) — кодом в этих разрядах задают, в соответствии с табл. 1, тип выхода и способ поддержания логического уровня на свободном входе. ISC[2:0] (2—0) — кодом в этих разрядах задают, в соответствии с табл. 2, какие изменения входного сигнала будут фиксироваться аппаратурой и как будут генерироваться запросы прерывания или события. При коде 011 низким логическим уровнем на входе, не изменяющемся при выходе микроконтроллера из "спящего" состояния, будет генерироваться только запрос прерывания. Событие в этой ситуации будет по-прежнему генерироваться при высоком уровне. Следует отметить, что если установлено единичное значение разряда INVEN, то логические уровни и их перепады, задаваемые кодами 001 — 011, становятся инверсными относительно указанных в таблице. ![]() Наличие для каждой линии каждого порта своего конфигурационного регистра делает процесс настройки портов довольно длинным. Чтобы сократить его, в микроконтроллерах ATxmega предусмотрена возможность установить одинаковую конфигурацию нескольких линий порта с помощью маски, задаваемой в регистре MPCMASK, который не имеет привязки ни к одному из регистров портов. Выполняется такая конфигурация в два этапа. Сначала в разряды регистра MPCMASK, соответствующие номерам линий порта, которые должны быть сконфигурированы одинаково, заносят логические единицы. Затем в регистр конфигурации любой из этих линий заносят требуемый конфигурационный код. Автоматически он будет загружен и в регистры конфигурации остальных линий порта, указанных в регистре MPCMASK. Производитель рекомендует, чтобы одновременное конфигурирование нескольких линий проводилось с предварительным запретом прерываний и их последующим разрешением. Пусть требуется сконфигурировать линии 0, 2, 3, 4 ,5, 7 порта В как двухтактные выходы и задать обнаружение спадающих перепадов уровней на них. Из табл. 1 и табл. 2 находим, что конфигурационный код для этого случая будет равен &В00000010. Требуемое действие выполнит последовательность команд Disable interrupts MPCMASK=&B10111101 PORTB_PIN4CTRL=&B00000010 Enable interrupts После этого все указанные в регистре MPCMASK линии порта (можно было использовать регистр конфигурации любой из них) будут сконфигурированы требуемым образом, а регистр MPCMASK обнулён. Доступен и механизм конфигурирования линий порта как входов или как выходов с помощью директив Config Pin, Config Port или непосредственной загрузкой регистра направления порта. Например, сконфигурировать все линии порта В на вывод можно так: PORTB_DIR = &В11111111 или так: DDRB = &В11111111 или так: config portb = output Генерирование событий и запросов прерываний. В микроконтроллерах ATxmega каждая линия порта, сконфигурированная как вход, способна генерировать запросы прерывания и события. Условия их генерации определяются полем ISC регистра PINnCTRL (см. табл. 2) и состоянием системы синхронизации микроконтроллера. Если на аппаратуру порта поступает сигнал синхронизации, контроль состояния входа производится синхронно. Если же сигнал синхронизации не поступает (как в некоторых режимах пониженного энергопотребления), то аппаратура порта контролирует состояние входа асинхронно. При синхронном контроле генерируются как запросы прерывания, так и события, при асинхронном — только запросы прерываний. При этом полная функциональность сохраняется только у линии 2 порта, у остальных линий она ограничена. Возможности аппаратуры порта по генерации запросов прерывания и событий при синхронном и асинхронном контроле входов приведены в табл. 3. Каждый порт способен генерировать два сигнала запросов прерываний (into и inti). Для управления прерываниями в составе аппаратуры порта имеются регистры: INTCTRL — регистр управления прерываниями. В нём используются следующие разряды: INT1 LVL[ 1:0] (3, 2) — уровень прерывания inti; INT0LVL[1:0] (1,0) — уровень прерывания into. Коды в этих полях задают уровни соответствующих прерываний: 00 — прерывание запрещено, 01 — прерывание низкого уровня, 10 — прерывание среднего уровня, 11 — прерывание высокого уровня. Уровень определяет очерёдность обработки запросов прерываний, поступивших одновременно. Если даже запрос прерывания более высокого уровня поступил во время обработки прерывания меньшего уровня, то эта обработка прерывается и обрабатывается новый запрос. Лишь по его выполнении обработка низкоуровневого прерывания продолжается. Разряды 4—7 регистра INTCTRL не используются. INT0MASK — регистр маски прерываний into. INT1MASK — регистр маски прерываний inti. Единицы в разрядах этих регистров задают линии порта, при изменении состояния которых будут генерироваться запросы прерывания (соответственно into и inti). Условия, при которых генерируются запросы, задают для каждой линии в полях ISC регистров PINnCTRL. INTFLAGS — регистр флагов прерывания. INT1 IF (1), INT0IF (0) — флаг устанавливается, если на любой из линии порта, выбранных в качестве источника запросов прерываний, выполняется условие генерации запроса. Он снимается аппаратно при переходе на обработку запроса либо программно путём записи единицы в соответствующий разряд регистра. Для использования прерываний необходимо: — настроить контроллер прерываний микроконтроллера и разрешить прерывания того уровня, который будет использоваться. Уровень каждого прерывания задаёт программист; — настроить источник запросов прерывания на их генерацию при выполнении соответствующих условий; — указать адрес (метку) подпрограммы обработки прерывания; — дать глобальное разрешение прерываний. Описанные действия обычно выполняют в начальном фрагменте программы на этапе конфигурирования модулей микроконтроллера. После этого остаётся в нужном месте программы разрешить обработку необходимого запроса прерывания. Пусть требуется сконфигурировать порт F на выход и установить на его линиях нулевые значения, если на линии 3 порта В не обнаружен высокий уровень сигнала. Будем использовать прерывание intO: config Priority=static,o vector=Application, Lo=Enabled PORTB_PIN3CTRL=&B01011011 PORTB_INT0MASK=&B00001000 Enable interrupts on portb_int0 Label1 Enable portb_int0,Lo Label1: DDRF=&Bllllllll PORTF=0 Return Обратите внимание, поскольку условием генерации запроса прерывания выбрано обнаружение высокого уровня на линии 3 порта В, то при конфигурировании этой линии в регистре PORTB_ PIN3CTRL задано инвертирование сигнала, так как выполнение этого условия не может быть обнаружено иначе. В "механизме" обработки прерываний можно выделить два этапа. Первый — формирование запроса прерывания и установка его флага в регистре прерываний соответствующего модуля микроконтроллера. Это действие выполняет аппаратура модуля при соответствующих формированию запроса условиях. Второй этап — обработка запроса, в ходе которого исполнение текущего фрагмента программы приостанавливается, а управление передаётся подпрограмме обработки прерывания. Это действие выполняет контроллер прерываний микроконтроллера. ![]() Если запрашиваемое прерывание разрешено, то второй этап — логическое продолжение первого, и оба они составляют единую процедуру, в ходе выполнения которой флаг прерывания снимается. А если прерывание запрещено? В этом случае второй этап будет заблокирован, но первый всё равно выполнен — запрос прерывания будет сформирован и его флаг в соответствующем регистре установлен. Значит, этот запрос может быть при необходимости обнаружен программой, ведь регистры прерывания модулей микроконтроллера ей доступны. Возможность программного анализа состояния флагов прерываний — эф-фективныи инструмент, позволяющий программисту решать целый ряд задач. Рассмотрим лишь один пример. Пусть необходимо остановить выполнение программы в строго определённом месте и продолжить её выполнение лишь в том случае, если на линии 3 порта В будет установлен низкий уровень. Подобные ситуации на практике встречаются нередко. Например, к этой линии подключена кнопка и следует дождаться её нажатия. Реализуется это достаточно просто. Линию 3 порта В конфигурируем как вход с внутренним поддержанием высокого уровня и задаём обнаружение низкого уровня: PORTB_PIN3CTRL=&B00011011 config pinb.3=input Выбираем запрос прерывания into от порта В и запрещаем это прерывание, если ранее оно было разрешено. В регистре маски разрешаем генерацию запроса прерывания только от линии 3: Disable portb_intO PORTB_INT0MASK=&B00001000 Предварительная настройка закончена. Теперь там, где программа должна быть остановлена, записываем команду Bitwait portb_intflags.О,Set После нажатия на кнопку выполнение программы продолжится, и первой же командой после остановки должен быть снят флаг прерывания intO: set PORTB_INTFLAGS.О Как уже отмечалось, автоматически этот флаг снимается только при переходе к процедуре обработки прерывания, а он запрещён. Технология виртуальных портов Работая с портами, нередко требуется манипулировать их отдельными разрядами. Для ускорения подобных действий в системе команд процессора микроконтроллера имеется ряд команд поразрядной обработки информации. Но работают они только с операндами, расположенными в адресном пространстве ввода—вывода (первые 32 адреса). Поскольку регистры портов располагаются за пределами этой области в расширенном пространстве памяти ввода—вывода, с ними такие команды не работают. Поэтому для изменения одного разряда, например, в регистре OUT порта приходится сначала загрузить его содержимое в регистр, находящийся в пространстве ввода—вывода, изменить в нём требуемый разряд и вновь записать результат в регистр OUT. Получается длинно и долго. Технология виртуальных портов призвана ускорить подобные операции. Виртуальный порт содержит четыре регистра: OUT, IN, DIR, INTFLAGS. Их адреса находятся в области памяти ввода-вывода. После связывания физического порта с виртуальным обращение к регистру виртуального порта становится эквивалентным обращению к одноименному регистру физического порта. Иначе говоря, регистры OUT, IN, DIR, INTFLAGS физического порта отображаются на область памяти ввода—вывода. Всего в микроконтроллерах ATxmega предусмотрены четыре виртуальных порта VPORTO—VPORT3. Конфигурирование виртуальных портов, т. е. связывание их с физическими портами в BASCOM AVR, выполняется с помощью директивы Config VPort, например: config vportO=c В результате её исполнения физический порт С микроконтроллера будет связан с нулевым виртуальным портом. Рассмотренная директива позволяет сконфигурировать несколько виртуальных портов одновременно: config VPortO=c,VPortl=E,o VPort2=D,VPOTt3=F После выполнения директивы связывания вместо обращения к физическому порту можно обращаться к соответствующему виртуальному. Например, оператором присваивания ddr0=&b00000000 все линии порта С будут сконфигурированы на вход, а оператор a=pinO прочитает байт из порта С и присвоит его переменной А. Если приходится часто использовать программные конструкции if pinc.6=1 then ... Toggle portc.5 и им подобные, то целесообразно работать через виртуальный порт. В этом случае и размер скомпилированной программы, и время её исполнения уменьшатся. Из других нововведений отметим возможность вывода на линии порта сигналов системной синхронизации устройств ввода—вывода и событий. Имеется ряд изменений в альтернативных функциях линий портов, обеспечивающих ввод и вывод сигналов от других модулей микроконтроллера (АЦП, ЦАП и др.). Описания альтернативных функций приведены в разделах [1,2], посвященных принципам устройства и функционирования соответствующих модулей микроконтроллера. ЛИТЕРАТУРА 1. 8/16-bit Atmel XMEGA A3U Microcontroller. — URL: http://www.atmeLcom/images/ atmel-8386-8-and-16-bit-avr-microcontroller-atxmega64a3u-128a3u-192a3u-256a3u_ datasheet.pdf (31.12.14). 2. Xmega A Manual. — URL: http://www. atmel.com/lmages/doc8077.pdf (31.12.14). |
![]() |
Цитировать 0 |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Усовершенствование комбинированного прибора на базе микроконтроллера ATxmega | Admin | Микроконтроллеры | 0 | 06.06.2015 19:54 |
[03-2015] Инновационная технология плавного управления тормозными средствами | poster334 | xx3 | 1 | 17.05.2015 00:05 |
Разработка модулей ввода/вывода | Rafa | Дипломы, курсовые, лекции, рефераты по СЦБ | 2 | 04.04.2014 18:15 |
Принципы построения модулей ввода-вывода | disyak | Ищу/Предлагаю | 9 | 14.03.2012 22:47 |
Двунаправленная схема портов ввода/вывода | Alex507 | Дипломы, курсовые, лекции, рефераты по СЦБ | 0 | 16.03.2010 21:56 |
![]() |
Возможно вас заинтересует информация по следующим меткам (темам): |
, , |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|