Универсальный внешний накопитель для всех iOS-устройств, совместим с PC/Mac, Android
Header Banner
8 800 100 5771 | +7 495 540 4266
c 9:00 до 24:00 пн-пт | c 10:00 до 18:00 сб
0 Comments

Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 1 / Хабр

Работа портов ввода/вывода

Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.

  • Часть 1. Работа портов ввода/вывода
  • Часть 2. Подключение светодиода к линии порта ввода/вывода
  • Часть 3. Подключение транзистора к линии порта ввода/вывода
  • Часть 4. Подключение кнопки к линии порта ввода/вывода

Пример будем рассматривать на микроконтроллере ATMega8.

Программу писать будем в Atmel Studio 6.0.

Эмулировать схему будем в Proteus 7 Professional.

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

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

Pxn – имя ножки порта микроконтроллера, где x буква порта (A, B, C или D), n номер разряда порта (7… 0).
Cpin — паразитная емкость порта.
VCC — напряжение питания.
Rpu — отключаемый нагрузочный верхний резистор (pull-up).
PORTxn — бит n регистра PORTx.
PINxn — бит n регистра PINx.
DDRxn — бит n регистра DDRx.

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

Впрочем, диоды там хилые и защита эта помогает только от микроскопических импульсов и помех. Если же на ножку микроконтроллера подать вольт 6-7 при 5 вольтах питания, то внутренние диоды его не спасут.

Конденсатор (см.2) — это паразитная емкость вывода. Хоть она и крошечная, но присутствует. Обычно ее не учитывают, но она есть. Не забивай голову, просто знай это.

Дальше идут ключи управления (см.3,4). Каждый ключ подчинен логическому условию, которые нарисованы на рисунке. Когда условие выполняется — ключ замыкается.

Каждый порт микроконтроллера AVR (обычно имеют имена A, B и иногда C или даже D) имеет 8 разрядов, каждый из которых привязан к определенной ножке корпуса. Каждый порт имеет три специальных регистра DDRx, PORTx и PINx (где x соответствует букве порта A, B, C или D). Назначение регистров:

DDRx

– Настройка разрядов порта x на вход или выход.

PORTx – Управление состоянием выходов порта x (если соответствующий разряд настроен как выход), или подключением внутреннего pull-up резистора (если соответствующий разряд настроен как вход).

PINx –Чтение логических уровней разрядов порта x.

PINхn – это регистр чтения. Из него можно только читать. В регистре PINxn содержится информация о реальном текущем логическом уровне на выводах порта. Вне зависимости от настроек порта. Так что если хотим узнать что у нас на входе — читаем соответствующий бит регистра PINxn. Причем существует две границы: граница гарантированного нуля и граница гарантированной единицы — пороги за которыми мы можем однозначно четко определить текущий логический уровень. Для пятивольтового питания это 1.4 и 1.8 вольт соответственно. То есть при снижении напряжения от максимума до минимума бит в регистре

PINx переключится с 1 на 0 только при снижении напряжение ниже 1.4 вольт, а вот когда напряжение нарастает от минимума до максимума переключение бита с 0 на 1 будет только по достижении напряжения в 1.8 вольта. То есть возникает гистерезис переключения с 0 на 1, что исключает хаотичные переключения под действием помех и наводок, а также исключает ошибочное считывание логического уровня между порогами переключения.

При снижении напряжения питания разумеется эти пороги также снижаются.

DDRxn – это регистр направления порта. Порт в конкретный момент времени может быть либо входом либо выходом (но для состояния битов PINxn это значения не имеет. Читать из PINxn реальное значение можно всегда).

DDRxy = 0 – вывод работает как ВХОД.

DDRxy = 1 – вывод работает на ВЫХОД.

PORTxn – режим управления состоянием вывода. Когда мы настраиваем вывод на вход, то от

PORTх зависит тип входа (Hi-Z или PullUp, об этом чуть ниже).

