Современные программные средства связи микроконтроллера с компьютером по интерфейсу RS-232. Часть 2

№ 7’2006
Новый алгоритм обмена по интерфейсу RS-232, разработанный автором и опубликованный в работах, заключается в аппаратной синхронизации каждого передаваемого/принимаемого байта линиями данных (TxD и RxD) этого же интерфейса.

Все статьи цикла:

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 байт). В обмене в этом случае участвует только одна линия интерфейса. Этo линия ТxD компьютера, которая соединена с линией RxD микроконтроллера. Вторая линия — линия TxD микроконтроллера, соединенная с линией RxD компьютера, в это время не используется (простаивает). В связи со сказанным, основная идея нового алгоритма заключается как раз в том, что «простаивающую» линию можно использовать для аппаратной синхронизации обмена байтами между компьютером и микроконтроллером. Что означает фраза «аппаратная синхронизация»? Она означает, что синхронизация осуществляется не посылкой информационного байта по простаивающей линии (например, Xoff, как это организовано в программной синхронизации), а изменением состояния линии TxD микроконтроллера с «логической 1» на «логический 0» и обратно, как это происходит при аппаратной синхронизации какой-либо линией квитирования (например, линией DTR).

В начале передачи каждого байта компьютер запрашивает у микроконтроллера разрешение на передачу. Для этого он анализирует свою линию данных RxD. Если линия находится в состоянии запрета на передачу (например, на ней установлена «логическая 1»), компьютер не передает байт, а продолжает опрашивать эту линию, пока не получит разрешения (например, пока уровень на линии не будет соответствовать «логическому 0»). Получив разрешение, компьютер передает только один байт, ожидает конца передачи этого байта (то есть ждет, пока не выведется последний бит передаваемого байта) и опять переходит в режим опроса линии для получения разрешения на передачу следующего байта.

Микроконтроллер, принимающий поток байт, выполняет следующие действия. Во-первых, именно он является инициатором начала обмена, поскольку именно он первым дает разрешение компьютеру на передачу очередного (первого) байта. Вспомним, что в начале передачи компьютер ждет разрешения на передачу, то есть находится в режиме ожидания. Переключив свою линию TxD из запрещающего состояния в разрешающее (то есть дав компьютеру разрешение на передачу байта), микроконтроллер ожидает передачи байта от компьютера. В чем суть ожидания передачи байта от компьютера? В том, что в начале поступления байта в микроконтроллер его линия RxD изменяет свое состояние, поскольку передача байта начинается со старт-бита. Поэтому линия RxD микроконтроллера и изменяет свое состояние с «логической 1» на «логический 0». В этот момент с одной стороны старт-бит инициирует UART микроконтроллера на прием байта (и этот прием уже происходит без участия процессора микроконтроллера), с другой, микроконтроллер, определив, что передача началась, должен сбросить разрешение (то есть установить запрещающий потенциал на своей линии TxD).

Момент времени сброса разрешения компьютеру на передачу следующего байта очень важен. Другими словами, требуется определить, когда именно микроконтроллер должен сбросить это разрешение (то есть установить запрет на передачу). С одной стороны, ответ на этот вопрос напрашивается сам собой: именно тогда, когда микроконтроллер определит начало поступления байта (то есть в момент времени начала старт-бита). Но здесь кроется одна «ловушка». Дело в том, что многие современные микроконтроллеры имеют быстродействие намного выше, чем предыдущие поколения. Многие производители предлагают микроконтроллеры с такой архитектурой, в которой большинство команд выполняются не за 12 тактов, как это было ранее. Многие из них выполняют команду процессора всего за один такт (например, микроконтроллеры ADUC8XX, C8051FXXX), некоторые — за два такта (например, P89LPC9XX), некоторые — за 4 такта (MSC12XX), другиеза 6 тактов (например, AT89C51ED2/RD2). Кроме того, быстродействие современных компьютеров также растет весьма быстро. Поэтому сбрасывать разрешение сразу после начала старт-бита нельзя, поскольку время от начала разрешения передачи и началом старт-бита последующего за этим разрешением передачи байта может составлять от нескольких микросекунд до долей микросекунд (в зависимости от скорости микроконтроллера). Такой короткий импульс разрешения просто не пройдет через преобразователи уровней интерфейса RS-232 (например, ADM3202, MAX1406, ADM231). В результате обмен может сорваться.

