Вы находитесь на странице: 1из 161

А. Ю.

КУЗЬМИНОВ

И Н Т Е Р Ф Е Й С

RS232
СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ
И МИКРОКОНТРОЛЛЕРОМ
ОТ DOS К WINDOWS98/XP

МОСКВА 2006
УДК 621.396.6
ББК 32.872
К89

Кузьминов А. Ю.
К89 Интерфейс RS232: Связь между компьютером и микроконтроллером: От DOS к
WINDOWS98/XP . — М.: Издательский дом «ДМКпресс», 2006. — 320 с.

ISBN 5970600296

В книге отражены вопросы по аппаратным средствам и программному обеспечению сопряжения


компьютера с современными 51совместимыми микроконтроллерами — системами на кристалле
(MSC12XX, ADUC8XX, P89LPC9XX, AT89C51ED2/RD2 и C8051F067/330). Приведены примеры приме
Оглавление
нения новейших разработок ведущих фирмпроизводителей элементной базы, связанной с интер
фейсом RS232 (новые преобразователи интерфейса, гальванические развязки и т. п.), в схемах свя
зи компьютера с микроконтроллером. Рассмотрены схемные решения и программное обеспечение ПРЕДИСЛОВИЕ..............................................................................................8
программирования в системе (InSystemProgramming — ISP) современных микроконтроллеров по
интерфейсу RS232. Предложен разработанный автором новый протокол обмена по интерфейсу ВВЕДЕНИЕ ...................................................................................................13
RS232, использующий аппаратную синхронизацию с помощью линий данных и обладающий высоки
ми надежностью и скоростью обмена (115 200 бод). 1. АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232................................15
Показано преимущество применения прямых команд ввода/вывода (in и out) в COMпорт перед
использованием APIфункций при программировании интерфейса RS232 в ОС Windows98/XP. Даны 1.1. Предварительные замечания........................................................16
рекомендации по последовательности действий, позволяющих применить прямые команды вво
да/вывода в COMпорт в ОС Windows98/XP. 1.2. Новые преобразователи интерфейса RS232 .............................16
Книга снабжена большим количеством примеров по схемным решениям (приведены принципи
альные схемы и фотографии макетных плат) и программному обеспечению для ОС DOS и 1.2.1. Новые специализированные микросхемы
Windows98/XP (приведены тексты программ). преобразователей интерфейса RS232..............................17
Программы для микроконтроллеров написаны на ассемблере и C51(Keil, v.6.14), а для компью
тера — на языке Кларион, являющемся одной из двух распространенных современных RADсистем 1.2.2. Нетрадиционные преобразователи интерфейса RS232....19
(вторая — Delphi), предназначенных для быстрой разработки приложений (Rapid Application
Development — RAD). 1.3. Примеры применения новых преобразователей
Программы для компьютера, работающие в DOS, написаны на языке Кларион для DOS (Clarion для сопряжения микроконтроллеров с компьютером
V.3.100), работающие в Windows98/XP — на языке Кларион для Windows (Clarion V.6.0) и встроенно
му в него C++. по интерфейсу RS232 .....................................................................21
Описаны примеры использования RS232 в системах сбора и обработки информации с датчиков.
Книга предназначена для опытных разработчиков компьютерных и автономных систем сбора и 1.3.1. Предварительные замечания .............................................21
обработки информации, в составе которых используются микроконтроллеры, а также начинающих 1.3.2. Управление состояниями микроконтроллера
специалистов в этой области; может быть полезна студентам вузов соответствующих специальностей.
с помощью компьютера по интерфейсу RS232 ...............27
1.3.3. Схемы формирования сигналов RST и PSEN
ББК 32.872
для микроконтроллеров семейств MSC12XX,
УДК 621.396.6
ADUC8XX и AT8951ED2(RD2)...............................................30
1.3.4. Схемы формирования сигналов RST и Vdd
Все права защищены. Никакая часть этой книги не может быть воспроизведена в какой бы для микроконтроллеров семейств P89LPC9XX
то ни было форме и какими бы то ни было средствами без письменного разрешения владельца и C8051FXXX..........................................................................31
авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность нали 1.3.5. Сопряжение микроконтроллеров семейства
чия технических ошибок все равно существует, издательство не может гарантировать абсолютную
точность и правильность приводимых сведений. В связи с этим издательство не несет ответственно MSC12XX с компьютером ....................................................32
сти за возможный ущерб любого вида, связанный с применением или неприменимостью любых ма 1.3.6. Сопряжение микроконтроллеров семейства
териалов данной книги.
ADUC8XX с компьютером.....................................................35
1.3.7. Сопряжение микроконтроллеров
ISBN 5970600296 © Издательский дом «ДМКпресс», 2006 AT89C51ED2(RD2) с компьютером.....................................37

3
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ ОГЛАВЛЕНИЕ

1.3.8. Сопряжение микроконтроллеров семейств 2.4.1. Суть нового алгоритма обмена ..........................................83
P89LPC9XX с компьютером.................................................37 2.4.2. Подпрограммы передачи и приема байта
1.3.9. Сопряжение микроконтроллеров семейств для компьютера и микроконтроллера, использующие
C8051FXXX с компьютером.................................................43 логику нового алгоритма обмена ......................................89
1.3.10.Кабель связи микроконтроллеров с компьютером.........48 2.4.3. Тестовые программы обмена информацией между
1.4. Гальванические развязки для интерфейса RS232....................49 микроконтроллером и компьютером по интерфейсу RS232,
1.4.1. Простой гальванически изолированный интерфейс использующие логику нового алгоритма...........................91
RS232 на базе микросхем развязки ADUM1201, 2.4.3.1. Общие положения ......................................................91
преобразователя SN75155 и оптронов ............................51 2.4.3.2. Тестовая программа обмена
1.4.2. Гальванически изолированный интерфейс RS232 для микроконтроллера MSC1210 ............................92
на базе микросхем развязок ADUM1201, ADUM1200 2.4.3.3. Тестовая программа обмена
и преобразователей ADM3202 и MAX3181......................54 для микроконтроллеров ADUC847/834 ...................97
1.4.3. Гальванически изолированный интерфейс RS232 2.4.3.4. Тестовая программа обмена
на базе микросхем развязок ADUM1201, ADUM1200 для микроконтроллеров AT89C51ED2(RD2)..........101
и преобразователя MAX1406 .............................................57 2.4.3.5. Тестовая программа обмена
1.4.4. Гальванически изолированный интерфейс RS232 для микроконтроллеров P89LPC938/904.............106
на базе микросхем развязок ADUM1201, ADUM1200 2.4.3.6. Тестовая программа обмена
и преобразователей MAX3190 и MAX3181 ......................58 для микроконтроллеров C8051F067/330D ..........113
1.4.4.1. Плата гальванически изолированного интерфейса
2.4.3.7. Тестовая программа обмена для компьютера
на базе развязок ADUM1201, ADUM1200,
в ОС DOS.....................................................................119
MAX3181 и MAX3190 для микроконтроллеров
семейств MSC12XX, ADUC8XX и AT89C51ED2/RD2 ......58 2.5. Программирование интерфейса RS232
в ОС Windows98/XP......................................................................125
1.4.4.2. Плата гальванически изолированного интерфейса
на базе развязок ADUM1201, ADUM1200, 2.5.1. Предварительные замечания ...........................................125
MAX3181, MAX3183 и MAX3190 2.5.2. Варианты программирования интерфейса RS232
для микроконтроллеров семейств P89LPC9XX .......61 в Win'98/XP.........................................................................127
1.5. Что делать, если длина линии связи интерфейса RS232 2.5.3. Программирование интерфейса RS232 с помощью
превышает 20 м? ............................................................................63 функций API .........................................................................128
2. ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ...........................67 2.5.3.1. Тестовая программа обмена для компьютера,
2.1. Предварительные замечания .......................................................68 использующая функции API, в ОС Win'98/XP........133
2.2. Формирование коротких машиннонезависимых 2.5.4. Программирование интерфейса RS232 с помощью
временных задержек .....................................................................71 прямых команд ввода/вывода в COMпорт ...................143
2.2.1. Общие положения.................................................................71 2.5.4.1. Общие положения .....................................................143
2.2.2. Программное формирование коротких 2.5.4.2. Применение команд ввода/вывода
аппаратнонезависимых временных задержек в DOS ...72 порт в Clarion6.0 для Win'98/XP .............................144
2.2.3. Программное формирование коротких аппаратно 2.5.4.3. Снятие запрета на применение команд
независимых временных задержек в Windows ...............73 ввода/вывода в порт для Win'XP............................147
2.3. Применение совмещений в программах 2.5.4.4. Открытие COMпорта для использования прямых
для микроконтроллера и компьютерa..........................................75 команд ввода/вывода в Win'XP .............................150
2.4. Использование нового алгоритма обмена информацией 2.5.4.5. Тестовая программа, использующая прямые команды
по RS232 между компьютером и микроконтроллером ............83 ввода/вывода в COMпорт в ОС Win'98/XP..................152
4 5
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ ОГЛАВЛЕНИЕ

2.6. Применение интерфейса RS232 для программирования П. 2.1. Удаленные компьютерные системы сбора и обработки
микроконтроллеров в системе (In_System_Programming) ......161 информации, поступающей с датчиков аналоговых,
2.6.1. Общие положения ..............................................................161 частотных и дискретных сигналов на базе
микроконтроллеров P80C552 и AT89C51 ...............................304
2.6.2. Программирование микроконтроллеров MSC12XX
в режиме ISP по интерфейсу RS232................................162 П. 2.1.1. Краткое описание..........................................................304
2.6.3. Программирование микроконтроллеров ADUC8XX П. 2.1.2. Назначение и область использования .......................305
в режиме ISP по интерфейсу RS232................................184 П. 2.1.3. Технические характеристики .......................................305
2.6.4. Программирование микроконтроллеров P89LPC9XX П. 2.1.4. Техникоэкономическая эффективность ....................306
в режиме ISP по интерфейсу RS232 и в режиме ICP П. 2.1.5. Сведения о документации ............................................306
по интерфейсу C2 ...............................................................203
П. 2.1.6. Сведения о внедрении..................................................306
2.6.4.1. Предварительные замечания..................................203
П. 2.1.7. Внешний вид окон, открывающихся
2.6.4.2. Применение промежуточного микроконтроллера в процессе работы программы поверки счетчиков
для осуществления режима ICP...............................204 обьема газа (OC DOS)....................................................306
2.6.4.3. Программирование микроконтроллеров П. 2.1.8. Примеры работы базового комплекта программ
P89LPC93X в режиме ISP.........................................205 систем сбора на базе микроконтроллера АТ89C51
2.6.4.4. Программирование микроконтроллеров и АЦП ADS1210 в ОС Windows98/XP ..........................310
P89LPC9XX в режиме ICP.........................................236 П. 2.1.9. Фотографии систем сбора............................................311
2.6.5. Программирование микроконтроллеров П. 2.1.10. Новая система сбора (2005 г.) ..................................316
AT89C51ED2 (RD2) в режиме ISP
П. 2.1.11. Новая разработка многоканальной
по интерфейсу RS232 ........................................................281
системы сбора.............................................................318
2.6.6. Программирование микроконтроллеров
C8051F067 и C8051F330D в режиме ISP
по интерфейсам C2 и JTAG и штатный режим работы Сведения об авторе................................................................................119
по интерфейсу RS232 ........................................................286
2.6.6.1. Программирование и штатный режим работы
микроконтроллера C8051F067...............................287
2.6.6.2. Программирование и штатный режим работы
микроконтроллера C8051F330D ............................294
Заключение..............................................................................................298
Список использованной литературы ..................................................299
ПРИЛОЖЕНИЯ
Приложение 1. Справочные данные по интерфейсу RS232 ............300
П.1.1. Контакты разъема интерфейса RS232 компьютера ..............300
П.1.2. Значения регистров состояния и управления
в интерфейсе RS232 компьютера.............................................300
Приложение 2. Удаленные компьютерные системы сбора
и обработки информации, поступающей с датчиков
аналоговых, частотных и дискретных сигналов на базе
51совместимых однокристальных микроконтроллеров....................304

6 7
ПРЕДИСЛОВИЕ

посредством высокочастотного электромагнитного поля (iCoupler), разработанных фир


мой Analog Devices (ADUM12XX). Эти развязки работают на повышенных скоростях обме
на (от 0÷1 и вплоть до 25 Мбод), отличаются крошечными габаритами, низкой стоимостью и
малым потреблением тока по сравнению с оптронами, что позволяет с успехом применять их
в гальванически развязанном интерфейсе RS232.
В качестве примеров, реализующих использование вышеописанных преобразователей
интерфейса RS232, в книге приведены аппаратные средства сопряжения современных
микроконтроллеров ADUC8XX (ф. Analog Devices), MSC12XX (ф. Texas Instruments),
P89LPC9XX (ф. Philips) и AT89C51ED2/RD2 с компьютером как для целей внутрисистемного
программирования (InSystemProgramming — ISP) по интерфейсу RS232, так и для штатно
Предисловие го режима их работы. Штатный режим работы с интерфейсом RS232 обсужден также и для
микроконтроллеров C8051F067/330 от ф. Silicon Laboratories.
Необходимо отметить, что аппаратные средства сопряжения микроконтроллеров
Со времени написания первой части книги (2003 год) [4] появилось много новшеств (как в ADUC8XX и MSC12XX с компьютером, приведенные в настоящей книге, значительно отличают
аппаратном, так и программном отношениях), так или иначе связанных с интерфейсом RS232. ся от тех, которые были описаны в первой части книги. Отличие состоит, с одной стороны,
Следуя традиции, принятой в первой части книги [4], настоящая книга условно делится на два в применении более современной элементной базы, с другой — в большей ориентирова
раздела. нности этих аппаратных средств на 3вольтовое питание (хотя, конечно, при питании в 5 В они
Первый раздел посвящен аппаратным средствам, связанным с интерфейсом RS232, вто также работают). Что касается аппаратных средств для микроконтроллеров P89LPC9XX,
рой — программному обеспечению для них. AT89C51ED2/RD2 и C8051F067/330, то в 1й части книги они отсутствoвали потому, что
Из аппаратных средств следует выделить новые преобразователи интерфейса RS232, об в 2003 г. некоторые из этих микроконтроллеров были еще либо в стадии разработки (и не вы
ладающие несомненными преимуществами (высокой скоростью обмена, малыми габаритами пускались), либо недоступны.
и потреблением энергии, а также достаточно низкой стоимостью) перед использующимися ра Помимо вышеописанных в книге приведены аппаратные средства коммуникаций по ин
нее, которые стали уже доступны в нашей стране, например MAX318X, MAX3190. терфейсу RS232 на расстояниях бoльших, чем допускает сам этот интерфейс, т. е. свыше 15 м.
Кроме того, переход на 3вольтовое питание, которое стало поддерживаться многими Если расстояние между объектами коммуникаций составляет 50÷1000 м, а сами объекты
современными микроконтроллерами, позволил, с одной стороны, поновому подойти к приме имеют интерфейс RS232, то в этом случае автор рекомендует использовать два подхода.
нению стандартных преобразователей интерфейса (например ADM231L), с другой — исполь Первый подход связан с обычными проводными линиями связи, например в виде витых
зовать давно забытые микросхемы преобразователей, например двунаправленный преобра пар, которые уже давно и традиционно используются в компьютерных сетях связи.
зователь SN75155 (корпус DIP8), который давно уже не используется, очень удобно приме Если расстояние достаточно большое, например 800÷1000 м, а скорость обмена по
нять в таких приложениях. Что касается нестандартных преобразователей интерфейса RS232 желательно оставить высокой, например 115 200 бод, то интерфейс RS232 можно пре
RS232, то в дополнение к уже описанным в первой части книги можно отнести новые КМОП образовать в интерфейс RS485/422, который допускает подобный обмен по проводам (в дан
транзисторы с изолированным затвором p и nпроводимости (например BS250, 2N7000 и ном случае — витым парам). Сделав обратное преобразование, получим тот же интерфейс
др.), которые с успехом могут служить приемниками RS232, т. к. их затвор (Uзи = ±20 B) без RS232, но уже на расстоянии 800÷1000 м. В книге приводится принципиальная схема подоб
какихлибо дополнительных резисторов может непосредственно контактировать с выходными ных преобразователей уже в виде готовых устройств, помещающихся в корпус обычной теле
линиями RS232(±10 В). фонной розетки (приведена даже фотография устройства на с. 6465). Такие устройства
Появление новых недорогих гальванически развязанных DCDCпреобразователей достаточно дешевы, безукоризненно работают, но имеют один известный недостаток — необ
(например +5 В в ±12 В), в которых значительно (в несколько раз) снижен шум, улучшена ходима сама электрическая линия связи, т. е. провода, что связано с рядом проблем: высокой
стабильность работы, уменьшены габариты, при их применении позволило улучшить надеж стоимостью линии связи и ее прокладки и связанными с ней сложностями, как то: повреж
ность и уменьшить площадь на плате узлов гальванической развязки для RS232. Пример дения линии (случайные или умышленные), значительные затруднения ее прокладки (а иногда
нового DCDCпреобразователя — RSD0512 фирмы RECOM. и полная ее невозможность ) и т. п.
Из новых оптронов, использующихся в гальванических развязках, следует отметить опт Второй подход связан с современными беспроводными (wireless) технологиями, развива
роны К7010 и К7110 (ф. COSMO), которые отличает высокая скорость работы, малый ток ющимися в настоящее время «гигантскими» темпами.
включения, малое потребление энергии и встроенный стабилизатор питания, благодаря чему Беспроводные линии связи малого радиуса действия имеют массу недостатков, среди
значительно улучшены надежность и скорость передачи (до 1 Мбод). которых: более низкая скорость обмена (10÷50 кбод при разумной цене); значительно
И, наконец, последнее новшество в гальванических развязках — появление новых уни меньшее расстояние связи 100÷500 м (при опятьтаки разумной цене радиотрансиверов);
кальных микросхем гальванических развязок, использующих принцип передачи информации зависимость надежности связи от погоды, расположения объектов связи (в помещении или
на открытом пространстве); связь менее стабильная, чем проводная, и часто срывается;

8 9
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ ПРЕДИСЛОВИЕ

масса стандартов связи (перечислять их — дело неблагодарное); стоимость радиотран пользу API) скорости работы программ, использующих API и прямые команды in и out. Делает
сиверов пока еще на порядок превышает стоимость, например, вышеуказанных преоб ся вывод, что изучение API совсем не обязательно (правда, достаточно полезно). Таким обра
разователей интерфейсов (RS232RS485/422); имеются некоторые известные проблемы зом, «снимается» один (кстати сказать, основной) из перечисленных «барьеров».
в программировании радиотрансиверов и т. п. Однако отсутствие линии связи и связанных Что касается перехода на новую версию языка программирования, работающую с опера
с этим проблем иногда перевешивает все вышеперечисленные недостатки систем ционной системой Windows, то эта проблема решается гораздо меньшими усилиями, чем пре
беспроводной связи, а в некоторых случаях (при невозможности прокладки проводной дыдущая. Например, переход с языка Кларион для DOS (Clarion v.3.100) на новую версию
линии связи, например, когда один из объектов связи находится под значительным языка Кларион для Windows (Clarion 6.0), на взгляд автора, не составляет больших проб
напряжением (в несколько тысяч вольт) по отношению к другому) беспроводная связь лем. В книге приводятся две тестовых программы обмена по RS232, написанные на
является единственно возможной и не имеет альтернативы. Применение интерфейса Clarion V3.100(DOS) и Clarion V6.0 (Windows). Сравнение текстов этих программ показыва
RS232 в беспроводных линиях связи выходит за рамки настоящей книги (хотя автор в ет 99 %ную их идентичность. Некоторое расхождение программ — в различиях экранных
настоящее время «усиленно» занимается подобными разработками). Возможно, в даль форм (точнее в их названиях): в Clarion V3.100 экранная форма называется «Screen» (эк
нейшем эта тема будет либо включена в книгу (если она будет переиздана), либо ран), а в Clarion V.6.0 — это «Window» (перевод, надеюсь, не требуется). Форма «Window»
раскрыта в отдельной книге. обладает просто более расширенными возможностями, чем «Screen». Таким образом, вто
Обо всех этих и некоторых других аппаратных средствах, использующихся в устройствах, рой «барьер» также снимается. Аналогичные «мелкие» проблемы, повидимому, возника
связанных с интерфейсом RS232, подробно описано в разделе книги, посвященном аппарат ют и для других языков программирования.
ным средствам RS232. В качестве примеров, иллюстрирующих применение интерфейса RS232 для обмена ин
*** формацией между компьютером и микроконтроллером, приведены несколько программ, сре
ди которых: тестовая программа обмена строкой байт по новому алгоритму обмена, разрабо
Программные средства, приведенные в настоящей книге, более ориентированы на ис танного автором; программы для внутрисистемного программирования (InSystem
пользование операционных систем Windows98 и WindowsXP. Это — существенное ее отличие Programming — ISP) микроконтроллеров ADUC83X/84X (ф. Analog Devices), MSC121X (ф. Texas
от первой части [4], где «по умолчанию» все программы были приведены для работы в опера Instruments), LPC9XX (ф. Philips); программы для внутрисхемного программирования (In Circuit
ционной системе DOS, а о Windows не было сказано ни слова (за исключением, быть может, Programming — ICP) микроконтроллеров LPC90X с помощью микроконтроллеров MSC1210 и
заключения). LPC938, которые, в свою очередь, сопрягаются с компьютером по RS232 и др.
Написание программ, так или иначе связанных с коммуникациями и, в частности, с соп Программы для компьютера написаны на языке Clarion v.3.100 (DOS) и Clarion v.6.0, a для
ряжением внешних устройств на базе микроконтроллеров с компьютером по интерфейсу микроконтроллеров — на С51 и на ассемблере.
RS232 в операционных системах Windows, для многих программистов часто является непре В книге несколько выделены два вопроса, которые вызывают затруднения при програм
одолимым барьером по многим причинам, основная из которых отсутствие в языках высо мировании:
кого уровня команд прямого ввода/вывода в порт, например RS232 (in и out), к которым так
привыкли программисты, а в операционной системе WindowsXP эти команды вообще запре  как сформировать аппаратно независимые короткие временные задержки (от единиц
щены (по крайней мере в официальной документации). до десятков микросекунд) достаточной точности в DOS и Windows,
В Win'XP (кстати сказать, и в Win'98) обращение к интерфейсу RS232 возможно через  как правильно пользоваться совмещениями, «не бояться» их и применять везде, где
специальный программный интерфейс (простите за тавтологию), разработанный компанией только возможно. Напомню, что под совмещениями принято понимать свойство язы
Microsoft специально для работы приложений (Application Program Interface — API). Изучение ка программирования перераспределять одну и ту же область памяти для двух (или бо
и применение функций API для программирования RS232 также наталкивается на известные лее) структур данных, имеющих различные форматы, например: строку данных длиной
трудности, т. к. примеры использования API в MSDN [18] приведены только для языка Cи. 100 байт и массив однобайтных чисел размерностью 100 (в Clarion — string(100) и
Для использования функций API в других языках (например в Кларионе для Windows) требует byte dim (100) ) или двухбайтное число (ushort — в Clarion, unsigned short — в Си)
ся некоторая модификация этих функций (а точнее — адаптация под соответствующий язык, и 2 однобайтных числа (byte — в Clarion и unsigned char — в Си), или однобайтное
в данном случае — Кларион). Эта модификация также связана с дополнительными трудностя число формата unsigned char и 8 однобитных чисел формата sbit (Си для микро
ми и временными затратами. контроллера). В книге показано какое огромное преимущество (как по экономии
Другой важной проблемой является необходимость перехода на новую версию языка памяти, так и по увеличению быстродействия и в микроконтроллере, и в компьюте
программирования, работающую в Windows. ре) имеет применение совмещений.
В книге объясняется, как достаточно просто запрограммировать обмен по интерфейсу ***
RS232 в операционных системах Windows, используя функции API, на языке Кларион для
Windows (на настоящее время его последняя версия — Clarion 6.0) и, кроме того, показано, Книга снабжена двумя приложениями.
что программировать обмен по RS232 можно (и нужно!) с помощью прямых команд вво В Приложении 1 в краткой справочной форме приведены все регистры (состояния, управ
да/вывода в порт (in и out), в том числе и в WindowsXP. Сделано сравнение (и далеко не в ления и данных), предназначенные для программирования интерфейса RS232 в компьютере;

10 11
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

там же приводится таблица распайки контактов 9штырьковых (DB9P) и 25штырьковых


(DB25P) разъемов интерфейса RS232 (COM 1 и COM 2), использующихся в компьютере.
В Приложении 2 приводятся описания автоматизированных систем сбора и обработки ин
формации, поступающей с датчиков аналоговых (давления, температуры, влажности) и частот
ных (количество импульсов с тахометрических и ротационных счетчиков объема газа или во
ды) сигналов, сконструированные автором, на базе современных микроконтроллеров. Приве
дены технические характеристики систем и их фотографии на объектах. Системы сбора сопря
гаются с компьютером по интерфейсу RS232. Эти системы применяются для поверки и граду
ировки счетчиков объема газа и воды и работают на соответствующих установках на протяже
нии уже более 10 лет.
Приведен адрес сайта автора, где можно более подробно ознакомиться с этими система
ми; кроме того, на сайте представлены некоторые программы для внутрисистемного програм
Введение
мирования (ISP) микроконтроллеров ADUC8XX, MSC12XX и LPC9XX и внутрисхемного
программирования (ICP) микроконтроллеров LPC90X с помощью микроконтроллеров
Последовательный интерфейс RS232С был разработан еще в 1969 г. и введен ассоциаци
MSC1210 и LPC938, которые, в свою очередь, сопрягаются с компьютером по RS232, и неко
ей электронной промышленности (Electronic Industries Associations — EIA) как стандарт для
торые другие программы. Приведен также адрес электронной почты автора.
связи аппаратных средств передачи данных (Data Communication Equipment — DCE), в качест
ве которых, как правило, используются компьютеры, с аппаратными средствами приема дан
ных (Data Terminal Equipment — DTE) — периферийными устройствами (принтерами, модема
ми и т. п.). Из всего многообразия периферийных устройств, подключаемых к компьютеру, в
настоящее время интерфейс RS232 остался, пожалуй, лишь у выносных модемов, поскольку
возросший на несколько порядков объем информации, передаваемой в периферийные уст
ройства, потребовал новых высокоскоростных интерфейсов, таких, например, как параллель
ный (Centronics) или высокоскоростной последовательный (USB). Но сейчас подавляющее
большинство модемов выпускаются в виде плат, которые вставляются в материнскую плату
компьютера (и сопрягаются с ней по внутренним интерфейсам ISA или PCI) либо даже интегри
руются в материнскую плату.
Казалось бы, использованию интерфейса RS232 приходит конец. Но нет, интерфейс RS232
до сих пор имеет подавляющее большинство компьютеров, поскольку он и сейчас не утратил
своего коммуникационного назначения, несмотря на низкую скорость обмена информацией. В
чем причина такой поразительной «живучести» этого интерфейса?
Второе рождение интерфейс RS232 пережил около 20 лет назад, когда начался выпуск
микроконтроллеров. Поначалу скорость работы микроконтроллеров была такой низкой, что
единственным интерфейсом, который позволял производить обмен информацией между
компьютером и микроконтроллером, был интерфейс RS232. Но к настоящему времени ско
рость работы современных микроконтроллеров возросла как минимум на порядок, а интер
фейс RS232 все равно имеет практически любой микроконтроллер, причем многие микро
контроллеры оборудованы даже двумя такими интерфейсами.
Причины, по которым интерфейс RS232 продолжает до сих пор использоваться, повидимому,
состоят в том, что этот интерфейс достаточно надежен, допускает связь на расстоянии до 15 м (при
скорости обмена 115 200 бод) и более (при соответствующем снижении скорости), легко програм
мируется (как в компьютере, так и в микроконтроллере). Всех этих свойств лишен, например, интер
фейс USB, который сейчас присутствует практически во всех компьютерах.
Несколько новых интерфейсов разработаны также и для микроконтроллеров (SPI,
SMBUS(I2C), CAN и даже USB и т. п.). Тем не менее интерфейс RS232 прочно и надолго вошел
в состав микроконтроллеров. Такое положение интерфейса, повидимому, объясняется еще

12 13
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

и тем, что программирование современных микроконтроллеров (которое происхо


дит достаточно медленно) производится в «системе» (InSystemProgramming — ISP), т. е. в том
же устройстве, где установлен микроконтроллер. Другими словами, современный микроконт
роллер не требуется больше программировать отдельно в программаторе, а потом уже
вставлять в устройство. Программирование в системе, помимо собственно удобства прог
раммирования, позволяет еще производить быструю отладку программы.
В настоящее время интерфейс RS232 переживает свое «третье» рождение в связи с не
вероятным «бумом», поднявшимся во всем мире, причиной которому — беспроводные техно
логии передачи информации. Скорость обмена информацией, например, в беспроводных
устройствах малого и среднего радиуса действия, едва дотягивает до 9600 бод, а иногда и
много меньше (1200 бод). Об увеличении скорости обмена информацией в таких устройствах
ни в настоящее время, ни в скором будущем, повидимому, нет даже и речи, поскольку с каж
Аппаратные
дым годом ужесточаются требования на ограничение мощности радиотрансиверов. Сейчас
новшества касаются только увеличения чувствительности приемников, входящих в состав
средства
радиотрансиверов, и улучшения их (приемников) соотношения сигнал/шум. Это улучшение
достигается различными методами (например, скачкообразным изменением частоты моду
ляции, применением избыточного кодирования и другими «хитроумными» способами), но ни
интерфейса
в коем случае не увеличением мощности передатчиков, дабы не «засорять эфир». В этих ус
ловиях об увеличении скорости обмена говорить не приходится. RS232
Максимальная скорость обмена, которую допускает интерфейс RS232 (в компьютере),
составляет 115 200 бод и вряд ли будет в скором времени перекрыта подобными устройства
ми беспроводной связи. В связи с вышеизложенным интерфейс RS232 вряд ли скоро уйдет из
нашей жизни в отряд «отставников», поэтому с ним придется еще долго работать. Вместе с тем
интерфейс RS232 не лишен многих недостатков. Кроме того, имеется много тонкостей при ис 1.1. Предварительные замечания .............................................................16
пользовании этого интерфейса в программах (как для компьютера, так и для микроконтролле
ра), а также «глюков», которые могут вызвать недоумение (и даже досаду) у многих разработ 1.2. Новые преобразователи интерфейса RS232 ...................................16
чиков как аппаратных, так и программных средств для RS232. 1.3. Примеры применения новых преобразователей
Целью настоящей книги является «снятие» некоторых «явных» препятствий на пути исполь для сопряжения микроконтроллеров с компьютером
зования интерфейса RS232 как в плане аппаратных средств, так и в плане программного по интерфейсу RS232...........................................................................21
обеспечения, а также показать некоторые новые возможности этого интерфейса.
1.4. Гальванические развязки для интерфейса RS232..........................49
Автор, специализирующийся на разработке и производстве компьютерных и автоном
ных систем (на базе микроконтроллеров) сбора и обработки информации, поступающей с 1.5. Что делать, если длина линии связи интерфейса RS232
различного рода датчиков, не претендует на «полноту охвата» темы, однако если изложен превышает 20 м? ..................................................................................63
ный материал будет полезен многим разработчикам аппаратных средств, связанных с ис
пользованием микроконтроллеров, а также программистам, то свою задачу автор посчита
ет выполненной.
Книга может быть также полезна студентам вузов компьютерного профиля.
Материал книги условно делится на две части. В первой части рассматриваются аппарат
ные средства сопряжения микроконтроллеров с компьютером по интерфейсу RS232, во вто
рой — программные средства для них. Приведено много схемных решений, фотографий, а так
же текстов программ как для микроконтроллеров, так и для компьютера. Причем программы
для компьютера больше ориентированы на ОС Windows 98/XP.

14
НОВЫЕ ПРЕОБРАЗОВАТЕЛИ ИНТЕРФЕЙСА RS232

1
Что касается нестандартных преобразователей интерфейса RS232, то в дополнение к
уже описанным в первой части книги можно отнести новые КМОПтранзисторы с изоли
рованным затвором p и nпроводимости (например BS250, 2N7000 и др.), которые с ус
пехом могут служить приемниками RS232, т. к. их затвор (Uзи =±20 В) без какихлибо
дополнительных резисторов может непосредственно контактировать с выходными ли
ниями RS232 (±10 В).
Рассмотрим новые специализированные микросхемы преобразователей интерфейса
Аппаратные средства RS232 более подробно.

1.2.1. Новые специализированные микросхемы преобразователей


интерфейса RS232 интерфейса RS232
Кратко охарактеризуем свойства новых специализированных микросхем преобразовате
лей интерфейса RS232 (рис. 1.2.1).
1.1. Предварительные замечания
Основная цель настоящей главы — показать на примерах аппаратных средств сопряже
Рис. 1.2.1.
ния микроконтроллеров с компьютером возможности интерфейса RS232 для конструирова Специализированные
ния систем сбора и обработки информации, поступающей с различного рода датчиковпреоб микросхемы
разователей физической (измеряемой) величины в электрический сигнал. преобразователей
интерфейса RS232
В начале главы приводится описание новых специализированных микросхем преобра
зователей уровней интерфейса RS232 (±10 В÷±12 В) в TTL–уровни (±5 В÷±3 В) и обратно,
которые в настоящее время стали широко доступны (они не вошли в первую часть книги [4]).
Помимо специализированных микросхем преобразователей приводятся несколько приме
ров применения некоторых электронных компонентов, которые могут быть использованы в
качестве таких преобразователей (они также не вошли в [4]). Для гальванически развязан
ного интерфейса RS232 приводятся новые микросхемы гальванических развязок, среди ко
торых — совершенно новый тип развязок на основе использования свойств электромагнит
ного поля.
Для иллюстрации применения на практике новых преобразователей интерфейса RS232 во
второй части главы приводятся готовые схемные решения по сопряжению микроконтроллеров
с компьютером по этому интерфейсу. Эти схемы сопряжения в основном предназначены для
программирования микроконтроллеров, а для штатного режима их работы — только для тести
рования самого обмена по RS232. В свою очередь, на эти схемы сопряжения автор будет ссы
латься во второй главе, где будут приведены программные средства для обмена по RS232.

1.2. Новые преобразователи интерфейса RS232


Новые преобразователи интерфейса RS232 обладают несомненными преимуществами
(высокой скоростью обмена, малыми габаритами и потреблением энергии, а также достаточ
но низкой стоимостью) перед использующимися ранее, например: MAX318X, MAX3190,
ADM3202, MAX1406. Кроме того, переход на 3вольтовое питание, которое стало поддержи
ваться многими современными микроконтроллерами, позволил поновому подойти к исполь
зованию стандартных преобразователей интерфейса (например ADM231L).
Другой пример — двунаправленный преобразователь SN75155 (корпус DIP8), кото
рый давно уже не используется, также очень удобно применять в таких приложениях.

16 17
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 НОВЫЕ ПРЕОБРАЗОВАТЕЛИ ИНТЕРФЕЙСА RS232

Микросхема ADM3202 от ф. Analog Devises отличается высокой скоростью работы нала драйвера составляет ±10 В при работе на 2 входа приемника (т. е. на нагрузку в 2,5 кОм).
(до 460 кбод); емкости конденсаторов, требуемых для работы преобразователя, реаль Недостатками микросхемы являются стандартное (не пониженное) потребление энергии и не
но не превышают 0,1 мкФ; микросхема может работать и при Vcc=+3 В, и при Vcc=+5 В. возможность работы с микроконтроллером при питании его от +3 В (при 5вольтовом питании
Размах сигнала драйвера (передатчика) RS232 реально составляет ±10 В (Vcc=+5 В) и микроконтроллера микросхема работает идеально).
±6 В (Vcc=+3 В) при работе на нагрузку в 5 кОм. Сигнал очень чистый, без какихлибо па
разитных искажений. Кроме того, ADM3202 отличается пониженным потреблением 1.2.2. Нетрадиционные преобразователи интерфейса RS232
энергии (особенно при питании от +3 В).
Помимо специализированных микросхем преобразователей интерфейса RS232, о которых
Микросхема ADM231L этой же фирмы также реально работает на скорости 115 кбод
было рассказано выше, существуют электронные компоненты, вообще говоря, не являющимися
(в ее описании указывается, что максимальная скорость обмена составляет 230 кбод),
преобразователями, но которые можно использовать в качестве таких преобразователей. О неко
емкости конденсаторов не превышают 1,0 мкФ. Размах сигнала драйвера повышен и
торых таких компонентах было рассказано в первой части книги [4]. Ниже представлены компонен
составляет ±11,5 В при питании от первого источника питания V+=+12 В при работе на
ты, не вошедшие в первую часть книги. Это КМОПтранзисторы прямой (BS250 от ф. Vishay) и обрат
нагрузку 5 кОм. Уникальной особенностью микросхемы является независимость разма
ной (2N7000 от ф. Fairchild или Vishay) проводимости с изолированным затвором и КМОПкоммута
ха сигнала драйвера от напряжения второго источника питания Vcc, которое может быть
тор (DG419 от ф. Vishay).
и +3 В, и +5 В. Сигнал также имеет высокую чистоту без паразитных составляющих.
Кратко охарактеризуем их свойства, внутреннюю структуру и цоколевку.
ADM231L отличается пониженным потреблением энергии.
Микросхема MAX1406 от ф. MAXIM отличается высокой скоростью работы (до 230 кбод),
повышенным размахом сигнала драйвера (±11,5 В) при работе на нагрузку в 5 кОм, независи
мостью этого размаха от напряжения Vcc и высокой чистотой сигнала. Микросхема питается от
3 источников питания (V+=+12 В, V–=–12 В и Vcc=+3÷+5 В), в связи с чем она не содержит
преобразователей (удвоителей и инверторов напряжения, как, например, ADM3202 и
ADM231) и не требует большого количества конденсаторов для работы. Особенностью микрос Рис. 1.2.2.1.
хемы является наличие 3 приемников и 3 передатчиков, что, как будет видно из дальнейшего Нетрадиционные преобразователи интерфейса RS232
изложения, позволяет сопрячь с ее помощью компьютер с микроконтроллером (который может
Транзисторы выпускаются в корпусе TO92 (см. рис. 1.2.2.1). Сопротивление транзисторов
работать как в режиме программирования, так в штатном режиме) без какихлибо дополни
в открытом состоянии составляет около 10 Ом, максимальный ток стока — чуть более 200 мА,
тельных преобразователей интерфейса RS232. MAX1406 отличается пониженным потреблени
максимальное напряжение стокисток — не более 50÷60 В, время включения и выключения
ем энергии.
— около 10 нс, мощность рассеяния — около 0,5 Вт. Максимальное напряжение затвористок
Микросхема передатчика RS232 MAX3190 от ф. MAXIM отличается повышенной скоростью
(Uзи _max) составляет ±20 В. Последнее свойство позволяет подключать затвор транзистора
работы (до 460 кбод), имеет размах сигнала драйвера до ±10 В при работе на два входа прием
непосредственно к линиям RS232 (напомню, что сигнал передатчика RS232 составляет около
ников (т. е. на нагрузку в 2,5 кОм) при питающих напряжениях V+=+12 В и V–=–12 В. Кроме то
±10÷±12 В), в связи с чем транзисторы могут использоваться в качестве приемников RS232.
го, она потребляет очень мало энергии при работе и может быть переведена в режим сверхниз
Единственное, что необходимо предусмотреть, — это нагрузочный резистор номиналом в
кого потребления — в «спящий» режим. Особенностью микросхемы является уникально малый
5 кОм, который следует подключить между затвором и общим проводом («землей»), т. к. со
корпус SOT236 размером 3×3 мм.
противление (изолированного) затвора транзисторов составляет сотни MOм, а стандарт
Микросхемы приемников MAX3181 и MAX3183 от ф. MAXIM работают на сверхвысокой
RS232 предусматривает входное сопротивление приемника в 5 кOм.
скорости для интерфейса RS232 (до 1,5 Мбод), отличаются сверхнизким потреблением энер
гии и уникально малым корпусом SOT235 размером 3×3 мм. Микросхема MAX3181 являет
ся инвертирующим приемником, как и подавляющее большинство всех микросхем приемни
ков RS232, а MAX3183 — не инвертирующим, что является уникальным свойством, позволя
ющим, как будет видно из дальнейшего изложения, напрямую подключать к нему вход RST
микроконтроллера с активно низким уровнем (например P89LPC9XX).
И наконец последняя микросхема, которую хотелось бы представить, — это микросхема
SN75155 от ф. Texas Instruments, в которой в одном корпусе всего с 8 выводами (DIP8, SOIC8)
размещается и приемник, и передатчик. Микросхема не нова, однако мало где применяется и
особой популярностью не пользуется, а зря. Микросхема реально работает на высокой скорос а) б)
ти (115 кбод), требует всего 2 источников питания (V+=+12 В, V–=–12 В), т. к. источник пита
ния +5 В встроен. В связи с этим для ее работы не требуется дополнительных конденсаторов Рис. 1.2.2.2.
Схемы применения транзисторов 2N7000 и BS250 в качестве приемников
для инверторов и удвоителей напряжения (как, например, у ADM3202 и ADM231L). Размах сиг интерфейса RS232: инвертирующих (а) и неинвертирующих (б)

18 19
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

Из приведенных вариантов использования КМОПтранзисторов 2N7000 и BS250 в каче На рис. 1.2.2.3 приведены примеры использования коммутатора DG419 в качестве пре
стве преобразователей интерфейса RS232 — инвертирующих и неинвертирующих приемни образователя интерфейса RS232 — приемника (инвертирующего и неинвертирующего) и пе
ков RS232 (рис. 1.2.2.2) — видно, что транзисторы могут использоваться в ключевом режиме редатчика (инвертирующего). Схемы достаточно просты и в комментариях не нуждаются.
как в схемах с общим истоком (классический ключ) — в таком режиме работают инвертирую
щие приемники, так и с общим стоком (истоковый повторитель) — в таком режиме работают
неинвертирующие приемники. Схемы достаточно просты и в особых комментариях не нужда
ются.
Проверка работы схем заключалась в подаче на затвор транзистора сигнала меандра
частотой 115 200 Гц, сформированного передатчиком микросхемы ADM3202, и наблюдении а) б)
выходного сигнала. Во всех случаях выходной сигнал представлял собой практически прямо
угольный меандр.
***
Рис.1.2.2.3.
Микросхема коммутатора DG419 выпускается в корпусе SOIC8 или DIP8. Напряжения питания Схемы применения коммутатора DG419 в качестве преобразователя
V+, V– и VL лежат в следующих пределах: V+=+10÷+15 В, V–=–10÷–15 В, VL=+3÷+5 В. Сопро интерфейса RS232: инвертирующего (а) и неинвертирующего (б)
приемника и инвертирующего передатчика (в)
тивление коммутатора в открытом состоянии составляет около 20 Ом. Коммутатор управляется нап в)
ряжением, поданным на его управляющий вход (вывод 6). При лог. 1 на управляющем входе выво
ды 1й и 8й замыкаются, на что указывает символ «1», стоящий над контактом 8. При лог. 0 замыка
Практическое применение как специализированных микросхем преобразователей
ются контакты, связанные с выводами 2м и 8м (при этом контакты 1й и 8й размыкаются).
RS232, так и нетрадиционных преобразователей, будет более понятно, когда будут рассмотре
Микросхема DG419 от ф. Vishay по своей структуре и функциям не отличается от микросхем
ны конкретные схемы сопряжения компьютера с микроконтроллерами.
ADG419 от ф. Analog Devices и DG419 от ф. MAXIM, приведенных в первой части книги [4].
Однако есть одно и очень существенное отличие в свойстве управляющего входа. Дело в том,
что коммутатор управляется сигналом, поданным на его управляющий вход (6й вывод), и этот
сигнал в коммутаторах ADG419 (Analog Devices) и DG419 (MAXIM) должен строго соответство
1.3. Примеры применения новых преобразователей
вать TTLуровню ( лог. 0 — от 0 до +0,8 В и лог. 1 — от +2,4 до +5 В при VL=+5 В, V–=–12 В, V+=+12 В). для сопряжения микроконтроллеров с компьютером
При подаче на этот вход управления сигнала ниже 0 В (например –10 В) эти две микросхемы ав по интерфейсу RS232
томатически коммутируют этот сигнал на «землю», т. к. оснащены входными диодами, защища
ющими вход управления от отрицательных напряжений (ниже 0 В). У микросхемы DG419 от 1.3.1. Предварительные замечания
ф. Vishay таких ограничительных диодов нет, поэтому при VL=+5 В уровень напряжения управ
ляющего сигнала Uупр. в состоянии лог. 0 должен находиться в пределах V–<Uупр.<0,8 В, а в Вначале несколько слов по поводу оценочных и «эволюционных» плат, мастерKIT'ов, эму
состоянии лог. 1 — в пределах +2,4 В<Uупр.<V+. Если V+=+12 В, а V–=–12 В, то при Uупр.=±10 В ляторовпрограмматоров и тому подобных устройств, предназначенных для «быстрой» раз
(уровни интерфейса RS232) микросхема прекрасно работает и выполняет свои функции. Кро работки аппаратных и программных средств на базе микроконтроллеров. Эти устройства вы
ме того, вход управления можно смело подключать напрямую к сигналам с уровнями пускаются либо самими производителями микроконтроллеров, либо «третьими» фирмами.
RS232, не боясь что вход будет «закорочен» на «землю». Разработчику любой системы, состоящей из компьютера и устройства связи с объектом (УСО),
Сопротивление открытого канала коммутатора DG419 Vishay (20 Ом) чуть больше, чем у сопряженного с ним по интерфейсу RS232, необходимо помнить следующие моменты по аппарат
DG419 MAXIM (4 Ом) и меньше, чем у ADG419 Analog Devices (35 Ом). Стоимость DG419 Vishay ным и программным средствам сопряжения вышеуказанных устройств с компьютером.
примерно в 2 раза меньше, чем ADG419 Analog Devices и примерно в 3 раза меньше чем DG419 Сначала об аппаратных средствах сопряжения предлагаемых устройств.
MAXIM. Таким образом, DG419 Vishay может работать приемником RS232. Единственно, Аппаратные средства сопряжения этих устройств имеют следующие особенности:
что необходимо предусмотреть — это нагрузочный резистор в 5 кОм (в соответствии со стан
дартом RS232), который необходимо подключить между управляющим входом и общим про  в подавляющем большинстве случаев схемы сопряжения не приводятся или приводят
водом («землей»), т. к. входное сопротивление микросхемы составляет несколько МОм (потреб ся с ошибками;
ление энергии DG419 сверхнизкое). На вход VL можно также подавать не только +5 В,  если схемы и приводятся, разработчик вынужден либо копировать их в своих разра
но и +3 В и даже меньше. При этом просто немного поменяется порог срабатывания. ботках (что не всегда приемлемо, т. к. элементная база, используемая в таких устрой
Кроме того, DG419 может работать и как передатчик RS232. В отличие от «родного» пере ствах, или безнадежно устарела, или, наоборот, состоит из микросхем, которые у нас
датчика, т. е. от специализированной микросхемы передатчика RS232, у DG419 более крутые труднодоступны), либо хотя бы следовать той логике сопряжения, которая приводится,
фронты (намного круче, чем 30 В/мкс). На расстояниях до 10÷15 м (расстояние от компьюте иначе поставляемое программное средство работать не будет, а вот логика сопряже
ра до микроконтроллера) это свойство ни к каким негативным результатам на приводит. ния у разработчика как раз таки должна быть своя;

20 21
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

 часто приводимые аппаратные средства сопряжения очень громоздки и в них трудно ра бы побочным продуктом основной специализации. Поэтому автор с легким сердцем «отдает»
зобраться, а разбираться все равно необходимо, иначе, если собственная разработка рабо принципиальные схемы сопряжения и исходные тексты программ.
тать не будет, трудно, либо вообще невозможно, определить причину неисправности; Кроме того, приведенные в книге аппаратные и программные средства сопряжения между
 если схема сопряжения реализована даже по интерфейсу RS232, то различные микроконтроллером и компьютером по интерфейсу RS232 работают ничуть не хуже, а даже лучше
устройства поразному управляют состояниями микроконтроллера: одни, напри «фирменных», если, например, сравнивать не «красоту» и универсальность программных средств
мер, управляют выводом RST микроконтроллера от линии DTR RS232 компьютера, устройств (описанных выше), а характеристики их обмена с компьютером по RS232 — скорость,
другие используют линию RTS, третьи устанавливают микрокнопку, нажав на кото надежность обмена и простоту схемных решений. Все «фирменные» программные средства для
рую можно сформировать сигнал RST и «сбросить» микроконтроллер; иногда для нижеприведенных микроконтроллеров (кроме программных средств для микроконтроллеров от
сопряжения используется сразу два порта RS232 компьютера и т. п. ф. ATMEL) работают на скорости, не превышающей 38 400 бод, и даже на этой скорости програм
мы часто «зависают». Нельзя не убедиться еще и в том, насколько «фирменные» схемы сопряже
Программные средства сопряжения подобных устройств с компьютером по RS232 имеют
ния с компьютером громоздки и часто сконструированы на «допотопной» элементной базе.
еще больше недостатков:
Насколько же просты схемы сопряжения, предложенные автором, читатель сможет убедиться уже
 исходные тексты программ, естественно, не приводятся, а предлагаются уже готовые через несколько страниц. Кроме того, все без исключения аппаратные средства и поддерживаю
программы исполняемого формата (*.exe); щие их программные средства идеально работают на скорости обмена 115 200 бод (разумеется,
 программы используют драйверы, которые необходимо установить в компьютере и на более низких скоростях они также работают).
которые часто конфликтуют с другими программами; Теперь, когда, повозможности, все оговорки сделаны, перейдем к делу.
 скорость обмена по RS232 очень низкая (практически не более 9600 бод); при установ
ке более высокой скорости в подавляющем большинстве случаев обмен срывается. ***
В качестве иллюстраций, показывающих применение новых преобразователей на практи
Вышеуказанные недостатки аппаратных и программных средств сопряжения таких
ке, ниже приведены схемы сопряжения микроконтроллеров MSC121X (ф. Texas Instruments),
устройств не позволяют использовать их даже в достаточно простых разработках, а уж о
ADUC8XX (ф. Analog Devices), P89LPC9XX (ф. Philips semiconductor), AT89C51ED2 (ф. ATMEL) и
серьезных и говорить не приходится.
C8051FXXX (ф. Silicon Laboratories) с компьютером для целей программирования и штатного
Единственное преимущество таких устройств в том, что они позволяют быстро написать и
режима работы. Выбор именно этих микроконтроллеров обусловлен следующими причинами.
проверить работоспособность какойлибо программы для микроконтроллера. Но после этого,
Вопервых, эти микроконтроллеры поддерживают внутрисистемное программирование (ISP)
когда нужно уже разработать собственное аппаратное средство сопряжения для своей разра
и именно по интерфейсу RS232 (кроме C8051FXXX). Напомню, ISP — свойство микроконтролле
ботки и написать программы сопряжения и для микроконтроллера, и для компьютера (не по
ров, заключающееся в том, что загрузка программы в микроконтроллер происходит прямо на
тащишь же какуюлибо оценочную плату заказчику!), «эйфория» от быстрой разработки какой
том же устройстве (точнее — готовом изделии), которое предназначено для использования. Ес
либо программы для микроконтроллера очень скоро проходит, оценочная плата убирается «до
ли устройство (например система сбора) обменивается в процессе своей работы с компьютером
лучших времен», и разработчик вынужден делать все сам и с самого начала.
по интерфейсу RS232 и программируется по этому же интерфейсу в режиме ISP, то никаких до
Вот здесь, по мнению, автора, и могут пригодиться те примеры сопряжения микроконт
полнительных устройств, специально предназначенных для программирования микроконтрол
роллеров с компьютером по RS232, которые приводятся далее. Кроме того, автор «не броса
леров (программаторов, эмуляторовпрограмматоров и т. п.), не требуется.
ет» разработчика только на одних аппаратных средствах схем сопряжения. Для некоторых из
Следует отметить, что режим ISP микроконтроллеров не обязательно должен иметь интер
них во второй главе приводятся тексты программ (с комментариями) как для микроконтролле
фейс RS232. Существует микроконтроллеры, которые могут быть запрограммированы в режи
ра, так и для компьютера.
ме ISP и по другим интерфейсам. Например, микроконтроллеры AT89SXX (ф. ATMEL) поддер
И еще об одном. Вышеуказанные устройства с поддерживающим их программным обес
живают ISP по интерфейсу SPI; микроконтроллеры C8051FXXX (ф. Silicon Laboratories) —
печением, как уже говорилось, достаточно дoроги (десятки и сотни долларов); предлагаемые
по интерфейсу JTAG и C2 и т. п. Поскольку компьютер не имеет этих интерфейсов, необходимо
же автором схемы и программное обеспечение (исходные тексты программ — в книге, испол
приобретать дополнительные устройства, предназначенные для программирования микроко
няемые файлы — на сайте автора) совершенно бесплатны.
нтроллеров и использующие интерфейсы, имеющиеся у компьютера (USB, RS232, принтерный
И наконец последнее. Автор ни в коем случае не отговаривает разработчиков от приоб
параллельный порт). Стоимость таких устройств, как уже говорилась, весьма высока и может
ретения подобных устройств. В конце концов — это дело вкуса и средств. Цель настоящей кни
достигать десятков и сотен долларов.
ги — показать, каким образом сконструировать схемы сопряжения микроконтроллера и
Вовторых, 3 из отмеченных 5 семейств микроконтроллеров (MSC121X, ADUC8XX,
компьютера и написать соответствующее программное обеспечение, и не более того. Автор
P89LPC9XX), помимо ISP по RS232, обладают еще 2 свойствами, которые намного упрощают
никоим образом не специализируется на разработке, производстве и тем более — продаже
конструирование систем сбора на их основе: встроенные прецизионный системный таймер
устройств для программирования микроконтроллеров по интерфейсу RS232. Основная специ
(разрядностью 23÷24 бита) и АЦП (разрядностью 10÷24 бита).
ализация автора — разработка и производство компьютерных систем сбора на базе микро
Выбор микроконтроллера AT89C51ED2, не имеющего в своем составе ни аналогоцифрового
контроллера и компьютера. Проблема, затронутая автором в настоящей книге, является как
пребразователя, ни системного таймера, обусловлен более существенными причинами, чем нали

22 23
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

чие этих 2 компонент. Эти причины будут приведены несколько позже, а сейчас несколько слов о Микросхем Σ∆АЦП существует великое множество. Один из них — ADS1210 от ф. BurrBrown
свойствах АЦП, требуемых для конструирования систем сбора. (вошедшей сейчас в ф. Texas Instruments). Этот АЦП показал уникальные результаты и использует
АЦП, который используется в системах сбора, по мнению автора, должен обладать следу ся в системах сбора, сконструированных автором, которые работают уже на протяжении многих
ющими свойствами: лет в нескольких организациях (см. приложение 2). Кроме того, микросхема ADS1210P имеет кор
пус DIP18 удобный для макетирования, что также является его несомненным достоинством.
 точность АЦП должна составлять не менее 16 разрядов,
К какому микроконтроллеру следует подключать такой АЦП? Естественно, к такому, кото
 АЦП должен быть оснащен самокалибровкой «нуля» и полной шкалы,
рый имеет ISP по RS232, обладает возможностью работы с периферийными устройствами по
 метод преобразования должен быть Σ∆, т. к. этот метод не может обойтись без
параллельной шине АДРЕС/ДАННЫЕ (т. е. имеет сигналы ALE, RD и WR), может работать от ис
встроенных цифровых фильтров, которые, помимо своей основной работы
точника питания в 3 и 5 В (т. к. некоторые периферийные устройства, например, таймеры
(фильтрации высокочастотного шума модулятора), прекрасно отфильтровывают и
82C54 работают только при питании 5 В); кроме того, хорошо бы, чтобы такой микроконтрол
низкочастотный шум, присутствующий в трактах измерений сигналов с датчиков.
лер имел бы корпус, удобный для макетирования (например PLCC). Вот здесь как раз и может
Кроме того, цифровой фильтр имеет полюс на частоте питающей сети 50 Гц зна
использоваться микроконтроллер AT89C51ED2 (обладающий всеми вышеперечисленными
чением до –|120÷150| дБ,
свойствами и многими не перечисленными выше).
 скорость АЦП одного канала должна составлять несколько сотен Гц (лучше не менее
В связи с вышеизложенным, автор счел необходимым включить в книгу рассмотрение
1000 Гц) при достаточно многоканальной системе сбора (8÷16 каналов), т. к. поми
сопряжения этого микроконтроллера с компьютером по интерфейсу RS232.
мо собственно аналогоцифрового преобразования АЦП должен еще проводить ка
Теперь несколько слов о микроконтроллерах семейств C8051FXXX от ф. Silicon Labortories
либровку «нуля», полной шкалы, устанавливать цифровой фильтр и, кроме того, «про
(в которую вошла бывшая ф. Cygnal). Автором были опробованы в работе и протестированы
пускать» однодва «холостых» преобразования перед тем, как осуществить рабочее
2 микроконтроллера этой фирмы: C8051F067 и C8051F330D. Почему были выбраны именно
преобразование (а каждое такое действие требует времени в 2÷3 раза больше, чем
эти микроконтроллеры?
собственно аналогоцифровое преобразование). В связи с этим нетрудно подсчитать,
Микроконтроллер C8051F067 имеет в своем составе сдвоенный высокоскоростной 16
что скорость получения рабочего аналогоцифрового преобразования одного канала
разрядный АЦП последовательных приближений («SAR», как его называют), который обладает
примерно на порядок меньше скорости работы самого Σ∆ АЦП (т. е. если частота АЦП
уникальным быстродействием (до 1 МГц), поэтому заманчиво было бы применить такой мик
1000 Гц, то частота рабочего аналогоцифрового преобразования одного канала бу
роконтроллер в системах сбора. Микроконтроллер расположен в корпусе TQFP64 (аналогич
дет составлять не более 100 Гц).
ном корпусу MSC1210). Для таких корпусов автором еще в [4] был предложен переходник
А теперь посмотрим, что мы имеем от встроенных АЦП трех вышеуказанных семейств мик TQFP64PGA64 для удобства ручного макетирования.
роконтроллеров. Микроконтроллер C8051F330D — относительно новый и является одним из всего 2 мик
АЦП микроконтроллеров семейств P89LPC9XX имеют точность только 10 разрядов, роконтроллеров семейства C8051FXXX, имеющих корпус DIP(20 или 24), пригодный для маке
не имеют ни калибровки нуля, ни полной шкалы, ни НЧфильтров, т. к. они являются не Σ∆, а тирования. Кроме того, этот микроконтроллер содержит в своем составе 10разрядный АЦП,
АЦП последовательных приближений. В связи с этим эти микроконтроллеры имеют очень который может быть сконфигурирован как АЦП с несколькими входами (до 16). (Есть, правда,
ограниченное применение в системах сбора. еще один микроконтроллер в корпусе DIP14 (C8051F300P), но у него только 8разрядный АЦП,
АЦП микроконтроллеров семейств MSC12XX хотя и являются Σ∆, но дают приемлемую точность и он относительно нераспространен.)
(около 14÷15 разрядов) на частоте не более 100 Гц, т. е. частота рабочего аналогоцифрового пре Оба микроконтроллера имеют ISP: C8051F067 — по интерфейсу JTAG, C8051F330D — по
образования одного канала составляет не более 10 Гц. В связи с этим эти микроконтроллеры могут интерфейсу C2. Тестирование проводилось с использованием USBDEBUGадаптера.
быть использованы в сравнительно малоканальных системах сбора (не более 2÷5 каналов). В этом При тестировании возникли проблемы, с которыми автор хотел бы поделиться с чи
случае общее время аналогоцифрового преобразования всех каналов будет составлять соответ тателем. Но вначале о проблемах, которые можно почерпнуть из самих описаний на микроко
ственно 2÷5 Гц. Поэтому если от системы сбора требуется оперативная информация каждые, напри нтроллеры (datasheet). Перечислим проблемы вместе с методами их «снятия».
мер, 0,1 с, а каналов 8÷16, то АЦП таких микроконтроллеров просто «не потянут» по скорости. Вопервых, для целей ISP требуется приобретать не оченьто дешевый USBDEBUGадап
АЦП микроконтроллеров семейств ADUC8XX еще медленнее (частота работы их АЦП тер (стоимостью около 2000 руб.).
около 70÷80 Гц). Поэтому они могут быть использованы в еще более «медленных» систе Вовторых, микроконтроллер C8051F067 не имеет средств работы с внешней па
мах сбора. Тем не менее семейства микроконтроллеров MSC12XX и ADUC8XX не следует мятью программ/данных (у него отсутствуют сигналы ALE, WR и RD) и поэтому не может ра
сбрасывать со счетов. ботать автоматически с периферийными устройствами (например с таймерами 82C54).
Что же делать, если требуется многоканальная система сбора (8÷16 каналов), а обнов Данная проблема в принципе легко снимается путем «ручного» программирования подоб
ление информации по АЦП должно проводиться, например, каждые 0,1 с? Ответ напрашива ного сопряжения, тем более что этот микроконтроллер довольно быстрый (инструкция вы
ется сам собой: либо использовать внешний достаточно быстрый Σ∆АЦП, который может полняется за 12 такта).
проводить аналогоцифровое преобразование с частотой не менее 1000 Гц, либо применять Втретьих, микроконтроллер не может работать напрямую с внешними устройствами,
микроконтроллер со встроенным достаточно быстрым АЦП. имеющими 5вольтовое питание (с теми же таймерами 82C54 и с другими устройствами),

24 25
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

т. к. питание микроконтроллера производится от источника питания до 2,7÷3,6 В. Эта проб Если бы проблем было немного, то можно было бы вполне использовать микроконтролле
лема решается с помощью использования микросхем двунаправленных преобразователей ры семейств C8051FXX в системах сбора. Наличие же такого количества (хотя частично и «сни
уровней +3 В+5 В (например ADG3300 от ф. Analog Devices). маемых») неудобств делают использование этих микроконтроллеров в многоканальных, доста
Вчетвертых, и это уже существенно, SARАЦП не имеет низкочастотных фильтров. Эта точно универсальных системах сбора весьма проблематичным.
проблема может быть снята двумя способами: аппаратным (с помощью НЧфильтров на опе Тем не менее автор счел необходимым привести схему сопряжения микроконтроллеров
рационных усилителях либо пассивных, например LC или RC) или программным — с по семейств C8051FXX с компьютером по интерфейсу RS232 не для целей программирования,
мощью программирования цифровых фильтров непосредственно в микроконтроллере (при а только для штатного режима работы. Для целей программирования приведена схема соп
его быстродействии это вполне реально; в разделе «Применения» (Application) по этому ряжения этих микроконтроллеров с интерфейсами JTAG (C8051F067) и C2 (C8051F330)
микроконтролеру даже приводятся образцы подобных программ (см. www.silabs.com). USBDEBUGадаптера. В разделе, посвященном программному обеспечению, будут приве
Впятых, эти микроконтроллеры содержат так называемую матрицу соединений, разобрать дены программы обмена информацией с компьютером по интерфейсу RS232, использую
ся с которой не такто просто. Чтобы вывести, например, байт по интерфейсу RS232 нужно сделать щие аппаратную синхронизацию с помощью линий данных TxD и RxD для микроконтролле
массу манипуляций с этой матрицей (в качестве примера в разделе по программному обеспече ров C8051F330D и C8051F067. Надеюсь, эти схемы сопряжения будут интересны читателю,
нию приводятся 2 программы по выводу символа через интерфейс RS232). т. к. они позволяют, по крайней мере, отказаться от покупки дорогостоящих эволюционных
Вшестых (и это уже показало тестирование), все микроконтроллеры семейства или оценочных плат на эти микроконтроллеры (толку от которых, как уже указывалось, нем
C8051FXXX не позволяют управлять портами ввода/вывода, если они заняты альтернативны ного) и ограничиться только приобретением не такого уж дорогого (55–60 долл.) USB
ми функциями. В частности, если, например, выбраны 2 порта ввода/вывода для интерфейса DEBUGадаптера.
RS232 (p0.0TxD, p0.1RxD для микроконтроллера C8051F067 и p0.4TxD, p0.5RxD для микро
контроллера C8051F330D), т. е. выбраны альтернативные функции, то линией TxD для уста 1.3.2. Управление состояниями микроконтроллера
новки ее в произвольное состояние уже управлять нельзя (хорошо еще, что прочитать с помощью компьютера по интерфейсу RS232
состояние линии RXD можно). По этому выводу можно только передавать байты по RS232 Для запуска и внутрисистемного программирования (ISP) на определенные выводы мик
стандартным образом (из SBUF). Для управления этими линиями (т. е. для их установки в 0 или
роконтроллера необходимо подавать два управляющих сигнала. Первым таким выводом явля
1 необходимо отключить альтернативную функцию (в данном случае обмен по RS232). При
ется вход сброса (RESET–RST).
чем, эта функция отключается только одним битом, поэтому, например, нельзя отключить ли
Практически все микроконтроллеры (кстати сказать, и микропроцессоры) имеют вход
нию TxD (для управления, например, синхронизацией) и оставить линию RxD. Это очень суще
сброса (RST), который предназначен для полного сброса микроконтроллера и запуска его в
ственное упущение разработчиков этих микроконтроллеров, которое делает невозможным
работу. В подавляющем числе микроконтроллеров этот вход RST имеет активный высокий уро
(без дополнительных аппаратных средств) обмен по RS232 между микроконтроллерами и
вень, т. е. если подать на вход RST уровень лог. 1, то микроконтроллер будет сброшен и оста
компьютером с помощью нового алгоритма, разработанного автором. Напомню, что подоб
новлен. При подаче на вход RST лог. 0 микроконтроллер включается в работу — «запускается».
ный алгоритм обмена заключается в аппаратной синхронизации каждого байта, но не линия
У микроконтроллеров семейств MSC121X, ADUC8XX и AT89C51ED2(RD2) вход RST как раз и
ми квитирования DTRDSR или RTSCTS, а линиями данных TxD и RxD (более подробно об этом
является таковым, т. е. имеет активный высокий уровень.
алгоритме обмена можно прочитать в [4] и в разделе по программному обеспечению в насто
Семейства же P89LPC9XX и C8051FXXX отличаются тем, что вход RST у них имеет активно
ящей книге). Данная проблема может быть решена аппаратным способом следующим образом.
Предположим, нужно управлять линией TxD (т. е. устанавливать ее в 0 или 1) и одновре низкий уровень, т. е. подача на вход RST лог. 0 останавливает и сбрасывает эти микроконтрол
менно использовать ее в качестве вывода байта по RS232. Если взять дополнительный вывод леры, а подача лог. 1 — запускает.
микроконтроллера, управлять которым разрешено матрицей соединений, и подключить его к Помимо уровня сигналов, вывод RST характеризуется еще и тем, что это именно вход,
одному из входов элемента И, а ко второму — вывод микроконтроллера TxD, то на выходе та т. е. он предназначен для того, чтобы им управлять извне. Как правило, если RST имеет ак
кого элемента И можно получить требуемое (далее будет приведена подобная схема). тивный высокий уровень, то в микроконтроллере он соединен с внутренним подтягиваю
Другое решением этой проблемы — отказаться от такого алгоритма обмена вообще и исполь щим резистором номиналом в несколько сот кOм, подключенным к общему проводу («зем
зовать программную синхронизацию (например известный алгоритм XonXoff). ле»). Так, например, значение этого подтягивающего резистора в микроконтроллерах
И наконец вседьмых: корпус TQFP64 очень неудобен для макетирования. Решение MSC12XX составляет около 500 кOм, в ADUC8XX — около 100 кOм. Если же RST имеет ак
этой проблемы — в использовании платыпереходника, разработанного автором для мик тивный низкий уровень, то подтягивающий резистор подключен к шине питания. Напри
роконтроллеров MSC12XX, имеющих такой же тип корпуса. Но попробуйте вручную распа мер, в микроконтроллерах P89LPC9XX значение этого подтягивающего резистора, подклю
ять корпус с 64 ножками, расстояния между которыми составляет всего 0,5 мм, а ширина ченного к шине питания, составляет около 20 кOм.
ножки — 0,3 мм! Хотя это и возможно, но является не такойто уж простой задачей. Забе Кроме того, поскольку вывод RST является входом, его можно либо непосредственно со
гая немного вперед, отметим, что далее в книге приведены фотографии подобных платпе единять с шиной питания или общим проводом, либо управлять им двухтактным сигналом
реходников с уже распаянными на них микроконтроллерами. В этом смысле гораздо удоб (который имеют все современные микросхемы (логики) и который еще называют пушпульным
нее использовать корпус PLCC68 (как, например, у AT89C51ED2). — от английских слов «push» и «pull»).

26 27
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

Необходимо отметить, что вывод RST в микроконтроллере является основным. Это озна значение регистра управления 3fch равно 0, то линии DTR и RTS сброшены, т. е. находятся в
чает, что он используется как при запуске и сбросе микроконтроллера, так и при его програм состоянии лог. 0 и (обe) имеют потенциалы в –10 В. Записав, например, в порт 3fch
мировании. единицу, получим: DTR=+10 В, RTS=–10 В.
При программировании микроконтроллера по ISP (по RS232) используется еще один до Начальные состояния линий DTR и RТS — сброшенные, т. е. при включении компьютера
полнительный вывод, при подаче на который определенного сигнала микроконтроллер пере и загрузке в него той или иной операционной системы DTR=RTS=–10 В.
водится в режим программирования. Иногда этот сигнал используется не самостоятельно, а Для управления выводами RST и PSEN семейств микроконтроллеров MSC12XX, ADUC8XX
совместно с сигналом, поданным на вывод RST (т. е. перевод микроконтроллера в режим ISP и AT89C51ED2(RD2) и выводами RST и Vdd семейств микроконтроллеров P89LPC9XX и
производится путем манипулирования уровнями и длительностью обоих сигналов). C8051FXXX (только RST) можно (и нужно) использовать сигналы линий DTR и RTS. Причем при
В микроконтроллерах MSC12XX, ADUC8XX и AT89C51ED2(RD2) таким вторым выводом составлении схем сопряжения необходимо «подгадать» таким образом, чтобы при включении
является вывод PSEN, одно из назначений которого — управлять микросхемами внешней компьютера все (из рассматриваемых) микроконтроллеры находились в состоянии сброса,
памяти программ. В этом случае вывод PSEN является уже не входом, а выходом, т. е. он вывод PSEN у семейств MSC12XX, ADUC8XX и AT89C51ED2 находился бы в состоянии лог. 1
«сам» подает определенные сигналы на упомянутые микросхемы. В этих трех семействах (штатный режим работы), а питание (вывод Vdd) у семейств P89LPC9XX было бы включено
микроконтроллеров вывод PSEN соединен с внутренним подтягивающим резистором номи (также штатный режим).
налом около 10 кOм, подключенным к шине питания. Свойство PSEN являться выходом Для управления выводом RST лучше всего использовать сигнал DTR (т. к. для управле
не позволяет ни непосредственно соединять его с шиной питания или общим проводом, ни ния им используется самый младший бит регистра управления), а для PSEN или Vdd — сиг
управлять им двухтактным сигналом (в некоторых случаях, когда двухтактный сигнал не нал RTS.
очень мощный, т. е. когда ток такого сигнала не превышает нескольких мА в состоянии лог. 0 Тогда, например, для запуска микроконтроллеров достаточно записать в регистр 3fch
и 1÷2 мА в состоянии лог. 1, такое управление допускается). Для подачи на этот вывод единицу. И вообще, для манипулирования выводами RST, PSEN или Vdd достаточно записы
уровня лог. 0 необходимо к нему подключить резистор номиналом в 1 кOм, соединенный вать в регистр управления ту или иную комбинацию из нулей и единиц (а их, понятно, четыре:
с «землей». Для подачи уровня лог. 1 вывод PSEN можно либо просто оставить свободным в двоичном виде — 00; 01; 10 и 11, в шестнадцатеричном — 0; 1; 2 и 3).
(напомню, что у него есть собственный подтягивающий к шине питания резистор), либо со Итак, подытожим все вышесказанное по поводу управления состояниями микроконтрол
единить с шиной питания через высокоомный резистор. Для соблюдения необходимых вре леров с помощью интерфейса RS232 компьютера.
менных соотношений (иногда с точностью до 1 мкс) при манипулировании сигналом на вы 1. В начальном состоянии интерфейса RS232 (линии DTR и RТS сброшены, т. е. находятся
воде PSEN этот высокоомный резистор не должен превышать 10÷100 кOм, чтобы не затя под потенциалами в –10 В) микроконтроллеры должны находиться в сброшенном сос
гивать длительности фронтов и спадов (свыше, например, 1 мкс). В идеале резистор должен тоянии (RST микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2)
быть около 10 кOм. Для перевода микроконтроллеров семейств MSC12XX, ADUC8XX и должен быть в состоянии лог. 1, т. е. под потенциалом питания (3 или 5 В), а RST
AT89C51ED2(RD2) в режим ISP вывод PSEN должен находиться в состоянии лог. 0. В штат семейств микроконтроллеров P89LPC9XX и C8051FXXX — в состоянии лог. 0, т. е. под
ном режиме работы PSEN должен оставаться в лог. 1.
потенциалом в 0 В.
В микроконтроллерах семейства P89LPC9XX вторым выводом, предназначенным для
Кроме того, вывод PSEN микроконтроллеров семейств MSC12XX, ADUC8XX и
перевода микроконтроллера в режим программирования, является вывод питания Vdd.
AT89C51ED2(RD2) должен быть в состоянии лог. 1, т. е., например, подключаться
В связи с тем, что потребление тока у этих микроконтроллеров достаточно низкое (не бо
к шине питания через резистор номиналом в 10 кОм, а питание (вывод Vdd) семейств
лее 3 мА), этим выводом можно легко манипулировать обычным двухтактным сигналом,
микроконтроллеров P89LPC9XX должно быть включено. Такое состояние микроконт
либо оставлять свободным или соединять непосредственно с общим проводом (выклю
роллеров является состоянием сброса. Оно должно предшествовать запуску микроко
чать), либо подключать к шине питания (включать). Необходимо только помнить, что подк
нтроллеров в работу.
лючение к шине питания должно осуществляться с помощью электронного компонента с
2. Для запуска микроконтроллеров в штатный режим работы линию DTR необходимо
достаточно низким сопротивлением (несколько Ом), чтобы напряжение питания остава
установить в состояние лог. 1 (+10 В). При этом вывод RST микроконтроллеров
лось в норме (около 3 В). Для таких целей идеально подходят обычные маломощные KMOП
семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) должен установиться в состояние
транзисторы (например, BS250 или 2N7000, о которых было упомянуто ранее). Можно так
лог. 0 (0 В), а вывод RST микроконтроллеров семейств P89LPC9XX и C8051FXXX — в состо
же использовать коммутатор DG419.
яние лог. 1 (+3 В). Кроме того, вывод PSEN микроконтроллеров семейств MSC12XX,
Поскольку микроконтроллеры семейства C8051FXX не используют интерфейс RS232
ADUC8XX и AT89C51ED2(RD2) должен оставаться в состоянии лог. 1, т. е. оставаться
для целей ISP (для этих целей используются два интерфейса: C2 или JTAG), по интерфейсу
подключенным к шине питания через резистор номиналом в 10 кОм, а питание микро
RS232 можно управлять только их выводом RST — для сброса и запуска.
контроллеров семейств P89LPC9XX должно оставаться включенным (Vdd=+3 В).
Теперь несколько слов об управляющих сигналах в интерфейсе RS232 компьютера.
3. Для остановки микроконтроллеров их состояние, а также состояние линий DTR и RTS,
Напомню (см. приложение 1), что порт RS232 (например COM 1) компьютера имеет только
должно соответствовать п. 1 (состоянию сброса).
2 выходных линии (DTR и RTS), состояниями сигналов на которых можно управлять
программно, записывая необходимые биты в порт управления с адресом 3fch. Причем 0й 4. Переключение микроконтроллеров в состояние программирования должно осу
бит управляет состоянием сигнала на линии DTR, а 1й бит — на линии RTS. Если, например, ществляться путем манипулирования сигналами DTR и RTS. Эти сигналы, в свою

28 29
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

очередь, должны управлять сигналами на выводах RST, PSEN и Vdd соответству Схема (рис. 1.3.3.1,б) может быть использована, если приемник RS232 либо занят други
ющих микроконтроллеров согласно их спецификации программирования в ре ми функциями, либо отсутствует вовсе.
жиме ISP, т. е. устанавливать на выводах микроконтроллеров соответствующие На рис. 1.3.3.2 показаны две альтернативные схемы формирования сигнала PSEN. Схема
потенциалы согласно приведенным в описаниях на микроконтроллеры времен вверху (а) более предпочтительна, т. к. сигнал PSEN, сформированный ею, более помехозащи
ным диаграммам. щен; кроме того, эта схема имеет более высокое быстродействие. Оба эти свойства определя
Перевод микроконтроллеров в режим ISP должен осуществляться из состояния ются тем, что, с одной стороны, сигнал PSEN (в одном из состояний) соединен с резистором но
сброса (п. 1). миналом в 10 кOм, с другой — высоким быстродействием коммутатора DG419. Схема внизу
Таким образом, схемы формирования соответствующих сигналов на выводах микро (б) более дешева, но менее «поворотлива», т. к. резистор 100 кOм несколько затягивает вре
контроллеров с помощью линий управления DTR и RTS и сами схемы сопряжения микро мя спада сигнала. Обе схемы удовлетворяют условиям пп. 1÷4 (1.3.2).
контроллеров с компьютером должны быть составлены так, чтобы удовлетворялись все
4 пункта. 1.3.4. Схемы формирования сигналов RST и Vdd
для микроконтроллеров семейств P89LPC9XX и C8051FXXX
1.3.3. Схемы формирования сигналов RST и PSEN для микроконтроллеров На рис. 1.3.4.1 приведены две альтернативные схемы управления сигналом на выводе
семейств MSC12XX, ADUC8XX и AT8951ED2(RD2) RST (для P89LPC9XX и C8051FXXX), а на рис. 1.3.4.2 — две альтернативные схемы управления
Свойства приведенных ранее сигналом Vdd микроконтроллеров семейств P89LPC9XX. Принципы их функционирования дос
Рис. 1.3.3.1. таточно просты, а достоинства и недостатки сводятся к следующему.
Схемы формирования сигнала RST
КМОПтранзисторов и микросхемы
DG419 являться приемниками RS232 Рис. 1.3.4.1.
могут быть использованы в практичес Схемы формирования сигнала RST
ких приложениях для формирования сиг
налов запуска и остановки микроконт
роллеров, а также для программирова
ния микроконтроллеров в режиме ISP.
На рис. 1.3.3.1,а приведены 2 аль
тернативные схемы управления сиг
налом на выводе RST, а на рис. 1.3.3.2
— 2 альтернативные схемы управле
ния сигналом PSEN микроконтролле
Рис. 1.3.3.2. ров семейств MSC12XX, ADUC8XX и
AT89C51ED2(RD2). Принципы их функ Рис. 1.3.4.2.
Схемы формирования сигнала RSEN Две схемы (рис. 1.3.4.1,а) на базе
ционирования достаточно просты и в Схемы формирования сигнала Vdd
КМОПтранзисторов обратной (2N7000) и
комментариях не нуждаются, а досто прямой (BS250) проводимости имеют дос
инства и недостатки сводятся к следу таточное быстродействие, очень просты,
ющему. дешевы, но потребляют ток около 3 мА (ко
На рис. 1.3.3.1,а показана одна из торый проходит через резистор R1 при
альтернативных схем управления сигна включении транзистора). Эти схемы могут
лом RST с помощью сигнала DTR. Из схе быть рекомендованы, если нет ограниче
мы видно, что для формирования сигна ний на потребляемую энергию.
ла RST в соответствии с пп. 1÷4 (см. Схема внизу (рис. 1.3.4.1,б) имеет бо
п. 1.3.2) достаточно сигнал DTR «пропус лее высокое быстродействие, практически
тить» через стандартный приемник не потребляет энергии, т. к. выходной сиг
RS232, обладающий инвертирующими нал (RST) двухтактный, но несколько громоздка и дорога.
свойствами и имеющий двухтактный вы Схема, показанная на рис. 1.3.4.2,а, обладает достаточным быстродействием, очень прос
ход. Эта схема наиболее проста, не со та и дешева, имеет низкое сопротивление при включении питания (менее 10 Ом), но и повы
держит ни одного дополнительного ком шенное потребление энергии, т. к. резистор R2 параллелен нагрузке (а это вход Vdd микроко
понента и рекомендуется к применению. нтроллера) и через него проходит дополнительный ток в 3 мА. При необходимости резистор R2

30 31
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

можно удалить; в этом случае нагрузкой схемы будет сам микроконтроллер, ток потребления
которого в активном режиме составляет не менее 3 мА. Однако если микроконтроллер будет Рис. 1.3.5.1.
Схема сопряжения микроконтроллеров семейства MSC12XX
переведен в «спящий» режим, его ток потребления намного снизится; это приведет к соответ с компьютером по интерфейсу RS232 для целей программи!
ствующему увеличению внутреннего сопротивления (которое в этом случае может составить рования в режиме ISP и штатного режима работы
десятки KOм), что, в свою очередь, может привести к значительному затягиванию времени
включения и выключения транзистора Т1.
Все же схема (рис. 1.3.4.2,а) может быть рекомендована к применению, т. к. манипуляция
с включением и выключением питания микроконтроллера (Vdd) в основном используется для
его программирования (в режиме ISP). В штатном же режиме работы микроконтроллера его
питание Vdd должно быть всегда включено (независимо от того, в каком состоянии находится
вывод RST).
Схема, показанная на рис. 1.3.4.2,б, имеет высокое быстродействие, низкое потреб
ление энергии и не зависит от потребления тока микроконтроллером. Схема более дорога
и громоздка. Сопротивление в открытом состоянии коммутатора (20 Ом) в два раза выше,
чем у транзистора на схеме вверху (рис. 1.3.4.2,а). Эта схема может быть рекомендована
к применению, если есть ограничение на потребляемую энергию.
***
Теперь читателю, «вооруженному» вышеизложенной информацией по поводу всех этих сиг
налов RST, PSEN и Vdd (если, конечно, он все внимательно прочитал и понял), а также достаточ
но подробными описаниями схем, которые их формируют, на взгляд автора, не составит боль
шого труда понять конкретные схемы сопряжения микроконтроллеров с компьютером, пред
назначенные как для штатного режима их работы, так и для программирования в режиме ISP.
Рассмотрим далее конкретные схемы сопряжения.

1.3.5. Сопряжение микроконтроллеров семейства MSC12XX


с компьютером
Рассмотрим схему сопряжения микроконтроллеров семейства MSC12XX с компьютером
по интерфейсу RS232 для целей ISP и штатного режима работы (рис. 1.3.5.1).
Как видим, для формирования сигнала RST используется приемник RS232 (13–12–й выводы
преобразователя ADM3202), на вход которого подается сигнал с линии DTR, а для формирования сиг
нала PSEN — коммутатор DG419, на вход управления (6й вывод) которого подается сигнал с линии
RTS. Сравнив схемы формирования сигналов RST и PSEN на рис. 1.3.5.1 с ранее обсуждавшимися
схемами (см. рис. 1.3.3.1,а и 1.3.3.2, а–б соответственно) можно заметить, что они идентичны.
Обмен сигналами платы с линиями интерфейса RS232 осуществляется через разъем
IDC10P (X1).
На плате предусмотрен 2контактный разъем (P1), на который подается внешнее питание
+3,3 В. Для индикации включения питания можно использовать светодиод (LD1 и R5).
Для работы микроконтроллера используется кварцевый резонатор Z1, снабженный дву
мя конденсаторами C6 и C7. Вывод EA микроконтроллера установлен в высокий уровень с по
мощью резистора R4.
Можно заключить, что эта схема (рис. 1.3.5.1) достаточно проста (на нее в дальнейшем бу
дем ссылаться, когда речь пойдет о программном обеспечении обмена информации компью
тера с микроконтроллером по RS232).
На рис. 1.3.5.1 можно заметить еще один 6контактный разъем IDC6P (X2), к которому
подключены источник питания +3,3 В, «земля» и четыре сигнала: VddT, RSTT, PDA и PCL, кото

32 33
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

рые подаются на разъем соответственно с выводов P1.0, P1.1, P1.2 и P1.3 микроконтроллера. 1.3.6. Сопряжение микроконтроллеров семейства ADUC8XX
Этот разъем и соответствующие сигналы предназначены для программирования микроконт с компьютером
роллеров семейства P89LPC9XX в режиме внутрисхемного программирования (ICP) с помощью
микроконтроллера MSC1210. Более подробно — см. далее (1.3.7). Рассмотрим схему сопряжения микроконтроллеров семейства ADUC8XX с компьютером
Схема (рис. 1.3.5.1) вручную смакетирована на плате (рис. 1.3.5.2). Микроконтроллер по интерфейсу RS232 для целей ISP и штатного режима работы (рис. 1.3.6.1). Из схемы видно,
MSC1210 распаен на платепереходнике (вариант еe разводки приведен в [4], a внешний вид Рис. 1.3.6.1.
— на рис. 1.3.5.3), которая вставлена в панельку PGA64. Забегая немного вперед, отметим, Схема сопряжения микроконтроллеров семей!
что на этой же фотографии можно увидеть еще одну панельку PGA64 (показанную нижней ства ADUC8XX с компьютером по интерфейсу
RS232 для целей программирования в режиме ISP
стрелкой), в которую вставляется платапереходник с микроконтроллером ADUC847. Разъем и штатного режима работы
IDC6 (X2 на рис. 1.3.5.1) для подключения кабеля сопряжения с платой ICP микроконтролеров
Р89LPC9XX на фотографии (рис. 1.3.5.2) показан верхней стрелкой.

Рис. 1.3.5.2.
Фотография
макетной платы
схемы сопряжения для
микроконтроллера
MSC1210

Рис. 1.3.5.3.
Фотография платы!
переходника для
микроконтроллера
MSC1210 (корпус TQFP64)

34 35
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

что по формированию сигналов RST и PSEN схема сопряжения микроконтроллеров семейств Рис. 1.3.6.4.
ADUC8XX полностью аналогична схеме для микроконтроллеров семейств MSC12XX, поэтому Фотография платы!
подробно останавливаться на ней не будем. Отметим только, что на эту схему будем ссылаться переходника для
микроконтроллера
при обсуждении поддерживающего ее программного обеспечения. ADUC834
На рис. 1.3.6.2 показана та же макетная плата (что и на рис. 1.3.5.2), но уже со вставлен
ной платойпереходником с микроконтроллером ADUC847; внешний вид платыпереходника с
микроконтроллером ADUC847 показан на рис. 1.3.6.3, с микроконтроллером ADUC834 — на
рис. 1.3.6.4.

Рис. 1.3.6.2.
Фотография макетной
платы схемы сопряжения
микроконтроллера ADUC847

1.3.7. Сопряжение микроконтроллеров AT89C51ED2(RD2)


с компьютером
Из приведенной на рис. 1.3.7.1 схемы сопряжения микроконтроллеров семейства
AT89C51ED2/RD2 с компьютером по интерфейсу RS232 для целей ISP и штатного режима работы
видно, что по формированию сигналов RST и PSEN она полностью аналогична схеме для мик
Рис. 1.3.6.3. роконтроллеров семейств MSC12XX, поэтому подробно останавливаться на ней не будем. От
Фотография метим только, что на эту схему мы будем ссылаться при обсуждении поддерживающего ее
платы!переходника
для микроконтроллера программного обеспечения.
ADUC847 Фотография макетной платы схемы сопряжения микроконтроллера AT89C51ED2 с компь
ютером по интерфейсу RS232 для целей программирования в режиме ISP и штатного режима
работы приведена на с. 39 (рис. 1.3.7.2).

1.3.8. Сопряжение микроконтроллеров семейств P89LPC9XX


с компьютером
Микроконтроллеры семейства P89LPC9XX разработаны всего 2–3 года назад
(2002–2003 г.) и продолжают пополняться новыми микросхемами. Отличительная особен
ность этих микроконтроллеров в том, что некоторые из них (например, P89LPC93XX) имеют 2
возможности внутрисистемного программирования (ISP): 1я — по интерфейсу RS232 (назы
ваемая в описании собственно ISP), 2я — по синхронному 2проводному скоростному после
довательному интерфейсу типа C2. В описании для избежания путаницы программирование
по этому интерфейсу называют ICP — InCircuitProgramming (внутрисхемным программирова
нием). Этот интерфейс состоит всего из 2 сигналов: PDA — DATA (данные — входные и выход
ные) и PCL — CLock (синхросигнала, стробирующего данные). Этот интерфейс чемто напоми

36 37
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

Рис. 1.3.7.2
Рис. 1.3.7.1. Фотография макетной
Схема сопряжения мик! платы схемы
роконтроллеров семей! сопряжения
ства AT89C51ED2/RD2 микроконтроллера
с компьютером AT89C51ED2
по интерфейсу RS232 с компьютером
для целей программиро! по интерфейсу RS232
вания в режиме ISP для целей ISP и
и штатного штатного режима
режима работы работы

 Вопервых, хотя микроконтроллеры семейств P89LPC90X и «маленькие», они об


ладают уникальными свойствами, среди которых: очень высокое быстродей
ствие (2 такта на цикл); встроенный 10разрядный АЦП (P89LPC904); встроен
ный 24разрядный системный таймер; возможность настроить выходной сигнал
с порта на три типа выхода: стандартный, двухтактный (пушпульный) и с открытым
стоком; кроме того, это семейство микроконтроллеров отличается крошечными
габаритами (в SOIC корпусах) и потребляет уникально мало энергии (буквы LP — Low Power
в названии микроконтроллера отражают это свойство).
 Вовторых, более мощные микроконтроллеры семейства P89LPC9XX, помимо интер
фейса RS232 для ISP, имеют такoй же интерфейс (C2), и грех было бы не запрограм
мировать микроконтроллер по такому интерфейсу, тем более что возможности прог
раммирования этих микроконтроллеров в режиме ICP гораздо шире, чем в режиме
ISP (см. описание на ICP и ISP для микроконтроллеров семейств P89LPC9XX).
 Втретьих (и это основная причина), на примере программирования микроконтроллеров
нает интерфейс SPI (разница в том, что в SPI входные (MISO) и выходные (MOSI) данные «раз семейства P89LPC9XX в режиме ICP с помощью микроконтроллера, сопряженного с
несены») и в точности соответствует синхронному режиму работы UART 51совместимого мик компьютером по интерфейсу RS232 (например того же P89LPC938 или MSC1210), авто
роконтроллера. Такой интерфейс (C2) имеют все микроконтроллеры семейства P89LPC9XX ром будут продемонстрированы свойства нового алгоритма обмена по интерфейсу
(кроме P89LPC932). Справедливости ради отметим, что микроконтроллеры семейств RS232 уже для практических целей.
ADUC8XX и MSC12XX также снабжены подобным интерфейсом, но информация о нем для этих Этот алгоритм разработан автором и приведен в первой части книги [4]. Его основное свой
микроконтроллерах закрыта и предназначена для коммерческих эмуляторовпрограммато ство заключается в синхронизации каждого байта аппаратным способом, но не с помощью ли
ров. Такой же интерфейс имеют некоторые микроконтроллеры C8051FXX (например ний квитирования DTRDSR или RTSCTS (стандартного аппаратного способа), а с помощью ли
C8051F330) от ф. Silicon Laboratories (информация открыта). Программирование некоторых ний данных TxD и RxD. В отличие от известного программного способа синхронизации XONXOFF
«маленьких» (8ножечных) микроконтроллеров от ф. Philips (P89LPC90X) возможно только в (он также производится с помощью линий данных TxD и RxD) аппаратный способ синхрониза
режиме ICP, т. е. только по такому же интерфейсу (C2). И хотя подобный интерфейс непосред ции обладает несомненным преимуществом. Это преимущество заключается в высокой надеж
ственно никак не связан с интерфейсом RS232, автор счел необходимым привести пример ности обмена, что особенно важно на больших скоростях (например, 115 200 бод). Недостаток
программирования микроконтроллеров P89LPC9XX в режиме ICP по 3 причинам. стандартного аппаратного способа синхронизации обмена по интерфейсу RS232 состоит в необ

38 39
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

ходимости использования самих линий квитирова Для формирования сигнала питания Vdd используется сигнал RTS, который напрямую по
ния (DTRDSR или RTSCTS). Использовать же ли дается на затвор такого же транзистора (Т1). Сток транзистора T1 соединен с выводом Vdd
нии квитирования нежелательно по двум причи микроконтроллера. Ранее уже обсуждались 2 вышеуказанные схемы формирования сигналов
нам: вопервых, при сопряжении микроконтролле RST и Vdd (см. рис. 1.3.4.1,а и 1.3.4.2,а), поэтому не должно возникнуть какихлибо неяснос
ра с компьютером линии квитирования заняты и тей или затруднений в понятии принципа их функционирования.
используются для других целей (см. 1.3.2, Остальные два передатчика и приемник преобразователя ADM231L используются для сопря
пп. 1÷4), вовторых, даже безотносительно к то жения линий данных микроконтроллера TXDM и RXDM с линиями данных TxD и RxD и линией кви
му, заняты ли линии квитирования или нет, для тирования DSR интерфейса RS232. Для питания преобразователя ADM231L (V+) используется нап
синхронизации они должны использоваться, а это ряжение +12 В; вывод Vcc подключен к источнику питания +3,3 В. Такое использование преобра
дополнительные провода. Если осуществляется зователя позволяет получить с выходoв передатчиков сигналы (RxD и DSR) с размахом в ±11,5 В,
сопряжение компьютера с микроконтроллером что почти в 6 раз (!) больше размаха сигнала передатчика (TxDM) микроконтроллера (0÷+3,3 В).
с использованием общей «земли», т. е. они Приемник преобразователя формирует сигнал RXDM с размахом 0÷+3,3 В из сигнала TxD RS232
связаны гальванически , то лишние 2 провода осо с размахом около ±10 В. Максимальная скорость обмена преобразователя ADM231L составляет
бого значения не имеют (хотя и это не всегда так). около 230 кбод, поэтому на скорости в 115 200 бод он работает безукоризненно.
Но если для связи используются гальванически В качестве источника питания +3,3 В используется малопотребляющий стабилизатор
развязанный интерфейс RS232 (о гальванических LP2950Z3.3 (DA1).
развязках речь будет идти впереди), то для каждой Для программирования микроконтроллеров семейств P89LPC9XX в режиме ICP с помощью
линии квитирования необходима своя гальвани микроконтроллера P89LPC938 на плате предусмотрен 6–контактный разъем типа IDC6 (X2), на
ческая развязка; в этом случае схема сопряжения который подаются сигналы PDA и PCL (обсуждавшиеся ранее), сигнал VddT, предназначенный
микроконтроллера с компьютером значительно для управления включением/выключением питания Vdd программируемого микроконтролле
усложняется. Использование же линий данных ра, и сигнал RSTT, предназначенный для управления его выводом RST. Все 4 сигнала (PDA, PCL,
(TxD и RxD) для аппаратной синхронизации с одной VddT и RSTT) формируются микроконтроллером P89LPC938 (DD2).
стороны не требует дополнительных проводов Кроме сигналов управления, на разъем X2 подается питание (+3,3 В, контакт № 3) и «зем
(в т. ч. гальванических развязок) при осуществле ля» (контакт № 1).
нии обмена данными, с другой — позволяет произ На этой схеме можно заметить «маленький» микроконтроллер P89LPC904 (DD3), кото
водить обмен с теми же надежностью и скоростью, рый сопряжен с компьютером аналогично микроконтроллеру P89LPC938 (DD2). Это сдела
свойственными аппаратному способу синхрониза но с целью проверки на работоспособность записанной в него тестовой программы обмена
ции. Более подробно о самом алгоритме аппарат по RS232. Микроконтроллер P89LPC938 (DD2) установлен в панельку PLCC28, а микроконт
ной синхронизации обмена написано в [4]; кроме роллер P89LPC904 — в панельку DIP8. Сигналы с линий интерфейса RS232 подаются
того, необходимые подробные пояснения будут на плату через разъем IDC10 (X1).
также даны, когда будут рассматриваться програм Из схемы сопряжения микроконтроллеров P89LPC938 и P89LPC904 с интерфейсом C2
мы обмена, использующие такую аппаратную синх (рис. 1.3.8.2), предназначенной для программирования микроконтроллеров в режиме ICP,
ронизацию с помощью линий данных TxD и RxD. видно, что сигналы с линий интерфейса C2 (PCL, PDA, RSTT), а также питания (+3,3 В)
Вышеуказанные 3 причины и привели к и «земли» с разъема IDC6P (X1), попадают на соответствующие им выводы микроконтрол
необходимости конструирования автором двух
следующих макетных плат (рис. 1.3.8.1 и 1.3.8.2). Рис. 1.3.8.2.
Как можно увидеть из схемы сопряжения Схема платы ICP
микроконтроллера P89LPC938 с компьютером для микроконтрол!
леров P89LPC93X
по интерфейсу RS232 (рис. 1.3.8.1), для формиро и P89LPC90X
Рис. 1.3.8.1. вания сигнала RST используется интерфейсный
Схема сопряжения микроконтроллера P89LPC938
с компьютером по интерфейсу RS232 для целей
сигнал DTR, который, «пройдя» через приемник
программирования в режиме ISP и штатного режима работы. микросхемы преобразователя ADM231L (DD1,
(Штатный режим работы P89LPC938 может быть выводы 9,10), попадает на затвор КМОПтран
использован для программирования микроконтроллеров
семейств P89LPC9XX в режиме ICP (плата ICP)
зистора прямой проводимости BS250 (T2). Сток
транзистора соединен с выводом RST микроконт
роллера P89LPC938 (DD2).

40 41
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

леров P89LPC938 и P89LPC904, расположенных в панельках (PLCC28 и DIP8 соответствен


но). Сигнал управления включением/выключением питания (VddT) с 5го контакта разъема X1
попадает на затвор КМОПтранзистора прямой проводимости BS250 (T1). На стоке транзисто
ра формируется сигнал питания Vdd, который подается на соответствующие выводы микроко
нтроллеров. Простота схемы очевидна.
Кабель сопряжения платы ISP с платой ICP (рис. 1.3.8.3) представляет собой обычный
плоский 6жильный кабель длиной 10÷15 см, «защелкнутый» на концах разъемами IDC6M. Рис. 1.3.8.5.
Общий вид платы ISP
Рис. 1.3.8.3. микроконтроллера
Схема кабеля связи MSC12XX, сопряженной
платы ISP с платой ICP кабелем связи с платой
ICP для микроконтролле!
ров семейств P89LPC9XX
(плата показана в прямо!
На рис. 1.3.8.4 показаны фотографии общего вида двух плат, сопряженных между собой угольнике, очерченном
пунктиром)
кабелем связи. Здесь необходимо добавить следующее. Плата ICP для P89LPC9XX может ис
пользоваться совместно как с вышеописанной платой ISP для P89LPC93X, так и с другими
микроконтроллерами. Если, например, разработчик имеет дело с микроконтроллерами се
мейства MSC12XX, и ему необходимо запрограммировать микроконтроллер семейства
P89LPC9XX, то на макетной плате, на которой установлен, например, микроконтроллер
MSC1210 достаточно установить разъем IDC6P (X2 на рис. 1.3.5.1) и соединить соответству 1.3.9. Сопряжение микроконтроллеров семейств C8051FXXX
ющие сигналы разъема с портами микроконтроллера MSC1210 (см. схему на рис. 1.3.5.1). с компьютером
Далее соединить обе платы кабелем связи (по рис. 1.3.8.3). В этом случае необходимость в
макетной плате ISP (рис. 1.3.8.1) отпадает. Для программирования микроконтроллеров C8051F067 и C8051F330D с компьюте
ром в режиме ISP и штатном режиме работы (рис. 1.3.9.1) используется USBDEBUG
адаптер, который сопряжен с микроконтроллером C8051F067 по интерфейсу JTAG, а с
микроконтроллером C8051F330D — по интерфейсу C2. С компьютером USBDEBUG
адаптер сопрягается по интерфейсу USB. Кроме того, микроконтроллеры сопряжены с
компьютером еще и по интерфейсу RS232, который предназначен только для штатного
режима их работы.
Рис. 1.3.8.4.
Фотография плат: Сопряжение микроконтроллеров с USBDEBUGадаптером организовано следую
а — ICP для микроконт! щим образом.
роллеров P89LPC93X На плате установлен 10контактный разъем IDC10P — X2(JTAG/C2), к которому
и P89LPC90X;
б — ISP для микроконт! подключается ответный разъем IDC10M, расположенный на конце кабеля сопряжения
роллеров семейств USBDEBUGадаптера с микроконтроллерами. На разъем X2(JTAG/C2) из USBDEBUG
P89LPC93X адаптера приходят следующие сигналы: TCK/C2DAT (4й контакт), TMS (5й контакт), TDO
(Эти две платы условно
разделены пунктиром.) (6й контакт) и TDI/C2CK (7й контакт). Контакты 2, 3 и 9 — «земляные», а 1, 8 и 10 не
а) б)
используются.
На плате расположены три 3штырьковых разъема: P1, P2 и P3, на каждом из кото
На рис. 1.3.8.5 показан общий вид платы ISP для микроконтроллера MSC12XX, сопряжен рых присутствует снимаемая двухконтактная перемычка (джампер, как его сейчас назы
ной с платой ICP для микроконтроллеров семейств P89LPC9XX кабелем связи. На схемы плат вают), предназначенная для переключения режима работы USBDEBUGадаптера.
ISP и ICP в дальнейшем мы будем ссылаться при обсуждении программных средствах для мик При замыкании контактов 2–3 на всех 3 разъемах (P1, P2 и P3) организуется режим
роконтроллеров семейств P89LPC9XX. Кроме того, будут приведены программы для микроко работы по интерфейсу JTAG, предназначенному для программирования микроконтрол
нтроллера MSC1210 (для него самого — программа для микроконтроллера и для его сопряже лера C8051F067. При этом сигнал TCK/C2DAT с разъема X2(JTAG/C2) попадает на ли
ния с компьютером по интерфейсу RS232 — программа для компьютера), с помощью которых нию (связь) TCK67, сигнал TMS — на TMS67 и сигнал TDI/C2CK — на TDI67. Необходи
можно запрограммировать микроконтроллеры семейства P89LPC9XX в режиме ICP непосре мо отметить, что линия TCK67 содержит подтягивающий к шине питания резистор R5.
дственно с компьютера. Кроме того, сигнал TDO с разъема X2(JTAG/C2) напрямую (без переключения) попадает
на линию (связь) TDO67.

42 43
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

попадает на линию (связь) RSTM. Линия RSTM соединена с выводом RST/C2CK микроконт
роллера C8051F330D и выводом RST микроконтроллера C8051F067.
Таким образом, при выборе микроконтроллера C8051F330D (соединении контактов 1–2
разъемов P1, P2 и P3) сигнал TDI/C2CK с разъема X2(JTAGC2) попадает на вход RST/C2CK
микроконтроллера C8051F330D. При выборе же микроконтроллера C8051F067 (соединении
контактов 2–3 разъемов P1, P2 и P3) вывод RST микроконтроллера оказывается подключен
ным к шине питания через подтягивающий резистор R4 (что и требуется для его режима
программирования).
При соединении джампером контактов 1 и 2 разъема P4 организуется штатный
режим работы микроконтроллеров. В этом случае сигнал с линии RST попадает на линию
RSTM — входы RESET обоих микроконтроллеров (вход RST микроконтроллера C8051F067 и
вход RST/C2K микроконтроллера C8051F330D). Как видно из схемы, этот сигнал RST форми
руется на стоке КМОПтранзистора Т1 (2N7000) с помощью сигнала DTR интерфейса RS232 и
приемника RS232 (9й и 10й выводы преобразователя ADM231LDD1) (подобная схема фор
мирования сигнала RST обсуждалась ранее (см. рис. 1.3.4.1,а), на базе транзистора 2N7000).
При работе в штатном режиме USBDEBUGадаптер физически может не отключаться (т. е.
его разъем IDC10M может оставаться подключенным к разъему IDC10P — X2(JTAG/C2), одна
ко программно он должен быть отключен. Для этого в программном обеспечении работы
USBDEBUGадаптера (IDE) необходимо выбрать и установить опцию отключения (Disconnect).
Нельзя не отметить достаточную надежность интерфейсов JTAG и C2 USBDEBUGадапте
ра, а также разнообразие функций программного обеспечения (IDE) и удобство работы с ним.
Необходимо только помнить, что на плату (рис. 1.3.9.1) можно устанавливать только
один из двух микроконтроллеров: либо C8051F067, либо C8051F330D. Причем, установка
того или иного микроконтроллера должна производиться при отключенном питании и (жела
тельно) при отключенных кабелях интерфейсов RS232 и JTAG/C2. Ни в коем случае нельзя
вставлять оба микроконтроллера и включать питание и кабели интерфейсов. В этом случае
можно испортить микроконтроллеры, USBDEBUGадаптер или интерфейс RS232 COM
порта компьютера.
Теперь о сопряжении микроконтроллеров с интерфейсом RS232 компьютера для работы
в штатном режиме. Как видно из схемы (рис. 1.3.9.1) интерфейс организован аналогично схе
Рис. 1.3.9.1 Линии TCK67, TMS67, TDI67 и TDO67 подключены соответственно к выводам TCK, TMS, мам, приведенным ранее и предназначенным для других микроконтроллеров. Но есть и неко
Схема сопряжения
микроконтролле! TDI и TDO микроконтроллера C8051F067. Таким образом и организуется сопряжение USB торые отличия.
ров C8051F067 DEBUGадаптера с микроконтроллером C8051F067. Сигнал с линии TxD интерфейса RS232 компьютера поступает на вход приемника
и C8051F330D При замыкании контактов 1–2 на всех 3 разъемах (P1, P2 и P3) организуется ре преобразователя ADM231L (DD1) — выводы 5 и 6. На выходе приемника формируется
с компьютером
для программиро! жим работы по интерфейсу C2, предназначенному для программирования микроконт сигнал RXDM, который по одноименной связи попадает на входы приемников RS232—
вания в режимах роллера C8051F330D. При этом из 2 сигналов (TCK/C2DAT и TDO), поступающих с разъ P0.1/RxD0 и P0.5/RxD соответственно микроконтроллеров C8051F067 и C8051F330D.
ISP и штатном ема X2(JTAG/C2) соответственно на 2е контакты разъемов P1 и P2, с помощью резис Здесь ничего нового нет, и эта связь (т. е. передача информации от компьютера к микро
тора R3 формируется один сигнал C2D. Этот сигнал по одноименной линии (C2D) попа контроллеру) ничем не отличается от всех предыдущих схем. Передача информации в об
дает на вход P2.0/C2D микроконтроллера C8051F330D. Сигнал TDI/C2CK, поступаю ратную сторону (т. е. от микроконтроллера к компьютеру) организована иначе и нуждает
щий с разъема X2(JTAG/C2) на 2й контакт разъема P3, попадает на линию (связь) ся в некотором пояснении.
RST/C2CLK. Дело в том, что, как уже было упомянуто, все микроконтроллеры семейства C8051XXX
Для переключения режимов работы обоих микроконтроллеров (программирова не позволяют использовать вывод порта, занятый альтернативной функцией, как
ние/штатный режим работы) на плате предусмотрен 3контактный разъем P4, также снабжен стандартный выход порта, если эта функция задействована (включена). Применитель
ный джампером. но к линии TxD микроконтроллера это означает, что при установке бита разрешения использо
При соединении джампером контактов 2 и 3 разъема P4 организуется режим вания интерфейса RS232 (битa UARTenable) вывод TxD уже нельзя устанавливать в произ
программирования. При этом сигнал RST/C2CLK, поступающий с разъема P3 на разъем P4, вольное состояние программно. Другими словами, команды Си (TXD=0 или TXD=1) или коман

44 45
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232

ды ассемблера (setb TxD или clr TxD) не дадут никакого эффекта: сигнал порта останется в ще использовать обычную микросхему 2входового элемента И (2И) (например SN74HC08) в
состоянии лог. 1. Сигнал на линии TxD будет изменяться, только если стандартным образом DIPкорпусе либо элемент 2И–НЕ с последующим инвертированием. У автора «под рукой» ока
вывести какойлибо байт (например латинскую букву «A») по RS232 (на Си — SBUF=0x41, на залась подобная микросхема, правда, с триггером Шмитта (уж он «картину не испортит») —
ассемблере — mov SBUF, #41h). Это очень серьезное упущение фирмы Cygnal. SN74HC132, которая и приведена на схеме (рис. 1.3.9.1).
Похожее свойство, но диаметрально противоположное существует в интерфейсе RS232 Для индикации работы схема оснащена светодиодом LD1. Схема питается напряже
компьютера. Там нельзя прочитать состояние линии RxD интерфейса (лог. 1 или лог. 0), нием +12 В, которое подается на двухконтактный разъем P5 и непосредственно под
поэтому для обеспечения аппаратной синхронизации линиями данных (об этом уже не раз упо ключается к преобразователю ADM231L. Остальные компоненты схемы питаются напря
миналось) линию RxD в интерфейсе компьютера необходимо соединить с какойлибо входной жением +3,3 В, для чего в схеме предусмотрен стабилизатор LP2950Z3.3 (DA1). Анало
линией квитирования (например с DSR). В этом случае, прочитав состояние линии DSR, мож говое питание микроконтроллера C8051F067 (+3,3 А) соединяется с цифровым (+3,3) в
но получить состояние линии RxD. одной точке перемычкой, обозначенной резистором R6 номиналом 0 Ом. Аналогично с
Если посмотреть на практически любую предыдущую схему сопряжения микроконтролле помощью перемычки R7 соединяется аналоговая и цифровая «земля» этого микроконт
ра с интерфейсом RS232 (в т. ч. на рис. 1.3.9.1), то можно заметить, что линия TxDM подклю роллера.
чена сразу ко входам 2 передатчиков преобразователя RS232 (7й, 4й и 8й, 11й выводы Остальные элементы схемы, по мнению автора, в комментариях не нуждаются.
микросхемы D1), выход одного из которых подключен к линии RxD, а выход второго — к линии На эту схему (рис. 1.3.9.1) в дальнейшем будем ссылаться при обсуждении поддерживаю
DSR). Этим и обеспечивается возможность чтения состояния линии RxD. Кстати, состояние ли щего ее программного обеспечения.
нии RxD микроконтроллеров семейства C8051FXXX, слава богу, прочитать можно независимо Необходимо добавить, что существует вариант микросхемы микроконтроллера
от того, выбран ли UART или нет. Хоть здесь не возникает проблем. C8051F330 в корпусе DIP24. Такая микросхема имеет маркировку C8051F330P. По внутрен
Необходимо отметить, что возможность управления состоянием линии TxD программно ней структуре эта микросхема полностью идентична микросхеме C8051F330D (DIP20) и отли
присутствует во всех встречавшихся автору микроконтроллерах (кроме C8051FXXX). чается от нее только разводкой выводов (рис. 1.3.9.2). При этом дополнительные 4 вывода в
Поскольку программным способом данную проблему не решить, необходимо приме микросхеме C8051F330P не используются (NC).
нить аппаратные средства. Для этого вспомним, что исходное состояние линии TxD мик
Рис. 1.3.9.2
роконтроллера перед передачей байта и конечное ее состояние после окончания переда
Разводка выводов («цоколевка»)
чи байта — единичное (лог. 1). Передача начинается со стартового бита (лог. 0), затем
микроконтроллера C8051F330P
следуют биты данных; заканчивается передача стоповыми битами (лог. 1). Таким обра
зом, передача байта осуществляется (в том числе) «нулями». Если использовать еще одну
линию микроконтроллера в качестве линии TxD*, то, подключив обе линии к 2входовому
элементу «ИЛИ по нулям», на выходе такого элемента можно получить требуемое: при лог. 1
на выходе TxD (т. е. в отсутствии передачи байта), управляя линией TxD*, можно получить
на выходе такого элемента точную копию состояния линии TxD*. С другой стороны, при
лог. 1 на линии TxD* при передаче байта по линии TxD на выходе этого же 2входового
элемента получим точную копию состояния линии TxD (т. е. передача байта будет происхо
дить стандартным образом). На фотографии макетной платы схемы сопряжения микроконтроллеров C8051F067
Из теории конечных автоматов известно, что 2входовый элемент ИЛИ, управляемый ну и C8051F330D с компьютером (рис. 1.3.9.3) верхней большой стрелкой показаны три 3контакт
левыми (инверсными) уровнями, преобразуется (конвертируется) в 2входовый элемент И. ных разъема (P1, P2 и P3 схемы), служащие для переключения режима JTAGC2, нижней большой
Это свойство отображено на рис. 1.3.9.1 в рамке, очерченной пунктиром, на примере 2вхо стрелкой — 3контактный разъем P4, переключающий режим работы платы: программирова
дового элемента И микросхемы 74AHC1G08. Решение излагаемой проблемы представлено ние/работа. Верхней маленькой стрелкой показан микроконтроллер C8051F330P (DIP24), ниж
верхним 2входовым элементом И, к одному из входов которого подключены «родные» сигна ней — C8051F330D (DIP20). Эти два микроконтроллера не впаены в плату, а просто поставлены
лы TxD (TxD067 и TxD330), а к другому — дополнительные TxD* (Tx0067 и Tx0330), обозначен на нее для демонстрации. Установка микроконтроллеров производится в панельку DIP24.
ные так соответственно для микроконтроллеров C8051F067 и C8051F330D. Сигнал TxD067 Микроконтроллер C8051F330D (DIP20) вставляется в панельку DIP24 таким образом, чтобы 1й
по одноименной линии подключен к выводу P0.0/TxD0, сигнал Tx0067 — к выводу P0.2 мик вывод микроконтроллера попал во 2й контакт панельки, т. е. она устанавливается в середину
роконтроллера C8051F067. Сигнал TxD330 подключен к выводу P0.4/TxD и сигнал Tx0330 — панельки. В этом случае выводы микроконтроллера как раз попадают в те контакты панельки,
к выводу P1.7 микроконтроллера C8051F330D. Выход элемента 2И — сигнал TxDM, который которые используются в схеме (рис. 1.3.9.1).
проходит по одноименной линии и попадает на входы двух передатчиков преобразователя Микроконтроллер C8051F067 вставлен в панельку PGA64.
ADM231L (DD1). На рис. 1.3.9.4 приведена фотография платыпереходника TQFP64PGA64 с распаенным
Если требуется сверхминиатюризация, то можно, конечно, использовать микросхему на ней микроконтроллером C8051F067.
74AHC1G08, т. к. она имеет миниатюрный корпус SOT235. Но для целей макетирования про

46 47
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

Рис. 1.3.9.3.
Фотография Рис. 1.3.10.
макетной платы Схема кабеля связи
схемы сопряжения микроконтроллеров
микроконтроллеров с компьютером
C8051F067
и C8051F330D
с компьютером

1.4. Гальванические развязки для интерфейса RS232


Рис. 1.3.9.4
Фотография платы! Гальванически изолированный интерфейс RS232 применяется во многих устройствах, где
переходника по тем или иным причинам либо нежелательно, либо просто невозможно (или опасно) соеди
TQFP64!PGA64 нять напрямую общие цепи «земли» и питания компьютера и самого устройства.
с микроконтроллером
C8051F067 Выражение «нежелательно» означает, например, что соединять можно, и компьютер или
устройство не выйдет из строя от такого соединения, но устройство будет работать либо некорре
ктно, либо с большими сбоями (это не касается сбоев передачи по интерфейсу RS232).
Например, если в устройстве применяется микроконтроллер с высокоточным (точнее — высоко
чувствительным) АЦП, и это устройство соединяется с компьютером по интерфейсу RS232 напря
мую, то такой АЦП может легко «ловить» шумы компьютера, в котором их масса, и передавать
в этот компьютер вместо полезного значения измеряемой величины — шум. При этом передача
информации по самому интерфейсу будет проходить совершенно без сбоев, и ни устройство,
ни компьютер от такого соединения не пострадают. Применительно к системам сбора и обработ
ки информации, получаемой с датчиков (а именно на такие применения микроконтроллеров ори
ентирована настоящая книга), это означает, что такие системы обязательно должны иметь
гальванически изолированный интерфейс RS232.
Выражения же «невозможно» или «опасно» означают, что при соединении компьютера с
устройством по интерфейсу RS232 без гальванической изоляции может выйти из строя либо
само устройство, либо компьютер. Если, например, устройство находится под достаточно высо
ким потенциалом по отношению к компьютеру (несколько сот либо даже тысяч вольт), то напря
мую соединять устройство с компьютером по интерфейсу RS232 просто нельзя. Причем боль
шая разность потенциалов может иметь место либо по необходимости (например, устройство
напрямую контактирует с пантографом электровоза, находящегося под напряжением в 5000 В
1.3.10. Кабель связи микроконтроллеров с компьютером относительно «земли»), либо разность потенциалов может возникнуть не специально (напри
Все 5 макетных плат с микроконтроллерами семейств MSC12XX (рис. 1.3.5.1), ADUC8XX мер, компьютер оснащен монитором с ЭЛТ, не заземлен, и на мониторе постепенно накаплива
(рис. 1.3.6.1), P89LPC93X (рис. 1.3.7.1), AT89C51ED2 (рис. 1.3.8.1) и C8051F067/330D (рис. ется высокий электростатический заряд). Часто гальваническую изоляцию осуществляют для
1.3.9.1) для сопряжения с компьютером по интерфейсу RS232 используют один и тот же ка обеспечения искробезопасности. Например, требуется периодический съем информации с
бель (рис. 1.3.10), который представляет собой обычный плоский 10жильный кабель длиной устройства измерения расхода газа (например пропанбутана), которое находится в его атмос
1÷1,5 м, «защелкнутый» с одного конца на 10контактный разъем IDC10M и распаенный с фере. Прямое подключение, а особенно отключение интерфейса (вообще любой разрыв кон
другого — на стандартный 9контактный разъем DB9M, использующийся в компьютерах для тактов) может привести к возникновению искры и, в конечном итоге, — к взрыву.
подключения к COMпорту (RS232). Показывать схему этого кабеля на всех 5 схемах автор Традиционный способ осуществления гальванической развязки — использование оптро
счел лишним. нов. Широко известны недостатки оптронов, которые уже «навязли в зубах», — это низкая ско

48 49
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

рость обмена, большие токи включения и потребления, необходимость в дополнительных резис SN75155); она в несколько раз больше, чем требуется для питания стандартных преобразова
торах (для включения светодиода оптрона и для подтяжки выхода к питанию), частые сбои в ра телей RS232 и на порядок (а то и на два) больше, чем требуется для питания современных пре
боте, высокая стоимость скоростных оптронов и т. п. С этими недостатками так или иначе «сми образователей интерфейса RS232. В связи с этим о питании гальванических развязок для ин
рялись», поскольку все равно ничего другого до последнего времени придумано не было (если терфейса RS232 от самих линий этого интерфейса наконец можно забыть. Во всяком случае,
не считать емкостные развязки типа ISO150 от ф. BurrBrown (TI) стоимостью около 15 долл.). все дальнейшее изложение будет посвящено гальваническим развязкам с питанием от
И вот, наконец, появилась возможность отказаться от использования оптронов. На этот DCDCпреобразователей. Преимущества таких развязок (применительно к интерфейсу
раз отличилась ф. Analog Devices. Она выпустила уникальные по своим свойствам гальвани RS232) заключаются в следующем:
ческие развязки семейства iCoupler. Эти одно и многоканальные развязки (ADUM120X) ис  повышенная надежность работы, поскольку размах сигнала на линии RxD компьюте
пользуют совершенно иной принцип передачи информации, чем, например, оптроны или ем ра может достигать ±10 В и более, т. к. передатчик берет энергию от отдельного источ
костные развязки типа ISO150 ф. BurrBrown (TI). В развязках ADUM120X информация пере ника питания;
дается посредством высокочастотного магнитного поля, как в трансформаторных связях. Уни  длина кабеля связи может достигать 10÷15 м;
кальность их в том, что эти устройства работают на скоростях от 0 до 25 Мбод(!), при этом  развязки проще и занимают меньше места на плате, чем с питанием от линий RS232;
потребление энергии на скорости 0,1 Мбод (например 115 кбод) приблизительно в 10(!) раз  высокая предсказуемость и «детерминированность» поведения сигналов, вследствие
меньше, чем у стандартного оптрона 6N137. Включение и выключение (т. е. переключение из чего резко снижается вероятность «зависания» компьютера, особенно при работе в
одного логического состояние в другое) происходит напряжением (или уровнем сигнала, а ОС Windows;
не током, как в оптроне) с током в несколько микроампер. Эти развязки дешевле оптронов,  подходят для любых типов компьютеров, в т. ч. имеющих «слаботочный» интерфейс
если исходить из цены на 1 канал передачи. Кроме того, они выпускаются в корпусах SOIC, RS232;
имеющих достаточно малые габариты. Например, 2канальная развязка с передачей в  не создают высокочастотных электромагнитных помех повышенного уровня, поэтому
2 направлениях ADUM1201AR (0÷1 Mбод, 2,5 долл.) выпускается в корпусе SOIC8 и имеет рекомендуются для работы с прецизионными АЦП.
размер 551 мм. И, наконец, эти развязки не требуют для работы никаких внешних компо
В качестве примеров гальванически изолированного интерфейса RS232 с применением
нент (как, например, оптроны, которые требуют как минимум по одному резистору во входной
DCDCконверторов и развязок ADUM120X будут приведены несколько схем, снабженных
и выходной цепях). Сейчас эти микросхемы достаточно доступны.
небольшими комментариями. Для микросхем в планарных корпусах будут приведены вариан
Единственный, по мнению автора, недостаток этих развязок состоит в том, что они рабо
ты разводки платпереходников в корпуса DIP для возможности их легкого макетирования и,
тают только с TTLуровнями сигналов и их нельзя напрямую подключать к линиям интерфейса
кроме того, фотографии самих переходников с распаенными на них микросхемами в порядке
RS232 (как, например, оптроны). Правда, этот недостаток легко преодолим, т. к. существует
возрастания их сложности, качества и соответственно стоимости (по фотографиям еще раз
масса преобразователей интерфейса RS232 (см., например, 1.2.1 и 1.2.2). Кроме того, в не
можно будет убедиться в реальности описываемых устройств).
которых случаях, когда не требуется высокая скорость работы (например, для формирования
сигналов управления режимом работы микроконтроллера, таких как RST, PSEN и т. п.), для
1.4.1. Простой гальванически изолированный интерфейс RS232
развязок вполне можно использовать достаточно дешевые оптроны.
на базе микросхем развязки ADUM1201,
В первой части книги [4] были приведены гальванические развязки, которые питаются
преобразователя SN75155 и оптронов
энергией от самих линий интерфейса RS232, а также развязки, для питания которых исполь
зуются изолированные DCDCпреобразователи. Еще три года назад (2003 г.) единственными В схеме сопряжения компьютера с микроконтроллером (например одним из семейств
реально работающими DCDCпреобразователями для подобных целей были DCDCпреобра MSC12XX, ADUC8XX и AT89C51ED2/RD2) с помощью гальванически изолированного интер
зователи семейства DCP05XX или DCR05XX мощностью 1÷2 Вт от ф. BurrBrown (TI) и стои фейса RS232 микроконтроллер показан условно в правой нижней части схемы (рис. 1.4.1.1).
мостью около 10–11 долл. (кстати, цена на них до сих пор так и не изменилась). Поэтому при В качестве гальванических развязок помимо двунаправленной развязки
ходилось использовать их в самых крайних случаях. В большинстве случаев для питания галь ADUM1201 (DD2) используются широко известные, легкодоступные и дешевые оптроны
ванических развязок автор рекомендовал тогда использовать сами линии интерфейса H11L1 (DD3) и TLP521 (DD4). В схеме также применена известная высокоскоростная, но
RS232, т. к. такое питание «бесплатное». Но, как известно, бесплатный сыр бывает только малоиспользуемая (изза ее повышенного потребления тока) микросхема одноканаль
в мышеловках — гальванические развязки с питанием от линий интерфейса имеют много ного приемопередатчика SN75155 (DD1) от ф. Texas Instruments. Ток потребления час
недостатков, перечислять которые очень долго (и не нужно). ти схемы со стороны компьютера составляет около 12 мА, из них 11 мА потребляет
В последнее время ситуация с качеством и ценой новых DCDCпреобразователей суще SN75155. Для питания части схемы со стороны компьютера используется DCDCкон
ственно изменилась. Появились новые DCDCпреобразователи, которые имеют уровень шу вертер RQD0512 (DD5) от ф. Recom мощностью в 1 Вт, преобразующий входное напря
мов в несколько раз (!) ниже, чем у DCR05XX или DCP05XX, и стоимость которых более чем жение +5 В в 2 напряжения: +12 В и –12 В, и выдающий ток по 42 мА на каждое нап
в 2 раза меньше последних. Примером могут служить DCDCпреобразователи RSDXX ряжение питания (т. е. с лихвой перекрывающий энергию, требующуюся для питания
и RQD–XX мощностью 0,25÷1,0 Вт от ф. Recom им подобные. Энергии этих DCDCконверте развязки). Микроконтроллер показан схематично; к нему подходят сигналы данных
ров вполне достаточно для питания даже старых преобразователей интерфейса RS232 (типа RS232 (TxDM и RxDM) и сигналы управления (RST и PSEN).

50 51
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

Рис. 1.4.1.2.
Вариант разводки платы!
переходника SOIC8DIP8 для
развязки ADUM1201 (слева —
верхний слой монтажа микросхемы,
справа — нижний слой платы)

Рис. 1.4.1.1.
Схема гальванически
изолированного
интерфейса RS232
на базе развязки
ADUM1201
и преобразователя
интерфейса
SN75155 для
микроконтроллеров
семейств
MSC12XX, ADUC8XX и
AT89C51ED2(RD2)

В платепереходнике в качестве «ножек» используются штырьки, которые легко «отламыва


ются» от линейки из 40 двусторонних штырьков круглого сечения диаметром около 0,5÷0,7 мм.
Верхняя часть штырька (меньшего диаметра) впаивается в платупереходник (лишняя часть
штырька откусывается), а нижняя служит ножкой. Штырек, связанный с 1м выводом микросхе

Рис. 1.4.1.3.
Плата!переходник
SOIC8DIP8 для развязки
ADUM1201:
а — фотография;
б — процедура
«подгибания» ножек
В прямоугольнике, очерченном пунктирной линией, показана схема кабеля связи с микросхемы под ее «дно»
компьютером. Линия RxD соединена с линией DSR непосредственно в разъеме DB9M,
который подключается к COMпорту компьютера. Таким образом, драйвер SN75155
(2й и 7й выводы) работает сразу на 2 входа (на 2 приемника RS232). Для получения
напряжения питания +5 В (питание ADUM1201) используется малопотребляющий и дос
таточно прецизионный стабилизатор LP2950CZ5.0 (DD6). Схема идеально работает на
скорости обмена 115 200 бод на расстоянии между компьютером и микроконтролле
ром до 15 м.
Микросхема ADUM1201 выпускается в корпусе SOIC8, который неудобен для ручного ма
кетирования. Для более удобной работы с этой микросхемой при ручном макетировании ав
тор рекомендует изготовить платупереходник SOIC8DIP8, вариант разводки которой приве
ден на рис. 1.4.1.2. а) б)

52 53
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

мы, можно не откусывать; при установке такой платыпереходника в панельку по нему удобно
ориентировать платупереходник .
Необходимо отметить, что расстояние между центрами ножек (штырьков), находя
щихся на одной линии, но с противоположных сторон платыпереходника (например между
центрами 1й и 8й ножек) составляет по стандарту корпуса DIP 0,3 дюйма, или 7,62 мм. Учи
тывая толщину штырька, а также погрешность монтажа, расстояние между штырьками
может составить чуть менее 6 мм. Максимальное же расстояние между концами ножек,
находящихся на одной линии, но с противоположных сторон микросхемы в корпусе SOIC8
(например между концами 1й и 8й ножек) составляет 6,2 мм. Поэтому микросхема в кор
пусе SOIC8 «не влезет» на платупереходник с топологией, показанной на рис. 1.4.1.2
(в левой нижней части рисунка).
Если же «подогнуть» ножки микросхемы под ее «дно» (рис. 1.4.1.3), то микросхема свобод
но умещается на платупереходник и еще даже остается свободное пространство, что намно
го упрощает пайку микросхемы. Для того чтобы еще более прояснить ситуацию, напомню, что, Рис. 1.4.2.1.
как известно, аналогичное расположение выводов имеют все конденсаторы, резисторы и ди Схема гальванической
развязки на базе
оды, предназначенные для поверхностного монтажа, а также микросхемы в корпусах QFN. микросхем развязок
Следует также отметить, что процедуру «подгибания» ножек микросхемы можно производить ADUM1201, ADUM1200
только один раз, иначе ножки могут сломаться. и преобразователя
интерфейса ADM3202
По фотографии платыпереходника SOIC8DIP8 для развязки ADUM1201 (рис. 1.4.1.3), для микроконтроллеров
видно, что микросхема ADUM1201 (с подогнутыми ножками) очень удачно «вписывается» в то семейств MSC12XX,
пологию платы, а штырек, связанный с 1м выводом микросхемы, не откусан и служит для ADUC8XX
и AT89C51ED2(RD2)
удобства ориентации (как уже говорилось ранее).

1.4.2. Гальванически изолированный интерфейс RS232


на базе микросхем развязок ADUM1201, ADUM1200
и преобразователей ADM3202 и MAX3181
Схема гальванически изолированного интерфейса RS232 на базе 2 микросхем раз
вязок ADUM1201(DD2), ADUM1200(DD3) и преобразователей ADM3202(DD1) и
MAX3181(DD5) (рис. 1.4.2.1), как и предыдущая (см. рис. 1.4.1.1), формирует 4 сигнала
— TxDM, RxDM, RST и PSEN для сопряжения компьютера с микроконтроллерами се
мейств MSC12XX, ADUC8XX и AT89C51ED2 (RD2), поэтому в условном показе микроконт Для более удобного макетирования устройств, использующих обе развязки ADUM1201 и
роллера нет необходимости. ADUM1200, автор рекомендует изготовить платупереходник 2SOIC8DIP12, схема и вари
В связи с тем, что преобразователь ADM3202 имеет 2 передатчика (10й, 7й и 11й, 14й ант разводки которой приведены на рис. 1.4.2.2. Для того чтобы микросхемы «вписались» в то
выводы DD1), линии RxD и DSR разнесены. Это значительно повышает надежность передатчи пологию платыпереходника, их ножки следует подогнуть так же, как и для переходника
ков, т. к. каждый из них работает на 1 вход. Схема кабеля сопряжения с компьютером показа SOIC8DIP8, т. е. так, как показано на рис. 1.4.1.3.
на в прямоугольнике, очерченном пунктиром. Как можно увидеть из его схемы, для каждой из Микросхема приемника RS232 MAX3181 (DD5 — рис. 1.4.2.1) выпускается в планарном
линий RxD и DSR предусмотрен отдельный провод, хотя эти два сигнала формируются преобра корпусе SOT235, который, как и корпус SOIC8, неудобен для макетирования, поэтому автор
зователем ADM3202 из одного и того же сигнала (RxDa), для формирования которого исполь рекомендует изготовить переходник SOT236DIP6 аналогично переходнику SOIC8DIP8
зуется единственный канал развязки ADUM1201 (2й, 7й выводы DD2). Часть схемы, непосре (рис. 1.4.1.2), схема и вариант разводки не приводятся в виду их простоты. Изза малого раз
дственно контактирующая с интерфейсом компьютера (слева от пунктирной линии, условно по мера микросхемы MAX3181 она свободно умещается на платепереходнике без процедуры
казывающей изоляционный барьер), питается от единственного источника питания напряже «подгибания» ножек.
нием +5 В (сигнал «+5 A»), формируемым DCDCпреобразователем RQS0505 мощностью все На рис. 1.4.2.3 приведена фотография вышеуказанных 2 плат переходников:
го 0,25 Вт. Размер DCDCконвертера RQS0505 (и соответственно стоимость) меньше разме 2SOIC8DIP12 и SOT236DIP6.
ра конвертера RQD0512, примененного в предыдущей схеме (рис. 1.4.1.1). Кроме того, отпа Кроме того, следует отметить, что микросхема приемника MAX3181 труднодоступна
дает необходимость в дополнительном стабилизаторе +5 В (DD6 — см. рис. 1.4.1.1). (в малых количествах), поэтому вместо нее можно применить КМОПтранзистор 2N7000.

54 55
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

Рис. 1.4.2.2. 1.4.3. Гальванически изолированный интерфейс RS232


Вариант разводки платы!переходника на базе микросхем развязок ADUM1201, ADUM1200
2SOIC8DIP12 для и преобразователя MAX1406
двух развязок ADUM1201 и ADUM1200
Схема гальванически изолированного интерфейса RS232 на базе развязок ADUM1201 и
ADUM1200 (рис. 1.4.3) несколько проще, чем предыдущая (рис. 1.2.4.1), т. к. в ней примене
на единственная микросхема преобразователя интерфейса MAX1406 (DD1), включающая в
свой состав по три приемника и три передатчика. В связи с этим отпадает необходимость
в дополнительном приемнике (MAX3181), как в схеме на рис. 1.4.2.1. Правда, возникает не
обходимость в дополнительном стабилизаторе +5 В (DD5 — LP2950Z5.0) и, кроме того, тре
буется DCDCпреобразователь с двумя (+12 В и –12 В) выходными напряжениями питания
(DD4 —RQD0512). Схема была достаточно скрупулезно протестирована автором и показала
идеальную работу на скорости 115 200 бод (как было упомянуто ранее, максимальная ско
рость работы MAX1406 составляет 230 кбод). Размах сигнала драйвера повышен и составля
ет около ±11,5 В на нагрузке в 5 кОм, что является несомненным преимуществом микросхе
мы MAX1406 перед упоминавшейся ранее ADM3202 (размах сигнала составляет ±10 В при

Рис. 1.4.2.3.
Фотографии плат!
переходников
2SOIC8DIP12 для
двух развязок
ADUM1201 и
ADUM1200 (а) и
SOT!23!6DIP6 (б) для
приемника MAX3181

Рис. 1.4.3.
Схема гальванической
развязки на базе
микросхем развязок
ADUM1201, ADUM1200
и преобразователя
а) интерфейса MAX1406
б) для микроконтролле!
ров семейств
Схема замены микросхемы MAX3181 на транзистор 2N7000 приведена в прямоугольни MSC12XX, ADUC8XX
ке, очерченном пунктиром, в левой нижней части рис. 1.4.2.1. Несколько слов о достои и AT89C51ED2(RD2)
нствах этой схемы (рис. 1.4.2.1). Схема достаточно проста, в ней применены относитель
но легкодоступные (и дешевые) компоненты и не содержится ни одного резистора (если
использовать приемник MAX3181). Кроме того, схема идеально работает на скорости
115 200 бод, т. к. максимальные скорости работы ADM3202 и MAX3181 значительно вы
ше и составляют 460 кбод и 1,5 Мбод соответственно. Длина кабеля связи с компьюте
ром может достигать 20 м. Автор рекомендует эту схему гальванических развязок для
большинства применений (и не только конкретно для микроконтроллеров семейств
MSC12XX, ADUM8XX и AT89C51ED2/RD2).

56 57
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

питании +5 В). Длина кабеля связи (на такой скорости работы схемы) может достигать 20 м.
Еще одно достоинство схемы в том, что она более удобна для макетирования, чем предыду
щая (рис. 1.4.2.1), если использовать микросхему MAX1406 в корпусе DIP16 (MAX1406CPE).
Правда, стоимость такой микросхемы (при малом количестве) довольно высока — чуть ме
нее 5 долл.
И последнее, что необходимо отметить по поводу микросхемы MAX1406. Эта мик
росхема была выпущена ф. MAXIM для прямой замены более старых микросхем
MC145406 от ф. Motorola и SN75C1406 от ф. Texas Instruments в устройствах, где требу Рис. 1.4.4.1.1.
Схема гальванически
ется высокая скорость обмена (в 115 200 бод), поскольку ни MC145406, ни SN75C1406 изолированного преоб!
такую скорость обмена не поддерживают. Автор настоятельно рекомендует ни в коем разователя интерфей!
случае не применять 2 последние микросхемы в качестве преобразователей интерфейса са ADUMAX на базе
ADUM1201, ADUM1200,
RS232 (в схеме на рис. 1.4.3). Эксперименты, проведенные автором с этими микросхема MAX3181 и MAX3190
ми, показали, что скорость обмена свыше 38 400 бод от них получить невозможно; кро
ме того, даже на такой скорости обмена эти 2 микросхемы работают нестабильно,
что приводит к частым «зависаниям» компьютера.

1.4.4.Гальванически изолированный интерфейс RS232


на базе микросхем развязок ADUM1201, ADUM1200
и преобразователей MAX3190 и MAX3181
Малый размер микросхем гальванических развязок ADUM1201 и ADUM1200 и кро
шечный размер преобразователей MAX3190, MAX3181 и MAX3183 позволяют конструиро
вать очень малые по габаритам устройства гальванически развязанного интерфейса
RS232, которые могут свободно умещаться на плате размером с обычную микросхему в
DIPкорпусе. Такая плата, оснащенная «ножками», подобным ножкам микросхем в DIPкор
пусах, может представлять собой чтото типа гибридной микросхемы в DIPкорпусе, кото Рис. 1.4.4.1.2.
рая может быть, с одной стороны, легко сконфигурирована под ту или иную задачу и, с дру Вариант разводки платы гальванически
изолированного преобразователя интерфейса
гой, — очень удобной для макетирования. Впоследствии такая «микросхема» после доста ADUMAX на базе ADUM1201, ADUM1200, MAX3181
точно скрупулезного тестирования может быть установлена уже в готовое изделие. Ниже и MAX3190
приводится 2 варианта подобных «гибридных микросхем» гальванически изолированного
интерфейса, предназначенного для программирования и штатного режима работы микро
контроллеров семейств MSC12XX, ADUC8XX и АТ89C51ED2(RD2) (1й вариант) и микроко
нтроллеров семейств P89LPC9XX (2й вариант), который (с некоторыми упрощениями) мо
жет быть также использован для микроконтроллеров C8051F067/330D.

1.4.4.1. Плата гальванически изолированного интерфейса


на базе развязок ADUM1201, ADUM1200, MAX3181
и MAX3190 для микроконтроллеров семейств MSC12XX,
ADUC8XX и AT89C51ED2/RD2 совместно с инвертирующими передатчиком MAX3190 (DD3) и приемником MAX3181 (DD4),
Схема гальванически изолированного преобразователя интерфейса на базе на другой (в нижней части) — 2канальная однонаправленная развязка MAX1200 (DD2) и два
ADUM1201, ADUM1200, MAX3181 и MAX3190 (рис. 1.4.4.1.1) состоит из 3 инвертирующих инвертирующих приемника MAX3181 (DD5 и DD6).
приемников RS232 — MAX3181 (DD4, DD5 и DD6), одного инвертирующего передатчика На фотографии платы «микросхемы» ADUMAX (рис. 1.4.4.1.3) можно увидеть, что такая тополо
RS232 — MAX3190 (DD3), одной 2канальной двунаправленной развязки ADUM1201 гия разводки компонентов позволила расположить 6 микросхем, 5 конденсаторов и 14 штырь
(DD1) и одной 2канальной однонаправленной развязки ADUM1200 (DD2). Назовем услов ков, которые являются «ножками» микросхемы, на довольно ограниченном пространстве, по пло
но такое устройство «ADUMAX». щади равном площади стандартной микросхемы в корпусе DIP16. На фотографии (рис. 1.4.4.1.3,а)
В варианте разводки платы (рис. 1.4.4.1.2) компоненты размещены с двух сторон. На од можно заметить явно выступающий (не откусанный) штырек, соответствующий 1му выводу «мик
ной стороне платы (в верхней части) размещенa двунаправленная развязка ADUM1201 (DD1) росхемы» ADUMAX, по которому легко ориентировать плату при установке в панельку.

58 59
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232

Схема гальванической развязки на базе ADUMAX для микроконтроллеров семейств


MSC12XX, ADUC8XX и AT89C51ED2 (RD2), как видно из рис. 1.4.4.1.4, формирует сигналы
для микроконтроллера RxDM, RST и PSEN из сигналов интерфейса RS232 TxD, DTR и RTS
соответственно, а сигнал интерфейса RxD формируется сигналом микроконтроллера
TxDM. Пунктиром показан изоляционный барьер. Схема тестировалась на скорости обме
на 115 200 бод и показала отличные результаты. Длина кабеля связи с компьютером мо
жет достигать 20 м. В прямоугольнике, очерченном пунктиром, показана схема кабеля
связи с компьютером.
Схема развязки достаточно проста и занимает мало места на плате.

1.4.4.2. Плата гальванически изолированного интерфейса


а)
на базе развязок ADUM1201, ADUM1200, MAX3181, MAX3183
Рис. 1.4.4.1.3. и MAX3190 для микроконтроллеров семейств P89LPC9XX
Фотография платы гальванически изолированного преобразова!
теля интерфейса ADUMAX на базе ADUM1201, ADUM1200, Схему платы гальванически изолированного интерфейса на базе развязок ADUM1201,
MAX3181 и MAX3190: а — верхняя часть платы; б — нижняя ADUM1200, MAX3181, MAX3183 и MAX3190, приведенную на рис. 1.4.4.2.1, назовем «мик
б)
росхемой» ADUMAX1. Можно заметить, что ADUMAX1 отличается от ADUMAX (рис. 1.4.4.1.1)
только тем, что 2 инвертирующих приемника ADUMAX — MAX3181(DD5 и DD6) заменены на
2 неинвертирующих приемника MAX3183 (тe же DD5 и DD6). В остальном схемы и соотве
Рис. 1.4.4.1.4.
тственно разводка плат идентичны.
Схема гальванической развязки Схема гальванической развязки на базе ADUMAX1 для микроконтроллеров семейств
на базе ADUMAX для микроконт! P89LPC9XX (рис. 1.4.4.2.2) формирует сигналы для микроконтроллера RxDM, RST и Vcc из сиг
роллеров семейств MSC12XX,
ADUC8XX и АТ89C51ED2 (RD2)
налов интерфейса RS232 TxD, DTR и RTS соответственно, а сигнал интерфейса RxD формиру

Рис. 1.4.4.2.1.
Схема гальванически
изолированного
преобразователя интерфейса
ADUMAX1 на базе ADUM1201,
ADUM1200, MAX3181, MAX3183
и MAX3190

60 61
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ЧТО ДЕЛАТЬ, ЕСЛИ ДЛИНА ЛИНИИ СВЯЗИ ИНТЕРФЕЙСА RS232 ПРЕВЫШАЕТ 20 М?

ется сигналом микроконтроллера TxDM. Сигнал Vcc формируется на стоке КМОПтранзистора 1.5. Что делать, если длина линии связи
BS250 (T1), исток которого соединен с источником питания +3,3 В, а на затвор подается сиг интерфейса RS232 превышает 20 м?
нал ТТЛуровня с выхода приемника ADUMAX1 (выводы 10 и 16). На вход этого же приемника
подается сигнал RTS с интерфейса RS232. Пунктиром показан изоляционный барьер. Схема Иногда возникает задача «удлинить» линию связи для интерфейса RS232; при этом за
тестировалась на скорости обмена в 115 200 бод и показала отличные результаты. Длина ка дача поставлена так, что нельзя изменять ни схему устройства на базе микроконтроллера,
беля связи с компьютером может достигать 20 м. В прямоугольнике, очерченном пунктиром, ни его программное обеспечение, ни программное обеспечение компьютера, с которым
показана схема кабеля связи с компьютером. этот микроконтроллер связан по интерфейсу RS232. С подобными задачами автор сталки
Схема достаточно проста и занимает мало места на плате. Подобную схему можно приме вался достаточно часто. Ниже приведены пример подобной ситуации и достаточно простое,
на взгляд автора, решение возникшей проблемы, которая некоторых разработчиков может
нить и для микроконтроллеров C8051F067/330D (исключая линию RTS и транзистор T1).
поставить в тупик (рис. 1.5.1).
Задача была поставлена следующим образом.
Имеется прибор (на базе микроконтроллера), который сопрягается с компьютером все
го двумя линиями интерфейса RS232 — TxD и RxD и, естественно, «землей» — сигналом SG.
Причем связь между компьютером и прибором по интерфейсу RS232 должна быть дуплекс
ной (как это обычно делается в интерфейсе RS232), т. е. передатчик и приемник должны ра
Рис. 1.4.4.2.2. ботать независимо друг от друга (так было написано программное обеспечение для компь
Схема гальванической развязки ютера и микроконтроллера в приборе).
на базе ADUMAX1 для микроконт!
роллеров семейств P89LPC9XX В качестве прибора был предоставлен «Газовый корректор», предназначенный для изме
рения расхода и объема газа, проходящего по газовой магистрали (трубе). Прибор располагал
ся непосредственно на магистрали, а компьютер — на расстоянии около 1 км ( 900 м) от при
бора. Программное обеспечение, имеющееся на компьютере, по снятию показаний прибора
было уже давно куплено и оплачено, поэтому изменить его уже было невозможно; кроме того

Рис. 1.5.1.
Схема двунаправленного преобразо!
вателя RS232RS485/RS422

62 63
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ЧТО ДЕЛАТЬ, ЕСЛИ ДЛИНА ЛИНИИ СВЯЗИ ИНТЕРФЕЙСА RS232 ПРЕВЫШАЕТ 20 М?

отсутствовала возможность както изменить программное обеспечение и в приборе, т. к. при


бор был разработан достаточно давно. Попытки заказчика применить стандартный преобра Рис. 1.5.4.
зователь интерфейса RS232 в интерфейс RS485 ни к чему не привели ввиду того, что в пре Фотография общего вида
образователе интерфейса RS485 была предусмотрена только полудуплексная связь, как это двух устройств —
преобразователей
обычно осуществляется в этом интерфейсе. RS232RS485/RS422
Для решения задачи автор использовал достаточно известные преобразователи
RS485/RS422TTL(ADM488), работающие в дуплексном режиме, и уже упоминавшийся преоб
разователь интерфейса RS232 ADM3202 (рис. 1.5.1). Как видно из схемы, все сигналы интер
фейсов и питание выведены на клеммы (K01÷K08). Для индикации включения питания ис
пользуется светодиод VD1. Для питания устройства применяется достаточно дешевый стабили
зированный источник питания +5 В/200 мА.
Расположение элементов (а) и вариант разводки платы устройства преобразователя интерфей
сов (б, в) приведены на рис. 1.5.2 . Использование микросхем в корпусах DIP существенно облегча
ет производство устройства. Для распайки компонентов не требуется высокой квалификации мон
тажника (вся работа по монтажу плат была довольно ловко проделана школьником 9го класса).

а
Рис. 1.5.2.
Вариант разводки платы
двунаправленного
преобразователя
RS232RS485/RS422:
а — расстановка элементов;
б — сторона монтажа «ТОР»;
в — сторона пайки «ВОТТОМ»
(вид сквозь плату)

Рис. 1.5.3.
Фотография устройства
преобразователя
RS232RS485/RS422

На фотографии устройства (рис. 1.5.3) размеры платы выбраны таким образом, что она лег
ко умещается в обыкновенную телефонную розетку и прикручивается к ней 8 саморезами, слу
жащими одновременно крепежом клемм к плате. В крышке розетки просверлено отверстие,
через которое наружу выведена верхняя часть светодиода.
На фотографии общего вида 2 устройств — преобразователей RS232RS485/RS422
(рис. 1.5.4) показаны: вверху — устройство в собранном виде, предназначенное для сопряже
ния с компьютером (на фотографии виден кабель с разъемом DB9M, который подключается к
COMпорту компьютера), внизу — устройство со снятой крышкой.

64 65
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232

Рис. 1.5.5.
Схема сопряжения прибора
с компьютером с помощью дву!
направленного преобразователя
Программные
RS232RS485/RS422

Для сопряжения устройств с компьютером и прибором (рис. 1.5.5) используется обыкно средства
венный (неэкранированный) 4жильный телефонный провод длиной 1÷1,5 м. Линия связи
между двумя устройствами представляет собой достаточно дешевый провод, состоящий
из 2 неэкранированных витых пар в одной общей оплетке.
интерфейса
Тестирование устройств показало идеальную их работу в дуплексном режиме на скорос
ти в 115 200 бод на линии связи длиной в 1 км (!). RS232

2.1. Предварительные замечания ............................................................68


2.2. Формирование коротких машиннонезависимых
временных задержек ...........................................................................71
2.3. Применение совмещений в программах
для микроконтроллера и компьютерa ...............................................75
2.4. Использование нового алгоритма обмена информацией
по RS232 между компьютером и микроконтроллером ..................83
2.5. Программирование интерфейса RS232 в ОС Windows98/XP .....125
2.6. Применение интерфейса RS232 для программирования
микроконтроллеров в системе (In_System_ProgrammingISP) .....161
ПРЕДВАРИТЕЛЬНЫЕ ЗАМЕЧАНИЯ

2
пенно были все выявлены, и в результате их устранения, а также благодаря некоторым допол
нительным новшествам появилась система Win98,SE2.
Системыпредшественницы Win'XP, SP2 (Win'2000, Win'Me и др.), которые были созданы
уже после Win98, постепенно становились «более» многозадачными, т. е. «псевдомногозадач
ность» постепенно превращалась в действительно «многозадачность», а приставка «псевдо»
постепенно исчезала. Кроме того, эти системы начали сочетать в себе некоторые сетевые воз
можности. После появления системы Win'XP, SP2, которая вобрала в себя лучшие свойства
Программные средства системпредшественниц, а также сетевые свойства Win'NT, системы Win'2000, Win'Me и др.
начали постепенно уходить из обращения.
Win'XP — действительно многозадачная операционная система, в которой каждой из
интерфейса RS232 нескольких запущенных и работающих программ отводится определенный «квант» време
ни. В Win'XP уже практически нет никакой связи с DOS. Программисту доступны далеко не
все ресурсы компьютера: прямой ввод/вывод через порты запрещен. И хотя и существуют
некоторые «обходные» пути, позволяющие преодолеть это запрещение (например извест
2.1. Предварительные замечания ная программa USERPORT, после запуска которой в Win'XP можно обращаться напрямую к
Программные средства для интерфейса RS232, по которому компьютер и микроконтрол портам ввода/вывода), основная идеология Win'XP — не разрешать никакой программе
лер обмениваются информацией между собой, условно можно разделить на две части. К пер «захватить» все ресурсы компьютера и, в частности, — запрет на прямой ввод/вывод че
вой части отнесем программы, написанные для компьютера, ко второй — программы для мик рез порты. В настоящее время операционная система Win'XP наиболее распространена.
роконтроллера. Однако система Win'98, SE2 до сих пор применяется, т. к. она тесным образом связана с
В свою очередь, программы для компьютера условно можно разделить также на две час DOS, которая является исключительно надежной благодаря своей простоте, хорошей изу
ти. К первой отнесем программы, написанные для операционной системы (ОС) DOS, ко второй ченности и предсказуемости работы.
— для Windows. В связи с вышеизложенным все программы для Windows будут приведены для Win'XP;
Если ОС DOS с последней седьмой (MSDOS V7.0) версией больше не модифицируется, то в Win'98 они также работают, хотя некоторые значительно медленнее, чем в DOS и
системы Windows постоянно обновляются. Систем Windows несколько. Мы будем рассматри Win'XP, но их работа в Win'XP — наиболее общий случай для систем Windows. Кроме того,
вать только две — последнюю версию Windows98 2й редакции (Win'98, SE2) и WindowsXP для несколько программ будет приведено для работы в DOS по двум причинам. Вопервых,
профессионалов с сервисным пакетом 2й редакции — WindowsXP professional, service pack 2 система DOS до сих пор используется благодаря своей надежности, вовторых, на приме
(Win'XP, SP2). Все промежуточные системы Windows, предшествующие Win'98, SE2 ре программ, написанных для DOS, будет показано, что программирование обмена
(WindowsV3.1, Windows95) и Win'XP, SP2 (Windows2000, WindowsMе и др.), а также стоящая компьютера с микроконтроллером по интерфейсу RS232 в Win'XP мало чем отличается от
несколько особняком WindowsNT, рассматриваться не будут по причинам, которые более пред программирования в DOS (если использовать «запрещенные» в Win'XP прямые процес
метно и четко будут сформулированы позже. сорные команды ввода/вывода в порт: in и out).
Вначале несколько слов о системе Windows98, SE2 и ее предшественниках. В Win'XP (кстати сказать, и в Win'98) обращение к интерфейсу RS232 возможно через спе
Win'98 — псевдoмногозадачная операционная система, которая зарекомендовала себя циальный программный интерфейс (простите за тавтологию), разработанный компанией
как исключительно надежная (поэтому до сих пор и используется) и в которой все еще допус Microsoft специально для работы приложений (Application Programm Interface — API). Функции
кается полноправное применение DOS. Программы для DOS работают в Win'98 как в режиме API издавна «славятся» своей «заглюченностью», поскольку API — бесплатный. Но бесплатный
«эмуляции», так и непосредственно (используется DOS7.0). Псевдомногозадачность Win'98 сыр, как уже упоминалось, бывает только в мышеловках, в каковую и сможет «угодить» неза
проявляется в том, что несколько запущенных программ могут работать «одновременно», но в дачливый программист («чайник», как его сейчас называют), если попытается использовать
действительности в каждый момент времени работает только одна программа, которая мо для программирования RS232 описанные в MSDN ( http://msdn.microsoft.com/library ) или в
жет «захватить» все ресурсы компьютера, а остальные программы ждут своей очереди. Имен других справочниках и руководствах эти самые функции API. В книге для полноты изложения
но этим свойством Win'98 похожа на DOS, в которой в каждый момент времени может рабо показано, как достаточно просто запрограммировать обмен по RS232 в Windows с помощью
тать вообще только одна программа (именно та, которая запущена). В Win'98 программисту APIфункций. Кроме того, было выявлено, что использование API, особенно в Win'98, резко
доступны все ресурсы компьютера, в том числе — прямой ввод/вывод через порты. Благода «тормозит» обмен по RS232, в связи с чем автор не рекомендует пользоваться APIфункциями,
ря этой особенности программирование интерфейса RS232 практически мало чем отличает предназначенными для программирования интерфейса RS232.
ся от его программирования в DOS. Существуют, конечно, некоторые нюансы, на которые бу Теперь относительно языка программирования. Продолжая традицию программиро
дет обращено особое внимание. вания на языке Кларион, который использовался для программирования обмена между
Windows 3.1 — система, которая была написана как программа DOS, поэтому большого микроконтроллером и компьютером по интерфейсу RS232 в системе DOS (Clarion v3.101)
распространения не получила. В Windows'95 было допущено много ошибок, которые посте и программы на котором приведены в первой части книги [4], в настоящей книге автор

68 69
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ФОРМИРОВАНИЕ КОРОТКИХ МАШИННОНЕЗАВИСИМЫХ ВРЕМЕННЫХ ЗАДЕРЖЕК

приводит все программы для компьютера, написанные для Win'XP, также на языке тических целях для программирования микроконтроллеров семейств P89LPC9XX в ре
Кларион для Windows. В настоящее время (конец 2005 г.) последняя версия этого языка жиме ICP, о котором уже упоминалось ранее.
— Clarion v6.0. Таким образом, дальнейшее изложение будет вестись в следующей последователь
Программы для DOS будут приведены на языке Clarion для DOS (ClarionV3.101) с исполь ности. Вначале будут рассмотрены: вопрос о том, каким образом обеспечить машинно
зованием пакета подпрограмм графического интерфейса для пользователя (Graphic User независимую короткую временную задержку в программах для DOS и Windows; вариан
Interface) — GUI–3. ты применения совмещений в программах для микроконтроллера (на Си и ассемблере)
Программы для микроконтроллера в основном будут приведены на языке Си (CKeil, и в программах для компьютера (на языке Кларион); вопрос об использовании нового
v6.14), хотя некоторые простые программы для микроконтроллера будут приведены и на ас алгоритма обмена по RS232 (для компьютера и для микроконтроллера); функции API для
семблере. программирования интерфейса RS232 в Windows и их использование совместно с но
Но прежде чем заниматься изложением материала по программированию интерфейса вым алгоритмом обмена, разработанным автором; вопрос об использовании прямых
RS232 (и для микроконтроллера и для компьютера), автор хотел бы уделить некоторое внима команд процессора ввода/вывода в порт (in и out) в Win'XP с приведением тестовых
ние двум проблемам, которые часто вызывают затруднения у многих программистов (иногда программ обмена по RS232 и сравнением быстродействия систем DOS, Win'98 и
даже достаточно высокого класса). Win'XP.
Первая проблема — как при написании программ (в DOS и Windows) обеспечить доста Дальнейшее изложение будет посвящено программированию в системе (ISP) микро
точно короткую аппаратно независимую (или, другими словами, машиннонезависимую) вре контроллеров MSC12XX, ADUC8XX, AT89C51ED2(RD2) и P89LPC93XX с компьютера по
менную задержку (в несколько микросекунд). При написании программ для микроконтролле интерфейсу RS232. Для микроконтроллеров MSC12XX, ADUC8XX и P89LPC93XX будут
ра такая проблема никогда не возникает, т. к. программисту всегда известен тип микроконт приведены программы автора для DOS и Win'XP. Для микроконтроллера
роллера (и его скоростные качества) и частота его тактового генератора. Поэтому эта пробле AT89C51ED2(RD2) имеется бесплатно распространяемое программное обеспечение,
ма касается только программ для компьютера. разработанное ф. ATMEL и предназначенное для программирования в системе (ISP)
Вторая проблема — грамотное и повсеместное использование совмещений. —FLIP V.2.4.4. Для использования этой программы будут приведены некоторые момен
Напомню, что совмещением называется такая структура данных, когда две или более ты по настройке.
переменных разного формата разделяют между собой одну и ту же область памяти. Будет рассмотрен вопрос о программировании микроконтроллеров P89LPC9XX в режиме
Например, двухбайтовая переменная (USHORT — в Кларионе или unsigned short в СИ) ICP под управлением микроконтроллеров (P89LPC93X и MSC12XX) и компьютера и приведены
и две однобайтные переменные (BYTE — в Кларионе и unsigned char в Си) могут распо программы, разработанные автором, для микроконтроллеров P89LPC93X и MSC12XX, а также
лагаться в одной и той же области памяти. При обмене информации по 8разрядному программы для DOS и Win'XP, выполняющие программирование микроконтроллеров
интерфейсу (например RS232) удобнее использовать однобайтные переменные; при P89LPC9XX, и, наконец, будут рассмотрены вопросы о программировании микроконтроллеров
расчетах либо для других целей, когда переменная уже находится в процессоре (или в C8051FXXX по интерфейсам JTAG и C2 (с помощью USBDEBUGадаптера) и штатный режим их
микроконтроллере), удобнее работать с двухбайтной переменной. Но поскольку обе пе работы по интерфейсу RS232.
ременные располагаются в одной и той же области памяти, нет необходимости преоб
разования 2 однобайтных переменных в 1 двухбайтную переменную (и обратно).
А такое преобразование часто «тянет» за собой использование, например, библиотек с 2.2. Формирование коротких машиннонезависимых
плавающей запятой, что резко увеличивает время преобразования и объем памяти временных задержек
программ. При использовании совмещений проблема преобразования «исчезает», т. к.
каждый тип переменной определен, и переменную любого типа можно использовать в 2.2.1. Общие положения
программе «напрямую».
И еще будет рассмотрен более подробно вопрос об использовании нового алгорит Короткие и достаточно точные временные задержки, как будет видно из дальнейше
ма обмена по интерфейсу RS232, разработанного автором, о котором уже было упомя го изложения, играют очень важную роль в обмене сигналами по интерфейсу RS232
нуто в настоящей книге и который приведен в ранее опубликованной 1й части книги [4]. между компьютером и микроконтроллером. Формирование коротких машиннонезави
В связи с увеличением быстродействия как современных компьютеров, так и совре симых временных задержек существенно различается в операционных системах DOS
менных микроконтроллеров, использование такого алгоритма обмена, как будет пока и Windows. В DOS, к сожалению, нет штатных программных средств, которые могут обес
зано далее, приобретает еще большее значение, особенно это касается надежности и печить аппаратно независимые короткие временные задержки, тогда как в Windows
скорости обмена. Будут приведены некоторые уточнения и «обновления» этого алгорит они присутствуют. В связи с этим методы программного формирования временных
ма, временная диаграмма сигналов передатчика и приемника, участвующих в обмене задержек различны в DOS и Windows. Поэтому вначале рассмотрим программное фор
информацией. В результате будут даны рекомендации по использованию такого алго мирование задержек в DOS, а затем — в Windows.
ритма обмена как в программах для микроконтроллера, так и в программах для компь Поскольку, как уже упоминалось, львиная доля всех программ, представленных в кни
ютера. Кроме того, будут приведены примеры применения этого алгоритма уже в прак ге, написана на языке Кларион, примеры программ будут приведены для DOS на языке

70 71
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ФОРМИРОВАНИЕ КОРОТКИХ МАШИННОНЕЗАВИСИМЫХ ВРЕМЕННЫХ ЗАДЕРЖЕК

Кларион для DOS (последняя версия языка — Clarion v.3.100), а для Windows на языке получим 2. Это значит, что 1 цикл счета длится около 2 мкс. Для получения, например, 10 мкс,
Кларион для Windows (в настоящее время (2005 г.) последняя версия этого языка — достаточно организовать цикл счета до 5:
Clarion v.6.0).
!
2.2.2. Программное формирование коротких аппаратно-независимых ! Временная задержка 10 мкс.
временных задержек в DOS !
loop i#=1 to 5
Язык Clarion v.3.100 для DOS имеет несколько опций (сред) работы. Это режимы: .
статический (Static Model), оверлейный (Overlay Model) и защищенный (Protected Mode). !
Наиболее скоростной — статический, но программы, написанные для этого режима,
очень короткие, поскольку он может работать с очень ограниченной областью памяти Данную процедуру, конечно, можно достаточно просто автоматизировать, вставляя каж
компьютера. Оверлейный режим на современных компьютерах вообще не работает. дый раз в программу вычисление цикла, например, до 10 с и автоматически вычисляя время
Защищенный режим использует всю область памяти компьютера, т. к. применяется цикла. Правда, при этом нужно будет ждать 10 с. Можно этого и не делать, а один раз опреде
только при опции расширенной памяти (DOS Extender). Скорость работы компьютера лить параметр цикла и в дальнейшем его использовать (так, например, написаны все програм
разная для статического и защищенного режимов. Кроме того, различные компьютеры, мы автора).
естественно, работают с разной скоростью. Единственная стабильная временная база,
на которую можно положиться в программном отношении, — это системный таймер, 2.2.3. Программное формирование коротких аппаратно-независимых
отсчитывающий время на всех компьютерах одинаково. Но минимальный интервал временных задержек в Windows
времени системного таймера составляет около 18 мс, что для коротких временных за
В операционных системах Windows задача формирования коротких аппаратнонезависи
держек (5÷30 мкс) — очень много. Поэтому единственная возможность получить точ
мых временных задержек значительно упрощается. Дело в том, что и в Win'98 и в Win'XP для
ную временную задержку заключается в следующем. Запускается системный таймер,
определения интервалов времени для собственных нужд используется так называемый
далее организуется цикл счета до какоголибо большого числа N (например, до милли
«Представительский счетчик» — QueryPerformanceCounter, который постоянно считает с опре
она или больше), после окончания счета опрашивается таймер и сравнивается со зна
деленной частотой F — QueryPerformanceFrequency. Эта частота различна для Win'98 и Win'XP
чением, которое предшествовало счету, т. е. определяется время счета Т. Далее N де
и составляет около 2 MГц в Win'98 и около 7 МГц — в Win'XP (для компьютера типа P4, 1,7
лится на Т, в результате чего можно получить частоту счета F[1/c]. Зная частоту счета,
ГГц). Эта частота счета жестко привязана к временной базе системного таймера. Для получе
не составляет большого труда сформировать любую временную задержку. Эта идея дос
ния необходимой временной задержки точное значение частоты F выяснять совсем не обяза
таточно примитивна, но, к сожалению, в DOS другого пути нет. Второй вариант — запус
тельно. Достаточно разделить эту частоту на 1 000 000, чтобы получить временную базу для
тить таймер и одновременно запустить счетчик цикла. После прошествия времени Т
счетчика в 1 мкс. Умножив это значение, например на 25, и заставив считать счетчик до это
(например 10 с) остановить счет и выяснить, до какого числа i досчитал счетчик цикла.
го значения, можно получить временную задержку в 25 мкс. Причем организованная таким
Приведем пример.
образом временная задержка будет абсолютно аппаратнонезависимой, т. е. будет давать од
ну и ту же задержку для разных компьютеров и операционных систем (Win'98 или Win'XP).
!
! Определение параметров для Разрядность счетчика — 8 байт, поэтому максимальное число, до которого счетчик
! вычислении временной задержки. может досчитать, а затем сброситься и начать считать заново, составляет
! 0ffffffffffffffffh=18 446 744 073 709 551 615. Это очень большое число, трудно поддаю
T#=clock() щееся «озвучиванию», тем не менее, с ним можно оперировать. В Кларионе не предусмот
i#=0 рены 8байтовые числа, поэтому для определения такого числа для счетчика (COUNTER)
loop используются два 4байтовых числа (ULONG и LONG), объединенные в группу (GROUP).
if (clock()T#)>1000 then break. Аналогичным образом определяется и частота счета (FREQUENCY). Такая структура дан
i#=i#+1 ных называется совмещением, о котором уже упоминалось. Более подробно о совмеще
. ниях и их применении в программах будет изложено несколько позже.
show(10,10,'10 сек.=')
Для работы со счетчиком необходимо использовать APIфункции (о которых также уже упо
setcursor(10,20)
type(i#)
миналось). Прототипы APIфункций для счетчика и частоты в Кларионе известны и четко опре
! делены. Например, для счетчика имеется следующий прототип:

В этом примере после 10 с счета на экран выведется значение переменной i#. Предполо QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL
жим, что, к примеру, i#=20000000. Тогда, разделив i# на 10 000 000 (10 с = 10 000 000 мкс),
72 73
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА

Ниже приведен фрагмент программы, написанной на Clarion v.6.0, использующей заде ! —


ржку в 25 мкс.
Оператор do DEL25 !Задержка 25 мкс.

do DEL25 ! 
! 
! 
как раз и выполняет задержку в 25 мкс: !
! Подпрограммы
! !
PROGRAM ! 
! ! 
! Переменные для частоты и счетчика ! 
! !
FREQUENCY GROUP,PRE(FRE) DEL25 routine
FREQL ULONG loop until QueryPerformanceCounter(COUNTER). !Чтение счетчика.
FREQH LONG CSTARTL=CNT:COUNTL !Занесение начального значения в
. CSTARTH=CNT:COUNTH !две стартовых longпеременных.
COUNTER GROUP,PRE(CNT) loop
COUNTL ULONG loop until QueryPerformanceCounter(COUNTER). ! Ожидание
COUNTH LONG if CNT:COUNTH=CSTARTH !
. DELTAC=CNT:COUNTLCSTARTL ! прошествия
! еlse !
DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени
. !
! if DELTAC>DC then break. ! DC(=25 мкс.)
! Прототипы APIфункций — для WIN'XP. . !
! !

!
MODULE('DELAY')
QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL
QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL
2.3. Применение совмещений в программах
END
для микроконтроллера и компьютера
! Под совмещением принято понимать такую структуру данных, когда несколько перемен
!  ных разного формата перераспределяют одну и ту же область памяти. Например, в памяти
!  компьютера или микроконтроллера может располагаться одна 2байтная переменная (типа
CODE
USHORT — в Кларионе и/или unsigned short — в Си) и две 1байтные переменные (типа BYTE
! 
! 
— в Кларионе или unsigned char — в Си).
Приведем пример.
! Пусть требуется передать из компьютера в микроконтроллер по интерфейсу RS232 длину
! Вычисление временной задержки в 25 мкс. какойлибо строки, состоящей из N байт. Причем N может насчитывать несколько тысяч байт
! (например, N — длина программы для микроконтроллера). Целесообразно выбрать формат
loop until QueryPerformanceFrequency(FREQUENCY). !Определение переменной N как 2байтной, например USHORT. С другой стороны, переменная типа USHORT
!частоты работы счетчика. не может быть передана по 8разрядному (1байтному) интерфейсу (RS232), поэтому ее целе
DC=int(25*FRE:FREQL/1000000) !Вычисление времени счета в 25 мкс. сообразно разбить на две 1байтные переменные (формата BYTE), являющиеся, например,
! старшим (NH) и младшим (NL) байтами переменной N. Затем передать, например, вначале
!  младший байт NL, а затем — старший NH. При приеме 2 байт микроконтроллер должен восста
! 
новить из двух 1байтных переменных (NL и NH) 2байтную переменную N и уже оперировать

74 75
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА

ею, например, использовать ее как максимальное значение счетчика принимаемых байт 


строки и т. п. —
Решение поставленной задачи «в лоб» может быть достаточно простым и заключаться в Вывод BT по RS232
следующем. 

Вначале «разбиваем» 2байтную переменную N на две 1байтные переменные NH и NL.
!
Это можно сделать, например, так:
Фрагмент программы на Си приема числа N для микроконтроллера может выгля
NH=int(N/256) деть так:
NL=N256*NH
//
T. e. старший байт NH получается от целочисленного деления N на 256, а младший байт NL — //Определение переменных
как разность между N и значением старшего байта, умноженным на 256. //
После приема двух байт NH и NL микроконтроллер должен восстановить исходное число N. unsigned char NL,NH;
Это можно сделать, например, так: unsigned int N;
//
N=NH*256+NL // П/п ввода байта
//
unsigned char inbyte() {
т. е. исходное число может N быть восстановлено как сумма значений старшего байта NH, ум
.
ноженного на 256, и младшего байта. Прием байта по RS232
.
Фрагмент программы на Кларионе для компьютера при N=35000 для такого решения return(byte);
приведен ниже. }
//
!
PROGRAM //
//Основная программа
N USHORT ! Переменная N //
NH BYTE !Старший байт N void main(void) {
NL BYTE !Младший байт N NH=inbyte();
BT BYTE !Переменная для п/п передачи байта NL=inbyte();
N=NH*256+NL;
CODE }
//
N=35000
Как видно из этих двух фрагментов, для того чтобы передать переменную N по интерфейсу RS232,
NH=int(N/256) ee необходимо преобразовать в две переменные NH и NL, а для того чтобы получить — восстановить
NL=NNH
из NL и NH. Процедуры разбивки и восстановления используют операции деления и умножения.
Для компьютера такие процедуры не составляют особой сложности, т. к. он обладает колоссальными
BT=NH
do OUTBYTE памятью и быстродействием по сравнению с микроконтроллером, поэтому эти процедуры будут «мгно
BT=NL венно» выполнены. А вот для микроконтроллера эти процедуры потребуют немалых затрат как по па
do OUTBYTE мяти программ, так и по быстродействию, т. к. для таких операций будут привлечены дополнительные
библиотеки. Это, в свою очередь, потребует дополнительной памяти программ и некоторые времен
return ные ресурсы, чтобы выполнить соответствующие подпрограммы библиотек. При большой скорости
! передачи данных от микроконтроллера потребуется значительное быстродействие и, как следствие
! Подпрограмма вывода байта этого, — достаточно большая частота генератора (не важно — внутреннего или внешнего). Если мик
! роконтроллер работает от батарейного источника питания, то такой источник (от большого количест
OUTBYTE routine

76 77
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА

ва программ или подпрограмм, написанных подобным образом) быстро кончится. Кроме того, от та т. к. фрагмент не содержит ни одной операции умножения или деления; кроме того, пере
кого «разбазаривания» ресурсов микроконтроллера его основная программа может просто не по менные N, NH и NL в сумме занимают всего 2 байта памяти (а не 4, как в предыдущем при
меститься в и без того достаточно «скудную» его память программ. мере), т. к. распределяются в одной и той же области памяти размером в 2 байта. Наде
Можно ли оптимизировать решение поставленной задачи и, если да, то каким образом? юсь, этот факт достаточно очевиден.
Вот здесь как раз и приходят на помощь совмещения. Ниже приведен фрагмент программы Совмещения не только значительно экономят память и увеличивают быстродействие. Они
для микроконтроллера, использующей совмещения. существенно облегчают программирование.
Приведем еще пример.
// Предположим, требуется передать по интерфейсу RS232 строку S, содержащую
// Совмещение "u.N" с "u.bt.NL" и "u.bt.NH". N байт.
// Переменные u.N (размерностью ushort) и Решение такой задачи «в лоб» заключается в том, что из строки необходимо последова
// u.bt.NL и u.bt.NH (обе размерностью byte(unsigned char)) тельно выделять каждый байт и уже его передавать по интерфейсу. Другими словами, вна
// перераспределяют одно и то же место в памяти микроконтроллера. чале нужно выделить первый байт строки и передать его, затем второй, третий и т. п. Выде
// Порядок расположения переменных NH(первая) и NL(вторая)
ление конкретного байта из строки потребует использования строковых операций. Такие
// в структуре (struct) строго определен и при его нарушении
операции присутствуют как в Кларионе, так и в Си. Но, с одной стороны, они выполняются
// вся конструкция совмещения не работает !!!
//
очень долго, с другой, — требуют достаточно внимательного отношения к индексам: здесь
union{ очень легко ошибиться. Приводить пример с выделением байт из строки, на взгляд автора,
unsigned short N; // Длина строки("u.N"). — лишнее. Гораздо удобнее использовать совмещение строки S с массивом байт размер
struct{ ностью М, равной количеству байт в строке N. Такое совмещение (в Кларионе) выглядит сле
unsigned char NH; // Ст.байт длины строки("u.bt.NH"). дующим образом (при N = 75):
unsigned char NL; // Мл.байт длины строки("u.bt.NL").
}bt; S string(75)
}u; M byte,dim(75),over(S)
//
Оператор over (S) как раз и выполняет подобное совмещение. Таким образом, массив
// М размерностью в 75 байт и строка S длиной 75 байт распределяются в одной и той же об
// П/п ввода байта ласти памяти (размером в 75 байт). Причем, элемент массива M[1] соответствует 1му бай
// ту строки S, M[2] — 2му и т. п. Для вывода всей строки S достаточно организовать 75разо
unsigned char inbyte() { вый цикл вывода iго элемента массива M[i]:
.
Прием байта по RS232 loop i=1 to 75
. B=M[i]
return(byte); do OUTBYTE
} .
//
Здесь B — переменная, которая используется в подпрограмме вывода байта OUTBYTE (чтобы
void main(void)
{ не «загромождать» излагаемое лишними подробностями, и подпрограмма OUTBYTE, и пере
u.bt.NL=inbyte(); //Прием мл.байта длины строки. менная B не приводятся).
u.bt.NH=inbyte(); //Прием ст.байта длины строки. Как видно из приведенного примера, совмещения не только экономят память, но и значи
temp_L=u.l; //Переменная u.Nдлина строки(ushort) тельно увеличивают удобство программирования, что повышает надежность программ (оши
//заполняется автоматически после биться с индексом i в приведенном 75циклoвом выводе элемента массива M[i] просто невоз
//заполнения переменных можно).
//u.bt.NL и u.bt.NH.Переменная temp_L Помимо совмещений между собой чисел разного формата, массивов со строками и т. п., име
//введена чтобы показать использование u.l ется возможность совмещения какоголибо бита 1байтного числа с битовой переменной.
Приведем еще пример.
Как можно заметить из приведенного выше фрагмента программы для микроконт Предположим, требуется последовательно вывести байт данных через какойлибо вывод
роллера, при использовании совмещений значительно экономится память программ, микроконтроллера, стробируя вывод каждого бита сигналом, подаваемым с другого вывода.

78 79
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА

Такие задачи часто возникают при «ручном» программировании вывода через различные PDA не проходит). В 99 случаях из 100 программист на Си (даже достаточно высокого класса)
последовательные интерфейсы (например SPI, C2, MicroWare и т. п.). предложит вам нечто, подобное фрагменту, приведенному ниже.
Попросите хорошего программиста выполнить подобную задачу на ассемблере. Скорее
всего, он вам предложит чтото вроде следующего фрагмента: //*************************************************************************
//* prog90x.c
; //* By : Bauke Siderius
; Алгоритм вывода байта в P89LPC938 //* Discription : ISP/ICP gateway code for LPC90x programmer using MCB900
; //*
//*************************************************************************
; //* Versions
; Установка названий бит //*************************************************************************
; //*
PDA: .reg p1.2 ;Бит данных //* v1.2 August 2003
PCL: .reg p1.3 ;Бит строба (Clock) //* Added a delay before entering ICP.
; //*
OUTBLPC .macro //* v1.1 August 2003
mov b,#8 //* Put ports in input only when not in use.
METO#: rrc a //* Fixed CRC read out.
mov PDA,c //*
nop //* v1.0 May 2003
nop //* Initial version.
nop //*
clr PCL //*************************************************************************
nop .
nop .
nop .
setb PCL .
nop
nop //*************************************************************************
nop //* shift_out()
djnz b,METO# //* Input(s) : data_byte.
.endm //* Returns : none.
; //* Description : function to shift out data to the part being programmed
//*************************************************************************
В этом фрагменте (макросе) байт данных, находящийся в аккумуляторе, выводится через void shift_out(char data_byte)
{
порт p1.2 микроконтроллера (обозначенный PDA) и стробируется сигналом, который подается
char shift_bit;
через порт p1.3 (обозначенный PCL). Как можно заметить, байт сдвигается вправо через флаг char temp_byte = 0;
переноса c (команда rrc а), в связи с чем младший бит байта попадает во флаг переноса, а от temp_byte = data_byte; // put databyte in a temp byte
туда уже в битовую переменную PDA, ассоциируемую с портом p1.2 (команда mov PDA,c). for(shift_bit = 0; shift_bit < 8; shift_bit++)// shift out 8 bits
Далее, через некоторое время, равное длительности 3 команд nop и требующееся для более {
стабильной установки бита на выводе PDA, по выводу PCL подается строб, представляющий PCL = 0; // hold clock line low
собой импульс длительностью также 3 команды nop. После 8 сдвигов (число 8 заранее зано if(temp_byte & 0x01) // check if LSB is set
сится в bрегистр) байт полностью выводится. Задача достаточно примитивная, поэтому легко {
выполнимая и ясная для понимания. (Необходимо отметить, что фрагмент приведен из одной PDA = 1; // set dataline high
из программ автора, предназначенной для программирования микроконтроллера }
P80LPC938 в режиме ICP с помощью микроконтроллера MSC1210). else
{
Но попробуйте попросить этого же программиста написать программу для подобной зада
PDA = 0; // set dataline low
чи на Си (а вот там, к сожалению, такая пересылка бита из флага переноса c в переменную }

80 81
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

temp_byte = (data_byte >>= 1); // shift databyte right one, put in temp BYTEIO=OUTB;
PCL = 1; // clock databit for (j=0;j<8;j++){
} PDA=BITIO;
PDA = 1; // set dataline high after transfer PCL=0;
PCL = 1; // hold dataline high after transfer DEL50();
} PCL=1;
//************************************************************************ DEL10();
BYTEIO=_cror_(BYTEIO,1);
Вышеприведенный фрагмент взят из программы для эволюционной платы MCB900, пред }
}
назначенной для программирования микроконтроллеров P80LPC9XX. Как можно убедиться,
//
если внимательно рассмотреть этот фрагмент, выводимый байт, находящийся в байтовой
переменной temp_byte, так же, как и в предыдущем случае, сдвигается вправо и стробирует Здесь использовано совмещение битовой переменной BITIO с младшим (нулевым) битом бай
ся битом PCL. Но как происходит установка и вывод бита данных PDA! А происходит она в товой переменной BYTEIO (конкретно: BYTEIO^0). В связи с этим, биту, выводимому через порт PDA,
зависимости от значения младшего бита байтовой переменной temp_byte. Для анализа просто присваивается значение бита BITIO аналогично присвоению бита переноса c биту PDA, как
и вывода младшего бита используется достаточно громоздкая конструкция: вначале он выде это сделано в вышеприведенной ассемблерной процедуре. Присвоение организуется всего одной
ляется, затем, если равен 1, то бит PDA устанавливается в 1, иначе PDA=0: командой (PDA = BITIO), и никакого выделения и анализа этого бита не требуется. Здесь впо
ру заметить, что «товарищ» мистер Bauke Siderius не любит, не хочет использовать либо просто не
if(temp_byte & 0x01) // check if LSB is set знает подобных битовых совмещений.
{ Приведенные примеры, на взгляд автора, достаточно красноречиво свидетельствуют
PDA = 1; // set dataline high
о явной пользе и большом преимуществе совмещений перед простыми преобразованиями
}
данных из одного формата в другой.
else
{
PDA = 0; // set dataline low
} 2.4. Использование нового алгоритма
обмена информацией по RS232
Между тем, пользуясь совмещением младшего бита выводимого байта с какойлибо бито между компьютером и микроконтроллером
вой переменной, аналогичную процедуру вывода бита можно «уложить» всего в одну команду!
Фрагмент подобной программы (автора) на Cи приведен ниже. 2.4.1. Суть нового алгоритма обмена
Новый алгоритм обмена по интерфейсу RS232, разработанный автором и опубликован
//
//Для P89LPC938
ный в [4], заключается в аппаратной синхронизации каждого передаваемого/принимаемого
// байта линиями данных (TxD и RxD) этого же интерфейса. В этом его существенное отличие от
sbit PDA = P0^4; стандартной аппаратной синхронизации линиями квитирования (DTRDSR или RTSCTS). Кро
sbit PCL = P0^5; ме того, от существующей программной синхронизации линиями данных (TxD и RxD), которую
// принято называть «XonXoff», новый алгоритм отличается именно «аппаратностью», т. е. синхро
//Совмещение бита BITIO с 0м битом байта BYTEIO низация осуществляется не посылкой информационного байта (например, Xoff) по линиям дан
// ных, а изменением их состояния, как это устроено в аппаратной синхронизации линиями
bdata unsigned char BYTEIO; квитирования.
sbit BITIO=BYTEIO^0; Такая аппаратная синхронизация, с одной стороны, экономит линии, по которым осу
// ществляется обмен данными, с другой, — позволяет использовать выходные линии квити
. рования компьютера (DTR и RTS) для управления режимами работы микроконтроллера
.
.
(штатный режим/режим внутрисистемного (ISP) программирования). При этом линия DTR
// управляет сбросом (вывод RESET микроконтроллера), а линия RTS — переводом его из
// П/п ввода/вывода байта в P89LPC9XX штатного режима работы в режим программирования. В большинстве случаев (микро
// контроллеры семейств MSC12XX, ADUC8XX, AT89C51ED2/RD2) линия RTS управляет сиг
void OUTBLPC(unsigned char OUTB) { налом, подаваемым на вывод PSEN. Суть аппаратной синхронизации линиями данных зак
unsigned char j; лючается в следующем.
82 83
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Предположим, что передается некоторый поток данных от компьютера к микроконтроллеру ти от скорости микроконтроллера). Такой короткий импульс разрешения просто не «пройдет» че
(например 1000 байт). В обмене в этом случае участвует только одна линия интерфейса — линия рез преобразователь интерфейса (ADM3202, MAX1406, ADM231 и др.). В результате обмен мо
ТxD компьютера, которая соединена с линией RxD микроконтроллера. Вторая линия — линия жет просто сорваться. С другой стороны, ждать, пока байт полностью не поступит в микроконт
TxD микроконтроллера, соединенная с линией RxD компьютера, в это время не используется роллер, и уже после этого сбросить разрешение тоже нельзя, поскольку компьютер после окон
(простаивает). Так вот, основная идея нового алгоритма заключается как раз в том, что «проста чательного вывода байта сразу же приступает к анализу линии, по которой передается разре
ивающую» линию можно использовать для аппаратной синхронизации обмена байтами между шение на передачу следующего байта. Поскольку микроконтроллер всетаки более медленное
компьютером и микроконтроллером. Что означает словосочетание «аппаратная синхрониза устройство, чем компьютер, он может не успеть «среагировать» и сбросить это разрешение нем
ция»? Она означает, что синхронизация осуществляется не посылкой информационного байта по ного позже момента начала анализа компьютером линии разрешения. В результате, проанали
простаивающей линии (например Xoff, как это организовано в программной синхронизации), а зировав линию разрешения и определив, что она находится в состоянии разрешения передачи,
изменением состояния линии TxD микроконтроллера (с лог. 1 в лог. 0 и обратно), как это проис компьютер передаст следующий байт, и на этом обмен сорвется.
ходит при аппаратной синхронизации какойлибо линией квитирования (например линией DTR). В связи вышеизложенным, на взгляд автора, идеальным моментом времени сброса раз
В начале передачи каждого байта компьютер запрашивает у микроконтроллера разрешение на решения является момент времени, соответствующий передаче половины байта (т. е. «середи
передачу. Для этого он анализирует свою линию данных RxD (которая соединена с линией TxD мик на» байта). В этом случае потенциалы разрешения и запрета будут чередоваться, и форма сиг
роконтроллера). Если линия находится в состоянии запрета на передачу (например в лог. 1), компь нала на линии разрешения (т. е. на линии TxD микроконтроллера, одновременно являющейся
ютер не передает байт, а продолжает опрашивать эту линию, пока не получит разрешения (напри RxD компьютера) будет представлять собой чтото похожее на прямоугольный меандр. Причем
мер, лог. 0). Получив разрешение, компьютер передает только один байт, ожидает конца переда длительность импульса такого «меандра» будет приблизительно равна половине длительности
чи этого байта (т. е. ждет, пока не выведется последний бит передаваемого байта) и передачи одного байта. Такой длинный импульс, с одной стороны, свободно пройдет через вы
опять переходит в режим опроса линии для получения разрешения на передачу следующего байта. шеупомянутые преобразователи интерфейса, с другой стороны, сброс разрешения в середине
Микроконтроллер, принимающий поток байт, выполняет следующие действия. Вопер передаваемого байта никак не повлияет на передачу следующего байта компьютером, пос
вых, именно он является инициатором начала обмена, поскольку именно он первый дает кольку в это время он анализирует не линию разрешения, а бит, ответственный за конец вы
разрешение компьютеру на передачу очередного (первого) байта. Напомню, что в начале пе вода последнего бита байта. И этим анализом компьютер будет «заниматься» до окончания вы
редачи компьютер ждет разрешения на передачу, т. е. находится в режиме ожидания. Переклю вода байта, прежде чем приступить к анализу линии разрешения. А эта линия разрешения к
чив свою линию TxD из запрещающего состояния в разрешающее (т. е. дав компьютеру раз этому моменту, как можно догадаться, будет уже давно сброшена, что и требуется.
решение на передачу байта), микроконтроллер ожидает передачи байта от компьютера. Подсчитаем длительность времени от момента стартбита до «середины» байта при скорос
В чем суть ожидания передачи байта от компьютера? Суть в том, что в начале поступления ти 115 200 бод. Очевидно, что при частоте 115 200 Гц длительность передачи одного бита бу
байта в микроконтроллер его линия RxD изменяет свое состояние, поскольку передача бай дет: 1/115 200=0,000 008 68 с или около 8,7 мкс.
та начинается со стартбита. Поэтомуто линия RxD микроконтроллера и изменяет свое Передача всех 10 бит (1 стартбит + 8 бит данных + 1 стопбит) будет занимать около
состояние с лог. 1 на лог. 0. В этот момент, с одной стороны, стартбит инициирует UART мик 87 мкс. Половина этого времени составляет около 43 мкс. Если сделать некоторый запас
роконтроллера на прием байта (и этот прием уже происходит без участия процессора микро по реакции микроконтроллера (5÷15 мкс), то после обнаружения стартбита необходимо
контроллера), с другой, — микроконтроллер, «определив», что «процесс пошел», должен сбро сделать задержку в 25÷30 мкс и затем сбросить разрешение. О том, как осуществить
сить разрешение (т. е. установить запрещающий потенциал на своей линии TxD). столь короткую и машиннонезависимую задержку в компьютере, уже говорилось ранее.
Момент времени сброса разрешения компьютеру на передачу следующего байта очень ва В микроконтроллере организовать подобную временную задержку достаточно просто, пос
жен. Другими словами, требуется определить, когда именно микроконтроллер должен сбросить кольку программисту всегда известна частота тактового генератора микроконтроллера.
это разрешение (т. е. установить запрет на передачу). С одной стороны, ответ на этот вопрос Резюмируем вышеизложенное, привязав все к временной диаграмме аппаратной
напрашивается сам собой: именно тогда, когда микроконтроллер определит начало поступле синхронизации передачи байта, составленной на основе предыдущих рассуждений
ния байта (т. е. в момент времени начала стартбита). Но здесь кроется одна «ловушка». Дело в (рис. 2.4.1).
том, что многие современные микроконтроллеры уже достаточно быстрые, по сравнению с Рис. 2.4.1.
предыдущим поколением. Команды современных микроконтроллеров уже выполняются не за Временная диаграмма
аппаратной синхронизации
12 тактов, как это было ранее. Многие из них являются «однотактными», т. е. выполняют коман передачи байта
ду процессора всего за один такт генератора (например микроконтроллеры ADUC8XX,
C8051FXXX), некоторые — 2тактными (P89LPC9XX), 4тактными (MSC12XX) и 6тактными
(AT89C51ED2/RD2). Кроме того, современные компьютеры также уже давно не «медленные».
Поэтому сбрасывать разрешение сразу после начала стартбита нельзя, поскольку вре
мя от начала разрешения передачи и начала стартбита последующего за этим разрешением
передачи байта может составлять от нескольких микросекунд до их долей (в зависимос

84 85
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Итак, передатчик ожидает разрешение на передачу байта. На временной диаграмме мер в 25 мкс) и т. п. не оказывают никакого влияния на скорость передачи. Например, за
это — время от 0 до получения такого разрешения (до перехода RxD с высокого уровня в держка в 25 мкс и проверка передатчиком сброса разрешения проводятся во время пе
низкий). Далее приемник посылает разрешение на передачу байта по линии RxD передат редачи и приема байта и никоим образом не «тормозят» обмен. Как будет видно из даль
чика, устанавливая ее в нулевой уровень. На верхнем графике этот факт отражен тем, что нейшего изложения, реальная скорость обмена при использовании излагаемого алгорит
уровень RxD переключается с единичного в нулевое состояние. Получив разрешение на ма отличается от идеальной не более чем на 1÷2 % и больше зависит от используемой
передачу байта, передатчик начинает его передавать, но не мгновенно, а спустя некото операционной системы и «метода», примененного для обращения к портам ввода/вывода
рое время реакции на разрешение передачи (на диаграмме оно обозначено Tpp). Далее (в частности к порту RS232). Такое сравнение сделано автором, и его результат будет
приемник ждет начало стартбита, т. е. переключения линии TxD приемника с единичного представлен читателю несколько позже.
уровня в нулевое. После определения факта начала передачи по стартбиту приемник, Вернемся к временной диаграмме. Если посмотреть еще раз на временную диаграм
спустя некоторое время реакции на начало передачи (Трн), запускает задержку длитель му (рис. 2.4.1), то можно заметить, что график зависимости напряжения от времени на
ностью около 25 мкс. линии RxD представляет собой почти симметричный прямоугольный меандр. Длитель
По прошествии времени задержки (Тз) приемник сбрасывает разрешение, т. е. переклю ность импульса такого меандра составляет половину времени на передачу 1 байта. Такой
чает линию RxD передатчика из низкого состояния в высокое. Далее после окончания пере импульс легко воспринимается преобразователем интерфейса (об этом уже было упомя
дачи байта передатчик переходит к анализу разрешения передачи следующего байта, т. е. нуто ранее).
состояния линии RxD. В этот момент она давно уже в единичном состоянии, и передатчик про Теперь несколько слов о том, каким образом компьютер может анализировать
должает ожидать разрешения на передачу. Приемник, приняв байт полностью до последнего линию разрешения. Дело в том, что в интерфейсе RS232 компьютера непосредственные
стопбита и записав его, например, в память, через некоторое время (назовем его временем чтение и анализ состояния самой линии RxD (т. е. лог. 0 или лог. 1) невозможны. Но, нап
реакции на конец приема — Трк), когда он полностью готов принять следующий байт, опять ример, соединив эту линию RxD с какойлибо входной линией квитирования (например
выставляет разрешение на передачу (уже следующего) байта. На временной диаграмме этот DSR), состояние которой поддается чтению, можно добиться требуемого: прочитав
факт отражен переключением линии RxD с единичного состояния в нулевое. Далее процесс (в определенное время) состояние линии DSR, можно узнать и состояние линии RxD,
повторяется. т. e. в то время, когда линия RxD используется как линия разрешения, чтение линии DSR
Необходимо отметить, что достоверность обмена может быть значительно повыше покажет ее состояние. Когда же линия RxD используется как линия данных, т. е. при
на, если передатчик сделает дополнительный анализ линии RxD на сброс разрешения. передаче информации из микроконтроллера в компьютер, состояние линии DSR просто
Как видно из временной диаграммы, сброс разрешения (т. е. установка приемником не нужно читать и анализировать, т. к. в таком режиме ее состояние не представляет
линии RxD передатчика в высокий уровень) происходит гдето в середине (по времени) никакого интереса.
передачи байта. Если передатчик проверит линию RxD на предмет сброса разрешения В обратную сторону, т. е. при передаче информации от микроконтроллера в компьютер,
(т.е. переключения ее в высокий уровень), то этот факт для передатчика будет означать, обмен информацией идет подобным же образом, т. е. логика работы аппаратной синхрони
что приемник начал принимать передаваемый передатчиком байт и именно в связи с зации остается прежней. Есть, правда, некоторые нюансы, на которых мы остановимся
этим сбросил разрешение. Другими словами, дополнительная проверка сброса разре несколько позже.
шения позволяет передатчику определить, что приемник работает «как положено» и пе Резюмируя все вышесказанное, приведем логическую блоксхему сопряжения компьюте
реключает линию RxD передатчика с высокого уровня в низкий (и обратно). Без такой ра и микроконтроллера для целей штатного режима работы при условии аппаратной синхро
проверки можно оказаться в следующей ситуации. Предположим, что приемник вообще низации обмена линиями данных (рис. 2.4.2).
не работает, и какимлибо образом линия RxD передатчика находится в разрешающем
состоянии. В этом случае передатчик будет передавать байт за байтом в «пустоту», посколь
ку он проверяет линию RxD только на предмет разрешения. Проверив же линию RxD на Рис. 2.4.2.
предмет запрета и определив, что приемник такого запрета не выдает, передатчик «мо Логическая блок!схема
сопряжения компьютера
жет сделать вывод», что приемник не работает, что линия RxD не переключается из с микроконтроллером
высокого состояния в низкое (и обратно). В связи с этим передатчик может прекратить для целей штатного режима
передачу (и выдать, например, сообщение об ошибке или какимлибо иным способом работы при аппаратной
синхронизации линиями
просигнализировать о сбое обмена). данных с одним передатчиком
И еще одно существенное замечание. Во время передачи байта, т. е. с начала старт
бита и до конца последнего стопбита, ни процессор передатчика, ни процессор приемни Как можно увидеть из приведенной схемы, линия RxD соединена с линией DSR непосред
ка не принимает никакого участия в обмене, поскольку и в компьютере, и в микроконт ственно в разъеме RS232 компьютера. Такое соединение целесообразно применять, если в
роллере этим занимается UART, т. е. аппаратные средства. Поэтому все проверки состоя примененном преобразователе интерфейса имеется только один передатчик (см. например,
ния линий, переключения их из одного состояния в другое, организация задержек (напри рис. 1.4.1.1, 1.4.4.1.4 и 1.4.4.2.2).

86 87
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Если же преобразователь интерфейса имеет 2 передатчика, то блоксхема может быть


представлена иначе (рис. 2.4.3). Как можно увидеть из блоксхемы, отсутствующее непосред
ственное соединение линий RxD и DSR (как в блоксхеме рис. 2.4.2) заменено на соответству Рис. 2.4.4.
ющее соединение этих сигналов, когда они имеют еще TTLуровни, т. е. это соединение ор Логическая блок!схема
сопряжения компьютера
ганизовано на входах 2 передатчиков. с микроконтроллерами
семейств C8051FXXX для целей
штатного режима работы
при аппаратной синхронизации
линиями данных с 2 передатчиками
Рис. 2.4.3.
Логическая блок!схема
сопряжения компьютера линия ТxD, то он уже недоступен как обычный порт вывода, и программным способом его
с микроконтроллером
для целей штатного ре! состояние изменять уже невозможно. Тем не менее, решить задачу аппаратной синхро
жима работы при аппа! низации для микроконтроллеров этого семейства возможно, но только привлекая допол
ратной синхронизации нительные аппаратные средства. Одно из решений, предложенное автором, заключается
линиями данных с
2 передатчиками в том, что нужно выбрать еще один какойлибо дополнительный цифровой порт вво
да/вывода (PX.X), состояние выхода которого можно изменять программным способом
(для этого требуется освободить порт от всех альтернативных функций) и объединить его
Использование 2 передатчиков несколько более предпочтительно, чем использова
выход с линией TxD по схеме 2И (этот вариант уже обсуждался в 1.3.9, см. рис. 1.3.9.1).
ние одного, поскольку в этом случае каждый передатчик работает только на один прием
В этом случае логическая блоксхема сопряжения компьютера с микроконтроллером
ник (на одну нагрузку, составляющую 5 кОм). При использовании же одного передатчика
(рис. 2.4.2) он работает уже на 2 приемника, каждый из которых имеет нагрузку в 5 кОм, несколько модифицируется (рис. 2.4.4).
т. е. нагрузка передатчика в этом случае составляет уже 2,5 кОм. Это несколько снижает
длительность фронта и спада сигнала передатчика, но поскольку современные микросхе
2.4.2.Подпрограммы передачи и приема байта для компьютера
мы передатчиков достаточно мощные, то к особым негативным результатам не приводит.
и микроконтроллера, использующие логику
Использование двух передатчиков имеет смысл, если они присутствуют в преобразовате
нового алгоритма обмена
ле интерфейса (не выбрасывать же их!). По блоксхеме (рис. 2.4.3) с компьютером сопря Ниже приведены подпрограммы приема и передачи байта, составленные в соответ
жено большинство микроконтроллеров, приведенных в настоящей книге, поскольку в схе ствии с логикой работы вышеизложенного алгоритма обмена и временной диаграммой
мах их сопряжения используются преобразователи, имеющие два передатчика. Как мож (рис. 2.4.1).
но догадаться, применение двух передатчиков вместо одного никоим образом не наруша Подпрограммы приведены для компьютера на языке Кларион для DOS (Clarion V.3100
ет логику алгоритма обмена. — Clarion Software Inc.), а для микроконтроллера — на 2 языках: ассемблере (8051 Macro
И еще один момент нуждается в обсуждении. Как видно из рис. 2.4.2 и 2.4.3, линия RxD Assembler Version 4.02a 2500 A.D. Software Inc, 1985) и Си (C51 — Keil Software Inc. V6.14).
микроконтроллера не требует «раздвоения», подобного линиям RxD и DSR. Это возможно
потому, что чтение состояния линии RxD микроконтроллером не вызывает никаких труднос Подпрограммы на Clarion v.3100 имеют следующий вид:
тей, поскольку эта линия является, помимо входа приемника RS232, обычным цифровым
входом, т. е. портом ввода/вывода. Точнее, этот цифровой порт микроконтроллера обладает !
! П/п ввода байта (байт в M1[i] )
альтернативной функцией — входом интерфейса RS232. !
При аппаратной синхронизации требуется не только читать состояние линии RxD, но еще INBYTE routine
и устанавливать линию TxD в то или иное состояние, соответствующее разрешению или out(3fbh,Y47h) !Установка TxD (разрешение передачи)
запрету передачи. Линию TxD компьютера возможно установить программно в произвольное loop; in(3feh,B); if band(B,2) then break.. !Ожидание стартбита (устки DSR)
состояние (установив или сбросив бит № 6 регистра управления линиями (адрес 3fbh), т. е. бит do DEL20 !Задержка 20 мкс
BREAK (см. приложение 1). out(3fbh,Y07h) !Сброс линии TxD (запрет передачи)
in(3feh,B) !Очистка регистра 3feh чтением
Что касается микроконтроллеров, то большинство из них позволяет устанавливать
loop;in(3fdh,B);if band(B,1) then break.. !Оже конца прихода байта(бит "DR"data ready)
линию TxD в произвольное состояние, как если бы она являлась обычным выходом циф in(3f8h,M1[i]) !Чтение байта данных
рового порта ввода/вывода. Исключением являются микроконтроллеры семейств !
C8051FXXX ф. Silicon Laboratories. В этих микроконтроллерах, если порт ввода/вывода ! П/п вывода байта (байт в M[i] )
выбран матрицей соединений для передачи информации по интерфейсу RS232, т. е. как !
OUTBYTE routine

88 89
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

loop;in(3fdh,B);if band(B,20h);break.. !Оже готовности передатчика (transmitter empty). mov a,sbuf ;Input byte from buffer
loop;in(3feh,B);if band(B,20h);break.. !Оже разреш.передачи(установки DSR) clr ri ;Clear flag ri
out(3f8h,M[i]) !Вывод байта .endm
loop;in(3feh,B);if band(B,2);break.. !Оже запрета передaчи(сброса DSR)
loop;in(3fdh,B);if band(B,40h);break.. !Ожe выхода байта из РС(OK to send). ;
in(3feh,B) !Очистка регистра 3feh чтением ; Макрос вывода байта
!
;
OUTBYTE .macro
Подпрограммы на Си имеют следующий вид.
jb RxD,$ ;Waiting enable transfer
mov sbuf,a ;Output byte in buffer
//
jnb RxD,$ ;Waiting disable transfer.WARNING!!!
// П/ п вывода байта
// jnb ti,$ ;Waiting output last bit (flag ti)
void outbyte(unsigned char byte) { clr ti ;Clear flag ti
while (RXD); // Ожидание разрешения на передачу байта (от компьютера). .endm
SBUF=byte; // Вывод байта. ;
while (!RXD); // Ожидание запрета на передачу (от компьютера).
while (!TI); // Ожидание окончания вывода байта микроконтроллером. В качестве микроконтроллера взят один из современных — MSC1210Y5. Этот 4тактный мик
TI = 0; // Сброс флага передачи (TI). роконтроллер занимает промежуточное положение по быстродействию между микроконтролле
}
//
рами: достаточно скоростными 1тактными (например ADUC847, C8051F067/330D) и 2тактными
// П/п ввода байта (например P89LPC938), среднескоростным 6тактным (AT89C51ED2) и стандартным 12тактным
// (например AT89S8252). Для микроконтроллера MSC1210 выбранная 10мкс задержка (с учетом
unsigned char inbyte() { времени его реакции на начало передачи Трн — см. рис. 2.4.1) переключает его линию TxD
unsigned char byte; (т. е. RxD компьютера) приблизительно между 4м и 5м битом, т. е. примерно в «середине» прини
TXD=0; // Установка разрешения компьютеру передавать байт. маемого байта.
while (RXD); // Ожидание стартбита.
DEL10(); // Задержка длительностью полбайта (115200 бод).
При использовании более высокоскоростного микроконтроллера, чем MSC1210, заде
TXD=1; // Запрет компьютеру передавать байт. ржку можно немного увеличить (в компьютере — см. подпрограмму на Кларионе), например,
while(!RI); // Ожидание окончания прихода байта в микроконтроллeр. установлена задержка в 20 мкс), в противном случае — уменьшить. Необходимо только пом
byte=SBUF; // Ввод байта в микроконтроллер. нить, что точное значение задержки не так уж и важно. Главное условие, чтобы переключе
RI = 0; // Сброс флага приема байта (RI). ние линии RxD с низкого уровня в высокий (см. рис. 2.4.1) осуществлялось не ранее чем спус
return(byte); тя 1–2 бита (по времени) после начала стартбита (чтобы на такой короткий импульс среаги
}
// ровал преобразователь интерфейса), но и не позже чем за 1–2 бита до начала стопбита
(чтобы передатчик «поймал» запрет передачи).
На ассемблере представлены макросы ввода и вывода байта. В связи с тем, что в макросах зап
рещено использовать комментарии на русском языке, они приведены на английском. Надеюсь, это
2.4.3.Тестовые программы обмена информацией
между микроконтроллером и компьютером
не вызовет особых затруднений у читателя, поскольку их перевод содержится в вышеприведенных
по интерфейсу RS232, использующие логику нового алгоритма
подпрограммах на Кларионе и Си. Макросы на ассемблере даны ниже.

; 2.4.3.1. Общие положения


; Макрос ввода байта
Ниже будут приведены реально работающие программы для микроконтроллеров
;
MSC1210, ADUC834/845, P89LPC938/904, AT89C51ED2/RD2 и C8051F067/F330D, напи
INBYTE .macro
санные на языке C51 (для интересующихся будут приведены программы для некоторых мик
clr TxD ;Enable transfer
jb RxD,$ ;Waiting startbit
роконтроллеров и на ассемблере) и программа для компьютера, написанная на языке Clarion
call DEL10 ;Call delay 10 mks V3.100 и работающая в операционной системе DOS. Что касается программ для компьютера,
setb TxD ;Disable transfer работающих в ОС Win'98/XP, то они будут приведены несколько позже, поскольку, с одной
jnb ri,$ ;Waiting set flag ri стороны, в программах для ОС Win'98/XP за основу будет взята именно программа для DOS,

90 91
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

с другой, — прежде чем приводить программы для Win'98/XP, необходимо будет объяснить unsigned char lenl; // Мл.байт длины строки("u.bt.lenl").
предварительные положения и соображения, без уяснения которых, по мнению автора, по }bt;
нять некоторые моменты программирования в ОС Win'98/XP будет непросто. }u;
Хотя программы для микроконтроллеров и снабжены комментариями, все же автор счел //
нужным привести краткие пояснения к каждой программе, т. к. в комментариях отражены не все
unsigned char c,j,a[80];
моменты и нюансы работы каждого конкретного микроконтроллера. В основном эти пояснения unsigned short temp_L; //Переменная для временного(temp)
будут касаться инициализации интерфейса RS232, таймеров, которые предназначены для гене //хранения длины строки.
рации скорости обмена, и некоторых других особенностей представляемых микроконтроллеров. void DEL10(void) {
for (j=0;j<10;j++);
2.4.3.2. Тестовая программа обмена для микроконтроллера MSC1210 }
Ниже приведены две тестовые программы для микроконтроллера MSC1210: первая — на
void initrs(void) { // Инициализация
Си, вторая — на ассемблере. Программы функционируют при условии сопряжения микроко SCON=0xec; // интерфейса
нтроллера MSC1210 с компьютером по схемам (рис. 1.3.5.1 и 1.3.10). Для функционирования T2CON=0x34; // RS232.
программ совместно с компьютером должна использоваться компьютерная программа, при
веденная в 2.4.3.7. В качестве генератора скорости обмена используются таймер T2 и внеш RCAP2=3; //Vобм.=115200 бод.
ний генератор с кварцевым резонатором частотой 11 059 200 Гц. Скорость обмена установ THL2=3;
лена 115 200 бод.
Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том // RCAP2=36; //Vобм.=9600 бод.
же порядке, в котором байты поступили в микроконтроллер. // THL2=36;
Программа на ассемблере записывает поступившие байты в стек, а затем считывает их }
оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке.
void outbyte(unsigned char byte) {
while (RXD); // Ожидание разрешения на передачу байта (от компьютера).
Программа на Си SBUF=byte; // Вывод байта.
while (!RXD); // Ожидание запрета на передачу (от компьютера).
 while (!TI); // Ожидание окончания вывода байта микроконтроллером.
// Программа вывода строки байт для MSC1210, TI = 0; // Сброс флага передачи (TI).
// скорость обмена 115200 бод, кварц 11059200 Гц. }
// см. inrs115.asm
// unsigned char inbyte() {
#include "stdarg.h" unsigned char byte;
#include "stdio.h" /* для printf */ TXD=0; // Установка разрешения компьютеру передавать байт.
#include "stdlib.h" while (RXD); // Ожидание стартбита.
#include "reg1210.h" /* для RS232 */ DEL10(); // Задержка длительностью полбайта (115200 бод).
TXD=1; // Запрет компьютеру передавать байт.
// while(!RI); // Ожидание окончания прихода байта в микроконтроллeр.
// Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". byte=SBUF; // Ввод байта в микроконтроллер.
// Переменные u.l (размерностью ushort) и RI = 0; // Сброс флага приема байта (RI).
// u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) return(byte);
// перераспределяют одно и то же место в памяти микроконтроллера. }
// Порядок расположения переменных lenh(первая) и lenl(вторая)
// в структуре (struct) строго определен и при его нарушении /**************************************************/
// вся конструкция совмещения не работает !!! void main(void)
// {
union{ initrs();
unsigned short l; // Длина строки("u.l"). P3DDRL=0x07;
struct{ REN=1; // Установка на прием.
unsigned char lenh; // Ст.байт длины строки("u.bt.lenh").

92 93
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

CKCON = 0x03; // MOVX=12 cycle stretch(1 мкс). ;


; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!!
START: ;
u.bt.lenl=inbyte(); //Прием мл.байта длины строки. ; Алгоритм ввода байта
u.bt.lenh=inbyte(); //Прием ст.байта длины строки. ;
temp_L=u.l; //Запоминание длины строки INBYTE .macro
//в переменной temp_L. clr TxD ;Enable transfer
//Переменная u.lдлина строки(ushort) jb RxD,$ ;Waiting startbit
//заполняется автоматически после call DEL10 ;Call delay 10 mks
//заполнения переменных setb TxD ;Disable transfer
//u.bt.lenl и u.bt.lenh. jnb ri,$ ;Waiting set flag ri
mov a,sbuf ;Input byte from buffer
for(u.l=0;u.l<temp_L;u.l++){ //Прием из компьютера clr ri ;Clear flag ri
a[u.l]=inbyte(); //очередного .endm
} //байта строки. ;
//Изменение u.l (например, u.l++) ; Алгоритм вывода байта
//влечет за собой автоматическое ;
//и соответственное изменение OUTBYTE .macro
//u.bt.lenl и u.bt.lenh. jb RxD,$ ;Waiting enable transfer
//Если u.l — адрес памяти, mov sbuf,a ;Output byte in buffer
//то u.bt.lenl и u.bt.lenh  jnb RxD,$ ;Waiting disable transfer.WARNING!!!
//соответственно младший jnb ti,$ ;Waiting output last bit (flag ti)
//и старший байты этого адреса. clr ti ;Clear flag ti
.endm
REN=0; //Установка RS232 на передачу. ;
.DATA
for(u.l=0;u.l<temp_L;u.l++){ //Передача в компьютер ;
outbyte(a[u.l]); //очередного ; Переменные
} //байта строки. ;
T2CON equ 0c8h
REN=1; //Установка RS232 на прием. RCAP2H equ 0cbh
RCAP2L equ 0cah
c=inbyte(); //Если принятый символ="@", ;
if (c==0x40) goto START; //то продолжение работы, CKCON equ 08eh
E: //иначе — конец. USEC equ 0fbh
goto E; PDCON equ 0f1h
} ACLK equ 0f6h
PASEL equ 0f2h
 P3DDRL equ 0b3h
Программа на ассемблере ;
 .CODE
; .org 0000h ;Вектор прерывания по RST
; Программа приема MK строки символов по RS232 (с передачей длины строки) jmp MAIN
; и вывода символов из МК в компьютер. .org 0003h ;Вектор прерывания по INT0
; Fкв=11059200 Гц. Скорость обмена — 115200 и 9600 бод. reti
; Синхронизация — с помощью линий TxD и RxD. .org 001bh ;Вектор прерывания по TF1
; Для проверки использовать программы HELLO.EXE(CLA). reti
; .org 0053h ;вектор прерывания от TIC
 reti
;Макрос ввода байта ;

94 95
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

; Основная программа inc dptr


; mov a,r1
.org 0060h cjne a,dph,spin
mov sp,#20h mov a,r0
MAIN: cjne a,dpl,spin
; ;
; Вывод байт по посл. порту
; ;
; Инициал. посл. порта clr REN ;Запрет приема.
; spout: pop a
mov SCON,#11101100b ;8 бит,2 стопа,REN=0(запрет приема ReciveENable=0), OUTBYTE
;TI=0,RI=0,Vобм определяется Т1 или Т2, djnz r0,spout
;SM1=SM2=1 режим 3. RB8=TB8=1. ;
; ; Ввод команды продолжения работы
;Инициализация таймерa T2 — как таймера. ;
; setb REN ;Разрешение приема.
mov T2CON,#00110100b; TF2=0,EXF2=0,RCLK=1,TCLK=1,EXEN2=0, IB: INBYTE
; TR2=1start,CNT2=0,CAP2=0. cjne a,#40h,E
; jmp START
mov RCAP2H,#0ffh ;Fобм.=Freq/(32*(65536(RCAP2H,RCAP2L)))
;65536RCAP2H,RCAP2L=6553665533=3 (253=fch) E: mov 0f2h,#0
jmp $
mov RCAP2L,#3 ;Fобм.=11059200/(32*3)=115200 бод. ;
DEL10 mov b,#10
;mov RCAP2L,#6 ;Fобм.=22118400/(32*6)=115200 бод. djnz b,$
;mov RCAP2L,#2 ;Fобм.= 7372800/(32*2)=115200 бод. ret
;mov RCAP2L,#1 ;Fобм.= 3686400/(32*1)=115200 бод. ;
;mov RCAP2L,#36 ;65536RCAP2H,RCAP2L=65536(65536,(25636))=36 .end
;Fобм.=11059200/(32*36)=9600 бод. ;
;mov RCAP2L,#12 ;Fобм.= 3686400/(32*12)=9600 бод.
2.4.3.3. Тестовая программа обмена
для микроконтроллеров ADUC847/834
mov PCON,#80h
mov CKCON,#20h Ниже приведены две тестовых программы для микроконтроллеров ADUC847/834. Пер
mov P3DDRL,#07h вая — на Си, вторая на ассемблере. Программы функционируют при условии сопряжения
; микроконтроллеров с компьютером по схемам (рис. 1.3.6.1 и 1.3.10). Для функционирования
;Ввод байт по посл. порту программ совместно с компьютером должна использоваться компьютерная программа, при
; веденная в 2.4.3.7. В качестве генератора скорости обмена используется таймер T3 и внеш
START: setb REN ;Разрешение приема. ний генератор с кварцевым резонатором частотой 32 768 Гц.
Установка одной и той же скорости обмена (в данном случае 115 200 бод) для микроконт
mov dptr,#0
роллеров ADUC847 и ADUC834 несколько отличается. Различие проявляется в значении реги
INBYTE
mov r0,a ; Мл. байт длины
стра T3CON. При скорости обмена в 115 200 бод T3CON равен 0x82 для ADUC847 и 0x81 для
INBYTE ADUC834. В программе установлена скорость обмена в 115 200 бод для микроконтроллера
mov r1,a ; Ст. байт длины ADUC847.
Подпрограмма задержки длительностью по времени в полбайта, которую вызывает
spin: INBYTE; Байт в a макрос ввода байта, использует разные максимальные значения итерационного цикла:
; для ADUC834 — 7, для ADUC847 — 20.
push a Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том
; же порядке, в котором байты поступили в микроконтроллер.

96 97
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Программа на ассемблере записывает поступившие байты в стек, а затем считывает их int i,l;
оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. initrs();
START:
Программа на Си REN=1;
 lenl=inbyte();
 lenh=inbyte();
// Программа вывода строки байт для ADUC847/834, l=lenh*256+lenl;
// скорость обмена 115200 бод, кварц 32768 Гц.
// см. inrs115a.asm for(i=0;i<l;i++){
// a[i]=inbyte();
#include "stdarg.h" }
#include "stdio.h" /* для printf */ REN=0;
#include "stdlib.h" for(i=0;i<l;i++){
#include "aduc845.h" /* для RS232 */ outbyte(a[i]);
}
void DEL7(void) { REN=1;
unsigned char j; c=inbyte();
for (j=0;j<20;j++); //7для ADUC834, 20847 if (c==0x40) goto START;
} E: goto E;
}
void initrs(void) { 
PLLCON=0;
T3CON=0x82; // 0x85 9600| 0x81для ADUC834,0x82для ADUC847 115200 Программа на ассемблере
T3FD=0x2d; // 0x12 бод | 0x2d бод. 
SCON=0x40; ;
} ; Программа приема MK строки символов по RS232 (с передачей длины строки)
void outbyte(unsigned char byte) { ; и вывода символов из МК в компьютер.
while (RXD); ; Fкв=32768 Гц). Скорость обмена — 115200 и 9600 бод.
SBUF=byte; ; Синхронизация — с помощью линий TxD и RxD.
while (!RXD); ;
while (!TI);
TI = 0; ;
} ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!!
;
unsigned char inbyte() { ; Макрос ввода байта
unsigned char byte; ;
TXD=0; INBYTE .macro
while (RXD); clr TxD ;Enable transfer
DEL7(); // Задержка длительностью полбайта (115200 бод). jb RxD,$ ;Waiting startbit
TXD=1; call DEL7 ;Delay 7/20 mks
while(!RI); setb TxD ;Disable transfer
byte=SBUF; jnb ri,$ ;Waiting set flag ri
RI = 0; mov a,sbuf ;Input byte from buffer
return(byte); clr ri ;Clear flag ri
} .endm
;
/**************************************************/ ; Макрос вывода байта
void main(void) ;
{ OUTBYTE .macro
unsigned char c,lenl,lenh,a[80]; jb RxD,$ ;Waiting enable transfer

98 99
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

mov sbuf,a ;Output byte in buffer mov dptr,#0


jnb RxD,$ ;Waiting disable transfer.WARNING!!! INBYTE
jnb ti,$ ;Waiting output last bit (flag ti) mov r0,a ; Мл. байт длины
clr ti ;Clear flag ti INBYTE
.endm mov r1,a ; Ст. байт длины
;
.DATA spin: INBYTE; Байт в a
; ;
; Переменные push a
; ;
PLLCON equ 0d7h ; Умножитель частоты для работы процессора inc dptr
T3FD equ 09dh mov a,r1
T3CON equ 09eh cjne a,dph,spin
; mov a,r0
.CODE cjne a,dpl,spin
.org 0000h ;Вектор прерывания по RST ;
jmp MAIN ; Вывод байт по посл. порту
.org 0003h ;Вектор прерывания по INT0 ;
reti clr REN ;Запрет приема.
.org 001bh ;Вектор прерывания по TF1 spout: pop a
reti OUTBYTE
.org 0053h ;вектор прерывания от TIC djnz r0,spout
reti ;
; ; Ввод команды продолжения работы
; Основная программа ;
; setb REN ;Разрешение приема.
.org 0060h IB: INBYTE
mov sp,#20h cjne a,#40h,E
jmp START

E: jmp $
MAIN: mov PLLCON,#0h ;
; DEL7 mov b,#20 ;7ADUC834,20ADUC847
djnz b,$
; ret
; Инициал. посл. порта ;
; .end
;
;
;Инициализация таймерa T3 для генерации бод. 2.4.3.4. Тестовая программа обмена
; для микроконтроллеров AT89C51ED2(RD2)
mov T3CON,#82h ;#82hдля ADUC847, #81hдля ADUC834|115200
mov T3FD,#2dh Ниже приведены две тестовых программы для микроконтроллера AT89C51ED2: первая — на
; Си, вторая — на ассемблере. Программы функционируют при условии сопряжения микроконтрол
mov SCON,#40h;52h лера с компьютером по схемам (рис. 1.3.7.1 и 1.3.10). Для функционирования программ совмест
; но с компьютером должна использоваться компьютерная программа, приведенная в 2.4.3.7.
;Ввод байт по посл. порту В качестве генератора скорости обмена используются специальный генератор скорости
;
обмена (Baud Rate Generator — BRG) и внешний кварцевый резонатор частотой 11 059 200 Гц.
START: setb REN ;Разрешение приема.
Скорость обмена установлена 115 200 бод.

100 101
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том return(byte);


же порядке, в котором байты поступили в микроконтроллер. }
Программа на ассемблере записывает поступившие байты в стек, а затем считывает их /**************************************************/
оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. void main(void)
{
initrs();
Программа на Си

REN=1; // Установка на прием.
//
// Программа вывода строки байт для AT89C51ED2,
START:
// скорость обмена 115200 бод, кварц 11059200 Гц.
// см. inrs_ed2.asm
lenl=inbyte();
//
lenh=inbyte();
#include "stdarg.h"
#include "stdio.h" /* для printf */
l=lenh*256+lenl;
#include "stdlib.h"
#include "at89c51xd2.h"
for(i=0;i<l;i++){
unsigned char c,j,lenl,lenh,a[80];
a[i]=inbyte();
int i,l;
}
REN=0; //Передача.
void DEL7(void) {
for (j=0;j<7;j++) {}
for(i=0;i<l;i++){
}
outbyte(a[i]);
}
void initrs(void) {
REN=1; //Прием.
CKCON0=1;
c=inbyte();
PCON=0x80;
if (c==0x40) goto START;
SCON=0xec;
E:
BRL=250; //115200 бод
goto E;
BDRCON=0x1f;
}
}

void outbyte(unsigned char byte) {


Программа на ассемблере

while (RXD); // Ожидание разрешения на передачу байта (от компьютера).
;
SBUF=byte; // Вывод байта.
; Программа приема MK AT89C51ED2 строки символов по RS232 (с передачей
while (!RXD); // Ожидание запрета на передачу (от компьютера).
; длины строки); и вывода символов из МК в компьютер.
while (!TI); // Ожидание окончания вывода байта микроконтроллером.
; Fкв.=11059200 Гц, X2режим. Скорость обмена — 115200 и 9600 бод.
TI = 0; // Сброс флага передачи (TI).
; Синхронизация — с помощью линий TxD и RxD.
} ; Для проверки использовать программы OUTBYTEC.EXE(CLA) и OUTBYTE1.EXE(BAS).
;
unsigned char inbyte() { ;Макрос ввода байта
unsigned char byte; ;
TXD=0; // Установка разрешения компьютеру передавать байт. ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!!
while (RXD); // Ожидание стартбита. ;
DEL7(); // Задержка длительностью полбайта (115200 бод). ; Алгоритм ввода байта
TXD=1; // Запрет компьютеру передавать байт. ;
while(!RI); // Ожидание окончания прихода байта в микроконтроллeр. INBYTE .macro
byte=SBUF; // Ввод байта в микроконтроллер. clr TxD ;Enable transfer
RI = 0; // Сброс флага приема байта (RI). jb RxD,$ ;Waiting startbit

102 103
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

call DEL7 ;Call delay 7 mks ;#52h и #40h работают!


setb TxD ;Disable transfer ;
jnb ri,$ ;Waiting set flag ri ;Инициализация BRG.
mov a,sbuf ;Input byte from buffer ;
clr ri ;Clear flag ri mov CKCON0,#1 ;X2режим
.endm mov BRL,#250
; mov BDRCON,#1fh
; Алгоритм вывода байта ;
; ;Ввод байт по посл. порту
OUTBYTE .macro ;
jb RxD,$ ;Waiting enable transfer START: setb REN ;Разрешение приема.
mov sbuf,a ;Output byte in buffer
jnb RxD,$ ;Waiting disable transfer.WARNING!!! mov dptr,#0
jnb ti,$ ;Waiting output last bit (flag ti) INBYTE
clr ti ;Clear flag ti mov r0,a ; Мл. байт длины
.endm INBYTE
; mov r1,a ; Ст. байт длины
.DATA
; spin: INBYTE; Байт в a
; Переменные ;
; push a
CKCON0 equ 08fh ;
BRL equ 09ah inc dptr
BDRCON equ 09bh mov a,r1
; cjne a,dph,spin
.CODE mov a,r0
.org 0000h ;Вектор прерывания по RST cjne a,dpl,spin
jmp MAIN ;
.org 0003h ;Вектор прерывания по INT0 ; Вывод байт по посл. порту
reti ;
.org 001bh ;Вектор прерывания по TF1 clr REN ;Запрет приема.
reti spout: pop a
.org 0053h ;вектор прерывания от TIC OUTBYTE
reti djnz r0,spout
; ;
; Основная программа ; Ввод команды продолжения работы
; ;
.org 0060h setb REN ;Разрешение приема.
mov sp,#20h IB: INBYTE
cjne a,#40h,E
MAIN: jmp START
;
E: jmp $
; ;
; Инициал. посл. порта DEL7 mov b,#7
; djnz b,$
mov PCON,#80h ret
mov SCON,#11101100b ;8 бит,2 стопа,REN=0(запрет приема ReciveENable=0), ;
;TI=0,RI=0,Vобм определяется Т1 или Т2, .end
;SM1=SM2=1 режим 3. RB8=TB8=1.

104 105
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

2.4.3.5. Тестовая программа обмена for (j=0;j<10;j++); //10


}
для микроконтроллеров P89LPC938/904
Ниже приведены две тестовых программы на Си для микроконтроллеров P89LPC938 и void initrs(void) {
P89LPC904 и одна программа на ассемблере для P89LPC904. Программы функционируют SSTAT=0x00; //Стандартный 51совместимый RS232.
при условии сопряжения микроконтроллеров с компьютером по схемам (рис. 1.3.8.1–1.3.8.3, P1M1=0x02; //¦Вместе это означает: ¦
P1M2=0x01; //¦TxDpush/pull_output, RxDinput.¦
1.3.8.5 и 1.3.10). Для функционирования программ совместно с компьютером должна исполь
SCON=0x40; //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный бит=1.
зоваться компьютерная программа, приведенная в 2.4.3.7. BRGCON=0x00;
В качестве генератора скорости обмена используется внутренний генератор скорости обмена BRGR0=0x30; //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]=
(Baud Rate Generator — BRG) с частотой 7 372 800 Гц. Скорость обмена установлена 115 200 бод. BRGR1=0x00; //7372800/[(0*256+48)+16]=7372800/64=115200.
Программы на Си запоминают принимаемую строку из 75 байт и выводят ее обратно в BRGCON=0x03; //Разрешение SBRGS и BRGEN.
том же порядке, в котором они поступили в микроконтроллер. }
Программа на ассемблере записывает поступившие байты в стек, а затем считывает их
оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. void outbyte(unsigned char byte) {
while (RXD); // Ожидание разрешения на передачу байта (от компьютера).
Программа на Си для P89LPC938 SBUF=byte; // Вывод байта.
 while (!RXD); // Ожидание запрета на передачу (от компьютера).
// Программа вывода строки байт для P89LPC938, while (!TI); // Ожидание окончания вывода байта микроконтроллером.
// скорость обмена 115200 бод, кварца нет, TI = 0; // Сброс флага передачи (TI).
// частота внутреннего генератора 7372800 Гц. }
// см. inrs115l.asm
// unsigned char inbyte() {
#include "stdarg.h" unsigned char byte;
#include "stdio.h" /* для printf */ TXD=0; // Установка разрешения компьютеру передавать байт.
#include "stdlib.h" while (RXD); // Ожидание стартбита.
#include "reg935.h" /* для RS232 */ DEL10(); // Задержка длительностью полбайта (115200 бод).
TXD=1; // Запрет компьютеру передавать байт.
// while(!RI); // Ожидание окончания прихода байта в микроконтроллeр.
// Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". byte=SBUF; // Ввод байта в микроконтроллер.
// Переменные u.l (размерностью ushort) и RI = 0; // Сброс флага приема байта (RI).
// u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) return(byte);
// перераспределяют одно и то же место в памяти микроконтроллера. }
// Порядок расположения переменных lenh(первая) и lenl(вторая)
// в структуре (struct) строго определен и при его нарушении /**************************************************/
// вся конструкция совмещения не работает !!! void main(void)
// {
union{ initrs();
unsigned short l; // Длина строки("u.l"). REN=1; // Установка на прием.
struct{
unsigned char lenh; // Ст.байт длины строки("u.bt.lenh"). START:
unsigned char lenl; // Мл.байт длины строки("u.bt.lenl"). u.bt.lenl=inbyte(); //Прием мл.байта длины строки.
}bt; u.bt.lenh=inbyte(); //Прием ст.байта длины строки.
}u; temp_L=u.l; //Запоминание длины строки
// //в переменной temp_L.
//Переменная u.lдлина строки(ushort)
unsigned char c,j,a[80]; //заполняется автоматически после
unsigned short temp_L; //Переменная для временного(temp) //заполнения переменных
//хранения длины строки. //u.bt.lenl и u.bt.lenh.
void DEL10(void) {

106 107
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

for(u.l=0;u.l<temp_L;u.l++){ //Прием из компьютера struct{


a[u.l]=inbyte(); //очередного unsigned char lenh; // Ст.байт длины строки("u.bt.lenh").
} //байта строки. unsigned char lenl; // Мл.байт длины строки("u.bt.lenl").
//Изменение u.l (например, u.l++) }bt;
//влечет за собой автоматическое }u;
//и соответственное изменение //
//u.bt.lenl и u.bt.lenh.
//Если u.l — адрес памяти, unsigned char c,j,a[80];
//то u.bt.lenl и u.bt.lenh  unsigned short temp_L; //Переменная для временного(temp)
//соответственно младший //хранения длины строки.
//и старший байты этого адреса. void DEL10(void) {
for (j=0;j<10;j++); //10
REN=0; //Установка RS232 на передачу. }

for(u.l=0;u.l<temp_L;u.l++){ //Передача в компьютер void initrs(void) {


outbyte(a[u.l]); //очередного SSTAT=0x00; //Стандартный 51совместимый RS232.
} //байта строки. P1M1=0x02; //¦Вместе это означает: ¦
P1M2=0x01; //¦TxDpush/pull_output, RxDinput.¦
REN=1; //Установка RS232 на прием. SCON=0x40; //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный
бит=1.
c=inbyte(); //Если принятый символ="@", BRGR0=0x30; //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]=
if (c==0x40) goto START; //то продолжение работы, BRGR1=0x00; //7372800/[(0*256+48)+16]=7372800/64=115200.
E: //иначе — конец. BRGCON=0x03; //Разрешение SBRGS и BRGEN.
goto E; }
}
// void outbyte(unsigned char byte) {
while (RXD); // Ожидание разрешения на передачу байта (от компьютера).
Программа на Си для P89LPC904 SBUF=byte; // Вывод байта.
 while (!RXD); // Ожидание запрета на передачу (от компьютера).
// Программа вывода строки байт для P89LPC904, while (!TI); // Ожидание окончания вывода байта микроконтроллером.
// скорость обмена 115200 бод, частота внутреннего TI = 0; // Сброс флага передачи (TI).
// генератора 7372800 Гц. }
// см. inrs115l.asm
// unsigned char inbyte() {
#include "stdarg.h" unsigned char byte;
#include "stdio.h" /* для printf */ TXD=0; // Установка разрешения компьютеру передавать байт.
#include "stdlib.h" while (RXD); // Ожидание стартбита.
#include "reg904.h" /* для RS232 */ DEL10(); // Задержка длительностью полбайта (115200 бод).
TXD=1; // Запрет компьютеру передавать байт.
// while(!RI); // Ожидание окончания прихода байта в микроконтроллeр.
// Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". byte=SBUF; // Ввод байта в микроконтроллер.
// Переменные u.l (размерностью ushort) и RI = 0; // Сброс флага приема байта (RI).
// u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) return(byte);
// перераспределяют одно и то же место в памяти микроконтроллера. }
// Порядок расположения переменных lenh(первая) и lenl(вторая)
// в структуре (struct) строго определен и при его нарушении /**************************************************/
// вся конструкция совмещения не работает !!! void main(void)
// {
union{ initrs();
unsigned short l; // Длина строки("u.l"). REN=1; // Установка на прием.

108 109
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

START: ;
u.bt.lenl=inbyte(); //Прием мл.байта длины строки. TXDLPC: .reg p1.0 ;a не p3.0!!!
u.bt.lenh=inbyte(); //Прием ст.байта длины строки. RXDLPC: .reg p1.1 ;а не p3.1!!!
temp_L=u.l; //Запоминание длины строки ;
//в переменной temp_L.
//Переменная u.lдлина строки(ushort) ;
//заполняется автоматически после ; МАКРОСЫ
//заполнения переменных ;
//u.bt.lenl и u.bt.lenh. ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ
; ЯЗЫК В КОММЕНТАРИЯХ !!!!!!!
for(u.l=0;u.l<temp_L;u.l++){ //Прием из компьютера ;
a[u.l]=inbyte(); //очередного
} //байта строки. ;
//Изменение u.l (например, u.l++) ; Макрос ввода байта
//влечет за собой автоматическое ;
//и соответственное изменение INBYTE .macro
//u.bt.lenl и u.bt.lenh. clr TXDLPC ;Enable transfer
//Если u.l — адрес памяти, jb RXDLPC,$ ;Waiting startbit
//то u.bt.lenl и u.bt.lenh  setb TXDLPC ;Disable transfer
//соответственно младший jnb ri,$ ;Waiting set flag ri
//и старший байты этого адреса. mov a,sbuf ;Input byte from buffer
clr ri ;Clear flag ri
REN=0; //Установка RS232 на передачу. .endm
;
for(u.l=0;u.l<temp_L;u.l++){ //Передача в компьютер ; Алгоритм вывода байта
outbyte(a[u.l]); //очередного ;
} //байта строки. OUTBYTE .macro
jb RXDLPC,$ ;Waiting enable transfer
REN=1; //Установка RS232 на прием. mov sbuf,a ;Output byte in buffer
jnb RXDLPC,$ ;Waiting disable transfer.WARNING!!!
c=inbyte(); //Если принятый символ="@", jnb ti,$ ;Waiting output last bit (flag ti)
if (c==0x40) goto START; //то продолжение работы, clr ti ;Clear flag ti
E: //иначе — конец. .endm
goto E; ;
} .DATA
// ;
; Переменные
Программа на ассемблере для P89LPC904 ;
 P1M1 equ 91h
; P1M2 equ 92h
; Программа для микроконтроллера P89LPC904 BRGCON equ 0bdh
; приема строки символов по RS232 BRG0 equ 0beh
; (с передачей длины строки) и вывода символов BRG1 equ 0bfh
; из МК в компьютер. F(CCLK)=7372800 Гц. SSTAT equ 0bah
; Скорость обмена — 115200 и 9600 бод. ;
; Синхронизация — с помощью линий TXD и RxD. .CODE
;
.org 0000h ;Вектор прерывания по RST
; jmp MAIN
; Определение выводов TXD и RXD RS232 P89LPC904 .org 0003h ;Вектор прерывания по INT0

110 111
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

reti OUTBYTE
.org 001bh ;Вектор прерывания по TF1 djnz r0,spout
reti ;
.org 0053h ;вектор прерывания от TIC ; Ввод команды продолжения работы
reti ;
; setb REN ;Разрешение приема.
; Основная программа IB: INBYTE
; cjne a,#40h,E
.org 0060h jmp START
; mov sp,#20h
MAIN: E: jmp $
; .end
; org $ ;
mov sp,#20h
2.4.3.6 Тестовая программа обмена
; для микроконтроллеров C8051F067/330D
; Инициал. посл. порта
В отличие от ранее рассмотренных микроконтроллеров, программирование микроконт
;
роллеров C8051FXXX имеет свои особенности, основные из которых сводятся к следующему:
SPINIT: mov SSTAT,#00h ;Стандартный 51совместимый RS232.
mov P1M1,#02h ;¦Вместе это означает: ¦ 1. Определить источник тактирования микроконтроллера (SYSCLK) — либо внешний ге
mov P1M2,#01h ;¦TxDpush/pull_output, RxDinput.¦ нератор (например кварцевый), либо внутренний.
mov SCON,#40h ;Все биты SCON,кроме SM1,равны 0, SM1=1. 2. Определить какие выводы микроконтроллера будут принимать участие в работе по
mov BRG0,#30h ;30h=48.Vobm=CCLK/[(BRG1*256+BRG0)+16]= матрице соединений.
mov BRG1,#00h ;7372800/[(0*256+48)+16]=7372800/64=115200. 3. Запретить сторожевой таймер (либо написать и включить в текст своей программы
mov BRGCON,#03h ;Разрешение SBRGS и BRGEN.
специальную программу сторожевого таймера). Без этого ни одна программа рабо
;
тать не будет, поскольку сторожевой таймер по умолчанию включен.
;Ввод байт по посл. порту
; 4. Выводы микроконтроллера, использующиеся как альтернативные функции портов
START: setb REN ;Разрешение приема. ввода/вывода, нельзя больше использовать в качестве портов вывода. Например,
если использовать порт P0.0 в качестве линии TxD (по умолчанию в C8051067), то эту
mov dptr,#0 линию (а именно P0.0) нельзя устанавливать в произвольное состояние командами
INBYTE Си: TxD=0 или TxD=1.
mov r0,a ; Мл. байт длины
INBYTE
Ниже приведены две тестовых программы на Си для микроконтроллеров C8051F067
mov r1,a ; Ст. байт длины и C8051F330D. Программы функционируют при условии сопряжения микроконтроллеров
с компьютером по схемам (рис. 1.3.9.1 и 1.3.10). Для функционирования программ совме
spin: INBYTE; Байт в a стно с компьютером должна использоваться компьютерная программа, приведенная в
; 2.4.3.7.
push a В программе для C8051F067 качестве генератора скорости обмена используется ге
; нератор с внешним кварцевым резонатором с частотой 11 059 200 Гц, в программе для
inc dptr C8051F330D — внутренний генератор частотой 24,5 МГц. Скорость обмена установлена в
mov a,r1 115 200 бод.
cjne a,dph,spin И та, и другая программа запоминает принимаемую строку из 75 байт и выводит ее обрат
mov a,r0
но в том же порядке, в котором они поступили в микроконтроллер.
cjne a,dpl,spin
;
; Вывод байт по посл. порту Программа на Си для C8051F067
; 
clr REN ;Запрет приема. //
spout: pop a // Программа вывода строки байт для C8051F067,

112 113
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

// скорость обмена 115200 бод, кварц 11059200 Гц. void UART0_Init (void)
// {
SCON0 = 0x52; // SCON: mode 1, 8bit UART, diable RX
// SSTA0 = 0x10; // Timer 1 generates UART0 baud rate and
// Includes // UART0 baud rate divide by two disabled
//
#include "c8051f060.h" // SFR declarations TMOD = 0x20; // TMOD: timer 1, mode 2, 8bit reload
//#include "stdarg.h" TH1 = (SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
#include "stdio.h" /* для printf */ TR1 = 1; // start Timer1
//#include "stdlib.h" CKCON |= 0x10; // Timer1 uses SYSCLK as time base
// PCON |= 0x80; // SMOD = 1
TI0 = 1; // Indicate TX ready
// c=SBUF0;
// Global CONSTANTS }
// //
#define SYSCLK 11059200 // SYSCLK frequency in Hz
#define BAUDRATE 115200 // Baud Rate for UART0 //
// // PORT_Init
sbit TX0 = P0^2; //
sbit RX0 = P0^1; //
// // Configure the Crossbar and GPIO ports
//
unsigned char c,j,lenl,lenh,a[80]; void PORT_Init (void)
int i,l; {
//########################################################### XBR0 = 0x04; // Enable UART0 on crossbar
// XBR1 = 0x00;
 XBR2 = 0x40; // Enable crossbar and weak pullups
// SYSCLK_Init P0MDOUT = 0x05; // enable P0.0,P02 outputs as pushpull,
// }
void SYSCLK_Init (void) //
{ //###########################################################
int i; void DEL10(void) {
OSCXCN = 0x65; // start external oscillator with for (j=0;j<10;j++) {}
// 11.0592 MHz crystal on TB }
for (i=0; i <5000; i++) ; // XTLVLD blanking interval (>1ms) //
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle void DEL100(void) {
// RSTSRC = 0x04; // enable missing clock detec unsigned int i;
tor reset for (i=0;i<100;i++) {}
CLKSEL = 0x01; // change to external crystal }
OSCICN = 0x00; // disable internal oscillator //
}
// void outbyte(unsigned char byte) {
while (RX0); // Ожидание разрешения на передачу байта (от компьютера).
// SBUF0=byte; // Вывод байта.
 while (!RX0); // Ожидание запрета на передачу (от компьютера).
// UART0_Init while (!TI0); // Ожидание окончания вывода байта микроконтроллером.
// TI0 = 0; // Сброс флага передачи (TI).
 }
// Configure the UART0 using Timer1, for <baudrate> and 8N1.
// unsigned char inbyte() {

114 115
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

unsigned char byte; REN0=1; //Прием.


TX0=0; // Установка разрешения компьютеру передавать байт. c=inbyte();
while (RX0); // Ожидание стартбита. if (c==0x40) goto START;
DEL10(); // Задержка длительностью полбайта (115200 бод). E:
TX0=1; // Запрет компьютеру передавать байт. goto E;
while(!RI0); // Ожидание окончания прихода байта в микроконтроллeр. }
byte=SBUF0; // Ввод байта в микроконтроллер.
RI0 = 0; // Сброс флага приема байта (RI). Программа для C8051F330D
return(byte); 
} // Программа вывода строки байт для C8051F330D,
// скорость обмена 115200 бод, кварца нет,
/**************************************************/ // частота внутреннего генератора 24500000 Гц.
void main(void) // Используется UART0.
{ //
//################################ #include "stdarg.h"
WDTCN = 0xde; // disable watchdog timer #include "stdio.h" /* для printf */
WDTCN = 0xad; #include "stdlib.h"
#include "c8051f330.h"
SFRPAGE=0x0f; //
// #define SYSCLK 24500000 // SYSCLK частота внутр.ген. в Гц.
SYSCLK_Init (); // initialize SYSCLK #define BAUDRATE 115200 // Скорость обмена в бодах.
PORT_Init ();
#define ONE 1
SFRPAGE=0x00; #define NUL 0
// //
UART0_Init (); // initialize UART0 sbit TX0 = P1^7; // Определение бита TXD UART0.
//################################ sbit RX0 = P0^5; // Определение бита RXD UART0.
//
REN0=1; // Установка на прием. // Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh".
//
START: union{
// REN=1; //Приeм. unsigned short l; // Длина строки("u.l").
struct{
lenl=inbyte(); unsigned char lenh; // Ст.байт длины строки("u.bt.lenh").
lenh=inbyte(); unsigned char lenl; // Мл.байт длины строки("u.bt.lenl").
}bt;
l=lenh*256+lenl; }u;
//
for(i=0;i<l;i++){ unsigned char c,j,a[80];
a[i]=inbyte(); unsigned short temp_L; //Переменная для временного(temp)
} //хранения длины строки.
//
REN0=0; //Передача. void DEL20(void) {
for (j=0;j<20;j++); //10
for(i=0;i<l;i++){ }
outbyte(a[i]);
} void initrs(void) {
// 
DEL100(); PCA0MD &= ~0x40; // WDT — запрещен.
// 

116 117
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

OSCICN = 0x83; //Инициализация внутреннего //заполнения переменных


RSTSRC = 0x06; //генератора. //u.bt.lenl и u.bt.lenh.
//
XBR0 = 0x01; // UART разрешен. for(u.l=0;u.l<temp_L;u.l++){ //Прием из компьютера
XBR1 = 0x40; // Матрица выходов разрешена. a[u.l]=inbyte(); //очередного
P0MDOUT |=0x10; // TxD0двухтактный выход, RxD0вход. } //байта строки.
P1MDOUT |=0x80; // Tx0 — двухтактный выход. //Изменение u.l (например, u.l++)
// //влечет за собой автоматическое
SCON0=0x10; //Инициализация RS232 (UART0). //и соответственное изменение
TH1=(SYSCLK/BAUDRATE/2); //Синхронизация от //u.bt.lenl и u.bt.lenh.
CKCON |= 0x08; //таймера T1. //Если u.l — адрес памяти,
TL1=TH1; //то u.bt.lenl и u.bt.lenh 
TMOD &= ~0xf0; //соответственно младший
TMOD |= 0x20; //и старший байты этого адреса.
TR1=1;
// TI0=1; REN0=0; //Установка RS232 на передачу.
}
for(u.l=0;u.l<temp_L;u.l++){ //Передача в компьютер
void outbyte(unsigned char byte) { outbyte(a[u.l]); //очередного
while (RX0); // Ожидание разрешения на передачу байта (от компьютера). } //байта строки.
SBUF0=byte; // Вывод байта.
while (!RX0); // Ожидание запрета на передачу (от компьютера). REN0=1; //Установка RS232 на прием.
while (!TI0); // Ожидание окончания вывода байта микроконтроллером.
TI0 = 0; // Сброс флага передачи (TI0). c=inbyte(); //Если принятый символ="@",
} if (c==0x40) goto START; //то продолжение работы,
E: //иначе — конец.
unsigned char inbyte() { goto E;
unsigned char byte; }
TX0=NUL; // Установка разрешения компьютеру передавать байт. //
while (RX0); // Ожидание стартбита.
DEL20(); // Задержка длительностью полбайта (115200 бод).
TX0=ONE; // Запрет компьютеру передавать байт.
while(!RI0); // Ожидание окончания прихода байта в микроконтроллeр. 2.4.3.7. Тестовая программа обмена для компьютера в ОС DOS
byte=SBUF0; // Ввод байта в микроконтроллер.
RI0 = 0; // Сброс флага приема байта (RI0). Для функционирования любой из тестовых микроконтроллерных программ, приведен
return(byte); ных в 2.4.3.2 (для MSC1210), 2.4.3.3 (для ADUC847/834), 2.4.3.4 (для AT89C51ED2/RD2),
} 2.4.3.5 (для P89LPC938/904) и 2.4.3.6 (для C8051F067/330D) написана компьютерная
/**************************************************/ программа на языке Clarion V3.100 Hello.cla, работающая в операционной системе DOS.
void main(void) Программа инициализирует интерфейс RS232 компьютера (порт COM 1:N,8,1,115 200),
{ запускает микроконтроллер, передает в него строку из 75 байт (представляющую собой
initrs();
символы латинского и русского алфавита), принимает эту строку от микроконтроллера и
REN0=1; // Установка на прием.
обе строки выводит (для сравнения) на экран монитора. В программу включена (INCLUDE)
START: опция графического интерфейса пользователя (Graphic User Interface). Этот интерфейс
u.bt.lenl=inbyte(); //Прием мл.байта длины строки. позволяет работать в оконном режиме и поддерживает мышь (аналогично всем програм
u.bt.lenh=inbyte(); //Прием ст.байта длины строки. мам для ОС Windows).
temp_L=u.l; //Запоминание длины строки В качестве алгоритма обмена программа использует приведенный в 2.3.1 новый алго
//в переменной temp_L. ритм обмена, разработанный автором. Ниже приведен текст программы Hello.cla, а вслед за
//Переменная u.lдлина строки(ushort) ним — ее файлпроект.
//заполняется автоматически после

118 119
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

Программа Hello.cla ROW(3,7) STRING('k='),COLOR(48)


 ROW(4,20) STRING('Начало передачи
! в микроконтроллер'),COLOR(48)
! Программа передачи и приема строки из 75 символов по RS232 ROW(6,4) STRING('Передаваемая строка:'),COLOR(48)
! ROW(10,20) STRING('Начало приема
из микроконтроллера'),COLOR(48)
PROGRAM ROW(12,4) STRING('Принятая строка:'),COLOR(48)
ROW(16,27) STRING('(Esc)'),COLOR(49)
MAP COL(65) STRING('(Enter)'),COLOR(49)
INCLUDE('GUI.INC') ROW(16,53) BUTTON('Продолжить'),KEY(257),
. USE(?Ok),COLOR(112,112,135,112,112)
COL(18) BUTTON(' Выход '),KEY(256),
! USE(?CANSEL),COLOR(48,48,135,48,48)
! Определение переменных ROW(7,4) ENTRY(@s75),USE(S),COLOR(112,112,112)
! ROW(3,9) ENTRY(@n_3),USE(k),COLOR(112,112,112)
C byte ROW(13,4) ENTRY(@s75),USE(S1),COLOR(112,112,112)
A byte .
B byte
S string(75)
BT byte CODE
M byte,dim(75),over(S)
S1 string(75)
M1 byte,dim(75),over(S1) setgraphic(89) !VGA
i ushort LOADGUI
j ushort setcolor(158)
k ushort blank
Y00h byte setcolor
Y01h byte loadsymbols
Y02h byte setmouse(10,15)
Y03h byte open(SCREEN1)
Y04h byte !
Y07h byte k=0
Y12 byte !
Y47h byte Y00h=00h;Y01h=01h;Y02h=02h;Y03h=03h;Y04h=04h;Y07h=07h;
Y80h byte Y0fh=0fh;Y12=12;Y47h=47h;Y80h=80h
Y0fh byte do INIT !Инициализация RS232
!
OK
SCREEN1 SCREEN(18,80),PRE(SCR1),CENTER,GRAPHIC,CUA,COLOR(53) k=k+1
ROW(1,1) PAINT(1,80),COLOR(55) DISABLE(?CANSEL)
ROW(1,2) PAINT(1,78),COLOR(112) DISABLE(?Ok)
ROW(2,1) PAINT(17,1),COLOR(55)
ROW(2,4) PAINT(16,75),COLOR(48) S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdifjhigklmnopqrstuvwxyz
ROW(2,80) PAINT(17,1),COLOR(55) АБВГДЕЖЗИКЛМНОПРСТУФХЦЧ'
ROW(3,20) PAINT(1,34),COLOR(49) ! Ч75й символ
ROW(9,20) PAINT(1,35),COLOR(49) DISPLAY !Вывод на экран исходной строки.
ROW(16,32) PAINT(1,42),COLOR(49) !
ROW(18,4) PAINT(1,75),COLOR(55) i=1
ROW(1,19) STRING('Тест порта RS232 {5} C=M[1] !Запоминание первого элемента строки.
(COM1:115200,N,8,2)'),COLOR(112) M[1]=75

120 121
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ

do OUTBYTE !Передача мл. байта длины (75) !


M[1]=0 ! Инициализация СОМпорта.
do OUTBYTE !Передача ст. байта длины (0) !
! Установка скорости обмена.
M[1]=C !Восстановление первого символа строки. !
loop i=1 to 75 out(3fch,Y00h) ! Сброс линии DTR (Reset микроконтроллера).
do OUTBYTE
. out(3fbh,Y80h) ! DLAB=1 для установки делителя.
out(3f8h,Y01h) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод.
out(3f9h,Y00h) ! Установить ст.б. скор.=0.
! !
in(3f8h,B) !Холостой ввод — делать ОБЯЗАТЕЛЬНО !!!(Для сброса бита DRdata ready). ! Установка режима.
! !
loop;in(3fdh,B);if band(B,1)=0;break.. !Оже сброса бита "DR"data ready. out(3fbh,Y07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD.
!
! Установка запрета прерываний по СОМпорту.
S1=''!Обнуление S1 !
out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h.
loop i=1 to 75 !
do INBYTE
. !
! Инициализация микроконтроллера.
DISPLAY !Вывод на экран принятой строки. !
out(3fch,Y00h) ! Сброс линии DTR (Reset микроконтроллера).00h
do DEL100MS
ENABLE(?Ok) out(3fch,Y01h) ! Установка линии DTR (Запуск микроконтроллера).01h
ENABLE(?Cansel) do DEL100MS
loop do DEL100MS
accept in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0").
case field() do DEL100MS
of ?CANSEL !
DISPLAY
close(SCREEN1) !
goto E ! П/п ввода байта (байт в M1[i] )
of ?Ok !
display INBYTE routine
i=1 out(3fbh,Y47h) !Установка TxD (разрешение передачи)
M[1]=40h loop; in(3feh,B); if band(B,2) then break.. !Ожидание стартбита (устки DSR)
do OUTBYTE do DEL20 !Задержка 20 мкс
goto OK out(3fbh,Y07h) !Сброс линии TxD (запрет передачи)
.!case in(3feh,B) !Очистка регистра 3feh чтением
.!loop loop;in(3fdh,B);if band(B,1) then break.. !Оже конца прихода байта(бит "DR"data ready)
! in(3f8h,M1[i]) !Чтение байта данных
E blank !
out(3fch,Y00h) !Сброс микроконтроллера ! П/п вывода байта (байт в M[i] )
return !
! OUTBYTE routine
! П/п инициализации RS232 loop;in(3fdh,B);if band(B,20h);break.. !Оже готовности передатчика (transmitter empty).
! loop;in(3feh,B);if band(B,20h);break.. !Оже разреш.передачи(установки DSR)
INIT routine out(3f8h,M[i]) !Вывод байта

122 123
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

!in(3feh,B) !Очистка регистра 3feh чтением Нажатие кнопки «Продолжить» (мышью или клавишей Enter) приведет к повторному
loop;in(3feh,B);if band(B,2);break.. !Оже запрета передaчи(сброса DSR) запуску программы; количество запусков отражает переменная k в левом верхнем углу.
loop;in(3fdh,B);if band(B,40h);break.. !Ожe выхода байта из РС(trasmitter holding В данном случае k = 146.
register empty.OK to send). Нажатие кнопки «Выход» — к выходу из программы.
in(3feh,B) !Очистка регистра 3feh чтением
!

DEL100MS routine
2.5. Программирование интерфейса RS232
T#=CLOCK();loop while CLOCK()T#<10. !Задержка 0,1 с. в ОС Windows98/XP
DEL200MS routine
T#=CLOCK();loop while CLOCK()T#<20. !Задержка 0,2 с. 2.5.1. Предварительные замечания
DEL50 routine
loop 15000 times Программирование интерфейса RS232 в ОС Windows не является чемто сверъесте
. ственным. Внешний вид программ, написанных на идентичных языках программирова
DEL1400 routine ния (например Clarion v3.100 для DOS и Clarion v.6.0 для Windows), также практически
loop j=1 to 1400 одинаков. Исключением (по крайней мере для языка Кларион) является название экран
. ной формы. Если в Кларионе для DOS экранная форма называется SCREEN (Экран), то
DEL20 routine для Windows — Window (Окно). Структуры данных экранных форм также идентичны. Пре
loop 40000 times
имущество экранной формы Window перед SCREEN заключается в том, что она обладает
.
большей универсальностью, имеет больше возможностей и, самое главное, более авто
!
матизирована. Если посмотреть на тексты всех программ, приведенных в книге, то мож
но заметить, что структура Window в них уж очень «навороченная», поскольку там исполь
Файлпроект Hello.pr
 зуются несколько шрифтов и масса разной другой информации. На первый взгляд кажет
#system auto exe ся, что «грамотно» написать структуру экранной формы Window очень сложно и можно
#model extended понаделать массу ошибок. Но на самом деле, ее писать вообще не требуется (!), посколь
ку она генерируется языком Кларион автоматически. Необходимо только выбрать раз
#pragma data(stack_size=>24576,threshold=>4096) мер окна (не в тексте программы, а буквально на экране), установить на нем соответ
#pragma check(stack=>on,index=>on) ствующие кнопки и другие параметры и атрибуты. Все это делается мышью с уже готовым
#pragma link_option(map=>off,case=>on) (выбранным по умолчанию) окном. После того как окно «устраивает» программиста, он
#compile hello.cla /check(stack=>off,nil_ptr=>off,index=>off) нажимает определенную кнопку и экранная форма Window автоматически генерируется
/debug(vid=>off,line_num=>off) (точнее генерируется ее текст на языке Кларион). Более полную информацию по этому
#pragma link(%clapfx%dos.lib)
вопросу можно найти в документации по языку. Все остальные «вещи» в программах для
#pragma link(%clapfx%xgui.obj)
DOS и Windows программируются практически одинаково.
#set exports='hello'
#link hello Есть, правда, одно свойство языка Clarion 6.0 (по сравнению, например, с языком
Clarion5.5 и более ранними версиями), которое необходимо учитывать. Язык Clarion6.0 под
После запуска программы на экран выводится окно (рис. 2.4.3.7). держивает так называемую threadmodel, которая связана с многозадачностью операцион
ной системы (в основном это касается Win'XP). Слово «thread» можно с большим приближе
Рис. 2.4.3.7.
нием перевести как «некий процесс». Если в программе «одновременно идут» несколько
Внешний вид окна процессов, то Clarion 6.0 поддерживает такие задачи. Более подробно с подобными вопро
программы сами можно ознакомиться в руководстве по этому языку.
Здесь же автору хотелось бы предостеречь программистов от одной (нетривиальной)
ошибки, которую можно сделать, в результате чего программа работать не будет.
Рассмотрим фрагмент программы, который присутствует практически во всех задачах
(при программировании в ОС Windows):

124 125
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

START В первом варианте при нажатии кнопки «OK» переменной p присваивается значение 1
 (p=1), и далее следует оператор break, который организует выход из процесса (thread'a) —
 accept … end. При нажатии кнопки «Cancel» переменной p присваивается значение 0
— (p=0) и далее точно также следует оператор break , который аналогично организует выход
accept из процесса (thread'a) — accept … end. После выхода из процесса accept … end ана
! лизируется переменная p, и в зависимости от ее значения программа переходит к метке
case accepted() START (при p=1) либо к метке Е (при p=0), по которой осуществляется выход из программы.
of ?Ok
В отличие от первого варианта второй более простой. Там нет никакой переменной p, и
p=1
ветвление происходит сразу: при нажатии кнопки «ОК» программа переходит к метке START
break
of ?Cancel (goto START), а при нажатии кнопки «Cancel» — к метке E (goto E), и далее осущес
p=0 твляется выход из программы.
break С точки зрения синтаксиса языка оба варианта безупречны. Мало того, в Clarion 5.5 (и в
end ! ot case Clarion v.3.100 для DOS) оба варианта будут безукоризненно работать и не будут вызывать ни
! каких проблем.
end ! от accept В Clarion6.0 второй вариант может в лучшем случае остановить программу, которая не бу
дет подавать никаких «признаков жизни», и выход из ситуации можно осуществить, нажав
if p=0 then goto E. классическое «CTRLALTDEL», а затем «завершить процесс». В худшем случае второй вариант
может «повесить» компьютер, да так, что выход из ситуации можно будет осуществить только,
goto START
нажав кнопку «RESET» на системном блоке. Отчего это? А от того что цикл accept…end — это
процесс (thread), который «по умолчанию» организует Clarion6.0, выход из которого (процесса)
E return
во втором варианте не завершает его. А незавершенный процесс будет продолжаться бес
конечно (вот отчего компьютер может «повиснуть»!).
В приведенном фрагменте используется конструкция accept…end, которая применяет
В первом варианте при любом условии (неважно «OK» или «CANCEL») вначале произво
ся для определения ветвления программы в зависимости от нажатия кнопок «OK» или
дится явное завершение процесса accept…end, а затем, когда процесс accept…end за
«Cancel»(Выход). Эти кнопки расположены внизу любого окна. Нажатие кнопки «OK» приведет
вершен, уже анализируется переменная p и в зависимости от ее значения осуществляется со
к тому, что в программе будет осуществлен переход к метке START. Нажатие кнопки «Cancel»
ответствующий переход. Но — и в этом вся соль — этот анализ происходит уже после того, как
приведет к переходу к метке E, т. е. к выходу из программы. Конструкция на первый взгляд до
процесс accept…end завершен.
вольно тривиальная и может быть, например, легко упрощена. Например так, как это сделано
Столь подробное объяснение приводится здесь для того, чтобы незадачливый програм
в программе на Кларионе для DOS (см. 2.4.3.7):
мист «не попался».
START Но это лишь исключительный случай. В основном (еще раз повторюсь), программы в Кла
 рион для DOS и Windows отличаются очень мало.

— 2.5.2. Варианты программирования интерфейса RS232 в Win'98/XP
accept
Как уже упоминалось, программирование интерфейса RS232 в операционных системах
!
Windows возможно двумя способами. Первый способ — использование функций API (Application
case accepted()
of ?Ok Program Interface) — программный интерфейс для разработки приложений. Второй способ — ис
goto START пользование прямых команд ввода/вывода в порт (в данном случае — RS232 или COMпорт).
of ?Cancel Использование функций API — стандартный путь, на который указывают все документиро
goto E ванные источники по программированию в Windows. Применение APIфункций наталкивается
end ! ot case на ряд проблем. В частности, APIфункции работают очень медленно, и, если речь идет о быст
! рой реакции на какоелибо кратковременное (например, несколько микросекунд) внешнее
end ! от accept воздействие на порт RS232, то функции API не успевают отследить такое воздействие. Кроме
E return того, некоторые функции работают с явными ошибками, т. е. либо выполняют не совсем те
действия, которые, например, указаны в описании на конкретную функцию API, либо выполня
В чем отличие этих двух вариантов? ют дополнительные действия, которые не описаны.

126 127
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

Использование прямых команд ввода/вывода в порт также имеет свои проблемы (на Для получения параметров уже работающего порта можно использовать функцию
них мы остановимся позже). Однако программирование интерфейса прямыми командами GetCommState — получить статус порта. Эта функция возвращает handle порта, его структу
ввода/вывода в порт хорошо известно, поскольку используется в DOS. Кроме того, прямые ру (PortStruct) и претензий не вызывает.
команды ввода/вывода в порт выполняются очень быстро, т. к. это «машинные» кoманды Для передачи данных по последовательному порту можно использовать две функции API:
процессора. Они позволяют отследить самые быстротекущие процессы, происходящие с ин TransmitCommChar (послать символ через COMпорт), которая выводит в порт один байт
терфейсом RS232. или WriteFile (запись файла), которая может выводить как массив (буфер) байт, так и все
В связи с вышеизложенным, рассмотрим программирование интерфейса RS232 вначале го один байт. Эти функции не вызывают претензий и работают правильно.
с помощью функций API, а затем — с помощью прямых команд ввода/вывода в COMпорт. Чтение информации из порта возможно только функцией ReadFile. Эта функция может
прочитать из порта либо один байт, либо массив (буфер) байт только в том случае, если этот байт
2.5.3. Программирование интерфейса RS232 с помощью функций API (или массив байт) поступил в COMпорт. В противном случае функция возвращает ошибку и мо
жет, кроме того, «повесить» компьютер на неопределенно долгое время, если байт в порт не
Рассмотрим кратко те функции API, которые имеют непосредственно отношение к програм
поступал. При чтении, например, одного байта, размер входного буфера уменьшается на 1. Раз
мированию интерфейса RS232 в 32разрядном режиме. Полное описание всех функций API
мер входного буфера указывается в функции SetupComm (установка COMпорта), но если, нап
можно найти в MSDN (об этом уже говорилось ранее).
ример, в порт поступает байт больше, чем указанный размер буфера (например 1), то байты не
Прототипирование функций API на Clarion 6.0 приводится в программе «Hello.clw», напи
теряются, а накапливаются в буфере, и размер буфера растет. Этот факт является злейшей
санной для работы в Windows98/XP (и приведенной ниже). Там же можно найти числовые
ошибкой, и исправлять ее пока никто не собирается. Возможно, до исправления этой ошибки в
значения констант, использующихся в APIфункциях. Необходимо отметить, что в Clarion 5.5
и 6.0 есть программа (WINAPI.EXE), в которой также описаны прототипы и значения кон конце концов и доберутся разработчики WindowsXP (или последующих версий Windows).
стант APIфункций. Некоторые из них в этой программе неверны, поэтому пользоваться ими Функция PurgeComm (очистка COMпорта) предусмотрена для очистки входного буфера
от поступивших байт, если, например, они не нужны. Очистить входной буфер можно, приме
нужно с осторожностью.
нив ту же функцию ReadFile. Если указать количество байт для чтения равным 1, то для
Первой функцией API, которой должно предваряться программирование RS232, является
очистки буфера размером в 10 байт необходимо 10 раз вызвать функцию ReadFile, если же
функция открытия порта — CreateFileA (создать файл). Она возвращает «hаndle» порта —
равным 10, то эту функцию необходимо вызвать 1 раз.
числовое значение, которое операционная система приписывает открытому порту. Дословно
У читателя может возникнуть вопрос: а зачем вообще очищать входной буфер? Если в порт
«handle» — ручка (потянув за которую можно «открыть» порт). Функция CreateFileA работа
приходит 10 байт, то и читать нужно 10 байт. Здесь несколько причин.
ет правильно и претензий не вызывает.
Вопервых, одним из параметров функции CreateFileA, открывающей COMпорт,
После открытия порта необходимо обратиться к функции построения контрольного блока
является 5й по счету параметр (всего их 7), который именуется CreationDisposition
COMпорта: BuildCommDCBA, в которой требуется перечислить параметры порта (скорость
(создание диспозиции) и который должен принимать значение Open_Existing (т. е. отк
обмена, формат данных, количество стопбит и т. п.). Эта функция включает в себя два пара
рыть существующий). Это означает, что открывается COMпорт со своим, уже построен
метра: ControlString и PortStruct.
ным, контрольным блоком (DCB), у которого все параметры приняты по умолчанию и, в
ControlString — строка символов, которая, например, может принимать следующее
частности, состояния линий квитирования DTR и RTS, как правило, установлены в высо
значение: ControlString='Com1:115 200,N,8,1', означающее, что будет открыт порт
кий уровень. После открытия порта (т. е. после того как отработала функция
COM1 (который будет работать на скорости 115 200 бод), бит паритета не используется, коли
CreateFileA), но перед тем как будут выполнены функции BuildCommDCBA и
чество бит данных — 8 и стопбит — 1.
SetCommState, в которых, например, линии DTR и RTS должны быть в состоянии сброса
Параметр PortStruct — это массив байт, который определяет более полно струк
(т. е. низкого уровня), эти линии установятся в высокий уровень и будут в нем находиться
туру работы COMпорта и в который, в частности, входят параметры из
до тех пор, пока функции BuildCommDCBA и SetCommState не отработают. После того
ControlString (скорость, бит паритета, количество бит данных и стопбит). Так вот,
как функции BuildCommDCBA и SetCommState отработают, состояния линий DTR и RTS
если, например, указать в ControlString скорость 115 200, а в PortStruct скорость установятся уже в низкий уровень. Таким образом, уровни напряжений на линиях DTR и
9600, то порт будет работать на скорости 9600 бод. Если же в ControlString указать RTS кратковременно перейдут из низкого состояния в высокий и обратно. Если использу
9600, а в PortStruct 115 200, то скорость работы порта может принять непредсказуе ется гальванически развязанный интерфейс с питанием от линий RTS и DTR, то на линии
мое значение. По этой причине изменять в PortStruct параметры, установленные RxD появятся несколько импульсов. Поскольку это — линия данных, то, как следствие, в
в ControlString, не рекомендуется. буфер COMпорта введутся несколько байт (1–3), которые (это уже понятно) являются
Необходимо отметить, что функция BuildCommDCBA не производит никаких действий с «бросовыми» и которые необходимо сбросить (т. е. очистить от них приемный буфер).
портом; в ней только перечисляется, какие параметры порта необходимо установить, но уста Сколько этих байт введется и сколько раз надо применить функцию ReadFile, чтобы
новку этих параметров функция не производит. очистить буфер, — с точностью сказать невозможно. Если, предположим, ввелось
Для установки параметров, указанных в функции BuildCommDCBA, в COMпорт исполь 3 байта, а функцию ReadFile применили 2 раза, то в буфере будет «сидеть» один невер
зуется функция SetCommState (установить статус порта). Эта функция претензий не вызы ный байт. Если же ввелось 2 байта, а функцию применили три раза, то компьютер «повис
вает и работает правильно. нет» и будет «ждать» прихода третьего байта (который может не прийти вовсе!).
128 129
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

Вовторых, если опять же используются развязки с питанием от линий квитирования, то вить указанные линии в определенное состояние (какую конкретно и в какое состояние — ука
при установки этих линий в соответствующее состояние (уже по программе) на линии дан зывается в параметрах для этой функции;
ных (RxD) опять может возникнуть несколько импульсов и во входной буфер опять введутся 2) SetCommBreak (установка сигнала Break) — устанавливает линию TxD в единичное
несколько байт. Это приведет к ситуации, описанной выше. состояние (высокий уровень)
Эти две причины являются некоторым препятствием к применению таких гальванических 3) ClearCommBreak (сброс сигнала Break) сбрасывает линию TxD в нулевое состояние.
развязок, если для программирования RS232 используются функции API. Как видно, функция EscapeCommFunction дублирует две последних.
Втрeтьих, если сигнал DTR используется для сброса и запуска микроконтроллера (т. е. ес Для чтения состояния входных линий DSR, CTS, DCD и RI существует функция
ли он управляет сигналом RST), то при кратковременном пребывании сигнала DTR в высоком GetCommModemStatus (получить статус модема). Эта функция поразному работает в Windows98
уровне микроконтроллер может запуститься и изменить (уже по своей программе) состояние и WindowsXP. Если, например, линия DSR соединена с линией RxD и по ней поступает какаялибо ин
линии RxD (например, дать разрешение на передачу байта). Это приведет к поступлению еще формация, то при вызове этой функции в Windows 98 она даст правильный результат. В Windows XP
одного (неверного) байта во входной буфер. По этой причине, даже если не используются в такой ситуации эта функция ведет себя непредсказуемо и пользоваться ей не рекомендуется.
гальванические развязки или используются, но питаются энергией от отдельного источника Для чтения состояния указанных линий (точнее — для проверки факта изменения этих
питания, в микроконтроллере желательно предусмотреть некоторую (небольшую) аппаратную, состояний) и для других целей используются совместно две функции API — SetCommMask
либо программную задержку для исключения этого эффекта. (установка маски COMпорта) и WaitCommEvent (ожидание наступления события COMпор
И наконец вчетвертых. При использовании алгоритма обмена по RS232, применяю та). Эти функции работают правильно и претензий не вызывают, однако во многих справочни
щего синхронизацию по линии RxD для разрешения и запрещения компьютеру передавать ках и руководствах приводится неправильное толкование их совместного функционирования.
очередной байт, в буфер опять будут вводиться байты, правда, в этом случае их количест Функция SetCommMask устанавливает так называемую маску порта, в которой в качест
во уже строго определено и равно в точности тому количеству байт, синхронизацию поступ ве параметра или параметров указываются те биты, которые отвечают за наступление того
ления которых и обеспечивает такой алгоритм. Если, например, из компьютера в микроко или иного события. Если требуется отследить одно событие, то указывается один бит (точнее
нтроллер передается 75 байт, с 2 байтами длины (т. е. всего 77), а принимается также его название), если несколько — то несколько бит.
75 байт, то ясно, что первые 77 байт, которые ввелись в буфер, необходимо очистить, при Функция WaitCommEvent выполняет 2 задачи. 1я задача — при наступлении одного из
менив функцию ReadFile 77 раз (читая по 1 байту) или 1 раз (читая сразу 77 байт). После указанных в функции SetCommMask событий она выдает ненулевое значение. Для определе
этого следующий прочитанный байт (78й) уже будет верен. ния, какое именно событие произошло, функция возвращает параметр, по которому это мож
Для определения сколько байт находится во входном буфере, существует структура но определить, прочитав этот параметр. Это ее 2я задача.
COMSTAT (статус COMпорта), в которой это количество байт присутствует в переменной Если требуется отследить наступление каждого из 2 событий, но в разное время, то
CbInQue (размер в байтах входной очереди). Структуру COMSTAT, в частности, заполняет API в функции SetCommMask необходимо указать 2 события, вызвать 2 раза функцию
функция ClearCommError (сброс ошибки COMпорта). Поскольку, как указывалось, в неко WaitCommEvent, в которой каждый раз необходимо проверить статус и сравнить его с
торых случаях предсказать точное значение ненужных байт нельзя, то возможно применение битами того или иного события.
следующего автомата: вызывается APIфункция ClearCommError, определяется количество Пример. Отследить 2 события: поступление байта в COMпорт (EV_RXCHAR) и установку
байт во входном буфере CbInQue, затем 1 раз вызывается APIфункция ReadFile с DSR в высокий уровень (EV_DSR).
CbInQue количеством читаемых байт. Применив APIфункцию PurgeComm совместно с опи
санным автоматом, можно исключить «зависание» компьютера.
Необходимо отметить, что при программировании COMпорта прямыми командами вво 1. Устанавливаем маску с 2 событиями: EV_RXCHAR+EV_DSR:
да/вывода в порт в DOS и в Windows98/XP таких проблем не возникает по нескольким причи
нам. Вопервых, линии DTR и RTS изначально находятся в низком уровне и при инициализации !
порта не изменяются без нашего на то ведома (как в функциях API). Вовторых, размер буфера loop
там аппаратный и умещает только 1 байт, т. е. если в буфере уже есть байт и приходит еще if SetCommMask(CommPort,EV_RXCHAR+EV_DSR) |
один, то предыдущий байт теряется. Втретьих, прямую команду процессора in, которая очища then break. !Маска на приём байта и DSR
ет аппаратный буфер COMпорта, можно применять хоть 100 раз; при этом компьютер ни разу .
!
не зависнет, даже если во входном буфере давно уже нет байта и в помине. APIфункции же на
писаны так, что приходящий байт вводится в программный буфер не зависимо от того,
2. Ожидаем установки DSR в высокий уровень, после чего, например, выполняем
требуется ли нам это или нет. Вот что является причиной вышеописанных «глюков».
команду ClearCommBreak:
Для установки выходных линий (DTR, RTS и TxD) COMпорта в произвольное состояние
имеются три функции API, которые претензий не вызывают и работают правильно: !
1) EscapeCommFunction — переназначить функцию COMпорта (вспомним клавишу loop
Escape (Esc), находящуюся в самом верхнем левом углу клавиатуры), которая может устано loop until WaitCommEvent(CommPort,EvtStatus,0).

130 131
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

if band(EvtStatus,EV_DSR) !DSR Sleep(100)


if ClearCommBreak(CommPort) then break. После этого программа будет ждать 100 мс, а затем будет выполнять следующий оператор.
. Приведенные функции API для COMпорта — это далеко не полный их перечень. Как
. уже указывалось, полный перечень находится, например, в MSDN. Для более детально
!
го уяснения функций API рекомендуется просмотреть в MSDN хотя бы те, что были
описаны выше, поскольку именно они используются для программы, приведенной авто
3. Ожидаем приема байта в COMпорт:
ром далее.
!
loop
2.5.3.1. Тестовая программа обмена для компьютера,
loop until WaitCommEvent(CommPort,EvtStatus,0). использующая функции API, в ОС Win'98/XP
if band(EvtStatus,EV_RXCHAR) then break. После такого несколько «сумбурного» изложения автором основных функций API, читате
. лю может показаться, что запрограммировать интерфейс RS232 с их помощью просто невоз
!
можно либо достаточно сложно. Отчасти это так и есть. Тем не менее автору удалось написать
достаточно стабильно работающую программу HELLO.CLW, которая приводится ниже. Програм
Если требуется отследить только одно событие, то можно установить маску на это событие, ма выполняет те же функции, что и тестовая программа для DOS (Clarion v.3.100), приведенная
а затем просто вызвать функцию WaitCommEvent и не проверять возвращаемый им статус: в 2.4.3.7, написана на языке Кларион для Windows — Clarion 6.0. Для работы с программой
может использоваться любой из микроконтроллеров, работающий с программой для
1. Устанавливаем маску на поступление байта в COMпорт: DOS (см. 2.4.3.7).
В программе HELLO.CLW пользователь может выбрать скорость обмена по интерфейсу
!
RS232 (9600 или 115 200 бод). Разумеется, программа для микроконтроллера должна быть
loop
if SetCommMask(CommPort,EV_RXCHAR)| написана так, чтобы указанные скорости обмена по RS232 микроконтроллера и компьютера
then break. !Маска на приём байта совпадали.
. Ниже приведен текст программы HELLO.CLW и ее файлапроекта Hello.prj.
!
Программа HELLO.CLW
2. Oжидаем наступление этого события (без проверки статуса, как в предыдущем случае): 
!
! ! Программа передачи и приема строки из 75 символов по RS232
loop until WaitCommEvent(CommPort,EvtStatus,0). ! с помощью APIфункций Windows98/XP.
! ! Используется программа для микроконтроллера: INRS115.c
!

Совершенно очевидно, что в последнем случае функция WaitCommEvent выполняется PROGRAM


намного быстрее, т. к. содержит не тройную проверку в цикле, а единственную. Во многих ру
ководствах по программированию APIфункций, как уже упоминалось по поводу их не совсем !========================
правильного толкования, помимо проверки факта наступления события (п. 2) опять, как в пре INCLUDE('Equates.CLW')
дыдущем примере, сравнивается статус порта с битом этого единственного сoбытия INCLUDE('TplEqu.CLW')
(EV_RXCHAR), что является лишним и требует дополнительного времени (а иногда счет идет на INCLUDE('Keycodes.CLW')
доли микросекунды!). INCLUDE('Errors.CLW')
!========================
После окончания работы с COMпортом его необходимо закрыть. Это делается с помощью
вызова функции CloseHandle (закрыть Handle), которая претензий не вызывает и работа !
ет правильно. ! Определение переменных
И последняя функция API, которой хотелось бы коснуться, — установка временной заде !
ржки — функция Sleep (спать). Эта функция, вообще говоря, не принадлежит к функциям COM C byte
порта, но в связи с тем, что она отсутствует в Clarion 6.0, автор рекомендует ее использовать. A byte
Вызвать эту функцию просто: B byte

132 133
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

S string(75) OPEN_ALWAYS ULONG(4)


BT byte FILE_FLAG_OVERLAPPED ULONG(40000000H)
M byte,dim(75),over(S) FILE_FLAG_NOOVERLAPPED ULONG(0)
S1 string(80) FILE_FLAG_NO_BUFFERING ULONG(20000000H)
M1 byte,dim(80),over(S1)
i ushort LPERRORS ULONG
i0 ushort(1)
j ushort CLRDTR ULONG(6)
k ushort SETDTR ULONG(5)
STR string(15) CLRRTS ULONG(4)
CH BYTE SETRTS ULONG(3)
N1 LONG SETBREAK ULONG(8)
N BYTE CLRBREAK ULONG(9)
CH1 BYTE RESETDEV ULONG(7)
NX ULONG
p byte ModemStatus ULONG
SPEED string(6) MS_CTS_ON ULONG(10h)
NP string(4) MS_DSR_ON ULONG(20h)
! MS_RING_ON ULONG(40h)
! Переменные для частоты и счетчика MS_RLSD_ON ULONG(80h)
!
CSTARTL ulong EvtStatus ULONG
CSTARTH long EV_BREAK ULONG(0040h)
CSTOPL ulong EV_CTS ULONG(0008h)
CSTOPH long EV_CTSS ULONG(0400h)
DC long EV_DSR ULONG(0010h)
DELTAC long EV_RING ULONG(0100h)
! EV_RLSD ULONG(0020h)
FREQUENCY GROUP,PRE(FRE) EV_RXCHAR ULONG(0001h)
FREQL ULONG EV_TXEMPTY ULONG(0004h)
FREQH LONG
. PURGE_TXABORT ULONG(1)
COUNTER GROUP,PRE(CNT) PURGE_RXABORT ULONG(2)
COUNTL ULONG PURGE_TXCLEAR ULONG(4)
COUNTH LONG PURGE_RXCLEAR ULONG(8)
.
! BytesToRead LONG
!
!
! Переменные для API
! !
CommPort UNSIGNED !(handle). ! Структура DCB:
PortCString CSTRING(5) !'COM1' и т.п. !
ControlCString CSTRING(50) !'COM1:115200,N,8,1' и т.п. PortStruct GROUP,PRE(PTS)
GENERIC_READ ULONG(80000000H) DCBlenght ULONG(28) ! Длина блока DCB(28 байт).
GENERIC_WRITE ULONG(40000000H) BaudRate ULONG!(800h) ! Скорость:11520000020000h,
ACCESS ULONG(0C0000000H) ! 5760000040000h,960000000800h.

CREATE_ALWAYS ULONG(2) fbitFields ULONG(1) ! Битовая маска.


OPEN_EXISTING ULONG(3)

134 135
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

wReserved USHORT ! Резервный. QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL


XonLim USHORT(0) ! Нет Xon. QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL
XoffLim USHORT(0) ! Нет Xoff. Sleep(ULONG),PASCAL
ByteSize BYTE(8) ! Длина слова 8 бит. END
Parity BYTE(0) ! Нет паритета. !===================================================
StopBits BYTE(1) ! Стопбит: 01,11.5,22. END !от MAP
XonChar BYTE(0) ! Символ Xon.
XoffChar BYTE(0) ! // Xoff. WinOut WINDOW('Тест порта RS232 (COM1:115200,N,8,2). Ввод/вывод — API.'),AT(,,340,164),|
ErrorChar BYTE(0) ! // Error. FONT('MS Sans Serif',8,,FONT:bold),CENTER,CENTERED,SYSTEM,GRAY,MAX
EvtChar BYTE(0) ! // Event. BUTTON('Выход'),AT(52,128,50,21),USE(?Cancel),|
wReserved1 USHORT ! Резервный. FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC),DEFAULT
. ! Конец структуры. IMAGE('CHECK4.ICO'),AT(204,128,18,21),USE(?Image1)
! BUTTON('Продолжить'),AT(224,128,69,21),USE(?Ok),|
FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC),DEFAULT
! IMAGE('CANCEL4.ICO'),AT(32,128,19,21),USE(?Image2)
! Структура COMSTAT: END
! !
COMSTAT GROUP,PRE(CST) WinIn WINDOW(' Ввод параметров порта'),AT(,,177,98),|
Status ULONG FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),|
CbInQue ULONG CENTER,CENTERED,SYSTEM,GRAY,MAX,RESIZE
CbOutQue ULONG MENUBAR
. ! Конец структуры. END
! PROMPT('бод'),AT(132,42,18,15),USE(?Prompt1),|
MAP FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC)
!=================================================== OPTION('Скорость обмена'),AT(76,10,89,49),USE(SPEED),BOXED,|
! Прототипы для APIфункций. FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC)
! RADIO('115200'),AT(88,22,39,19),|
MODULE('Comm Prototipes') FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC)
! RADIO(' 9600'),AT(88,38,34,19),|
CreateFileA(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC),VALUE('9600')
SIGNED,RAW,PASCAL,NAME('CreateFileA') END
BuildCommDCBA(*CSTRING,*STRING),SIGNED,RAW,PASCAL,Name('BuildCommDCBA') PROMPT('бод'),AT(132,26,18,15),USE(?unnamed),|
SetCommState(SIGNED,*STRING),BOOL,RAW,PASCAL FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC)
GetCommState(SIGNED,*STRING),BOOL,RAW,PASCAL IMAGE('CHECK4.ICO'),AT(24,74,18,22),USE(?Image5)
TransmitCommChar(UNSIGNED,BYTE),UNSIGNED,PASCAL BUTTON('Запуск'),AT(48,74,76,20),USE(?Button3),|
EscapeCommFunction(SHORT,ULONG),LONG,PASCAL FONT('Tahoma',11,,FONT:bold,CHARSET:CYRILLIC),DEFAULT
CloseHandle(SIGNED),BOOL,PROC,PASCAL OPTION('<185> Порта'),AT(12,10,53,49),USE(NP),BOXED,|
SetCommBreak(SHORT),SHORT,PASCAL FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC)
ClearCommBreak(SHORT),SHORT,PASCAL RADIO('COM1'),AT(20,22,32,18),USE(?unnamed:1),|
GetCommModemStatus(SHORT,*ULONG),SIGNED,PASCAL FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC), |
SetCommMask(SHORT,ULONG),SHORT,PASCAL TIP('COM1'),VALUE('COM1')
WaitCommEvent(UNSIGNED,*ULONG,LONG),SHORT,RAW,PASCAL RADIO('COM2'),AT(20,38,33,17),USE(?unnamed:2),|
ReadFile(UNSIGNED,*BYTE,ULONG,*LONG,LONG),BOOL,RAW,PASCAL,PROC FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC), |
WriteFile(UNSIGNED,*BYTE,ULONG,*LONG,LONG),BOOL,RAW,PASCAL TIP('COM2'),VALUE('COM2')
PurgeComm(UNSIGNED,ULONG),UNSIGNED,RAW,PASCAL!Мой END
ClearCommError(UNSIGNED,*ULONG,*STRING),SHORT,RAW,PASCAL END
!
END !
!
MODULE('DELAY') CODE

136 137
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

show(5,40,S)
NP='COM1' show(5,50,'Конец передачи из PC')
SPEED='115200' show(5,60,'')
open(WinIn) !
p=0 sleep(5) !Для 9600 дополнительно.
accept sleep(5)
if accepted()=(?button3) then p=1; break. !
end loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка вх. буфера.
if p=0 then return. !
! loop until(SetCommMask(CommPort,EV_RXCHAR)). ! Установка маски
! Вычисление временной задержки в 25 мкс. ! только(!) на прием байта.
! !
loop until QueryPerformanceFrequency(FREQUENCY). !Определение частоты работы счетчика. show(5,70,'Начало передачи из микроконтроллера')
DC=int(25*FRE:FREQL/1000000) !Вычисление времени счета в 25 мкс. S1=''
! !
loop i=1 to 75 !Прием 75 байт строки
! do INBYTE !из
do INIT !Инициализация RS232 и микроконтроллера. . !микроконтроллера.
!
loop until(SetCommMask(CommPort,EV_TXEMPTY)). ! Установка маски на вывод байта show(5,80,S1)
show(5,90,'Конец передачи из микроконтроллера')
close(WinIn) show(5,100,'')
!
k=0 enable(?Ok)
OPEN(WinOut) enable(?Cancel)
!
disable(?Ok) p=0
disable(?Cancel) accept
START !
! case accepted()
S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИКЛМНОПРСТУФХЦЧ' of ?Ok
!blank
k=k+1 !display
show(5,30,'Начало передачи из PC') disable(?Ok)
show(5,10,'') disable(?Cancel)
show(5,10,'k=') p=1
type(k) break
! of ?Cancel
i=1 p=0
C=M[1] break
M[1]=75 end!ot case
do OUTBYTE !Передача мл. байта длины (75) !
M[1]=0 end! От accept
do OUTBYTE !Передача ст. байта длины (0)
! if p=0 then goto E.
M[1]=C !Передача 75 байт строки.
loop i=1 to 75 !в микроконтроллер. blank
do OUTBYTE loop until(SetCommMask(CommPort,EV_TXEMPTY)). ! Установка маски
. i=1
! M[1]=40h

138 139
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

do OUTBYTE
goto START !
! П/п ввода байта (байт в M1[i] )
E !
! INBYTE routine
loop until(EscapeCommFunction(CommPort,CLRDTR)). !Сброс микроконтроллера. !
loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка вх. буфера. loop until(SetCommBreak(CommPort)). !Установка TxD — разрешение передачи.
loop until(CloseHandle(CommPort)). !Закрытие CommPort'a. loop until WaitCommEvent(CommPort,EvtStatus,0). !Ожидание прихода байта
close (WinOut) !(EvtStatus=EV_RXCHAR).
RE loop until(ClearCommBreak(CommPort)). !Сброс TxD — запрет передачи.
return loop until(ReadFile(CommPort,M1[i],1,N1,NULL)). !Чтение байта данных.
!
! ! П/п вывода байта (байт в M[i] )
!Конец программы !
! OUTBYTE routine
!
!========================================================================= loop !Ожидание разрешения
! ПОДПРОГРАММЫ loop until (GetCommModemStatus(CommPort,ModemStatus)). !передачи,
! if BAND(ModemStatus,MS_DSR_ON) then break. !т.е. установки DSR
. !(MS_DSR_ON).
! loop until(TransmitCommChar(CommPort,M[i])). !Вывод байта.
! П/п инициализации RS232 и микроконтроллера. loop until WaitCommEvent(CommPort,EvtStatus,NULL). !Оже концa вывода байта
! !(EvtStatus=EV_TXEMPTY).
INIT routine !!
! DEL25 routine
! Инициализация COMпорта loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика.
! CSTARTL=CNT:COUNTL !Занесение начального значения в
PortCString=NP CSTARTH=CNT:COUNTH !две стартовых longпеременных.
loop !
!PortCString='COM1' loop until QueryPerformanceCounter(COUNTER). ! Ожидание
!PortCString='COM2' if CNT:COUNTH=CSTARTH !
CommPort=CreateFileA(PortCString,ACCESS,0,NULL,OPEN_EXISTING,| DELTAC=CNT:COUNTLCSTARTL ! прошествия
FILE_FLAG_NOOVERLAPPED,NULL) !Открытие порта else !
loop until(GetCommState(CommPort,PortStruct)). !Получение статуса порта. DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени
ControlCString=NP & ':' & SPEED & ',N,8,2' . !
loop until(BuildCommDCBA(ControlCString,PortStruct)).!Построение DCB. if DELTAC>DC then break. ! DC(=25 мкс.)
PTS:fbitFields=1 !Битовая маска. . !
loop until(SetCommState(CommPort,PortStruct)). !Установка статуса порта. !==========================================================================
! DELAY35 routine
! Инициализация микроконтроллера loop 21000 times.
! !
loop until(EscapeCommFunction(CommPort,CLRDTR)). !Сброс микроконтроллера.
Sleep(100) !Задержка 100 мс. Файлпроект Hello.prj
loop until(ClearCommBreak(CommPort)). !Сброс TxD — запрет передачи. 
loop until(EscapeCommFunction(CommPort,SETDTR)). !Запуск микроконтроллера  Project File Title
Sleep(100) #noedit
loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка входного буфера. #system win32
! #model clarion lib
! Конец инициализации #set RELEASE = on
! #pragma debug(vid=>off)

140 141
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

#pragma optimize(cpu=>386) При запуске программы в Win'XP на экране монитора появляется окно (рис. 2.5.3.3), а
#pragma optimize(speed=>on) после выбора необходимой скорости обмена, № COMпорта и нажатия кнопки «Запуск» —
#pragma define(NULL=>off) следующее окно (рис. 2.5.3.4).
#compile "hello.clw"
#pragma link("hello.lib") Рис. 2.5.3.3.
Окно выбора параметров
#pragma link("WindowsShell.Manifest") порта (Win'XP)
#link "hello.exe"

Программа работает в ОС Win'98(SE2) и Win'XP(SP2).


При запуске в Win'98 на экране монитора появляется окно (рис. 2.5.3.1). Необходимо
выбрать № COMпорта, к которому подключено соответствующее устройство (или одна из макет
ных плат, описанных ранее). Соответствующая скорость обмена должна быть запрограммирова
на в микроконтроллер. Питание устройства (или макетной платы) должно быть включено.
Рис. 2.5.3.4.
При выборе 1го COMпорта и скорости обмена в 115 200 бод (как на рис. 2.5.3.1) и нажатии Основное окно работы
кнопки «Запуск» на экран выводится окно (рис. 2.5.3.2). Нажатие кнопки «Продолжить» приведет программы (Win'XP)
к повторному запуску программы передачи и приема строки. При этом количество перезапусков
отражается переменной k, показанной в верхнем левом углу окна (k = 179, т. к. при большем ко
личестве нажатий на кнопку «Продолжить» указательный палец начинает неметь :) ). Если срав
нить окна, показанные на рис. 2.5.3.2 и 2.4.3.7, то можно заметить их логическую (но не внеш
нюю) идентичность. Это не удивительно, поскольку программы выполняют одну и ту же функцию,
но в разных ОС (DOS и Win'98).
Рис. 2.5.3.1.
Окно выбора параметров
порта (Win'98)

Рис. 2.5.3.2.
Основное окно работы
программы (Win'98)

2.5.4. Программирование интерфейса RS232


с помощью прямых команд ввода/вывода в COM-порт

2.5.4.1. Общие положения


Программирование интерфейса RS232 в ОС Windows с использованием прямых команд
ввода/вывода в COMпорт сопряжено с некоторыми проблемами, которые, к счастью, разре
шимы.
Первая проблема — каким образом вообще вывести в порт и ввести из порта информа
цию. Дело в том, что в Кларионе для DOS (Clarion v.3.100), на котором написана программа,
приведенная в 2.4.3.7, есть встроенные команды ввода/вывода в порт — in (№ Порта, Дан
ные) и out (№ Порта, Данные). Эти команды и применялись для программирования интерфей
са RS232 (COMпорта). В Кларионе для Windows (Clarion 6.0) таких встроенных команд вво
да/вывода в порт нет.

142 143
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

Вторая проблема касается разрешения применения команд прямого ввода/вывода (in( ) INP(USHORT),BYTE,PASCAL,NAME('Inp32')
и out( ) ) в порт. В ОС Win'98 эта проблема не стоит, поскольку в этой ОС прямые команды вво OUTP(USHORT,BYTE),PASCAL,NAME('Out32')
да/вывода в порт разрешены. В ОС Win'XP команды прямого ввода/вывода (in( ) и out( ) ) в END
порт запрещены (по крайней мере в официальной документации). !
Третья проблема также касается только ОС Win'XP и состоит в том, что если даже какимлибо
способом обойти запрещение на применение прямых команд ввода/вывода в порт, то для того После этого можно использовать 2 вышеуказанные функции.
чтобы они работали с портом (в данном случае с COMпортом), этот порт необходимо открыть. Использование библиотеки inpout32.dll для прямого ввода/вывода в порт имеет свои
Смысл слова «открыть» состоит в том, чтобы разрешить работу самого COMпорта (в т. ч. и для пря преимущества и недостатки.
Преимущества заключаются в достаточной простоте применения функций INP( ) и OUTP( ),
мого ввода/вывода туда/оттуда информации). В Win'98 этого «открытия» делать не требуется,
а также в том, что применение этих функций автоматически разрешает их использование в
поскольку там прямые команды ввода/вывода в порт разрешены и этот вопрос не стоит.
Win'XP (другими словами, применение этих функций автоматически снимает запрет на прямой
Забегая вперед, сразу заметим, что все эти три проблемы решаемы (и каждая из них мо
ввод/вывод в порт в Win'XP).
жет быть решена несколькими способами). Недостатки использования функций INP( ) и OUT( ) состоят в том, что: а) требуется привле
кать дополнительную библиотеку (inpout32.dll), что сопряжено с дополнительными «манипуля
2.5.4.2. Применение команд ввода/вывода в порт циями» в программе и необходимостью иметь эту библиотеку, и б) эти функции выполняются
в Clarion 6.0 для Win 98/XP не очень быстро (но, конечно, на порядок быстрее, чем функции API). Правда, быстродействия
Задача использования отсутствующих команд ввода/вывода в порт в Clarion 6.0 может их хватает, чтобы отследить самые быстротекущие процессы в интерфейсе RS232.
быть решена по крайней мере 2 способами. Второй способ (Б) применения прямых команд ввода/вывода в порт заключается в сле
Первый способ (назовем его способом А) заключается в том, что существует специально дующем.
написанная и бесплатно распространяемая библиотека (inpout32.dll), которая решает сразу Хотя в самом языке Clarion 6.0 и отсутствуют команды прямого вывода в порт (in и out), эти
2 задачи — дает в распоряжение пользователя 2 внешних библиотечных функции: INP(Адрес команды присутствуют в языке Си (C++), который встроен в Clarion 6.0. Написав на этом язы
порта) и OUTP (Адрес порта, Данные) и разрешает их применение в Win'XP (напомню, этого ке две внешних подпрограммы ввода и вывода в порт и обратившись к ним из программы на
Clarion6.0 как к внешней функции, можно решить поставленную задачу. Ниже приведен текст
разрешения в Win'98 не требуется). Применение этих функций и позволяет производить
2 внешних подпрограмм In.cpp и Out.cpp, написанных автором на встроенном C++, для прямо
ввод/вывод в порт, а заодно и разрешает этот ввод/вывод в Win'XP. Адрес порта должен быть
го ввода и вывода в порт.
переменной типа USHORT, а данные — типа BYTE.
Для того чтобы вывести в порт информацию, достаточно применить функцию //
OUTP(USHORT,BYTE). Предположим, требуется вывести в порт данных (3f8h) порта COM 1 сим //Подпрограмма In.cpp
вол 'A', имеющий код ASCII — 41h. Для этого достаточно написать: //
#pragma save
OUTP(3f8h,41h) #pragma call(inline => on, reg_param => (dx), reg_return => (ax))
static unsigned char inportb(unsigned int Port_number)=
Чтобы ввести данные из порта, достаточно применить функцию INP(USHORT). Предположим, {
требуется ввести данные из порта состояния COM1 (3feh). Для этого достаточно написать: 0xEC, // in al,dx
};
B=INP(3feh) #pragma restore

где переменная B должна быть типа BYTE. extern "C" unsigned char INP(unsigned int Port_number)
Чтобы воспользоваться в программе вышеуказанными функциями, требуется сделать две {
вещи: 1) преобразовать библиотеку inpout32.dll в inpout32.lib с помощью программы unsigned char byte;
libmaker.exe, входящей в комплект поставки Clarion6.0 (о том, как это сделать, написано в руково byte=inportb(Port_number);
дстве пользователя по языку Clarion 6.0), и уже библиотеку inpout32.lib вставить в проект своей return byte;
программы; 2) в тексте программы необходимо указать прототипы использования команд }
INP(USHORT) и OUTP(USHORT,BYTE). Прототипирование осуществляется стандартным образом, //
как это обычно делается в Кларионе:
//
! // Подпрограмма Out.cpp
MODULE('INPOUT32') //

144 145
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

#pragma save то вторая подпрограмма помещает значение адреса 3f8h в переменную Port_number, обра
#pragma call(inline => on, reg_param => (dx,ax)) щается к первой подпрограмме с помощью инструкции byte=inportb(Port_number); и,
static void outportb(unsigned int port, unsigned char byt)= получив значение введенного байта в переменной byte, возвращает это значение в Клари
{ он с помощью инструкции return byte.
0xEE, // out dx,al Столь подробное описание подпрограммы In.cpp приводится здесь потому, что, хотя внеш
}; не эта подпрограмма выглядит достаточно простой, она является ключевым решением пробле
#pragma restore мы прямого ввода из порта, который (ввод) в Кларионе для Windows (Clarion6.0) отсутствует.
Аналогично работает и подпрограмма Out.cpp. Разница состоит в том, что в подпрограмме
extern "C" void OUTP(unsigned int Port_Number, unsigned char byte) In.cpp передается один параметр (адрес порта) и возвращается значение, прочитанное из это
{ го порта, а в подпрограмме Out.cpp передаются два параметра (адрес порта — в регистр dx и
outportb(Port_Number,byte); значение, которое требуется вывести в этот порт — в регистр ax). Поэтому такое подробное
} описание подпрограммы in.cpp приводится еще и для того, чтобы читатель смог проследить эту
// аналогию в подпрограмме Out.cpp.
Но это еще не все.
Основная идея этих 2 подпрограмм заключается в следующем. Вначале рассмотрим Чтобы эти подпрограммы работали, необходимо: а) написать в языке Кларион для них про
подпрограмму In.cpp. тотипы, и 2) включить их в проект программы на Кларионе.
Во встроенном в Clarion6.0 языке C++ есть возможность использования «inline» проце Прототипирование подпрограмм должно осуществляться в программе на Кларионе следу
дур, чтобы в текст программы (на C++) можно было вставлять машинные коды команд процес ющими инструкциями:
сора. Эти inlineпроцедуры возможно применять только в том случае, если функция, в которой
они используются, имеет атрибут «static». Но атрибут «static» не позволяет вызвать эту функцию MODULE('IN.CPP')
из программы пользователя, другими словами, — из языка Кларион (но позволяет осущест INP(USHORT),BYTE,NAME('_INP')
вить ее вызов из программы на C++ из того же модуля). С другой стороны, программа, кото END
рая может быть вызвана из языка Кларион, должна быть «внешней» по отношению к нему; в MODULE('OUT.CPP')
этом случае внешняя подпрограмма (или функция) должна иметь атрибут «extern», т. е. «внеш OUTP(USHORT,BYTE),NAME('_OUTP')
ний». Поэтому подпрограмма in.cpp состоит из 2 программ. END
Первая — подпрограмма, имеющая атрибут «static», осуществляет непосредственное ис
пользование inlineкоманды процессорa (in al,dx), машинный код которой 0xEC. Эта ко Здесь также есть одна тонкость. Символ подчеркивания ( «_» ) перед названиями INP и
манда процессора осуществляет ввод данных (команда in), расположенных по адресу, нахо OUTP отражает тот факт, что эти подпрограммы написаны именно на языке Си. Если посмот
дящемуся в регистре dx процессора, в младший байт аккумулятора (al). Для осуществления реть на подпрограммы In.cpp и Out.cpp, то можно заметить, что в них используется инструкция
такого действия необходимо, вопервых, запомнить текущее состояние процессора (что вы extern «C». Символ «C» и есть причина символа подчеркивания. Без символа подчеркивания в
полняет команда #pragma save), вовторых, включить опцию «inline», передать адрес порта прототипе и символа «С» в подпрограмме вся конструкция работать не будет.
(RS232) в регистр dx и получить результат ввода в регистре ax (что выполняет инструкция Для того чтобы вставить подпрограммы In.cpp и Out.cpp в проект, необходимо открыть в
#pragma call(inline  on, reg_param  (dx), reg_return  (ax))). проекте папку «External source files» (Внешние файлы), выбрать опцию «Add» (Добавить) и ука
Далее следует процессорная команда непосредственного ввода из порта, имеющая шестнад зать подпрограмму, например, «In.cpp». Забегая немного вперед, отметим, что для нижеприве
цатеричный код 0xEC, что означает ввод из порта, адрес которого находится в регистре dx, денной тестовой программы «Hello.clw», использующей прямые команды ввода/вывода в пор
а результат этого ввода помещается в регистр al. Последней инструкцией подпрограммы яв ты, будет приведен и текст файлапроекта («Hello.prj»), где все это уже сделано.
ляется инструкция #pragma restore, что означает восстановление первоначального А сейчас возвратимся ко второй проблеме использования команд прямого ввода/вывода
состояния процессора. через порты в Win'XP, а именно к тому, как обойти запрещение применения таких команд.
Вторая — это подпрограмма, к которой уже можно обратиться из программы на Кларио
не и которая в связи с этим уже имеет атрибут extern. Она является как бы связующим зве
ном между первой подпрограммой (к которой она и обращается) и программой на Кларионе,
2.5.4.3. Снятие запрета на применение команд ввода/вывода
откуда и идет обращение к ней. в порт для Win'XP
Действие этой подпрограммы заключается в следующем. Когда в Кларионе осуществля Как уже было упомянуто, одним из способов, разрешающих применение прямых команд
ется обращение ко второй подпрограмме командой B=INP (адрес порта ввода), где B — пере ввода/вывода в порт, является использование библиотеки inpout32.dll. Но в этой библиотеке
менная типа BYTE, а адрес порта типа USHORT (например 3f8h), т. е. пишется: уже приведены подпрограммы ввода/вывода в порты (INP( ) и OUTP( ) ), поэтому надобность в
подпрограммах In.cpp и Out.cpp отпадает. В связи с этим использование библиотеки
B=INP(3f8h), inpout32.dll становится бессмысленным, если предполагается работа с подпрограммами
In.cpp и Out.cpp.

146 147
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

«Покопавшись» в Интернете, можно обнаружить сразу несколько программ, целью кото


рых является разрешить использование прямых команд ввода/вывода в порты в Win'XP. Пе
репробовав некоторые из них, автор обнаружил, что реально работают только 2 программы:
UserPort, написанная Томасом Франзоном (Tomas Franzon), которую очень просто найти лю
бым поисковиком, и Portmon, написанная Марком Русиновичем (Mark Russinovich) (www.sys
internal.com). Ниже будут приведены примеры применения этих программ.
Первая программа — программа UserPort. Эта бесплатно распространяемая програм
ма довольно остроумно обходит запрет на использование прямых команд ввода/вывода в
порты в Win'XP. Идея программы — в использовании недокументированных команд
Win'XP в привилегированном режиме. Подробное описание работы программы UserPort
приводится в файле UserPort.pdf. Программа UserPort работает с драйвером UserPort.sys,
который входит в комплект поставки программы. Чтобы разрешить ввод/вывод в порты
драйвер UserPort.sys необходимо скопировать в папку C:\WINDOWS\SYSTEM32\DRIVERS\
и перезагрузить компьютер. После такой манипуляции уже возможно использование вы
шеописанных подпрограмм In.cpp и Out.cpp. Необходимо, однако, заметить, что использо
вание драйвера UserPort.sys для работы подпрограмм In.cpp и Out.cpp с COMпортом порт) будет «перехвачена» и выведена на экран, что резко «затормозит» такой ввод/вывод Рис. 2.5.4.3.2.
компьютера является условием необходимым, но недостаточным. Как было упомянуто ра (рис. 2.5.4.3.2). Далее установить («открыть») порты, к которым будет осуществляться обраще Выключение
опции Capture
нее, требуется еще «открыть» COMпорт. О способах открытия COMпорта будет изложено ние. В нашем случае это COM 1 (и, например, COM 2). Для этого необходимо выбрать опцию (захват)
несколько позже. Здесь же пока возвратимся к программам, разрешающим использова Capture, в открывшемся подменю выбрать опцию Ports (порты) и в еще одном открывшемся
ние прямых команд ввода/вывода в порты в Win'XP. подменю отметить порты COM 1: Serial0 и COM 2:Serial1 (см. рис. 2.5.4.3.3). Далее необходимо
Вторая программа, которую хотелось бы представить, — программа Portmon (Портмони выйти из программы Portmon. После таких манипуляций можно уже производить прямой
тор). Она предназначена для решения более широкого круга задач, чем просто разрешение на ввод/вывод в порты COM 1 и COM 2 не только из программы на Clarion6.0 (т. е. использовать
ввод/вывод в порты. Она, например, позволяет «отслеживать» обращение к портам из той или подпрограммы In.cpp и Out.cpp), но и вообще использовать прямые команды ввода/вывода в
иной программы (при выборе опции «Capture» — захват) и выполнять некоторые другие функ порты COM 1 и COM 2 в любой другой программе (в частности, даже в DOSпрограммах, напри
ции. Применительно к использованию подпрограмм In.cpp и Out.cpp для ввода/вывода в пор мер, в турбобэйсике tb.exe, Clarion v3.100 и.т.п). Можно, например, запустить программу
ты из языка Clarion6.0 программа Portmon выполняет сразу две задачи: 1) разрешает приме Hello.exe, написанную на языке Кларион для DOS — Clаrion v.3.100 (Hello.cla) и приведенную в
нять прямой ввод/вывод в порты, и 2) открывает порт (в нашем случае COMпорт) для работы. 2.4.3.7. Правда, чтобы в DOSпрограммах правильно отражались символы русского языка на экра
Для использования этой программы в нашем случае, необходимо выполнить следующее. не, в конец файла AUTOEXEC.NT необходимо вставить какойлибо DOSдрайвер монитора, например:
Рис. 2.5.4.3.1.
Исходный вид окна После инсталляции и запуска программы на экран выведется окно (рис. 2.5.4.3.1). Необхо
программы Portmon димо отключить опцию Capture (захват), иначе каждая попытка ввода или вывода в порт (COM tdrvses.exe,
после запуска

а в файл CONFIG.NT — следующие команды:

dos=high, umb
device=%SystemRoot%\system32\himem.sys
files=40

Необходимо отметить, что файлы AUTOEXEC.NT и CONFIN.NT находятся в папке C:\WIN


DOWS\SYSTEM32\. Если же использование программ для DOS не предполагается, то файлы
CONFIG.NT и AUTOEXEC.NT лучше не трогать.
Вернемся к Win'XP, прямым командам ввода/вывода в COMпорт и сравнению 2 про
грамм UserPort и Portmon на предмет их преимуществ и недостатков. Вначале о програм
ме Portmon. Эту программу рекомендуется использовать только для разработки и про
верки работоспособности новых программ, поскольку после запуска Win'XP каждый раз
необходимо производить манипуляции, показанные на рис. 2.5.4.3.1–2.5.4.3.3.

148 149
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

MODULE('Comm Prototipes')
!
CreateFileA(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED),|
SIGNED,RAW,PASCAL,NAME('CreateFileA')
CloseHandle(SIGNED),BOOL,PROC,PASCAL
!
END

Для использования этих APIфункций требуется определить несколько переменных:

!
!Переменные для APICOM — 1й способ открытия порта.
!
CommPort UNSIGNED !(handle).
PortCString CSTRING(10) !'COM1/COM2'
OPEN_EXISTING ULONG(3)
Рис. 2.5.4.3.3. !
Это может легко сделать программист, но ни в коем случае не пользователь програм
Открытие портов
COM 1 и COM 2
мы, «заставлять» которого производить подобные манипуляции просто недопустимо.
Открыть COMпорт можно следующими командами:
для работы Пользователь должен запустить программу, написанную для его целей, и программа
должна работать с портами ввода/вывода. Другими словами, работа с портами вво PortCString='COM1'
да/вывода должна быть осуществлена автоматически после запуска программы CommPort=CreateFileA(PortCString,0,0,0,OPEN_EXISTING,0,0)
пользователя.
Как было упомянуто ранее, программа UserPort (а точнее — драйвер UserPort.sys, Как можно увидеть по этим командам, переменной PortCString присваивается значение 'COM1',
установленный в папку C:\WINDOWS\SYSTEM32\DRIVERS\) «автоматически» разреша a APIфункция CreateFileA() используется с нулевыми параметрами. Другими словами, парамет
ет использование прямых команд ввода/вывода в порт после запуска Win'XP. Програм ры COMпорта (скорость обмена, бит паритета, количество бит данных и количество стопбит) не опре
ма же Portmon.exe не обладает такой возможностью. Другими словами, «заставить» делены. Это определение можно будет сделать позже уже прямыми командами ввода/вывода
программу Portmon автоматически произвести манипуляции, показанные на рис. в COMпорт.
2.5.4.3.1–2.5.4.3.3 нельзя. Поэтому для написания пользовательской программы, в ко Для закрытия COMпорта должна использоваться APIфункция CloseHandle():
торой предполагается применение прямых команд ввода/вывода в порт, допустимо
только применение драйвера UserPort.sys, который требуется установть только один loop until(CloseHandle(CommPort)). !Закрытие CommPort'a.
раз.
Напомним еще раз, что установка драйвера UserPort.sys является необходимым услови Вторым способом, которым можно осуществить открытие COMпорта, является использо
ем работы с портами ввода/вывода, но недостаточным. Требуется еще «открыть» COMпорт вание бесплатно распространяемой библиотеки clacom32.dll, с помощью которой приводятся
для работы. Каким образом это сделать? Об этом будет рассказано далее. примеры применения программ работы с COMпортом в Windows, разработанных компанией
Gap Development Company (www.gapdev.com) под общим названием ClaCom (и распространя
2.5.4.4. Открытие COM-порта для использования прямых команд емых уже небесплатно).
ввода/вывода в Win'XP Чтобы использовать библиотеку clacom32.dll для открытия COMпорта, требуется осущест
Расскажем о двух способах «открытия» COMпорта. вить следующие действия: а) необходимо преобразовать библиотеку clacom32.dll в clacom32.lib с
Первый способ, которым возможно «открыть» COMпорт, — уже небезызвестные API помощью входящей в состав Crarion 6.0 программы libmaker.exe и включить ее в проект програм
функции (которые, по мнению автора, только на это и годятся). Прототипы APIфункций, мы на Clarion 6.0; б) определить прототипы использования команд открытия и закрытия COM
использующихся для работы с COMпортом, были уже приведены в 2.5.3 (в рассмотрен порта:
ной там же программе Hello.clw). Из всех APIфункций нам потребуются только 2: для
«открытия» COMпорта и его «закрытия». Первый прототип — (CreateFileA()) предназ MODULE('CLACOM')
начен для открытия порта, второй (CloseHandle()) — для его закрытия. Ниже приведены SetPort(SHORT),PASCAL,NAME('_SetPort@8')
эти два прототипа. ResetPort(SHORT),PASCAL,NAME('_ResetPort@8')
END

150 151
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

и переменную для номера COMпорта: Программа Hello.clw



ComNum short !
! Программа передачи и приема строки из 75 символов по RS232
Для открытия COMпорта требуется использовать следующие команды: !

ComNum=0 ! 0COM1,1COM2 PROGRAM


SetPort(ComNum)
ResetPort(ComNum) INCLUDE('Equates.CLW')
INCLUDE('TplEqu.CLW')
INCLUDE('Keycodes.CLW')
Как видно из последних команд, для открытия порта COM 1, переменной ComNum необходи
INCLUDE('Errors.CLW')
мо присвоить нулевое значение, для открытия COM2 — единичное. Открытие порта осу
!
ществляется командой SetPort(ComNum), приведение его в рабочее состояние — коман ! Определение переменных
дой ResetPort(ComNum). Эти две команды необходимо использовать в программе на !
Clarion6.0 только один раз — в начале программы. C byte
A byte
2.5.4.5. Тестовая программа, использующая прямые команды B byte
ввода/вывода в COM-порт в ОС Win'98/XP S string(80)
BT byte
Итак, подытожим все выше изложенное в п. 2.5.4.2–2.5.4.4. M byte,dim(80),over(S)
Для использования в Clarion 6.0 прямых команд ввода/вывода в порт в ОС Win'98/XP S1 string(80)
необходимо осуществить следующие 3 действия. M1 byte,dim(80),over(S1)
1. Включает в себя два варианта: i ushort
j ushort
а) написать программы для прямого ввода/вывода в порт на встроенном в Clarion6.0
k ushort
языке C++ (In.cpp и Out.cpp), прототипы для них и включить их в файлпроект (*.prj);
CH byte
б) не писать никаких программ ввода/вывода, a использовать готовую библиотеку N1 long
inpout32.dll, преобразовать ее в библиотеку inpout32.lib с помощью программы lib STR string(5)
maker.exe и включить ее в файлпроект (*.prj). Кроме того, написать прототипы для ис p byte
пользования команд INP( ) и OUTP( ). !
2. Разрешить использование прямых команд ввода/вывода в порт, установив ! Переменные для QueryPerformanceCounter
драйвер UserPort.sys в папку C:\WINDOWS\SYSTEM32\DRIVERS\. При исполь !
зовании библиотеки inpout32.dll в применении драйвера UserPort.sys нет необ CSTARTL ulong
ходимости. CSTARTH long
3. «Открыть» COMпорт для работы с помощью: а) APIфункций или б) библиотеки cla CSTOPL ulong
com32.dll. CSTOPH long
DC long
Ниже приведен текст тестовой программы Hello.clw, в котором показаны все вариан
DELTAC long
ты. Неиспользуемые варианты закомментированы (перед ними установлен восклица !
тельный знак). В файлпроект, который приведен вслед за текстом программы Hello.clw,
включены все варианты. В самой же программе используются подпрограммы In.cpp
и Out.cpp и драйвер UserPort.sys; открытие COMпорта сделано с помощью библиотеки !
clacom32.dll. Отметим, что для того, чтобы получить «картинку» окна, вид «кнопок» и другие !Переменные для APICOM — 1й способ открытия порта.
атрибуты ОС Win'XP, в файлпроект необходимо дополнительно включить файл !
«WindowsShell.Manifest». CommPort UNSIGNED !(handle).
В программе установлены следующие параметры COMпорта: COM 1: N,8,1, 115 200. Програм PortCString CSTRING(10) !'COM1/COM2'
ма использует алгоритм аппаратной синхронизации, о котором уже не раз говорилось. OPEN_EXISTING ULONG(3)
!

152 153
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

! MODULE('Comm Prototipes')


!Переменная для CLACOM — 2й способ открытия порта. !
! CreateFileA(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED),|
ComNum short SIGNED,RAW,PASCAL,NAME('CreateFileA')
! CloseHandle(SIGNED),BOOL,PROC,PASCAL
!
! END
! Переменные (совмещения) для частоты и счетчика !
! MODULE('DELAY')
FREQUENCY GROUP,PRE(FRE) QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL
FREQL ULONG QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL
FREQH LONG Sleep(ULONG),PASCAL
. END
COUNTER GROUP,PRE(CNT) !===================================================
COUNTL ULONG MODULE('CLACOM')
COUNTH LONG SetPort(SHORT),PASCAL,NAME('_SetPort@8')
. ResetPort(SHORT),PASCAL,NAME('_ResetPort@8')
! END
!
!#######################
MAP
END ! от MAP
!########################
!
! Способ а) прямого ввода/вывода в порт
! с использованием драйвера USERPORT, но без Window WINDOW('Тест RS232 (COM1:115200,N,8,2). Пр<255>мой ввод/вывод в порт.'),|
! использования библиотеки inpout32.dll. AT(,,365,172),|
! FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),|
MODULE('IN.CPP') COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX
INP(ULONG),BYTE,NAME('_INP') BUTTON('Выход'),AT(36,132,52,21),USE(?Cancel),|
END FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC)
MODULE('OUT.CPP') BUTTON('Продолжить'),AT(244,132,73,21),USE(?Ok),|
OUTP(unsigned long,BYTE),NAME('_OUTP') FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC),DEFAULT
END END
! !

! CODE
! Способ б) прямого ввода/вывода в порт без
! использования дравера USERPORT, но с !
! использованием библиoтеки inpout32.dll. !Открытие COMпорта(API) — 1й способ открытия для WIN'XP.
! !Этот способ требует закрытия COMпорта, но не требует
! MODULE('INPOUT32') !дополнительной библиотеки.
! INP(USHORT),BYTE,PASCAL,NAME('Inp32') !
! OUTP(USHORT,BYTE),PASCAL,NAME('Out32') ! PortCString='COM1'
! END ! CommPort=CreateFileA(PortCString,0,0,0,OPEN_EXISTING,0,0)
! ! Sleep(100)
!
!===================================================
!Прототипы APIфункций — для WIN'XP.
!

154 155
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

!
! Открытие COMпорта (CLACOM) — 2й способ открытия для WIN'XP. M[1]=C
! Этот способ не требует закрытия порта, но требует loop i=1 to 75
! дополнительную библиотеку clacom32.dll. do OUTBYTE
! .
ComNum=0 ! 0COM1,1COM2
SetPort(ComNum) show(5,50,'Конец передачи из PC')
ResetPort(ComNum) show(5,60,'________________________________________________________')
!
!
! В этом месте идет переключение с вывода на ввод.
! !
! Вычисление временной задержки в 25 мкс. B=INP(3f8h) !Холостой ввод — ОБЯЗАТЕЛЬНО!(Для сброса бита DRdata ready).
!
!Определение частоты работы счетчика. loop while band(INP(3fdh),1). !Ожидание сброса бита "DR"data ready.
! A=INP(3feh) !Очистка 3feh для правильного ожя стартбита.
loop until QueryPerformanceFrequency(FREQUENCY). !
!
!Вычисление времени счета в 20 мкс. !
! ! Sleep(5)
DC=int(20*FRE:FREQL/1000000) !
!
show(5,80,'Начало передачи из микроконтроллера')
do INIT !Инициализация RS232
loop i=1 to 75
k=0 do INBYTE
OPEN(Window) .

START show(5,90,S1)
blank show(5,100,'Конец передачи из микроконтроллера')
show(5,110,'_______________________________________________________')
disable(?Ok)
disable(?Cancel) p=0
enable(?Ok)
enable(?Cancel)
k=k+1
S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdifjhigklmnopqrstuvwxyzАБВГДЕЖЗИКЛМНОПРСТУФХЦЧ' accept
show(5,40,S) !
! Ч75й символ case accepted()
of ?Ok
show(5,30,'Начало передачи из PC') p=1
show(5,10,'k=') break
type(k) of ?Cancel
p=0
i=1 break
C=M[1] .! ot case
M[1]=75 !
do OUTBYTE !Передача мл. байта длины (75) .! от accept
M[1]=0 if p=0 then goto E.
do OUTBYTE !Передача ст. байта длины (0) i=1

156 157
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP

M[1]=40h !
do OUTBYTE INBYTE routine
goto START OUTP(3fbh,47h) !Установка TxD(в +9 В) (разрешение передачи).
loop until band(INP(3feh),2). !Ожидание стартбита (изменения состояния DSR).
E OUTP(3fch,00h) !Сброс микроконтроллера do DEL20 !Задержка 25 мкс.
OUTP(3fbh,7h) OUTP(3fbh,07h) !Сброс линии TxD(в 9 В) (запрет передачи).
A=INP(3feh) !Очистка 3feh для правильного ожидания стартбита.
! loop until band(INP(3fdh),1).!Ожидание прихода байта(устки бита "DR"data ready).
! Закрытие COMпорта (API) — 1й способ. Для WIN'XP M1[i]=INP(3f8h) !Чтение байта данных.
! A=INP(3feh) !Очистка 3feh для правильного ожидания стартбита.
! loop until(CloseHandle(CommPort)). !Закрытие CommPort'a. !
! ! П/п вывода байта (байт в M[i])
!
return OUTBYTE routine
loop until band(INP(3fdh),20h). !Ожидание готовности передатчика (transmitter empty).
! loop until band(INP(3feh),20h). !Ожидание разрешения передачи(установки DSR).
! Подпрограммы OUTP(3f8h,M[i]) !Вывод байта.
! !B=INP(3feh)
! П/п инициализации RS232 и микроконтроллера. loop until band(INP(3feh),2h). !Ожидание сброса разрешения
! !(изменения состояния DSR).
INIT routine loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС (OK to send).
! B=INP(3feh) !Очистка 3feh для правильного
! Инициализация СОМпорта. !ожидания стартбита.
! !
! Установка скорости обмена.
! !
OUTP(3fbh,80h) ! DLAB=1 для установки делителя. DEL20 routine
OUTP(3f8h,1) ! Установить мл.б. скор.:1115200 бод,129600 бод. loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика.
OUTP(3f9h,00h) ! Установить ст.б. скор.=0. CSTARTL=CNT:COUNTL !Занесение начального значения в
! CSTARTH=CNT:COUNTH !две стартовых longпеременных.
! Установка режима. loop !
! loop until QueryPerformanceCounter(COUNTER). ! Ожидание
OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. if CNT:COUNTH=CSTARTH !
! DELTAC=CNT:COUNTLCSTARTL ! прошествия
! Установка запрета прерываний по СОМпорту. else !
! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени
OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. . !
! if DELTAC>DC then break. ! DC(=25 мкс)
. !
! !
! Инициализация микроконтроллера.
! Текст файлапроекта hello.prj приведен ниже
OUTP(3fch,00h) ! Сброс линии DTR (Reset микроконтроллера). 
Sleep(100) ! Задержка 0,1 с.  Project File Title
OUTP(3fch,01h) ! Установка линии DTR (Запуск микроконтроллера). #noedit
Sleep(100) ! Задержка 0,1 с. #system win32
B=INP(3f8h) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). #model clarion lib
Sleep(20) #set RELEASE = on
! #pragma debug(vid=>off)
! П/п ввода байта (байт в M1[i]) #pragma optimize(cpu=>386)

158 159
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)

#pragma define(NULL=>on)
#compile "Hello.clw"
#compile "In.cpp"
#compile "Out.cpp"
#pragma link("hello.lib")
#pragma link("inpout32.lib")
#pragma link("clacom32.lib")
#pragma link("WindowsShell.Manifest")
#link "hello.exe"

Сравнив подпрограммы инициализации COMпорта, микроконтроллера, ввода и вывода


байта приведенной выше программы с программой Hello.cla, написанной на языке Кларион
для DOS (Clarion v.3100) и приведенной в п. 2.4.3.7, можно отметить практичеки полную их
идентичность. Если же сравнить текст приведенной программы с текстом программы, исполь
зующей APIфункции и приведенной в п. 2.5.3, то можно увидеть насколько неуклюжи и гро
моздки APIфункции. Кроме того, сравнив подпрограммы для ввода и вывода байта этих двух
программ, можно заметить, что подпрограммы ввода и вывода байта в программе, использу
ющей APIфункции, выполняют не все действия, которые выполняют эти же подпрограммы в
программе, использующей прямой ввод/вывод в порты. Причиной этому является «непово Рис. 2.5.4.5.2.
ротливость» APIфункций, не позволяющая отслеживать быстротекущие процессы в интерфей Общий вид окна программы
се RS232. 2.6. Применение интерфейса RS232 Hello.exe в ОС Win'XP
Программу следует запускать совместно с подключенной к COMпорту какойлибо из ма для программирования микроконтроллеров
кетных плат с микроконтроллером, описанных в главе по аппаратным средствам. Перед за в системе (In_System_Programming)
пуском программы Hello.exe кабель от макетной платы должен быть соединен с портом COM1,
а питание макетной платы включено. 2.6.1. Общие положения
После запуска программы Hello.exe в ОС Win'98 на экране монитора появится окно
(рис. 2.5.4.5.1). Нажатие кнопки «Продолжить» приведет к повторному запуску программы Как уже упоминалось ранее, когда речь шла об аппаратных средствах сопряжения микро
(количество нажатий на кнопку, или количество запусков, k равно 176), нажатие кнопки контроллеров с компьютером по интерфейсу RS232, эти аппаратные средства работают как в
Рис. 2.5.4.5.1. «Выход» — к выходу из программы в Windows. штатном режиме, так и в режиме программирования. Программное обеспечение режима ISP
Общий вид окна для микроконтроллеров MSC12XX, ADUC8XX и P89LPC9XX, разработанное ф. Texas Instru
программы Hello.exe При запуске программы в ОС Win’ XP появится окно (рис. 2.5.4.5.2), где k = 239.
в ОС Win'98
ments, Analog Devices и Philips для соответствующих микроконтроллеров имеет много недос
татков.
Так, например, программное обеспечение от Texas Instruments для программирования
микроконтроллеров MSC12XX стабильно работает на скорости, не превышающей 19 200 бод;
программное обеспечение от Analog Devices предназначено только для эволюционных плат
(где используются микроконтроллеры ADUC8XX), схемы сопряжения которых с компьютером
не приводятся или приводятся недостаточно полно; программное обеспечение микроконт
роллеров P89LPC9XX также предназначено для эволюционных плат, в которых используют
ся эти микроконтроллеры. В связи с этим автором написаны программы для программиро
вания микроконтроллеров MSC12XX, ADUC8XX и P89LPC9XX в режиме ISP для схем сопря
жения этих микроконтроллеров с компьютером, приведенных на рис. 1.3.5.1 (MSC12XX),
рис. 1.3.6.1 (ADUC8XX), рис. 1.3.8.1 — 1.3.8.3 (P89LPC9XX) и рис. 1.3.10 (схема кабеля свя
зи с компьютером).
Бесплатно распространяемое программное обеспечение для программирования
микроконтроллера AT89C51ED2(RD2), сопряженного с компьютером по схеме
(рис. 1.3.7.1), разработанное ф. ATMEL (программа FLIP v.2.4.4), имеет настолько высо
кое качество, что не только не вызывает у автора (книги) никаких претензий, но и наоборот

160 161
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)

— вызывает чувство восхищения его прекрасной работой. Программа FLIP v.2.4.4 иде PROGRAM
ально работает на скорости 115 200 бод и имеет массу интересных возможностей. Авто !
ру остается только поблагодарить эту фирму за такую прекрасную программу и поже ! Определение переменных
лать, чтобы и другие фирмы разработали для своих микроконтроллеров подобную про !
M byte,dim(100) !Массив для вывода OUTBYTE.
грамму. Для работы этой программы со схемой сопряжения с компьютером, приведен
S string(100),over(M) !Строка для вывода OUTBYTE.
ной на рис. 1.3.7.1, требуется только некоторые настройки этой программы, о которых M1 byte,dim(100) !Массив принимаемых байт INBYTE.
будет рассказано несколько позже. S1 string(100),over(M1) !Строка принимаемых байт.
Что касается программирования микроконтроллеров C8051F067 и C8051F330D !
от ф. Silicon Laboratories в режиме ISP: по интерфейсу JTAG и C2 (с помощью USB ! Строка и массив со значением регистра USEC.
DEBUGАдаптера), схема сопряжения которых приведена на рис. 1.3.9.1, то здесь авто ! Для 11.059 МГц => 10=0Ah => 30h,41h.
ру тоже остается только привести некоторые уточнения, касающиеся настройки програ ! Для 22.118 МГц => 20=14h => 31h,34h.
ммного обеспечения IDE v.2.5.2. SUSEC string('<52h,57h,46h,42h,30h,41h>')
Поэтому дальнейшее изложение будет построено следующим образом. !MUSEC byte,dim(6),over(SUSEC)
Вначале будут приведены программы для программирования микроконтроллеров !
в режиме ISP: ! Строка и массив со значением регистра MSECL.
! Для 11058 => 32h => 33h,32h.
— по интерфейсу RS232 (MSC1210XX, ADUC8XX и P89LPС93X),
! Для 22117 => 65h => 36h,35h.
— по интерфейсу C2 (P89LPС9XX); SMSECL string('<52h,57h,46h,43h,33h,32h>')
далее — некоторые рекомендации по настройке параметров программ для !MMSECL byte,dim(6),over(SMSECL)
программирования микроконтроллеров в режиме ISP: !
— FLIP v.4.4 от ф. AMTEL (FN89C51TD2(RD2) по интерфейсу RS 232, ! Строка и массив со значением регистра MSECH.
— IDE v.2.5.2 от ф. Silicon Laboratories (C8051F067 по интерфейсу JTAG и ! Для 11058 => 2Bh => 32h,42h.
C8051F330D) по интерфейсу C2 с помощью USBDEBURGадаптера. ! Для 22117 => 56h => 35h,36h.
SMSECH string('<52h,57h,46h,44h,32h,42h>')
!MMSECH byte,dim(6),over(SMSECH)
2.6.2. Программирование микроконтроллеров MSC12XX в режиме ISP !
! Строка и массив стирания памяти программ M0000.
по интерфейсу RS232 SM0000 string('<4dh,30h,30h,30h,30h>')
Для программирования микроконтроллеров MSC12XX в режиме ISP по интерфейсу !MM0000 byte,dim(5),over(SM0000)
RS232 должна использоваться схема сопряжения этого семейства микроконтроллеров с !
компьютером (рис. 1.3.5.1). Далее приведены тексты двух программ для программирования ! Строка и массив стирания памяти данных M8000.
микроконтроллера MSC121X в режиме ISP по интерфейсу RS232. SM8000 string('<4dh,38h,30h,30h,30h>')
!MM8000 byte,dim(5),over(SM8000)
Первая программа downti.cla написана на языке Кларион для DOS (Clarion v.3.100) и ра
!
ботает либо в ОС DOS, либо в режиме эмуляции DOS — в Win'98 и Win'XP. Текст файлпроек L ulong ! Длина файла в байтах.
та ее (downti.pr) приведен вслед за текстом самой программы. N ushort
Вторая программа написана на языке Кларион для Windows (Clarion6.0). Она работает в NSTROK ushort(0) ! Количество строк в *.hexфайле
ОС Win'98 и Win'XP. Название программы — Ispmsc.clw, а ее файлпроекта — Ispmsc.prj NOST ushort ! Остаток
Обе программы работают с портом COM 1 на скорости 115 200 бод. Они используют для NSYMB ushort ! Количество символов .
программирования одно и то же имя файла: file.hex. Длина файла file.hex составляет чуть бо NP ushort(0) ! Количество точек в символе .
лее 92 кБ, что в формате исполняемой программы (*.binформат) составляет ровно 32 кБ NP1 ushort
(максимальный размер памяти микроконтроллера MSC1210Y5). k ushort
k1 ushort
KL ushort
Программа downti.cla
B byte
i ushort

j ushort
!
i1 ulong
! Программа программирования файла file.hex в msc1210.
T1 long
!

162 163
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)

KINI ushort !Количество попыток запуска MSC1210. N=i


loop i=3 to N17
Y00h byte(00h) type(chr(M1[i]))
Y01h byte(01h) .
Y02h byte(02h) else
Y03h byte(03h) KINI=KINI+1
Y04h byte(04h) if KINI<10
Y06h byte(06h) goto INIT
Y07h byte(07h) else
Y12 byte(12) setcursor(17,10)
Y47h byte(47h) type('Вставьте микросхему !!!')
Y80h byte(80h) setcursor(18,10)
Y0fh byte(0fh) type('Включите питание<0dh,0ah>')
setcursor(19,10)
!BINARY FILE,PRE(BIN),DRIVER('DOS'),NAME('12kb.hex') goto WYKL
!BINARY FILE,PRE(BIN),DRIVER('DOS'),NAME('printf65.hex') .
.
BINARY FILE,PRE(BIN),DRIVER('DOS'),NAME('file.hex') !
RECORD RECORD ! Рисование рамки
STR string(65500) !Строка с прочитанным файлом !
MSTR byte,dim(65500),over(STR) !Массив для передачи. setcursor(4,13)
.. type('г===========')
! setcursor(5,13)
CODE type('¦')
blank setcursor(5,25)
type('¦')
KINI=1 setcursor(6,13)
type('L===========')
show(2,5,'Инициализация микроконтроллера') !
setcursor(2,35) ! Загрузка в MSC1210 временн'ых
! ! характеристик: USEC,MSECL и MSECH.
! Инициализaция MSC1210 !
! S=SUSEC;loop k=1 to 6;do OUTBYTE.
do INITRS ! Инициализация RS232. beep(0,10)
S=SMSECL;loop k=1 to 6;do OUTBYTE.
INIT do INITMSC beep(0,10)
S=SMSECH;loop k=1 to 6;do OUTBYTE.
in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). beep(0,10)
type ('.') !
show(2,5,' ')
k=1 show(2,5,'Подготовка к программированию.')
M[k]=0dh ! "CR" !
do OUTBYTE ! Стирание памяти данных
!
loop i=1 to 60 ! show(11,3,'Стирание памяти данных')
do INBYTE setcursor(2,35)
if M1[i]=val('>') then break. S=SM8000;loop k=1 to 5;do OUTBYTE.
. !
if i<60 loop i=1 to 50
setcursor(5,16) do INBYTE

164 165
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)

if M1[i]=val('>') then break. else


. if i1=65501
if i<50 next(BINARY)
type('.') .
else if BIN:MSTR[i165500]=0dh then NSTROK=NSTROK+1.
goto INIT !Количество строк(.)
. .
! .
close(BINARY)
! !
!Стирание памяти программ. NP=int(NSTROK/16) !Целое количество точек в символе .
! NOST=NSTROKNP*16 !Остаток
setcursor(2,37) if NP<=1 then NP=1.
S=SM0000;loop k=1 to 5;do OUTBYTE. !
! ! Команда 'E' (Echo off)
loop i=1 to 50 !
do INBYTE k=1
if M1[i]=val('>') then break. !3eh M[k]=val('E')
. do OUTBYTE
if i<50 !
N=i !N5 do DEL200MS
loop i=N4 to N2 !
type(chr(M1[i])) !ok ! Команда 'L' (Load)
. !
else k=1
goto INIT M[k]=val('L')
. do OUTBYTE
do DEL200MS !
loop i=1 to 10
! beep(0,1)
! Открываем файл '*.hex' для программирования. do INBYTE
! if M1[i]=val('>') then break.
open(BINARY,00h) .
L=bytes(BINARY) !Длина файла в байтах. if i<10
set(BINARY) !Читаем файл ! type('.')
next(BINARY) !BINARY. else
goto INIT
setcursor(8,7) .
type('Чтение файла file.hex ok<0dh,0ah>')
setcursor(11,10) in(3f8h,B) !Холостой ввод
type('Программирование<0dh,0ah>') !
setcursor(12,6) Open(BINARY,00H)
type(' ') L=bytes(BINARY) !Длина файла в байтах.
! set(BINARY)
! Подсчитываем количество строк в файле (по 0dh). empty(BINARY) ! На всякий случай.
! set(BINARY)
NSTROK=0 next(BINARY)
loop i1=1 to L !
if i1<=65500