Когда ножка настроена на выход, то значение соответствующего бита в регистре PORTx определяет состояние вывода. Если PORTxn=1 то на выводе лог.1, если PORTxn=0 то на выводе лог.0.

Когда ножка настроена на вход, то если PORTxn=0, то вывод в режиме Hi-Z. Если PORTxn=1 то вывод в режиме PullUpс подтяжкой резистором в 100к до питания.

Таблица. Конфигурация выводов портов.

DDRxn PORTxn I/O Comment
0 0 I (Input) Вход Высокоимпендансный вход. (Не рекомендую использовать, так как могут наводится наводки от питания)
0 1 I (Input) Вход Подтянуто внутренне сопротивление.
1 0 O (Output) Выход На выходе низкий уровень.
1 1 O (Output) Выход На выходе высокий уровень.

Общая картина работы порта показана на рисунках:

Рис. DDRxn=0 PORTxn=0 – Режим: HI-Z – высоко импендансный вход.

Рис. DDRxn=0 PORTxn=1 – Режим: PullUp – вход с подтяжкой до лог.1.

Рис. DDRxn=1 PORTxn=0 – Режим: Выход – на выходе лог.0. (почти GND)

Рис. DDRxn=1 PORTxn=1 – Режим: Выход – на выходе лог.1. (почти VCC)

Вход Hi-Z — режим высокоимпендансного входа.
Этот режим включен по умолчанию. Все ключи разомкнуты, а сопротивление порта очень велико. В принципе, по сравнению с другими режимами, можно его считать бесконечностью. То есть электрически вывод как бы вообще никуда не подключен и ни на что не влияет. Но! При этом он постоянно считывает свое состояние в регистр PINn и мы всегда можем узнать что у нас на входе — единица или ноль. Этот режим хорош для прослушивания какой либо шины данных, т.к. он не оказывает на шину никакого влияния. А что будет если вход висит в воздухе? А в этом случае напряжение будет на нем скакать в зависимости от внешних наводок, электромагнитных помех и вообще от фазы луны и погоды на Марсе (идеальный способ нарубить случайных чисел!). Очень часто на порту в этом случае нестабильный синус 50Гц — наводка от сети 220В, а в регистре

PINn будет меняться 0 и 1 с частотой около 50Гц

Вход PullUp — вход с подтяжкой.
При DDRxn=0 и PORTxn=1 замыкается ключ подтяжки и к линии подключается резистор в 100кОм, что моментально приводит не подключенную никуда линию в состояние лог.1. Цель подтяжки очевидна — не допустить хаотичного изменения состояния на входе под действием наводок. Но если на входе появится логический ноль (замыкание линии на землю кнопкой или другим микроконтроллером/микросхемой), то слабый 100кОмный резистор не сможет удерживать напряжение на линии на уровне лог.

1 и на входе будет лог.0.

Режим выхода.
Тут, думаю, все понятно — если нам надо выдать в порт лог.1, мы включаем порт на выход (DDRxn=1) и выдаем лог.1 (PORTxn=1) — при этом замыкается верхний ключ и на выводе появляется напряжение, близкое к питанию. А если надо лог.0, то включаем порт на выход (DDRxn=1) и выдаем лог.0 (PORTxn=1) — при этом открывается уже нижний вентиль, что дает на выводе около нуля вольт.