С другой стороны, ждать, пока байт полностью не поступит в микроконтроллер, и уже после этого сбрасывать разрешение тоже нельзя, поскольку компьютер после окончательного вывода байта сразу же приступает к анализу линии, по которой передается разрешение на передачу следующего байта. Поскольку микроконтроллер все-таки более медленное устройство, чем компьютер, он может не успеть среагировать и сбросить это разрешение немного позже момента начала анализа компьютером линии разрешения. В результате, проанализировав линию разрешения и определив, что она находится в состоянии разрешения передачи, компьютер передаст следующий байт, который микроконтроллер пропустит, что приведет к срыву обмена данными.

В связи со сказанным, с точки зрения автора, идеальным моментом времени сброса разрешения является момент времени, соответствующий передаче половины байта (то есть середина байта). В этом случае потенциалы разрешения и запрета будут чередоваться, и форма сигнала на линии разрешения (на линии TxD микроконтроллера) будет представлять собой что-то похожее на прямоугольный меандр. Причем длительность импульса такого меандра будет приблизительно равна половине длительности передачи одного байта. Такой длинный импульс, с одной стороны, свободно пройдет через преобразователь уровней интерфейса. С другой стороны, сброс разрешения в середине передаваемого байта никак не повлияет на передачу следующего байта компьютером, поскольку в это время он анализирует не линию разрешения, а бит, ответственный за конец вывода последнего бита передаваемого байта. И этим анализом компьютер будет заниматься до окончания вывода байта, прежде чем приступить к анализу линии разрешения. А линия разрешения к этому моменту будет уже давно сброшена, что и требуется.

Подсчитаем длительность времени от момента старт-бита до середины байта при скорости 115 200 бод. Очевидно, что при частоте 115 200 Гц длительность передачи одного бита будет равна: 1/115 200 = 0,00000868 с или около 8,7 мкс.

Передача всех 10 бит (1 старт-бит + 8 бит данных + 1 стоп-бит) будет занимать около 87 мкс. Половина этого времени составляет около 43 мкс. Если сделать некоторый запас по реакции микроконтроллера (5–15 мкс), то после обнаружения старт-бита необходимо сделать задержку в 25–30 мкс и затем сбросить разрешение. О том, как осуществить столь короткую и машинно-независимую задержку в компьютере, уже обсуждалось ранее. В микроконтроллере организовать подобную временную задержку достаточно просто, поскольку программисту всегда известна частота тактового генератора микроконтроллера.

На рис. 1 показана временная диаграмма передачи байта, составленная на основе приведенных выше рассуждений.

Рис. 1. Временная диаграмма аппаратной синхронизации передачи байта
Рис. 1. Временная диаграмма аппаратной синхронизации передачи байта

Подведем итоги (рис. 1). Итак, передатчик ожидает разрешения на передачу байта. На временной диаграмме это время от 0 до получения такого разрешения (до перехода RxD с высокого уровня в низкий). Далее приемник посылает разрешение на передачу байта по линии RxD передатчика, устанавливая ее в нулевой уровень. На верхнем графике этот факт отражен тем, что уровень RxD переключается с единичного в нулевое состояние. Получив разрешение на передачу байта, передатчик начинает передавать байт, но не мгновенно, а спустя некоторое время реакции на это разрешение; это время реакции на разрешение передачи обозначено Tpp. Далее приемник ждет начало старт-бита, то есть переключения линии TxD приемника с уровня «логической 1» на «логический 0». После определения факта начала передачи по старт-биту, приемник спустя некоторое время реакции, обозначенное Трн (время реакции на начало передачи), запускает задержку длительностью около 25 мкс.

