Однако точно так же называются и внешние порты ввода/вывода, для обмена с «окружающей средой» (управляются они, естественно, внутренними портами ввода/вывода). На схеме рис. 11.2 они показаны в количестве трех (А, В и С). В разных МП их может быть и больше, и меньше. Еще важнее число выводов этих портов, которое чаще всего совпадает с разрядностью процессора (но не всегда, как это было у 8086, который имел внутреннюю 16-разрядную структуру, а внешне выглядел 8-разрядным). Если мы заставим 8-разрядные порты «общаться», например, с внешней памятью, то на двух из них можно выставить 16-разрядный адрес, а на оставшемся— принимать данные. А как быть, если портов два или вообще один? (К примеру, в микроконтроллере Atmel AVR 2313 портов формально два, но один усеченный, так что общее число линий составляет 15.) Для этого все внешние порты в МП всегда двунаправленные. Скажем, если портов два, то можно сначала выставить адрес, а затем переключить их на вход и принимать данные. Естественно, для этого порты должны позволять работу на общую шину, т. е. либо иметь третье состояние, либо выход с общим коллектором для объединения в «монтажное ИЛИ».
Варианты для обоих случаев организации выходной линии порта показаны на рис. 11.3, где приведены упрощенные схемы выходных линий микроконтроллеров семейства 8048 — широко когда-то использовавшегося предшественника популярного МК 8051 (например, 8048 был выбран в качестве контроллера клавиатуры в IBM PC). В самом 8051 построение портов несколько сложнее (в частности, вместо резистора там полевой транзистор), но для уяснения принципов работы это несущественно.
По первому варианту (рис. 11.3, а
) в МК 8048 построены порты 1, 2 (всего там три порта). Когда в порт производится запись, то логический уровень поступает с прямого выхода защелки на статическом D-триггере на вход схемы «И», а с инверсного — на затвор транзистора VT2. Если этот уровень равен логическому нулю, то транзистор VT1 заперт, a VT2 открыт, на выходе также логический нуль. Если уровень равен логической единице, то на время действия импульса «Запись» транзистор VT1 открывается, а транзистор VT2 запирается (они одинаковой полярности). Если на выходе присутствует емкость (а она всегда имеется в виде распределенной емкости проводников и емкости входов других компонентов), то через VT1 протекает достаточно большой ток заряда этой емкости, позволяющий сформировать хороший фронт перехода из «0» в «1». Как только импульс «Запись» заканчивается, оба транзистора отключаются, и логическая единица на выходе поддерживается резистором R1. Выходное сопротивление открытого транзистора VT1 примерно 5 кОм, а резистора — 50 кОм. Любое другое устройство, подключенное к этой шине, при работе на выход может лишь либо поддержать логическую единицу, включив свой подобный резистор параллельно R1, либо занять линию своим логическим нулем — это, как видите, и есть схема «монтажное ИЛИ». При работе на вход состояние линии просто считывается со входного буфера (элемент «В» на рис. 11.3, а).
Рис. 11.3.
Упрощенные схемы портов ввода/вывода МК 8048:а
— портов 1 и 2; б — порта 0
Второй же вариант, по которому устроен портО (рис. 11.3, б
), — это обычный выходной каскад КМОП с третьим состоянием, т. е. такой порт может работать на выход, только полностью занимая линию, остальные подключенные к линии устройства при этом должны «смиренно внимать» монополисту, воспринимая сигналы. Это обычно не создает особых трудностей и схемотехнически даже предпочтительно (ввиду симметрии выходных сигналов и высокого сопротивления для входных). Единственная сложность возникает при сопряжении такого порта с линией, работающей по первому варианту, т. к. при логической единице на выходе могут возникнуть электрические конфликты, если кто-то попытается выдать в линию логический нуль. Для обеспечения работы трехстабильного порта по схеме «монтажное ИЛИ» (в том числе для их параллельной работы) применяют хитрый прием: всю линию «подтягивают» к напряжению питания с помощью внешнего резистора (во многих МК существует встроенный отключаемый резистор, установленный аналогично R1 в схеме рис. 11.3, а), и нормальное состояние всех участвующих трехстабильных портов — работа на вход в третьем состоянии, тогда на линии всегда будет логическая единица. На выход же линию переключают только когда надо выдать логический нуль, в этом случае, даже при одновременной активности нескольких портов, конфликтов не возникнет.
Лечение амнезии