Простые внешние устройства
Понятно, что напряжение практически никогда не соответствует в точности 0 или 5 В, поэтому в спецификациях портов ввода всегда указывают диапазон напряжений, которые считаются нулем (например, от 0 до 0.2 В) и единицей (например, от 4.5 до 5 В), для промежуточных же напряжений значение соответствующего бита не определено (а на практике определяется случайными факторами). Регистр порта ввода часто называют регистром-защелкой (latch register), потому что основная его функция – зафиксировать напряжения на входах в определенный момент времени и передать их центральному процессору в виде однозначно (пусть и негарантированно правильно) определенных значений.
Разработчики микросхем часто совмещают входы портов ввода и выходы портов вывода, создавая таким образом комбинированное устройство – порт ввода-вывода. Такое устройство должно быть существенно сложнее, чем простая комбинация порта ввода и порта вывода. Если порт вывода пытается установить на определенном выходе высокое напряжение, а другое Устройство пытается установить низкое, в соответствии с законом Ома это приведет к возникновению электрического тока. Внутреннее сопротивление типичного микроконтроллерного порта составляет около 200 Ом.
При разности напряжений в 5 В это соответствует упоминавшемуся выше предельно Допустимому току в 25 мА: таким образом, устройство с нулевым внутренним сопротивлением все-таки может выставить ноль, но попытка сделать это на нескольких линиях одновременно приведет к перегрузке схем питания контроллера. В любом случае, большие токи приводят к потерям энергии и разогреву схемы, поэтому без крайней необходимости их лучше избегать. Если мы хотим использовать одни и те же "ноги" микросхемы как для ввода, так и для вывода, мы должны иметь возможность контролируемого включения выходных каскадов порта вывода.
Отключаемые выходные каскады называются тристабильными, а третье, отключенное, состояние выхода – высокоимпедансным. Тристабильные выходы используются не только для реализации двунаправленных контактов микросхем, но и для подключения устройств к шине: устройство, перешел шее в третье состояние, освобождает шину и позволяет какому-то другому задатчику выставлять на ней свои данные. Для управления переводом выходов в высокоимпедансное состояние, порт ввода-вывода должен иметь еще один регистр, называемый регистром или маской направления данных (data direction register) (рис. 9.5).
Рис. 9.5. Принципиальная схема порта ввода-вывода
Единица в разряде этого регистра обычно соответствует переводу соответствующего вывода в третье состояние, дающее возможность использовать этот контакт для ввода. Таким образом, даже такое простое устройство, как порт ввода-вывода, имеет целых три регистра: два регистра данных (многие реализации портов размещают эти два регистра по одному адресу: при чтении обращение происходит к защелке порта ввода, а при записи – к регистру порта вывода) и один управляющий. Более сложные устройства обычно также имеют один или несколько регистров данных и один или несколько управляющих регистров. Устройства, передающие и принимающие большие объемы данных (контроллеры жестких дисков, сетевые интерфейсы, видеоадаптеры) часто вместо одного регистра данных снабжаются буфером памяти, отображенным на адреса памяти процессора.
Вместо управляющих регистров у некоторых сложных устройств есть командный регистр. Центральный процессор передает через этот регистр последовательность команд, а устройство их исполняет и, возможно, передает последовательность ответов.