По прошествии времени задержки (на диаграмме оно обозначено Тз) приемник сбрасывает разрешение, то есть переключает линию RxD передатчика из низкого состояния в высокое. Далее, после окончания передачи байта, передатчик переходит к анализу разрешения передачи следующего байта (состояния линии RxD). В этот момент она достаточно давно находится в единичном состоянии, и передатчик продолжает ожидать разрешение на передачу. Приемник, приняв байт полностью до последнего стоп-бита и записав, например, его в память, спустя некоторое время (назовем его временем реакции на конец приема Трк), когда он полностью готов принять следующий байт, опять выставляет разрешение на передачу (уже следующего) байта. На временной диаграмме этот факт отражен переключением линии RxD с состояния «логической 1» в состояние «логического 0». Далее процесс повторяется.

Необходимо отметить, что достоверность обмена может быть значительно повышена, если передатчик сделает дополнительный анализ линии RxD на сброс разрешения. Как видно из временной диаграммы, сброс разрешения (установка приемником линии RxD передатчика в высокий уровень) происходит по времени где-то в середине передачи байта. Если передатчик проверит линию RxD на предмет сброса разрешения (переключение ее в высокий уровень), то этот факт для передатчика будет означать, что приемник начал принимать передаваемый передатчиком байт и в связи именно с этим сбросил разрешение. Другими словами, дополнительная проверка сброса разрешения позволяет передатчику определить, что приемник работает ожидаемым образом и переключает линию RxD передатчика с высокого уровня в низкий и обратно.

Без такой проверки можно оказаться в следующей ситуации. Предположим, что приемник вообще не работает, и каким-либо образом линия RxD передатчика находится в разрешающем состоянии. В этом случае передатчик будет передавать байт за байтом в «пустоту», поскольку он проверяет линию RxD только на предмет разрешения. Проверив же линию RxD дополнительно на предмет запрета и определив, что приемник такого запрета не выдает, передатчик может сделать вывод, что приемник не работает, что линия RxD не переключается из высокого состояния в низкое и обратно. В связи с этим передатчик может прекратить передачу (и выдать, например, сообщение об ошибке или каким-либо иным способом просигнализировать о сбое обмена).

И еще одно существенное замечание. Во время передачи байта, то есть с начала старт-бита и до конца последнего стоп-бита ни процессор передатчика, ни процессор приемника не принимают никакого участия в обмене, поскольку и в компьютере, и в микроконтроллере этим занимается UART, то есть аппаратные средства. Поэтому все проверки состояния линий, переключения их из одного состояния в другое, организация задержек (например, в 25 мкс) и т. п. не оказывают никакого влияния на скорость передачи. Например, задержка в 25 микросекунд и проверка передатчиком сброса разрешения проводятся во время передачи и приема байта, и никоем образом не «тормозят» обмен. Как будет видно из дальнейшего изложения, реальная скорость обмена при использовании излагаемого алгоритма отличается от идеальной не более, чем на 1–2% и больше зависит от используемой операционной системы и «метода», примененного для обращения к портам ввода/вывода (в частности, к порту RS232). Такое сравнение сделано автором, и его результат будет представлен читателю несколько позднее.

Вернемся к временной диаграмме. Если посмотреть еще раз на временную диаграмму (рис. 1), то можно заметить, что график зависимости напряжения от времени на линии RxD представляет собой почти симметричный прямоугольный меандр. Длительность импульса такого меандра составляет половину времени на передачу одного байта. Такой импульс легко воспринимается преобразователем интерфейса (об этом уже было упомянуто выше).

Теперь несколько слов о том, каким образом компьютер может анализировать линию разрешения. Дело в том, что в интерфейсе RS232 компьютера непосредственное чтение и анализ состояния самой линии RxD (то есть «логическая 1» или «логический 0») невозможен. Но, например, соединив эту линию RxD с какой-либо входной линией квитирования (например, DSR), состояние которой поддается чтению, можно добиться требуемого: прочитав в определенное время состояние линии DSR, можно узнать и состояние линии RxD. Tо есть в то время, когда линия RxD используется как линия разрешения, чтение линии DSR покажет ее состояние. Когда же линия RxD используется как линия данных (при передаче информации из микроконтроллера в компьютер), состояние линии DSR просто не нужно читать и анализировать, так как в таком режиме ее состояние не представляет никакого интереса.