Порты ввода-вывода микроконтроллеров AVR. Электрические характеристики

   Для грамотного использования микроконтроллера необходимо иметь представление об электрических характеристиках его выводов. Эти характеристики определяют максимально допустимый втекающий/вытекающий ток и уровни входных/выходных напряжений. От них зависит что и как можно подключать к микроконтроллеру, и к чему это приведет. 
   Сегодняшний материал посвящен как раз этой теме. Данные, приведенные ниже, взяты из описания на микроконтроллер Atmega16 в разделах Electrical Characteristics и Typical Characteristics. Для более детального изучения этого вопроса, рекомендую обязательно их посмотреть. 

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

   Схема ограничивает величину входных напряжений в диапазоне от -Vd до Vcc+Vd В, где Vd – прямое падение напряжения на диоде (обычно принимается 0,7 В), Vcc – напряжение питания микроконтроллера. Это защищает цепи микроконтроллера от перенапряжений и пробоя статическим электричеством. Однако, эти защитные диоды довольно хиленькие и выдерживают ток в единицы миллиампер. 

   Несмотря на свою полезную функцию, схема может доставить ряд неприятностей. Если подать входные сигналы на выводы выключенного микроконтроллера, то они через защитный диод запитают микроконтроллер и все остальную схему. Это явление называют паразитным питаниям. Как при этом поведет себя микроконтроллер, сложно предсказать, поэтому такой режим нежелателен.
   По хорошему, нужно сначала подавать питание, а потом входные сигналы. При выключении же наоборот – снимать входные сигналы, затем отключать питание.
   Также на схеме ты можешь видеть подтягивающий резистор Rpu (pull up) и паразитную емкость Cp. Номинал подтягивающего резистора ~20 – 50 кОм, паразитная емкость имеет величину несколько пФ.
Выводы микроконтроллеров AVR могут работать или в режиме входа, или в режиме выхода. Рассмотрим эти режимы.

   Данный режим используется, когда микроконтроллер управляет или передает данные какому-нибудь внешнему устройству. Например, управляет светодиодом, сдвиговым регистром, внешним АЦП и т. д.
Подключая к микроконтроллеру внешние микросхемы, ты всегда должен проверять, согласуются ли уровни ее входных напряжений с выходными напряжениями микроконтроллера.
   Для этого в описании на микроконтроллер ATmega16 в разделе электрических характеристик приведены значения выходных напряжений логического нуля Vol (output low voltage) и единицы Voh (output high voltage). Обрати внимание, данные приведены для определенного напряжения питания и токов, даны минимальные и максимальные значения. Уровни напряжений для других условий можно оценить по графикам “I/O Pin Current vs Output Voltage”.

   
   В режиме выхода вывод микроконтроллера может быть или источником или потребителем тока (то есть ток или вытекает из него или втекает). Это зависит от того, какой логический уровень установлен на выводе – ноль или единица (то есть это зависит от содержимого регистра PORTх). Если на выводе логический ноль, то любое положительное напряжение, приложенное к выводу, вызовет втекающий ток. Если на выводе логическая единица, то любое внешнее напряжение, меньше напряжения питания микроконтроллера, вызовет вытекающий ток.
   Протекание тока сопровождается падением напряжения на внутренних цепях вывода микроконтроллера. Величину падения можно оценить по тем же графикам “I/O Pin Current vs Output Voltage”.

Зависимость выходного напряжения от втекающего тока.
Вывод микроконтроллера в режиме выхода, установлен логический ноль, напряжение питания 5В.

Зависимость выходного напряжения от вытекающего тока.
Вывод микроконтроллера в режиме выхода, установлена логическая единица, напряжение питания 5В.

   Как ты можешь видеть, графики приведены для диапазона токов от 0 до 70 мА (для температуры +25 С), но это вовсе не означает, что через каждый из выводов микроконтроллера AVR может протекать такой ток. Таблица Аbsolute Maximum Ratings в разделе электрических характеристик говорит нам о том, что максимальный ток через один вывод микроконтроллера AVR не должен превышать 40 мА, а ток через выводы VCC и GND не должен превышать 200 мА для PDIP и 400 мА для корпусов TQFP/MLF. 

   Это позволяет нам оценить, какую нагрузку микроконтроллер способен запитать своими силами. Например, мы можем подключить 8 ярких светодиодов при токе 20 мА и микроконтроллер не сгорит. При этом для расчета ограничительных резисторов нужно будет учитывать падение напряжения (~0. 5 В) на выходе микроконтроллера.

8 * 20 мА = 160 мА
+ 10 мА собственное потребление
итого 170 мА < 200 мА

Rd = (5 – 0.5 – Vd)/20 , где Vd прямое падение напряжения на светодиоде

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

