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

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

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



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

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

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

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

image

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

image

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) Выход На выходе высокий уровень.

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

image

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

image

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

image

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

image

Рис. 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) — при этом открывается уже нижний вентиль, что дает на выводе около нуля вольт.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 31
  • +2
    Еще одна фишка есть в новых атмеловских контроллерах: если порт настроен как выход (DDRxn = 1), то запись единицы в разряд PINxn инвертирует соответствующий бит PORTxn и переключает ногу (0→1, 1→0).
    • +1
      Да, например на ATMega48/88/168. Очень удобная штука, кстати.
      Я бы сказал, что классическая ATMega8 уже сильно устарела, но для обучения сгодится.
    • +10
      Ой как нехорошо получается. easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-rabota-portov-vvoda-vyvoda.html И зовем сюда автора изначального текста dihalt
      • +9
        Чета ржу :)
        • 0
          О, тогда я прямо вам и задам вопрос. Точнее, предложу подправить исходный текст.
          «Впрочем, диоды там хилые и защита эта помогает только от микроскопических импульсов от помех. Если же ты по ошибке вкачаешь в ножку микроконтроллера вольт 6-7 при 5 вольтах питания, то никакой диод его не спасет».
          Диоды там достаточного размера, только это защита не от дурака, повесившего на вход то, что туда вешать нельзя, а от электростатического разряда, возникающего, например, когда дурак хватается за ножки контроллера руками — там быстро, зато может быть пара килоВольт в пике. И с этой функцией защитные диоды справляются обычно хорошо, а вот стравить постоянное перенапряжение больше 0.7 В никакой диод по физике своей не способен.
          • +1
            Ну 0.7 обычно редко является критичным перенапряжением для всей схемы МК. Те же AVR вполне переживают 6 вольт и даже на них работают приличное время. Без гарантий естественно.

            (А STM32 не дохнут от 5 вольт, но работать перестают). А ток этих диодов реально какой то мизерный. Не помню сколько, что то около 1-2мА. Так что и от небольших перенапряжений по входу спасает.
            • 0
              Это забивание гвоздей микроскопом, прямо скажем.
              • +2
                Это экспериментальная практика. У меня за годы работы с МК что они только и не терпели. Особенно у такого «внимательного» как я. Вкорячить другую полярность? Забацать другой источник? Запаять не тот номинал? Это все ко мне.
            • +2
              А почему, простите, тот, кто хватает процессор за ножки — дурак?
              Его левитацией, что-ли перемещать из магазина в панельку на плате?
              • +2
                Избаловали нас современными детальками. Раньше только пинцетом и в антистатическом браслете :)
                • –1
                  Не знаю уж как Вы, а я МП-25 без пинцета паял…
                  • +1
                    МП-25 обычный биполярник, ему саттика не страшна. А пот полевики его времён и некоторые микросхемы очень даже боялись.
                    • 0
                      А продавщицам радиотоваров обычно пофигу: Хвать рукой горсть КП103Ж. И все, собственно, транзисторам приходит эта самая Ж.
                • 0
                  Потому что при электростатическом разряде от человеческого тела напряжение может быть несколько киловольт, а пробивное напряжение подзатворного оксида входных полевых транзисторов — это единицы вольт, в лучшем случае — полтора десятка.
                  И если диод не успеет быстро стравить лишний заряд, то вход пробьется, и все.
                  В современных микросхемах обычно хорошая ESD защита, но злоупотреблять ей все равно не стоит, особенно если речь идёт о дорогих микросхемах, или о специализированных, где нормальную защиту по каким-то причинам поставить нельзя.
          • 0
            Ох, еще одна статья про светодиод на AVR…
            • +8
              Не, я привык что мои статьи передирают и рерайтят все кому ни лень, но чтобы на хабр. Это что то новенькое :)
              • +5
                Без упячко-мэн-а это не то :)
                Но зато тут картинки цветные, не то что у тебя :D
              • 0
                А подскажите, пожалуйста, в PIC'ах устройство портов аналогичное?

                В том смысле, что если в PIC установлен, скажем TRIS = 1, то:
                PORT = 0 переведёт порт в режим Hi-Z, а
                PORT = 1 подтянет вход к питанию через резистор?
                • 0
                  ХЗ, я не работал с пиками серьезно. Так что не скажу. Но по идее никто ничего нового тут не придумал. Смотрите даташит.
                  • 0

                    А ты у себя картинки обнови, эвон как старался)

                  • +1
                    Мне особенно понравилось оригинальное решение в виде красных волнистых линий под надписями. Он это в PowerPoint что ли рисовал?..
                    • +3
                      Да, тут все не слава богу, одна «Робота» чего стоит — глазам больно…
                      Хорошо, хотя бы, что ссылка на оригинальную статью уже во-втором комментарии.
                      Спасибо, DIHALT, за науку и за картинки ржачные! :)
                • 0
                  А что будет если вход висит в воздухе? А в этом случае напряжение будет на нем скакать в зависимости от внешних наводок, электромагнитных помех и вообще от фазы луны и погоды на Марсе (идеальный способ нарубить случайных чисел!). Очень часто на порту в этом случае нестабильный синус 50Гц — наводка от сети 220В, а в регистре PINn будет меняться 0 и 1 с частотой около 50Гц


                  Если это и правда так (1 и 0 чередуются с частотой 50гц), то качество такого генератора случайных чисел крайне низкое. Пожалуйста, не пишите что это «идеальный способ нарубить случайных чисел». Вдруг кому-то придет в голову использовать это свойство для генерации паролей или еще чего-нибудь.
                  • +1
                    Не все же оттуда брать. Несколько байт, для затравки, потом еще через что нибудь пропустить. Ну и чередование там не строго 50 герц, наводок же много, они пересекаются и смешиваются. Ничего другого более случайного вы в контроллере все равно не найдете.
                    • +1
                      Ничего другого более случайного вы в контроллере все равно не найдете

                      Шум АЦП
                      • +1
                        Там та же шняга так то.
                        • 0
                          В старших битах, а в младших будет нормальный такой шум, с 50Гц не коррелирующий.
                          Правда на практике при слабых наводках его входная ёмкость может зарядиться (не знаю из-за чего, может утечки какие), и он уплывёт в единицу.
                          • +1
                            Старый стабилитрон (Д814, к примеру) дает 5 мВ добротного шума.
                            • 0
                              … и занимает места как две ATmegа'и :)
                              Если уж на то пошло, есть современные аппаратные генераторы случайных чисел. Но мы говорим о голом контроллере.
                          • 0
                            Кроме наводок 50Гц там еще есть шум от работы внутренних узлов контроллера. Но этот шум в широком смысле обладает слишком большой корреляцией чтобы считаться случайным. Вот шум pn-перехода германиевого транзистора при стабильной температуре и напряжении питания в принципе еще можно считать более-менее случайным. Но собрать такой узел чтобы на него не действовали посторонние наводки задача не такая простая как может показаться с первого взгляда.
                    • –1
                      Спасибо всем за ваши комментарии!!!
                      • 0
                        Содержание статьи, в видеоформате:

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