Меню Рубрики

Установка портов на ввод или вывод

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

Порт ввода-вывода – логическое объединение сигнальных линий, через которое принимаются и передаются данные.
Каждая линия порта, как правило, обозначается как Pnx, где

  • n – обозначение порта;
  • x – номер бита (линии) в порте.

Каждый порт ввода-вывода обслуживают как минимум 3 служебных регистра:

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

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

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

Для всех линий портов ввода-вывода, как правило, доступна программная конфигурация входных подтягивающих резисторов. Подтягивающие резисторы осуществляют доопределение потенциалов «брошенных» входов напряжением высокого (Pull-up) или низкого (Pull-down) уровня.

Для обращения к отдельным линиям порта используется маскирование битов.

Входные элементы управления

В качестве входных элементов управления могут использоваться

  • другие элементы схемы;
  • тумблеры;
  • джамперы;
  • множественные переключатели;
  • кнопки.

Тумблеры предназначены для коммутации цепей управления. Обрабатываемый сигнал с тумблера – потенциальный.

Различают 1-позиционные и 2-позиционные тумблеры:

1-позиционные

2-позиционные

Джамперы , как правило, используются для переключения режима работы, и их состояние проверяется только в момент включения питания микроконтроллера. Установка джампера замыкает 2 вывода, между которыми он установлен.

Множественные переключатели представляют собой набор 1-позиционных тумблеров в миниатюрном формате.

Кнопки предназначены для коммутации цепей управления. Обрабатываемый сигнал с кнопки – импульсный и фиксирует момент нажатия кнопки и момент ее отжатия.

Выходные элементы управления

В качестве выходных элементов управления могут использоваться

  • другие элементы схемы;
  • элементы индикации (единичные светодиоды или светодиодные сборки, в частности, — 7-сегментные индикаторы).

Единичные светодиоды

7-сегментные индикаторы

Различают 7-сегментные индикаторы с общим анодом и с общим катодом.

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

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

В таблице приведены коды для отображения цифр на 7-сегментном индикаторе

источник

Электроника для всех

Блог о электронике

AVR. Учебный курс. Устройство и работа портов ввода-вывода

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

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

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

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

Дальше идут ключи управления. Это я их нарисовал рубильниками, на самом деле там стоят полевые транзисторы, но особой сути это не меняет. А рубильники наглядней.
Каждый рубильник подчинен логическому условию которое я подписал на рисунке. Когда условие выполняется — ключ замыкается. PIN, PORT, DDR это регистры конфигурации порта.

Есть в каждом контроллере AVRPIC есть тоже подобные регистры, только звать их по другому).

Например, смотри в даташите на цоколевку микросхемы:

Видишь у каждой почти ножки есть обозначение Pxx. Например, PB4 где буква «B» означает имя порта, а цифра — номер бита в порту. За порт «B» отвечают три восьмиразрядных регистра PORTB, PINB, DDRB, а каждый бит в этом регистре отвечает за соответствующую ножку порта. За порт «А» таким же образом отвечают PORTA, DDRA, PINA.

Читайте также:  Установка или снятие флажка что это

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

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

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

  • DDRxy=0 — вывод работает как ВХОД.
  • DDRxy=1 вывод работает на ВЫХОД.

PORTx
Режим управления состоянием вывода. Когда мы настраиваем вывод на вход, то от PORT зависит тип входа (Hi-Z или PullUp, об этом чуть ниже).
Когда ножка настроена на выход, то значение соответствующего бита в регистре PORTx определяет состояние вывода. Если PORTxy=1 то на выводе лог1, если PORTxy=0 то на выводе лог0.
Когда ножка настроена на вход, то если PORTxy=0, то вывод в режиме Hi-Z. Если PORTxy=1 то вывод в режиме PullUp с подтяжкой резистором в 100к до питания.

Есть еще бит PUD (PullUp Disable) в регистре SFIOR он запрещает включение подтяжки сразу для всех портов. По дефолту он равен 0. Честно говоря, я даже не знаю нафиг он нужен — ни разу не доводилось его применять и даже не представляю себе ситуацию когда бы мне надо было запретить использование подтяжки сразу для всех портов. Ну да ладно, инженерам Atmel видней, просто знай что такой бит есть. Мало ли, вдруг будешь чужую прошивку ковырять и увидишь что у тебя подтяжка не работает, а вроде как должна. Тогда слазаешь и проверишь этот бит, вдруг автор прошивки заранее где то его сбросил.

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

  • Режим выхода
    Ну тут, думаю, все понятно — если нам надо выдать в порт 1 мы включаем порт на выход (DDRxy=1) и записываем в PORTxy единицу — при этом замыкается верхний ключ и на выводе появляется напряжение близкое к питанию. А если надо ноль, то в PORTxy записываем 0 и открывается уже нижний вентиль, что дает на выводе около нуля вольт.
  • Вход Hi-Z — режим высокоимпендансного входа.
    Этот режим включен по умолчанию. Все вентили разомкнуты, а сопротивление порта очень велико. В принципе, по сравнению с другими режимами, можно его считать бесконечностью. То есть электрически вывод как бы вообще никуда не подключен и ни на что не влияет. Но! При этом он постоянно считывает свое состояние в регистр PIN и мы всегда можем узнать что у нас на входе — единица или ноль. Этот режим хорош для прослушивания какой либо шины данных, т.к. он не оказывает на шину никакого влияния. А что будет если вход висит в воздухе? А в этом случае напряжение будет на нем скакать в зависимости от внешних наводок, электромагнитных помех и вообще от фазы луны и погоды на Марсе (идеальный способ нарубить случайных чисел!). Очень часто на порту в этом случае нестабильный синус 50Гц — наводка от сети 220В, а в регистре PIN будет меняться 0 и 1 с частотой около 50Гц
  • Вход PullUp — вход с подтяжкой.
    При DDRxy=0 и PORTxy=1 замыкается ключ подтяжки и к линии подключается резистор в 100кОм, что моментально приводит неподключенную никуда линию в состояние лог1. Цель подтяжки очевидна — недопустить хаотичного изменения состояния на входе под действием наводок. Но если на входе появится логический ноль (замыкание линии на землю кнопкой или другим микроконтроллером/микросхемой), то слабый 100кОмный резистор не сможет удерживать напряжение на линии на уровне лог1 и на входе будет нуль.
Читайте также:  Установка вариатора зажигания для гбо

Также почти каждая ножка имеет дополнительные функции. На распиновке они подписаны в скобках. Это могут быть выводы приемопередатчиков, разные последовательные интерфейсы, аналоговые входы, выходы ШИМ генераторов. Да чего там только нет. По умолчанию все эти функции отключены, а вывод управляется исключительно парой DDR и PORT, но если включить какую-либо дополнительную функцию, то тут уже управление может полностью или частично перейти под контроль периферийного устройства и тогда хоть запишись в DDR/PORT — ничего не изменится. До тех пор пока не выключишь периферию занимающую эти выводы.
Например, приемник USART. Стоит только выставить бит разрешения приема RXEN как вывод RxD, как бы он ни был настроен до этого, переходит в режим входа.

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

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

  • Самый безопасный для МК и схемы, ни на что не влияющий режим это Hi-Z.
  • Очевидно что этот режим и должен быть по дефолту.
  • Значения большинства портов I/O при включении питания/сбросе = 0х00, PORT и DDR не исключение.
  • Соответственно когда DDR=0 и PORT=0 это High-Z — самый безопасный режим, оптимальный при старте.
  • Hi-Z это вход, значит при DDR=0 нога настроена на вход. Запомнили.
  • Однако, если DDR=0 — вход, то что будет если PORT переключить в 1?
  • Очевидно, что будет другой режим входа. Какой? Pullup, другого не дано! Логично? Логично. Запомнили.
  • Раз дефолтный режим был входом и одновременно в регистрах нуль, то для того, чтобы настроить вывод на выход надо в DDR записать 1.
  • Ну, а состояние выхода уже соответствует регистру PORT — высокий это 1, низкий это 0.
  • Читаем же из регистра PIN.

Есть еще один способ, мнемонический:
1 похожа на стрелку. Стрелка выходящая из МК — выход. Значит DDR=1 это выход! 0 похож на гнездо, дырку — вход! Резистор подтяжки дает в висящем порту единичку, значит PORT в режиме Pullup должен быть в единичке!

Для детей в картинках и комиксах 🙂
Для большей ясности с режимами приведу образный пример:

Уровень напряжения на выводе словно планка, которая может двигаться вертикально вверх или вниз. В режиме Hi-Z мы можем на эту планку только смотреть, а двигать или как то на нее воздействовать мы не можем. Поэтому любая помеха может ее дрыгать как угодно, но зато если мы ее куда прицепим, то ее уровень будет зависеть только от другой цепи и ей мы не помешаем.

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

В режиме OUT у нас планка прибита гвоздями к земле или прижата домкратом к питанию. Внешняя сила может ее пересилить только сломав домкрат или сломается сама. Тупая внешняя сила просто разрушает наш домкрат или вырывает гвозди из пола с мясом. В любом случае — девайс в помойку.

183 thoughts on “AVR. Учебный курс. Устройство и работа портов ввода-вывода”

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

источник

AVR на C — просто? Часть 2

2. Первая программа или порты ввода-вывода.

2.1. Порты и выводы.

Чтобы общаться с внешним миром у микроконтроллера есть порты ввода-вывода, в каждом из которых есть несколько отдельных битов (считай выводов), на которых можно установить ноль (0) или единицу (1).

У ATmega328 таких портов 3 это порты B,C и D . На каждом порту по 8 битов ( за исключением порта C он 7 — разрядный ) которыми можно (нужно) управлять. Но управлять с некоторыми ограничениями.

Читайте также:  Установка зажигания на лодочном моторе меркури

D0 и D1 используются для прошивки микроконтроллерах на плате Arduino через USB;

C6 – используется для перезагрузки ( reset ) ;

B6 и B7 — на этих выводах микроконтроллера подключается внешний кварцевый резонатор .

Остальные биты можно использовать если они не задействованы. Для наших изысканий будем использовать:

порт B – B0, B1, B2, B3, B4, B5 ( соответственно выводы микроконтроллера с 1 4 по 1 9 );

порт C – С0, С1, С2, С3, С4, С5 (выводы — с 23 по 28);

порт D – D2, D3, D4, D5, D6, D7 (выводы — 4, 5, 6, 11, 12, 13).

Необходимо учитывать что ATmega328 производится в разных корпусах и нумерация выводов может отличатся

2.2. Регистры управления портами.

Управление портами достаточно простое. Используется три восьми битных регистра —

DDRx, PORTx и PINx, где x имя порта (в нашем случае B,C и D ).

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

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

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

Настройка и работа портов сводится к трем операциям в зависимости от настройки входа или выхода.

В регистре DDRx на нужный разряд устанавливаем 0 обозначая его как ввод;

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

Считываем из регистра PINx с того-же разряда состояние 0 или 1.

В регистре DDRx на нужный разряд устанавливаем 1 обозначая его как вывод;

В регистр PORTx на этот разряд устанавливаем его состояние 0 или 1;

В регистре PINx можно считать текущее состояние каждого разряда порта.

Пример: На выводе 5 порта B установить 1 ( вывод 17 микроконтроллера переключить на логическую 1 )

Установили разряд DDRB 5 в 1 настроив вывод как вывод

Установили разряд PORT B 5 переключив вывод микроконтроллера в 1. Дальнейшее переключение этого вывода производится без изменения регистра DDRx если не понадобится переключить разряд порта на ввод.

Регистр PIN B можно не использовать, если только для проверки состояния выводов порта.

Рекомендация: биты регистров желательно переключать по отдельности, чтобы не вносить путаницу в программу микроконтроллера, если нет необходимости использовать все выводы порта как ввод или вывод.

2.3. Программа

Разберем программу на C по строкам .

В программе вставлен бесконечный цикл while(1), чтобы микроконтроллер не выполнил ничего лишнего. Все действия с портами в программе выполнены с использованием поразрядных операций в языке C. Что дало возможность управлять только одним разрядом (одним выводом микроконтроллера) порта B.

На использованном нами выводе микроконтроллера ATmega328 в Arduino UNO и Arduino Nano v3 подключен светодиод, поэтому в первой программе не придется даже собирать схему, достаточно подключить Arduino к компьютеру.

2. 4. Проект на C и компиляция

Программное обеспечение готово, программа написана, микроконтроллер тоже есть в виде Arduino. Начнем.

Запускаем CodeBlocks, в меню File >> New >> Project начинаем создавать проект.

Выбираем AVR Project и Go.

В поле Project title указываем название проекта, ниже в Folder to create project in указываем путь к папке куда создаем проект и жмем Next.

В следующем окне оставляем галку только Create “Release” configuration и опять Next.

Выбираем наш микроконтроллер (у меня atmega328p ) устанавливаем частоту (для Arduino Nano v3 — 16МГц ) и оставляем создание только hex файла и Finish.

И наконец в созданном проекте находим файл main.c и открываем его. Внутри видим:

Заменяем эту заготовку нашей программой и жмем

Происходит компиляция проекта и внизу видим

2.5. Прошиваем микроконтроллер

Все прошивка готова, она находится в папке проекта (выбранной при создании проекта). У меня C:\avr\Program1\bin\Release\Program1.hex этот файл и является нашей прошивкой.

Начнем прошивать. Запустим программу ArduinoBuilder

В окне выбираем файл hex (находится в папке проекта CodeBlocks >> bin/Release/project1.hex) нашего проекта, выбираем Arduino и частоту микроконтроллера и жмем кнопку чем программировать (у меня COM9 ) обычно это com порт отличный от 1. После сего проделанного смотрим мигающий диод.

На этом задача минимум выполнена. Рассмотрен подборка программного обеспечения, изучены порты ввода/вывода и регистры их управления, написана программа на C скомпилирована и прошита в микроконтроллер. И все это можно применить для микроконтроллеров AVR за исключением программы ArduinoBuilder которая в основном создана под Arduino, но и ее можно заменить при использовании например программатора USBASP и программы AVRDUDE_PROG, основная часть материала полностью применима.

источник

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