Зависимость тока потребления от тактовой частоты и напряжения питания микроконтроллера в активном режиме. 

   Режим входа используется для приема или ввода данных в микроконтроллер. Например, для получения данных с цифрового датчика или определения состояния тактовой кнопки.
   В режиме входа вывод микроконтроллера может быть или в высокоимпедансном состоянии (Hi-Z) или подтянут к плюсу питания через встроенный резистор (20 – 50 кОм). Спалить вывод в режиме входа замыканием на землю или плюс питания нельзя, в отличии от режима выхода. Но можно спалить внутренние цепи вывода, подав чрезмерно большое напряжение. Конечно, если бросок напряжения на входе микроконтроллера будет кратковременным, защитные диоды предохранят его.
   Подключая к микроконтроллеру внешние микросхемы, с которых принимаются данные, нужно всегда проверять, согласуются ли выходные уровни микросхемы с входными уровнями микроконтроллера.
   В разделе типичных электрических характеристик приведены графики “Pin Thresholds And Hysteresis”, по которым можно оценить уровни входных напряжений в зависимости от напряжения питания микроконтроллера AVR.

Зависимость порогового напряжения от напряжения питания микроконтроллера. Любое напряжение выше графика, воспринимается микроконтроллером как логическая единица. 

   Как можно видеть из рисунка, при напряжении 5 В входное напряжение > 2 В будет восприниматься микроконтроллером как логическая единица.

   Аналогичный график представлен и для логического нуля.

Зависимость порогового напряжения от напряжения питания микроконтроллера. Любое напряжение ниже графика, воспринимается микроконтроллером как логический ноль. 

   При питании 5 В, входное напряжение меньше ~1.4, воспринимается микроконтроллером как логический ноль. 

   Думаю ты заметил, что между пороговыми уровнями логического нуля и единицы разница 2 – 1.4 = 0.6 В. Как микроконтроллер воспринимает напряжение попавшее в этот диапазон? Никак. Благодаря наличию гистерезиса, внутренняя логика вывода микроконтроллера не реагирует на эти значения. И только в случае превышения порогов, переключается в одно из состояний. Про гистерезис ты можешь немного почитать в статье “Компаратор на операционном усилителе”.

Зависимость гистерезиса от напряжения питания микроконтроллера

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

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

    Подводя итог выше сказанному, сформулирую несколько правил:

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

   Кстати, недавно я наступил на грабли, связанные с согласованием уровней. В одной из схем я применил 5-ти вольтовый сторожевой таймер и 3-х вольтовую ПЛИС. Выход таймера согласовал со входом ПЛИС, а про согласование входа сброса таймера с выходом ПЛИС забыл. Когда плата пришла с завода, я обнаружил, что уровня выходного напряжения ПЛИС не хватает для перезагрузки сторожевого таймера и тот постоянно ее сбрасывает. Из положения пришлось выходить, используя 5-ти вольтовую логическую микросхему на плате. У нее оставалось 2 незадействованных логических элемента и она “нормально воспринимала” логические уровни ПЛИС. Так что будьте аккуратнее, такой момент можно случайно проглядеть, особенно, если в схеме много микросхем.

цифровых входных/выходных портов на AVR

цифровых входных/выходных порта на AVR

8-разрядные микроконтроллеры

AVR® управляют приложениями через цифровые входы и выходы (I/O). Эти контакты могут контролировать любое напряжение, присутствующее как вход с высоким импедансом, и подавать или потреблять ток как цифровой выход высокого или низкого напряжения.

Эти контакты обычно организованы в группы по восемь и называются портами. AVR использует алфавит для обозначения этих портов, например: PortA, PortB и т. д. Контакты порта A обозначаются как PA0 – PA7.

Все порты AVR имеют настоящую функцию чтения-изменения-записи при использовании в качестве обычных цифровых портов ввода/вывода. Это означает, что направление одного вывода порта может быть изменено без непреднамеренного изменения направления любого другого. То же самое относится к изменению значения привода (если он сконфигурирован как выход) или включению/отключению подтягивающих резисторов (если он сконфигурирован как вход). Каждый выходной буфер имеет симметричные характеристики возбуждения с высокой пропускной способностью как приемника, так и истока.

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