В обратную сторону (при передаче информации от микроконтроллера в компьютер) обмен информацией идет подобным же образом, и логика работы аппаратной синхронизации остается прежней. Есть, правда, некоторые нюансы, на которых мы остановимся несколько позднее.

Резюмируя все вышесказанное, приведем блок-схему сопряжения компьютера и микроконтроллера для целей штатного режима работы при условии аппаратной синхронизации обмена линиями данных. Блок-схема такого сопряжения приведена на рис. 2.

Рис. 2. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с одним передатчиком
Рис. 2. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с одним передатчиком
Рис. 3. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с двумя передатчиками
Рис. 3. Логическая блок-схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с двумя передатчиками

Как можно увидеть из приведенной схемы, линия RxD соединена с линией DSR непосредственно в разъеме RS232 компьютера. Такое соединение целесообразно применять, если в использованном преобразователе уровней интерфейса имеется только один передатчик. Если же преобразователь интерфейса имеет два передатчика, то блок-схема может быть представлена следующим образом (рис. 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 (как линия ТxD), то он уже недоступен как обычный порт вывода, и программным способом его состояние изменять уже невозможно. Тем не менее, решить задачу аппаратной синхронизации для микроконтроллеров этого семейства возможно, но только привлекая дополнительные аппаратные средства. Одно из решений, предложенное автором, заключается в том, что нужно выбрать еще один какой-либо дополнительный цифровой порт ввода/вывода (PX.X), состояние выхода которого можно изменять программным способом (для этого порт требуется освободить от всех альтернативных функций), и объединить его выход с линией TxD по схеме 2И. В этом случае логическая блок-схема сопряжения компьютера с микроконтроллером несколько модифицируется (рис. 4).

Рис. 4. Логическая блок-схема сопряжения компьютера с микроконтроллерами семейств C8051FXXX для целей штатного режима работы при аппаратной синхронизации линиями данных с двумя передатчиками
Рис. 4. Логическая блок-схема сопряжения компьютера с микроконтроллерами семейств C8051FXXX для целей штатного режима работы при аппаратной синхронизации линиями данных с двумя передатчиками

В следующей части статьи мы поговорим о реализации на практике приведенного нового алгоритма обмена данными.

Продолжение следует

Литература

  1. Баррингтон Брюс Б. Как создавался Кларион. // Мир ПК. 1993. № 2.
  2. Кузьминов А. Ю. Интерфейс RS232. Связь между компьютером и микроконтроллером. От DOS к Windows98/XP — М.: ДМК-ПРЕСС. 2006 (в печати).
  3. Кузьминов А. Ю. Интерфейс RS232. Связь между компьютером и микроконтроллером. — М.: Радио и связь. 2004.
  4. Кузьминов А. Ю. Однокристальные микроэвм — основа удаленных систем сбора и обработки сигналов, поступающих с датчиков. // Электроника и компоненты. 1998. № 2.
  5. Кузьминов А. Ю. Новые MCS51 — совместимые микроконтроллеры и их применение в системах сбора информации с датчиков. // Контрольно — измерительные приборы и системы. 1997. № 6. C. 32–35; 1998. № 7.
  6. Кузьминов А. Ю. Удаленные системы сбора информации с датчиков на базе однокристальных микроЭВМ. // Автоматизация и производство. 1996. № 3.
  7. Кузьминов А. Ю. Универсальная система сбора и обработки данных АСИР-3. // Мир ПК. 1996. № 6.
  8. Орлов А. Два звучных слова — Clarion и Delphi. // Мир ПК. 1996. № 6.
  9. Фролов А. В., Фролов Г. В. Программирование модемов. М.: ДИАЛОГ-МИФИ. 1993.
  10. www.analog.com
  11. www.atmel.com
  12. www.maxim-ic.com
  13. www.semiconductor-philips.com
  14. www.silabs.com
  15. www.ti.com
  16. www.msdn.microsoft.com/library
  17. www.gapdev.com
  18. www.sysinternal.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *