В данной статье рассказывается о портах ввода-вывода микроконтроллера Arduino. Всё написанное также верно и для клонов Arduino, например Freeduino.
Различные устройства и приборы подключаются к микроконтроллеру через порты ввода-вывода. Микроконтроллер, являющийся ядром Arduino - это 8-битный микроконтроллер, и поэтому его порты ввода-вывода также являются 8-битными. Это общий принцип, и хотя теоретически порт ввода-вывода 8-битного микроконтроллера может быть и 16-ти, и 32-х, и 64-битным, но практического смысла оснащать 8-битный микроконтроллер не-8-битным портом ввода-вывода нет, поскольку для чтения или записи данных в такой порт пришлось бы использовать несколько команд ассемблера, то есть операция обмена данными с таким портом производилась бы только за несколько тактов.
Порт ввода-вывода обычного назначения (GPIO - General Purpose Input/Output) представляет собой несколько выводов (пинов) микроконтроллера по числу бит, то есть в данном случае это 8 выводов. Если посмотреть на плату Arduino, то с одной стороны находятся две группы по 8 контактов, обозначенные как цифровые (Digital), а с другой стороны две группы по 6 контактов, одна из которых - это контакты напряжений питания и пин сброса (Reset), а вторая - это 6 контактов, обозначенных как входы для аналоговых сигналов (Analog In).
С точки зрения программы для микроконтроллера каждый порт - это несколько специальных регистров (переменных), производя чтение или запись данных в которые можно менять состояние или режим работы выводов микроконтроллера. Поскольку каждому выводу порта обычного назначения соответствует 1 бит, то напряжение на соответствующем выводе может меняться, принимая логическое значение либо высокий уровень (HIGH), либо низкий уровень (LOW).
Как правило высокому уровню напряжения соответствуют напряжение, равное или чуть меньше, чем напряжение питания микроконтроллера (для Arduino это +5 вольт), а низкому уровню соответствует либо уровень земли (0 вольт), либо небольшое напряжение (например, +0.2 или +0.6 вольт). Половина напряжения высокого уровня называется высоким нулём (Hi-Z).
Для логических микросхем существует ряд электрических стандартов напряжений, основанных на технологии, по которой данная микросхема выполнена. Например, TTL, CMOS и т.п. Если две микросхемы с одинаковым напряжением питания выполнены по разным технологиям (например, одна из их CMOS, а другая TTL), то они как правило логически совместимы между собой, если речь идёт только о сигналах 1 или 0. Но уровень сигнала Hi-Z у них может отличаться, что может потребовать их электрического согласования.
Например, уровень Hi-Z микросхемы, которая получает сигнал равен +2В, а уровень Hi-Z микросхемы, которая сигнал то принимает, то передаёт +2,4В). Таким образом вторая микросхема передаёт сигнал первой, и затем переводит порт в состояние ввода данных, то есть у неё на выводе уровень Hi-Z +2.4В. А первая читает порт, а там логическая единица.
Но на практике с подобными проблемами можно столкнуться, разве что пытаясь передать сигнал с выхода микросхемы с напряжением питания +3,3В на вход микросхемы с напряжением питания +5В. Если у второй уровень Hi-Z составляет 2В, то электрического согласования не потребуется, а если 2,4В, то потребуется поставить между этими выводами схему согласования уровней на полевом транзисторе.
Тем не менее, при подключении микросхем друг к другу это следует учитывать, поскольку мне приходилось сталкиваться например с тем, что микросхема питается от напряжения +5В, а логическая единица у неё +3,2В, и хотя она при этом работает, но нагревается во время работы градусов до 60 по Цельсию. То есть напряжение питания +5В, а порты ввода-вывода, хоть и совместимые с 5-вольтовой логикой, но трёхвольтовые, то есть для работы с такой микросхемой лучше использовать микроконтроллер с напряжением питания +3,3В (прим. Это так называемый электрический стандарт интерфейса PCI).
Микроконтроллер Arduino, кстати, вполне может работать на частоте 8МГц и с напряжением питания +3,3В, но в конструктиве Arduino такая возможность не предусмотрена, поэтому к Arduino лучше подключать микросхемы 5-вольтовой логики.
Всего микроконтроллер ATmega328p (как и ATmega168) в корпусе PDIP имеет три порта ввода-вывода. Они обозначены, как порты B, С и D:
Таким образом всего Arduino имеет 20 контактов ввода-вывода обычного назначения (GPIO).
Помимо портов GPIO к микроконтроллеру можно подключать устройства через специальные интерфейсы. Например, микроконтроллер Arduino оснащён следующими интерфейсами:
Analog In
.Analog In
. Позволяет Arduino измерять частоту и уровень аналогового сигнала.Таким образом, каждый пин Arduino может использоваться либо как вывод обычного назначения (GPIO), либо как один из выводов специального назначения. После нажатия на кнопку сброс либо сразу после включения, все специальные функции выводов отключены, а сами выводы находятся в состоянии Hi-Z, то есть при сбросе они становятся электрически и логически нейтральными. То есть для того, чтобы задействовать для того или иного вывода микроконтроллера его специальную функцию, его следует соответствующим образом программно инициализировать. Это делается записью нужных значений в соответствующие регистры.
Микроконтроллер ATmega2560 имеет отличное от микроконтроллера ATmega328P число пинов ввода-вывода и большее количество портов. Они обозначены как порты A, B, C, D, E, F, G, H, J, K и L:
Таким образом плата Arduino MEGA 2560 имеет 70 контактов ввода-вывода общего назначения (GPIO).
Автор: Андрей Шаройко <vanyamboe@gmail.com>