Каждый порт состоит из трех регистров:

  • DDRx – Регистр направления данных
  • PORTx — регистр вывода контактов
  • PINx — Регистр ввода контактов

где x = имя порта (A, B, C или D)

Эти регистры определяют настройку цифровых входов и выходов. Выводы ввода-вывода также могут использоваться совместно с внутренними периферийными устройствами. Например, аналого-цифровой преобразователь (АЦП) может быть подключен к контакту ввода-вывода вместо цифрового контакта. В этом случае регистры вывода ввода-вывода настраивают его как высокоимпедансный вход с тремя состояниями.

  • Биты DDxn доступны по адресу ввода/вывода DDRx
  • Биты PORTxn по адресу ввода/вывода PORTx
  • битов PINxn по адресу ввода/вывода PINx

Где n = номер бита вывода в регистре порта

DDxn

Биты DDxn в регистре DDRx выбирают направление этого вывода. Если DDxn записывается в ‘1’, Pxn настраивается как выходной контакт. Если DDxn записывается в «0», Pxn настраивается как входной контакт.

PORTxn

Биты PORTxn в регистре PORTx выполняют две функции. Они могут управлять выходным состоянием вывода и настройкой входного вывода.

В качестве вывода:
Если в бит записывается ‘1’, когда контакт сконфигурирован как выходной, на контакт порта устанавливается высокий уровень. Если в бит записывается «0», когда контакт сконфигурирован как выходной, на выводе порта устанавливается низкий уровень.

В качестве входа:
Если в бите записана «1», когда вывод сконфигурирован как входной, активируется подтягивающий резистор. Если в бит записывается «0», когда вывод сконфигурирован как входной, вывод порта имеет три состояния.

PINxn

Биты PINxn в регистре PINx используются для чтения данных с вывода порта. Когда контакт сконфигурирован как цифровой вход (в регистре DDRx) и включена подтяжка (в регистре PORTx), бит будет указывать состояние сигнала на контакте (высокий или низкий).
Примечание: Если порт сделан выходным, то чтение регистра PINx даст вам данные, которые были записаны на контакты порта.

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

Все выводы PORTA, установленные как входы с включенной подтяжкой и последующим чтением данных из PORTA:

 DDRA = 0x00; // сделать PORTA все входы
ПОРТ = 0xFF; //включаем все подтягивания
данные = ПИНА; //считываем контакты PORTA в переменные данные
 

PORTB настроен на входы с тремя состояниями:

 DDRB = 0x00; // сделать PORTB все входы
ПОРТБ = 0x00; // отключаем подтягивания и переводим все контакты в три состояния
 

Младший полубайт PORTA установлен как выходы, старший полубайт как входы с включенными подтяжками:

 DDRA = 0x0F; //вывод нижних выводов, ввод верхних выводов
ПОРТ = 0xF0; //выходные контакты установлены на 0, входные контакты включают подтягивания
 

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

Проект цифрового ввода-вывода на AVR Xplained 328PB

Пример проекта, упомянутого в видео

[| Пример ввода-вывода со ссылкой на видео]]

Переключение между входом и выходом

При переключении между тройным состоянием ({DDxn, PORTxn} = 0b00) и высоким выходом ({DDxn, PORTxn} = 0b11) , должно иметь место промежуточное состояние либо с включенным подтягиванием {DDxn, PORTxn} = 0b01) , либо с низким выходным сигналом ({DDxn, PORTxn} = 0b10) .

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

Переключение между входом с подтягиванием и низким выходом вызывает ту же проблему. Вы должны использовать либо три состояния
({DDxn, PORTxn} = 0b00) , либо выходное высокое состояние ({DDxn, PORTxn} = 0b11) в качестве промежуточного шага.

Блокировка отключения подтягивания

Бит отключения подтягивания PUD в регистре MCUCR может переопределить настройки подтягивания DDRx и PORTx .

