Продолжение. Начало в№ в'2006
Современные программные
Алексей КУЗЬМИНОВ, к. т. н.
compmicrosys@mail.ru
средства связи
микроконтроллера с компьютером по интерфейсу RS-232
2. Использование нового алгоритма обмена информацией по RS-232 между компьютером и микроконтроллером
2.1. Суть нового алгоритма обмена
Новый алгоритм обмена по интерфейсу RS-232, разработанный автором и опубликованный в работах [2] и [3], заключается в аппаратной синхронизации каждого передаваемого/принимаемого байта линиями данных (TxD и RxD) этого же интерфейса. В этом его существенное отличие от стандартной аппаратной синхронизации линиями квитирования (DTR-DSR или RTS-CTS). Кроме того, от существующей программной синхронизации линиями данных (TxD и RxD), которую принято называть Xon-Xoff, новый алгоритм отличается именно «аппаратностью», то есть синхронизация осуществляется не посылкой информационного байта (например, Xoff) по линиям данных, а изменением их состояния, как это устроено в аппаратной синхронизации линиями квитирования.
Такая аппаратная синхронизация с одной стороны экономит линии, по которым осуществляется обмен данными, а с другой — позволяет использовать выходные линии квитирования компьютера (DTR и RTS) для управления режимами работы микроконтроллера (штатный режим/режим внутрисистемного (ISP) программирования). При этом линия DTR управляет сбросом (вывод RESET микроконтроллера), а линия RTS — переводом его из штатного режима работы в режим программирования. В большинстве случаев (для микроконтроллеров семейств MSC12XX, ADUC8XX, AT89C51ED2/RD2) линия RTS управляет сигналом, подаваемым на вывод PSEN.
Суть аппаратной синхронизации линиями данных заключается в следующем. Предположим, что передается некоторый поток данных от компьютера к микроконтроллеру (например, пакет размером 1000 байт). В обмене в этом случае участвует только одна линия интерфейса. Это линия TxD компьютера, которая соединена с линией RxD микроконтроллера. Вторая линия — линия TxD микроконтроллера, соединенная с ли-
нией RxD компьютера, в это время не используется (простаивает). В связи со сказанным, основная идея нового алгоритма заключается как раз в том, что «простаивающую» линию можно использовать для аппаратной синхронизации обмена байтами между компьютером и микроконтроллером. Что означает фраза «аппаратная синхронизация»? Она означает, что синхронизация осуществляется не посылкой информационного байта по простаивающей линии (например, Xoff, как это организовано в программной синхронизации), а изменением состояния линии TxD микроконтроллера с «логической 1» на «логический 0» и обратно, как это происходит при аппаратной синхронизации какой-либо линией квитирования (например, линией DTR).
В начале передачи каждого байта компьютер запрашивает у микроконтроллера разрешение на передачу. Для этого он анализирует свою линию данных RxD. Если линия находится в состоянии запрета на передачу (например, на ней установлена «логическая 1»), компьютер не передает байт, а продолжает опрашивать эту линию, пока не получит разрешения (например, пока уровень на линии не будет соответствовать «логическому 0»). Получив разрешение, компьютер передает только один байт, ожидает конца передачи этого байта (то есть ждет, пока не выведется последний бит передаваемого байта) и опять переходит в режим опроса линии для получения разрешения на передачу следующего байта.
Микроконтроллер, принимающий поток байт, выполняет следующие действия. Во-первых, именно он является инициатором начала обмена, поскольку именно он первым дает разрешение компьютеру на передачу очередного (первого) байта. Вспомним, что в начале передачи компьютер ждет разрешения на передачу, то есть находится в режиме ожидания. Переключив свою линию TxD из запрещающего состояния в разрешающее (то есть дав компьютеру разрешение на передачу байта), микроконтроллер ожидает передачи байта от компьютера. В чем суть ожидания передачи байта от компьютера? В том, что в начале поступления байта в микроконтроллер его линия RxD изменяет свое состо-
яние, поскольку передача байта начинается со старт-бита. Поэтому линия ИхБ микроконтроллера и изменяет свое состояние с «логической 1» на «логический 0». В этот момент с одной стороны старт-бит инициирует иЛИТ микроконтроллера на прием байта (и этот прием уже происходит без участия процессора микроконтроллера), с другой, микроконтроллер, определив, что передача началась, должен сбросить разрешение (то есть установить запрещающий потенциал на своей линии ТхБ).
Момент времени сброса разрешения компьютеру на передачу следующего байта очень важен. Другими словами, требуется определить, когда именно микроконтроллер должен сбросить это разрешение (то есть установить запрет на передачу). С одной стороны, ответ на этот вопрос напрашивается сам собой: именно тогда, когда микроконтроллер определит начало поступления байта (то есть в момент времени начала старт-бита). Но здесь кроется одна «ловушка». Дело в том, что многие современные микроконтроллеры имеют быстродействие намного выше, чем предыдущие поколения. Многие производители предлагают микроконтроллеры с такой архитектурой, в которой большинство команд выполняются не за 12 тактов, как это было ранее. Многие из них выполняют команду процессора всего за один такт (например, микроконтроллеры ЛБиС8ХХ, С8051ЕХХХ), некоторые — за два такта (например, Р89ЬРС9ХХ), некоторые — за 4 такта (М8С12ХХ), другие — за 6 тактов (например, ЛТ89С51Е02/К02). Кроме того, быстродействие современных компьютеров также растет весьма быстро. Поэтому сбрасывать разрешение сразу после начала старт-бита нельзя, поскольку время от начала разрешения передачи и началом старт-бита последующего за этим разрешением передачи байта может составлять от нескольких микросекунд до долей микросекунд (в зависимости от скорости микроконтроллера). Такой короткий импульс разрешения просто не пройдет через преобразователи уровней интерфейса И8-232 (например, ЛБМ3202, МЛХ1406, ЛБМ231). В результате обмен может сорваться.
С другой стороны, ждать, пока байт полностью не поступит в микроконтроллер, и уже после этого сбрасывать разрешение тоже нельзя, поскольку компьютер после окончательного вывода байта сразу же приступает к анализу линии, по которой передается разрешение на передачу следующего байта. Поскольку микроконтроллер все-таки более медленное устройство, чем компьютер, он может не успеть среагировать и сбросить это разрешение немного позже момента начала анализа компьютером линии разрешения. В результате, проанализировав линию разрешения и определив, что она находится в состоянии разрешения передачи, компьютер передаст следующий байт, который микроконтроллер пропустит, что приведет к срыву обмена данными.
В связи со сказанным, с точки зрения автора, идеальным моментом времени сброса разрешения является момент времени, соответствующий передаче половины байта (то есть середина байта). В этом случае потенциалы разрешения и запрета будут чередоваться, и форма сигнала на линии разрешения (на линии ТхЭ микроконтроллера) будет представлять собой что-то похожее на прямоугольный меандр. Причем длительность импульса такого меандра будет приблизительно равна половине длительности передачи одного байта. Такой длинный импульс, с одной стороны, свободно пройдет через преобразователь уровней интерфейса. С другой стороны, сброс разрешения в середине передаваемого байта никак не повлияет на передачу следующего байта компьютером, поскольку в это время он анализирует не линию разрешения, а бит, ответственный за конец вывода последнего бита передаваемого байта. И этим анализом компьютер будет заниматься до окончания вывода байта, прежде чем приступить к анализу линии разрешения. А линия разрешения к этому моменту будет уже давно сброшена, что и требуется.
Подсчитаем длительность времени от момента старт-бита до середины байта при скорости 115 200 бод. Очевидно, что при частоте 115 200 Гц длительность передачи одного бита будет равна: 1/115 200 = 0,00000868 с или около 8,7 мкс.
Передача всех 10 бит (1 старт-бит + 8 бит данных + 1 стоп-бит) будет занимать около 87 мкс. Половина этого времени составляет около 43 мкс. Если сделать некоторый запас по реакции микроконтроллера (5-15 мкс), то после обнаружения старт-бита необходимо сделать задержку в 25-30 мкс и затем сбросить разрешение. О том, как осуществить столь короткую и машинно-независимую задержку в компьютере, уже обсуждалось ранее. В микроконтроллере организовать подобную временную задержку достаточно просто, поскольку программисту всегда известна частота тактового генератора микроконтроллера.
На рис. 1 показана временная диаграмма передачи байта, составленная на основе приведенных выше рассуждений.
Подведем итоги (рис. 1). Итак, передатчик ожидает разрешения на передачу байта. На временной диаграмме это время от 0 до получения такого разрешения (до перехода ИхВ с высокого уровня в низкий). Далее приемник посылает разрешение на передачу байта по линии ИхЭ передатчика, устанавливая ее в нулевой уровень. На верхнем графике этот факт отражен тем, что уровень ИхЭ переключается с единичного в нулевое состояние. Получив разрешение на передачу байта, передатчик начинает передавать байт, но не мгновенно, а спустя некоторое время реакции на это разрешение; это время реакции на разрешение передачи обозначено Трр. Далее приемник ждет начало старт-бита, то есть переключения линии ТхЭ приемника с уровня «логической 1» на «логический 0». После определения факта начала передачи по старт-биту, приемник спустя некоторое время реакции, обозначенное Трн (время реакции на начало передачи), запускает задержку длительностью около 25 мкс.
По прошествии времени задержки (на диаграмме оно обозначено Тз) приемник сбрасывает разрешение, то есть переключает линию ИхЭ передатчика из низкого состояния в высокое. Далее, после окончания передачи байта, передатчик переходит к анализу разрешения передачи следующего байта (состояния линии ИхО). В этот момент она достаточно давно находится в единичном состоянии, и передатчик продолжает ожидать разрешение на передачу. Приемник, приняв байт полностью до последнего стоп-бита и записав, например, его в память, спустя некоторое время (назовем его временем реакции на конец приема Трк), когда он полностью готов принять следующий байт, опять выставляет разрешение на передачу (уже следующего) байта. На временной диаграмме этот факт отражен переключением линии ИхБ с состояния «логической 1» в состояние «логического 0». Далее процесс повторяется.
Необходимо отметить, что достоверность обмена может быть значительно повышена,
если передатчик сделает дополнительный анализ линии ИхЭ на сброс разрешения. Как видно из временной диаграммы, сброс разрешения (установка приемником линии ИхБ передатчика в высокий уровень) происходит по времени где-то в середине передачи байта. Если передатчик проверит линию ИхЭ на предмет сброса разрешения (переключение ее в высокий уровень), то этот факт для передатчика будет означать, что приемник начал принимать передаваемый передатчиком байт и в связи именно с этим сбросил разрешение. Другими словами, дополнительная проверка сброса разрешения позволяет передатчику определить, что приемник работает ожидаемым образом и переключает линию ИхЭ передатчика с высокого уровня в низкий и обратно.
Без такой проверки можно оказаться в следующей ситуации. Предположим, что приемник вообще не работает, и каким-либо образом линия ИхЭ передатчика находится в разрешающем состоянии. В этом случае передатчик будет передавать байт за байтом в «пустоту», поскольку он проверяет линию ИхЭ только на предмет разрешения. Проверив же линию ИхЭ дополнительно на предмет запрета и определив, что приемник такого запрета не выдает, передатчик может сделать вывод, что приемник не работает, что линия ИхЭ не переключается из высокого состояния в низкое и обратно. В связи с этим передатчик может прекратить передачу (и выдать, например, сообщение об ошибке или каким-либо иным способом просигнализировать о сбое обмена).
И еще одно существенное замечание. Во время передачи байта, то есть с начала старт-бита и до конца последнего стоп-бита ни процессор передатчика, ни процессор приемника не принимают никакого участия в обмене, поскольку и в компьютере, и в микроконтроллере этим занимается иЛИТ, то есть аппаратные средства. Поэтому все проверки состояния линий, переключения их из одного состояния в другое, организация задержек (например, в 25 мкс) и т. п. не оказывают никакого влияния на скорость передачи.
Компьютер
Преобразователи уровней RS232
TxD
RxD
DSR
DTR
SG
Информация /синхронизация
Приемник
М и кроконтроллер Информация/синхронизация
Информация
Синхронизация
Передатчик
Информация/синхронизация
Приемник
RxD
TxD
RESET
SG
Рис. 2. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с одним передатчиком
Компьютер
Преобразователи уровней RS232
TxD
RxD
DSR
DTR
SG
Информация /синхронизация
Приемник
М и кроконтроллер Информация/синхронизация
Информация
Синхронизация
Передатчик
Передатчик
Информация/синхронизация
Приемник
RxD
TxD
RESET
SG
Рис. 3. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с двумя передатчиками
Например, задержка в 25 микросекунд и проверка передатчиком сброса разрешения проводятся во время передачи и приема байта, и никоем образом не «тормозят» обмен. Как будет видно из дальнейшего изложения, реальная скорость обмена при использовании излагаемого алгоритма отличается от идеальной не более, чем на 1-2% и больше зависит от используемой операционной системы и «метода», примененного для обращения к портам ввода/вывода (в частности, к порту И8232). Такое сравнение сделано автором, и его результат будет представлен читателю несколько позднее.
Вернемся к временной диаграмме. Если посмотреть еще раз на временную диаграмму (рис. 1), то можно заметить, что график зависимости напряжения от времени на линии ИхЭ представляет собой почти симметричный прямоугольный меандр. Длительность импульса такого меандра составляет половину времени на передачу одного байта. Такой импульс легко воспринимается преобразователем интерфейса (об этом уже было упомянуто выше).
Теперь несколько слов о том, каким образом компьютер может анализировать линию разрешения. Дело в том, что в интерфейсе И8232 компьютера непосредственное чтение и анализ состояния самой линии ИхО (то есть «логическая 1» или «логический 0») невозможен. Но, например, соединив эту линию ИхБ
с какой-либо входной линией квитирования (например, ОвИ), состояние которой поддается чтению, можно добиться требуемого: прочитав в определенное время состояние линии ОвИ, можно узнать и состояние линии ИхЭ. То есть в то время, когда линия ИхЭ используется как линия разрешения, чтение линии ОвИ покажет ее состояние. Когда же линия ИхЭ используется как линия данных (при передаче информации из микроконтроллера в компьютер), состояние линии ЭвИ просто не нужно читать и анализировать, так как в таком режиме ее состояние не представляет никакого интереса.
В обратную сторону (при передаче информации от микроконтроллера в компьютер) обмен информацией идет подобным же образом, и логика работы аппаратной синхронизации остается прежней. Есть, правда, некоторые нюансы, на которых мы остановимся несколько позднее.
Резюмируя все вышесказанное, приведем блок-схему сопряжения компьютера и микроконтроллера для целей штатного режима работы при условии аппаратной синхронизации обмена линиями данных. Блок-схема такого сопряжения приведена на рис. 2.
Как можно увидеть из приведенной схемы, линия ИхО соединена с линией ЭвИ непосредственно в разъеме Ив232 компьютера. Такое соединение целесообразно применять, если в использованном преобразователе уровней
интерфейса имеется только один передатчик. Если же преобразователь интерфейса имеет два передатчика, то блок-схема может быть представлена следующим образом (рис. 3). Как можно увидеть из блок-схемы, отсутствующее непосредственное соединение линий RxD и DSR (как в блок-схеме рис. 2) заменено соответствующим соединением этих сигналов, когда они имеют еще уровни TTL то есть это соединение организовано на входах двух передатчиков.
Использование двух передатчиков более предпочтительно, чем одного, поскольку в этом случае каждый передатчик работает только на один приемник (на одну нагрузку). При использовании же одного передатчика, как на рис. 2, он работает уже на два приемника, каждый из которых имеет нагрузку в 5 кОм, то есть нагрузка передатчика в этом случае составляет уже 2,5 кОм. Это несколько снижает длительность фронта и спада сигнала передатчика, но, поскольку современные микросхемы передатчиков достаточно мощные, к особым негативным результатам не приводит. Использование двух передатчиков имеет смысл, если они присутствуют в преобразователе уровней интерфейса (почему бы их не использовать, если они уже есть!). По блок-схеме рис. 3 с компьютером сопряжено большинство микроконтроллеров, приведенных в статье по аппаратным средствам, поскольку в схемах их сопряжения используются преобразователи, имеющие два передатчика. Как можно догадаться, применение двух передатчиков вместо одного никоим образом не нарушает логику алгоритма обмена.
Подчеркнем, что, как видно из рис. 2 и рис. 3, линия RxD микроконтроллера не требует «раздвоения», подобного линиям RxD и DSR. Это возможно в связи с тем, что чтение состояния линии RxD микроконтроллером не вызывает никаких трудностей, поскольку эта линия является помимо входа приемника RS232 обычным цифровым входом, то есть портом ввода/вывода.
При аппаратной синхронизации требуется не только читать состояние линии RxD, но еще и устанавливать линию TxD в то или иное состояние, соответствующее разрешению или запрету передачи. Линию TxD компьютера возможно установить программно в произвольное состояние (установив или сбросив бит № 6 регистра управления линиями (адрес 3fbh), то есть бит BREAK [2], [3], [9]). Что касается микроконтроллеров, то большинство из них позволяет устанавливать линию TxD в произвольное состояние, как если бы она являлась обычным выходом цифрового порта ввода/вывода.
Исключением являются микроконтроллеры семейств C8051FXXX производства Silicon Laboratories. В этих микроконтроллерах, если порт ввода/вывода выбран матрицей соединений для передачи информации по интерфейсу RS232 (как линия TxD), то он уже
недоступен как обычный порт вывода, и программным способом его состояние изменять уже невозможно. Тем не менее, решить задачу аппаратной синхронизации для микроконтроллеров этого семейства возможно, но только привлекая дополнительные аппаратные средства. Одно из решений, предложенное автором, заключается в том, что нужно выбрать еще один какой-либо дополнительный цифровой порт ввода/вывода (PX.X), состояние выхода которого можно изменять программным способом (для этого порт требуется освободить от всех альтернативных функций), и объединить его выход с линией TxD по схеме 2И. В этом случае логическая блок-схема сопряжения компьютера с микроконтроллером несколько модифицируется (рис. 4).
В следующей части статьи мы поговорим о реализации на практике приведенного нового алгоритма обмена данными. ■
Продолжение следует Литература
1. Баррингтон Брюс Б. Как создавался Кларион. // Мир ПК. 1993. № 2.
2. Кузьминов А. Ю. Интерфейс RS232. Связь между компьютером и микроконтроллером. От DOS к Windows98/XP — М.: ДМК-ПРЕСС. 2006 (в печати).
3. Кузьминов А. Ю. Интерфейс КБ232. Связь между компьютером и микроконтроллером. — М.: Радио и связь. 2004.
4. Кузьминов А. Ю. Однокристальные микроэвм — основа удаленных систем сбора и обработки сигналов, поступающих с датчиков. // Электроника и компоненты. 1998. № 2.
5. Кузьминов А. Ю. Новые МСв51 — совместимые микроконтроллеры и их применение в системах сбора информации с датчиков. // Контрольно — измерительные приборы и системы. 1997. № 6. С. 32-35; 1998. № 7.
6. Кузьминов А. Ю. Удаленные системы сбора информации с датчиков на базе однокристальных микроЭВМ. // Автоматизация и производство. 1996. № 3.
7. Кузьминов А. Ю. Универсальная система сбора и обработки данных АСИР-3. // Мир ПК. 1996.
№6.
8. Орлов А. Два звучных слова — С1апоп и Бе1рЫ. // Мир ПК. 1996. № 6.
9. Фролов А. В., Фролов Г. В. Программирование модемов. М.: ДИАЛОГ-МИФИ. 1993.
10. w ww.analog.c om
11. w ww.atmel.c om
12. ww w.maxim-ic.c om
13. w ww.semiconductor-philips.c om
14. ww w.silabs.c om
15. ww w.ti.c om
16. ww w.msdn.microsoft.c om/library
17. ww w.gapdev.c om
18. w ww.sysintemal.c om