|
А. Редчук
Frequently asked questions. Особенности использования ввода/вывода в семействе mcs51
Предлагаемый материал продолжает рубрику “Часто задаваемые вопросы”.
Александр Редчук (real@real.kiev.ua) отвечает на вопросы об особенностях использования ввода/вывода в МК семейства MCS51.
Вопрос: Какие существуют особенности использования I/O выводов в семействе mcs51?
Ответ: Семейство mcs51 имеет “квазидвунаправленные” выводы портов. Упрощённо вывод порта можно представить как выход с открытым стоком и, кроме порта P0, несильный pull-up. Для конфигурирования “ноги” на ввод в соответствующий бит порта просто выводится единичка, наружный сигнал её пересиливает. Но на самом деле схема выходного каскада гораздо сложнее, и её особенности необходимо учитывать, иначе это может привести к сбоям или даже неработоспособности системы.
Pull-up для портов P1-P3 на самом деле состоит из трёх частей (рис. 1). Самый слабый транзистор Q2 обеспечивает ток около 10–20 мкА (максимальное значение занормировано на уровне 50 мкА). Транзистор Q3 обеспечивает поддержание уровня “1”, но при снижении напряжения на входе до уровня 1,6–1,8 В (при питании 5 В) он выключается. Максимальный ток в этот момент составляет 0,65 мА, типовой — 0,3 мА. Характеристика вывода P2.0 первого попавшегося At89c51-24PI приведена на рис. 2 (кривая с разрывом). И, наконец, самый мощный транзистор Q1 (единицы мА) включается на 2 периода кварцевого генератора при переходе бита в регистре порта из “0” в “1”, обеспечивая хорошее нарастание сигнала.
Рис. 1. Pull-up для портов P1-P3
Схема управления транзисторами Q1 порта P2 несколько более сложная. При выборке команд из внешнего ПЗУ и при обращениях к внешней памяти с адресацией через DPTR транзисторы Q1 включены всё время выдачи адреса. Выходы порта P0 на самом деле также имеют транзисторы Q1, которые включаются при выводе младшего байта адреса и при выводе данных в командах записи во внешнюю память. Поэтому при работе порта P0 только в качестве шины данных внешние подтягивающие резисторы не нужны.
Сложная структура выходной ячейки обеспечивает и возможность выдать достаточно приличный (по меркам работы на ТТЛ-микросхемы) уровень логической “1”, и, в то же время, не потреблять лишний ток при подаче на вход “0”. Но:
- Если “нога” была притянута к “земле” внешним сигналом с открытым коллектором, то к питанию её поначалу будет тянуть маленький ток, нарастание будет очень медленным. Из-за этого, например, может плохо работать обмен по I2C. Притяните выводы к питанию резистором 3–15 кОм.
- Нелинейная характеристика выхода приводит к тому, что существует зона сопротивлений нагрузки, при которых выход может находиться в двух устойчивых
состояниях (рис. 2, прямая линия соответствует нагрузочному резистору 10 кОм):
- точка A — Q3 закрыт, ток маленький, напряжение — доли вольта;
- точка B — Q3 открыт, ток относительно большой, напряжение на выходе больше 2 В.
Рис. 2. Нелинейная характеристика выхода At89C51-24PI
Eсли “нога” работает через резистор на базу n-p-n-транзистора, а в базу подается достаточно большой ток, то выход находится вблизи точки переключения, и иногда даже наводка может дотянуть вывод до точки C и выключить транзистор Q3. После этого, тока транзистора Q2 может не хватать для того, чтобы вывести напряжение на нагружающем резисторе в зону включения Q3. Выход защёлкивается в точке B. При этом “контрольный” вывод “1” в бит порта просто не восстановит уровень “1”, так как не происходит перехода 0®1 в бите регистра порта, и транзистор Q1 не включается.
Для обеспечения достаточно большого тока базы:
- ставьте резистор с базы не на вывод порта, а на питание, и пусть порт коротит базу на “землю”. Недостаток — лишний потребляемый ток в состоянии “транзистор закрыт”;
- если это возможно, ставьте p-n-p-транзисторы и используйте ток “0”;
- ставьте составные транзисторы. Для нормальной работы падения напряжения на двух переходах достаточно даже при малом токе. Ключи микросхем ULN2003 (К1109КТ23) имеют также резисторы база-эмиттер, достаточно низкоомные для удержания выхода в “0”. Однако выходы порта при работе находятся достаточно далеко от точки C, и защёлкивания не происходит.
- Как уже указывалось, Q1 при работе портов включается на два периода тактовой частоты. В итоге, при значительной емкостной нагрузке (затвор полевого транзистора или шина из многих микросхем) на высоких тактовых частотах этот транзистор может не успевать вывести напряжение на выводе в зону включения Q3 и после выключения Q1. В зависимости от токовой нагрузки, напряжение на выходе будет либо медленно нарастать за счёт тока Q2, либо спадать до 0 В. В этом случае также рекомендуется внешний подтягивающий резистор 3–15 кОм.
Вопрос: Как можно расширить число линий ввода/вывода MCS51 минимальным числом внешних компонентов?
Ответ: Транзисторы Q1 в портах P2 и P0 включены в режиме внешней шины, и их нагрузочная способность достаточна для создания вполне приличных “КМОП-уровней” на нагрузке 1 кОм. В то же время, в “обычном” состоянии резистор 4,7 кОм на “землю” создаёт достаточно устойчивый “0” на входах процессоров серии mcs51.
Следствия:
- Даже если в вашей системе используются внешние ОЗУ/ПЗУ, но есть и внутреннее ПЗУ, то вы можете использовать линии портов P2 и P0 как входы, подключив входные сигналы через последовательные резисторы около 3 кОм и опрашивая их подпрограммой, находящейся во внутренней памяти кода. Для P0, не имеющего постоянно включенных pull-up, сопротивление последовательных резисторов можно увеличить (не забывая о времени установления — при слишком большом сопротивлении нельзя будет читать P0 в течении нескольких циклов процессора после обращения к внешнему ПЗУ).
- Если внешнего ПЗУ нет, то можно расширить порты микроконтроллера, не занимая выводов для стробирования регистра. Порт P2 используется как входы (через резисторы), напрямую же к нему подключены входы регистра ИР23, на строб регистра подаётся сигнал /PSEN.
Последовательность команд:
mov DPH, somedata
movc a, @a+DPTR
запишет в регистр значение “somedata”.
При отсутствии внешнего ОЗУ можно, заняв для стробирования вывод /WR микроконтроллера, произвести запись данных сразу в два регистра, подключив входы первого к P0, второго — к P2. Команды
mov DPH, reg2data
mov a, reg1data
movx @DPTR, a
занесут в регистры соответствующие значения. В остальное время P0 и P2 используются как входы.
Необходимое замечание по поводу нагрузочной способности портов P0, P2 в режиме внешней шины.
Intel для своих контроллеров специфицировал минимальное напряжение “1” в BUS MODE на уровне Vcc = 0,7 В при вытекающем токе 3,2 мA и Vcc = 1,5 В — при -7 мA. Dallas приводит значение Voh3 > 2,4 В при токе -8 мA.
Atmel вообще не указывает нагрузочной способности P2 в этом режиме и приводит для P0 значение Voh = 2,4 В при токе всего 0,8 мA. Но экспериментальные данные и для P0, и для P2 дают значение > 4,3 В при токе 4 мA и > 3,5 В — при 10 мA. Это очень близко к замерам для i80c31BH и i87c51FA, вполне соответствовало бы “типовым” значениям, в то время как INTEL приводит их как минимальные. И это слишком много (отличие больше, чем на порядок!) для “типового” при минимальных значениях от Atmel. Однако, уверенно и “честно” применять приведённый трюк можно только с портом P0, используя последовательные резисторы с сопротивлением более 10 кОм.
|