Когда этот бит записывается в единицу, подтягивания в портах ввода-вывода отключаются, даже если регистры DDxn и PORTxn сконфигурированы для включения подтягиваний ({DDxn, PORTxn} = 0b01 ) .

Переключение контакта ввода/вывода

Запись ‘1’ в PINxn переключает значение PORTxn независимо от значения DDRxn. Инструкцию по сборке SBI можно использовать для переключения одного бита в порту.

Неподключенные контакты

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

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

  Вернуться к началу

Выход порта AVR на C

Серия микроконтроллеров AVR ссылается на свои порты ввода-вывода как PORTA, PORTB, PORTC, PORTD и так далее.

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

Как настроить контакты порта AVR

Например, вы можете настроить первые 4 бита PORTA для использования в качестве входов, а старшие 4 бита PORTA для использования в качестве выходов. Регистры направления данных В микроконтроллерах серии AVR, прежде чем вы сможете использовать порт для ввода или вывода, вы должны убедиться, что порт сконфигурирован либо как вход, либо как выход. Это делается с помощью регистров направления данных или ГДР . Для каждого из портов на вашем чипе имеется DDR, например: DDRA , DDRB , DDRC , DDRD и так далее.

Каждый регистр DDRx имеет ширину 8 бит. Записав 1 в любой бит регистра DDRx, вы настраиваете соответствующий контакт на PORTx как выход.

DDRx: 1 = ПИН-код НАСТРОЕН КАК ВЫХОД

Аналогичным образом, если вы записываете 0 на контакт в регистре DDRx, вы указываете, что этот контакт должен быть настроен как вход. Мы рассмотрим ввод порта в нашем руководстве по вводу порта AVR.

Чтобы установить все биты PORTA в качестве вывода, вам нужно записать все 1 в DDRA. Следующие 2 команды идентичны и настроят все контакты PORTA как выходы.

 ДДРА = 0xFF;
ДДРА = 255; 

Обе линии записывают двоичный код 11111111 в DDRA, поэтому каждый вывод PORTA будет в режиме вывода.

Вы можете использовать любую строку в своей программе. Выход порта Чтобы фактически отправить данные через порт, вы просто назначаете значение, которое вы хотите отправить через порт, в предопределенное место PORTx (замените x на правильный порт). Таким образом, чтобы отправить данные из PORTA, после того как вы инициализировали их для всех выходов, будут работать следующие строки:

 ПОРТ = 0xAA;
ПОРТ = 170; 

Обе строки записывают двоичный шаблон 10101010 в PORTA. Если у вас есть светодиоды, подключенные к контактам порта, связанным с PORTA, вы увидите, что все остальные светодиоды загораются.

Когда вы записываете 1 на вывод порта, вы указываете этому контакту порта перейти на HIGH . Аналогичным образом, когда вы записываете 0 на вывод порта, вы сообщаете этому контакту порта значение 9.0016 НИЗКИЙ .

PORTx: 1 = ВЫХОДНОЙ КОНТАКТ, УПРАВЛЯЕМЫЙ ВЫСОКИМ

Код образца

Вот полный пример вышеуказанных концепций, готовый для вставки в ваш AVRStudio и компиляции.

 // **************************************************** ************************************
// Включает
// ******************************************************* **********************************
#include 
#include 
// ******************************************************* **********************************
// Основной
// ******************************************************* **********************************
интервал основной (пустой)
{
    // настроить PORTA как выход
    ДДРА = 0xFF;
    // основной цикл
    пока (правда)
    {
        // включаем каждый второй бит на PORTA, шаблон 10101010
        ПОРТ = 0xAA;
    }
} 

Вы можете скачать полный исходный код здесь.

Вперед, компилируйте

Вы должны иметь возможность скопировать и вставить этот код прямо в AVRStudio и нажать кнопку Build Active Configuration (она выглядит как белая корзина с двумя синими стрелками вниз, или нажмите F7). Для меня этот код компилируется в 160 байт.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *