А. Ю. КУЗЬМИНОВ
И
Н
Т
Е
Р
Ф
Е
Й
С
RS232 СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ ОТ DOS К WINDOWS98/XP
МОСКВА 2006
УДК ББК
К89
621.396.6 32.872 К89 Кузьминов А. Ю. Интерфейс RS232: Связь между компьютером и микроконтроллером: От DOS к WINDOWS98/XP . — М.: Издательский дом «ДМКпресс», 2006. — 320 с. ISBN 5970600296 В книге отражены вопросы по аппаратным средствам и программному обеспечению сопряжения компьютера с современными 51совместимыми микроконтроллерами — системами на кристалле (MSC12XX, ADUC8XX, P89LPC9XX, AT89C51ED2/RD2 и C8051F067/330). Приведены примеры приме нения новейших разработок ведущих фирмпроизводителей элементной базы, связанной с интер фейсом RS232 (новые преобразователи интерфейса, гальванические развязки и т. п.), в схемах свя зи компьютера с микроконтроллером. Рассмотрены схемные решения и программное обеспечение программирования в системе (InSystemProgramming — ISP) современных микроконтроллеров по интерфейсу RS232. Предложен разработанный автором новый протокол обмена по интерфейсу RS232, использующий аппаратную синхронизацию с помощью линий данных и обладающий высоки ми надежностью и скоростью обмена (115 200 бод). Показано преимущество применения прямых команд ввода/вывода (in и out) в COMпорт перед использованием APIфункций при программировании интерфейса RS232 в ОС Windows98/XP. Даны рекомендации по последовательности действий, позволяющих применить прямые команды вво да/вывода в COMпорт в ОС Windows98/XP. Книга снабжена большим количеством примеров по схемным решениям (приведены принципи альные схемы и фотографии макетных плат) и программному обеспечению для ОС DOS и Windows98/XP (приведены тексты программ). Программы для микроконтроллеров написаны на ассемблере и C51(Keil, v.6.14), а для компью тера — на языке Кларион, являющемся одной из двух распространенных современных RADсистем (вторая — Delphi), предназначенных для быстрой разработки приложений (Rapid Application Development — RAD). Программы для компьютера, работающие в DOS, написаны на языке Кларион для DOS (Clarion V.3.100), работающие в Windows98/XP — на языке Кларион для Windows (Clarion V.6.0) и встроенно му в него C++. Описаны примеры использования RS232 в системах сбора и обработки информации с датчиков. Книга предназначена для опытных разработчиков компьютерных и автономных систем сбора и обработки информации, в составе которых используются микроконтроллеры, а также начинающих специалистов в этой области; может быть полезна студентам вузов соответствующих специальностей.
ББК 32.872 УДК 621.396.6
Все права защищены. Никакая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельца авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность нали чия технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственно сти за возможный ущерб любого вида, связанный с применением или неприменимостью любых ма териалов данной книги.
ISBN 5970600296
© Издательский дом «ДМКпресс», 2006
Оглавление ПРЕДИСЛОВИЕ..............................................................................................8 ВВЕДЕНИЕ ...................................................................................................13 1. АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232................................15 1.1.
Предварительные замечания........................................................16
1.2.
Новые преобразователи интерфейса RS232 .............................16 1.2.1. Новые специализированные микросхемы преобразователей интерфейса RS232..............................17 1.2.2. Нетрадиционные преобразователи интерфейса RS232....19
1.3.
Примеры применения новых преобразователей для сопряжения микроконтроллеров с компьютером по интерфейсу RS232 .....................................................................21 1.3.1. Предварительные замечания .............................................21 1.3.2. Управление состояниями микроконтроллера с помощью компьютера по интерфейсу RS232 ...............27 1.3.3. Схемы формирования сигналов RST и PSEN для микроконтроллеров семейств MSC12XX, 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. Сопряжение микроконтроллеров AT89C51ED2(RD2) с компьютером.....................................37
3
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
ОГЛАВЛЕНИЕ
1.3.8. Сопряжение микроконтроллеров семейств P89LPC9XX с компьютером.................................................37 1.3.9. Сопряжение микроконтроллеров семейств C8051FXXX с компьютером.................................................43 1.3.10.Кабель связи микроконтроллеров с компьютером.........48 1.4. Гальванические развязки для интерфейса RS232....................49 1.4.1. Простой гальванически изолированный интерфейс RS232 на базе микросхем развязки ADUM1201, преобразователя SN75155 и оптронов ............................51 1.4.2. Гальванически изолированный интерфейс RS232 на базе микросхем развязок ADUM1201, ADUM1200 и преобразователей ADM3202 и MAX3181......................54 1.4.3. Гальванически изолированный интерфейс RS232 на базе микросхем развязок ADUM1201, ADUM1200 и преобразователя MAX1406 .............................................57 1.4.4. Гальванически изолированный интерфейс RS232 на базе микросхем развязок ADUM1201, ADUM1200 и преобразователей MAX3190 и MAX3181 ......................58 1.4.4.1. Плата гальванически изолированного интерфейса на базе развязок ADUM1201, ADUM1200, MAX3181 и MAX3190 для микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2/RD2 ......58 1.4.4.2. Плата гальванически изолированного интерфейса на базе развязок ADUM1201, ADUM1200, MAX3181, MAX3183 и MAX3190 для микроконтроллеров семейств P89LPC9XX .......61 1.5. Что делать, если длина линии связи интерфейса RS232 превышает 20 м? ............................................................................63 2. ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232 ...........................67 2.1. Предварительные замечания .......................................................68 2.2. Формирование коротких машиннонезависимых временных задержек .....................................................................71 2.2.1. Общие положения.................................................................71 2.2.2. Программное формирование коротких аппаратнонезависимых временных задержек в DOS ...72 2.2.3. Программное формирование коротких аппаратно независимых временных задержек в Windows ...............73 2.3. Применение совмещений в программах для микроконтроллера и компьютерa..........................................75 2.4. Использование нового алгоритма обмена информацией по RS232 между компьютером и микроконтроллером ............83
4
2.4.1. Суть нового алгоритма обмена ..........................................83 2.4.2. Подпрограммы передачи и приема байта для компьютера и микроконтроллера, использующие логику нового алгоритма обмена ......................................89 2.4.3. Тестовые программы обмена информацией между микроконтроллером и компьютером по интерфейсу RS232, использующие логику нового алгоритма...........................91 2.4.3.1. Общие положения ......................................................91 2.4.3.2. Тестовая программа обмена для микроконтроллера MSC1210 ............................92 2.4.3.3. Тестовая программа обмена для микроконтроллеров ADUC847/834 ...................97 2.4.3.4. Тестовая программа обмена для микроконтроллеров AT89C51ED2(RD2)..........101 2.4.3.5. Тестовая программа обмена для микроконтроллеров P89LPC938/904.............106 2.4.3.6. Тестовая программа обмена для микроконтроллеров C8051F067/330D ..........113 2.4.3.7. Тестовая программа обмена для компьютера в ОС DOS.....................................................................119 2.5.
Программирование интерфейса RS232 в ОС Windows98/XP......................................................................125 2.5.1. Предварительные замечания ...........................................125 2.5.2. Варианты программирования интерфейса RS232 в Win'98/XP.........................................................................127 2.5.3. Программирование интерфейса RS232 с помощью функций API .........................................................................128 2.5.3.1. Тестовая программа обмена для компьютера, использующая функции API, в ОС Win'98/XP........133 2.5.4. Программирование интерфейса RS232 с помощью прямых команд ввода/вывода в COMпорт ...................143 2.5.4.1. Общие положения .....................................................143 2.5.4.2. Применение команд ввода/вывода порт в Clarion6.0 для Win'98/XP .............................144 2.5.4.3. Снятие запрета на применение команд ввода/вывода в порт для Win'XP............................147 2.5.4.4. Открытие COMпорта для использования прямых команд ввода/вывода в Win'XP .............................150 2.5.4.5. Тестовая программа, использующая прямые команды ввода/вывода в COMпорт в ОС Win'98/XP..................152
5
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
2.6.
Применение интерфейса RS232 для программирования микроконтроллеров в системе (In_System_Programming) ......161 2.6.1. Общие положения ..............................................................161 2.6.2. Программирование микроконтроллеров MSC12XX в режиме ISP по интерфейсу RS232................................162 2.6.3. Программирование микроконтроллеров ADUC8XX в режиме ISP по интерфейсу RS232................................184 2.6.4. Программирование микроконтроллеров P89LPC9XX в режиме ISP по интерфейсу RS232 и в режиме ICP по интерфейсу C2 ...............................................................203 2.6.4.1. Предварительные замечания..................................203 2.6.4.2. Применение промежуточного микроконтроллера для осуществления режима ICP...............................204 2.6.4.3. Программирование микроконтроллеров P89LPC93X в режиме ISP.........................................205 2.6.4.4. Программирование микроконтроллеров P89LPC9XX в режиме ICP.........................................236 2.6.5. Программирование микроконтроллеров AT89C51ED2 (RD2) в режиме ISP по интерфейсу RS232 ........................................................281 2.6.6. Программирование микроконтроллеров C8051F067 и C8051F330D в режиме ISP по интерфейсам C2 и JTAG и штатный режим работы по интерфейсу 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
ОГЛАВЛЕНИЕ
П. 2.1. Удаленные компьютерные системы сбора и обработки информации, поступающей с датчиков аналоговых, частотных и дискретных сигналов на базе микроконтроллеров P80C552 и AT89C51 ...............................304 П. 2.1.1. Краткое описание..........................................................304 П. 2.1.2. Назначение и область использования .......................305 П. 2.1.3. Технические характеристики .......................................305 П. 2.1.4. Техникоэкономическая эффективность ....................306 П. 2.1.5. Сведения о документации ............................................306 П. 2.1.6. Сведения о внедрении..................................................306 П. 2.1.7. Внешний вид окон, открывающихся в процессе работы программы поверки счетчиков обьема газа (OC DOS)....................................................306 П. 2.1.8. Примеры работы базового комплекта программ систем сбора на базе микроконтроллера АТ89C51 и АЦП ADS1210 в ОС Windows98/XP ..........................310 П. 2.1.9. Фотографии систем сбора............................................311 П. 2.1.10. Новая система сбора (2005 г.) ..................................316 П. 2.1.11. Новая разработка многоканальной системы сбора.............................................................318 Сведения об авторе................................................................................119
7
ПРЕДИСЛОВИЕ
Предисловие Со времени написания первой части книги (2003 год) [4] появилось много новшеств (как в аппаратном, так и программном отношениях), так или иначе связанных с интерфейсом RS232. Следуя традиции, принятой в первой части книги [4], настоящая книга условно делится на два раздела. Первый раздел посвящен аппаратным средствам, связанным с интерфейсом RS232, вто рой — программному обеспечению для них. Из аппаратных средств следует выделить новые преобразователи интерфейса RS232, об ладающие несомненными преимуществами (высокой скоростью обмена, малыми габаритами и потреблением энергии, а также достаточно низкой стоимостью) перед использующимися ра нее, которые стали уже доступны в нашей стране, например MAX318X, MAX3190. Кроме того, переход на 3вольтовое питание, которое стало поддерживаться многими современными микроконтроллерами, позволил, с одной стороны, поновому подойти к приме нению стандартных преобразователей интерфейса (например ADM231L), с другой — исполь зовать давно забытые микросхемы преобразователей, например двунаправленный преобра зователь SN75155 (корпус DIP8), который давно уже не используется, очень удобно приме нять в таких приложениях. Что касается нестандартных преобразователей интерфейса RS232, то в дополнение к уже описанным в первой части книги можно отнести новые КМОП транзисторы с изолированным затвором p и nпроводимости (например BS250, 2N7000 и др.), которые с успехом могут служить приемниками RS232, т. к. их затвор (Uзи = ±20 B) без какихлибо дополнительных резисторов может непосредственно контактировать с выходными линиями RS232(±10 В). Появление новых недорогих гальванически развязанных DCDCпреобразователей (например +5 В в ±12 В), в которых значительно (в несколько раз) снижен шум, улучшена стабильность работы, уменьшены габариты, при их применении позволило улучшить надеж ность и уменьшить площадь на плате узлов гальванической развязки для RS232. Пример нового DCDCпреобразователя — RSD0512 фирмы RECOM. Из новых оптронов, использующихся в гальванических развязках, следует отметить опт роны К7010 и К7110 (ф. COSMO), которые отличает высокая скорость работы, малый ток включения, малое потребление энергии и встроенный стабилизатор питания, благодаря чему значительно улучшены надежность и скорость передачи (до 1 Мбод). И, наконец, последнее новшество в гальванических развязках — появление новых уни кальных микросхем гальванических развязок, использующих принцип передачи информации
8
посредством высокочастотного электромагнитного поля (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. Необходимо отметить, что аппаратные средства сопряжения микроконтроллеров ADUC8XX и MSC12XX с компьютером, приведенные в настоящей книге, значительно отличают ся от тех, которые были описаны в первой части книги. Отличие состоит, с одной стороны, в применении более современной элементной базы, с другой — в большей ориентирова нности этих аппаратных средств на 3вольтовое питание (хотя, конечно, при питании в 5 В они также работают). Что касается аппаратных средств для микроконтроллеров P89LPC9XX, AT89C51ED2/RD2 и C8051F067/330, то в 1й части книги они отсутствoвали потому, что в 2003 г. некоторые из этих микроконтроллеров были еще либо в стадии разработки (и не вы пускались), либо недоступны. Помимо вышеописанных в книге приведены аппаратные средства коммуникаций по ин терфейсу RS232 на расстояниях бoльших, чем допускает сам этот интерфейс, т. е. свыше 15 м. Если расстояние между объектами коммуникаций составляет 50÷1000 м, а сами объекты имеют интерфейс RS232, то в этом случае автор рекомендует использовать два подхода. Первый подход связан с обычными проводными линиями связи, например в виде витых пар, которые уже давно и традиционно используются в компьютерных сетях связи. Если расстояние достаточно большое, например 800÷1000 м, а скорость обмена по RS232 желательно оставить высокой, например 115 200 бод, то интерфейс RS232 можно пре образовать в интерфейс RS485/422, который допускает подобный обмен по проводам (в дан ном случае — витым парам). Сделав обратное преобразование, получим тот же интерфейс RS232, но уже на расстоянии 800÷1000 м. В книге приводится принципиальная схема подоб ных преобразователей уже в виде готовых устройств, помещающихся в корпус обычной теле фонной розетки (приведена даже фотография устройства на с. 6465). Такие устройства достаточно дешевы, безукоризненно работают, но имеют один известный недостаток — необ ходима сама электрическая линия связи, т. е. провода, что связано с рядом проблем: высокой стоимостью линии связи и ее прокладки и связанными с ней сложностями, как то: повреж дения линии (случайные или умышленные), значительные затруднения ее прокладки (а иногда и полная ее невозможность ) и т. п. Второй подход связан с современными беспроводными (wireless) технологиями, развива ющимися в настоящее время «гигантскими» темпами. Беспроводные линии связи малого радиуса действия имеют массу недостатков, среди которых: более низкая скорость обмена (10÷50 кбод при разумной цене); значительно меньшее расстояние связи 100÷500 м (при опятьтаки разумной цене радиотрансиверов); зависимость надежности связи от погоды, расположения объектов связи (в помещении или на открытом пространстве); связь менее стабильная, чем проводная, и часто срывается;
9
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
масса стандартов связи (перечислять их — дело неблагодарное); стоимость радиотран сиверов пока еще на порядок превышает стоимость, например, вышеуказанных преоб разователей интерфейсов (RS232RS485/422); имеются некоторые известные проблемы в программировании радиотрансиверов и т. п. Однако отсутствие линии связи и связанных с этим проблем иногда перевешивает все вышеперечисленные недостатки систем беспроводной связи, а в некоторых случаях (при невозможности прокладки проводной линии связи, например, когда один из объектов связи находится под значительным напряжением (в несколько тысяч вольт) по отношению к другому) беспроводная связь является единственно возможной и не имеет альтернативы. Применение интерфейса RS232 в беспроводных линиях связи выходит за рамки настоящей книги (хотя автор в настоящее время «усиленно» занимается подобными разработками). Возможно, в даль нейшем эта тема будет либо включена в книгу (если она будет переиздана), либо раскрыта в отдельной книге. Обо всех этих и некоторых других аппаратных средствах, использующихся в устройствах, связанных с интерфейсом RS232, подробно описано в разделе книги, посвященном аппарат ным средствам RS232. *** Программные средства, приведенные в настоящей книге, более ориентированы на ис пользование операционных систем Windows98 и WindowsXP. Это — существенное ее отличие от первой части [4], где «по умолчанию» все программы были приведены для работы в опера ционной системе DOS, а о Windows не было сказано ни слова (за исключением, быть может, заключения). Написание программ, так или иначе связанных с коммуникациями и, в частности, с соп ряжением внешних устройств на базе микроконтроллеров с компьютером по интерфейсу RS232 в операционных системах Windows, для многих программистов часто является непре одолимым барьером по многим причинам, основная из которых отсутствие в языках высо кого уровня команд прямого ввода/вывода в порт, например RS232 (in и out), к которым так привыкли программисты, а в операционной системе WindowsXP эти команды вообще запре щены (по крайней мере в официальной документации). В Win'XP (кстати сказать, и в Win'98) обращение к интерфейсу RS232 возможно через специальный программный интерфейс (простите за тавтологию), разработанный компанией Microsoft специально для работы приложений (Application Program Interface — API). Изучение и применение функций API для программирования RS232 также наталкивается на известные трудности, т. к. примеры использования API в MSDN [18] приведены только для языка Cи. Для использования функций API в других языках (например в Кларионе для Windows) требует ся некоторая модификация этих функций (а точнее — адаптация под соответствующий язык, в данном случае — Кларион). Эта модификация также связана с дополнительными трудностя ми и временными затратами. Другой важной проблемой является необходимость перехода на новую версию языка программирования, работающую в Windows. В книге объясняется, как достаточно просто запрограммировать обмен по интерфейсу RS232 в операционных системах Windows, используя функции API, на языке Кларион для Windows (на настоящее время его последняя версия — Clarion 6.0) и, кроме того, показано, что программировать обмен по RS232 можно (и нужно!) с помощью прямых команд вво да/вывода в порт (in и out), в том числе и в WindowsXP. Сделано сравнение (и далеко не в
10
ПРЕДИСЛОВИЕ
пользу API) скорости работы программ, использующих API и прямые команды in и out. Делает ся вывод, что изучение API совсем не обязательно (правда, достаточно полезно). Таким обра зом, «снимается» один (кстати сказать, основной) из перечисленных «барьеров». Что касается перехода на новую версию языка программирования, работающую с опера ционной системой Windows, то эта проблема решается гораздо меньшими усилиями, чем пре дыдущая. Например, переход с языка Кларион для DOS (Clarion v.3.100) на новую версию языка Кларион для Windows (Clarion 6.0), на взгляд автора, не составляет больших проб лем. В книге приводятся две тестовых программы обмена по RS232, написанные на Clarion V3.100(DOS) и Clarion V6.0 (Windows). Сравнение текстов этих программ показыва ет 99 %ную их идентичность. Некоторое расхождение программ — в различиях экранных форм (точнее в их названиях): в Clarion V3.100 экранная форма называется «Screen» (эк ран), а в Clarion V.6.0 — это «Window» (перевод, надеюсь, не требуется). Форма «Window» обладает просто более расширенными возможностями, чем «Screen». Таким образом, вто рой «барьер» также снимается. Аналогичные «мелкие» проблемы, повидимому, возника ют и для других языков программирования. В качестве примеров, иллюстрирующих применение интерфейса RS232 для обмена ин формацией между компьютером и микроконтроллером, приведены несколько программ, сре ди которых: тестовая программа обмена строкой байт по новому алгоритму обмена, разрабо танного автором; программы для внутрисистемного программирования (InSystem Programming — ISP) микроконтроллеров ADUC83X/84X (ф. Analog Devices), MSC121X (ф. Texas Instruments), LPC9XX (ф. Philips); программы для внутрисхемного программирования (In Circuit Programming — ICP) микроконтроллеров LPC90X с помощью микроконтроллеров MSC1210 и LPC938, которые, в свою очередь, сопрягаются с компьютером по RS232 и др. Программы для компьютера написаны на языке Clarion v.3.100 (DOS) и Clarion v.6.0, a для микроконтроллеров — на С51 и на ассемблере. В книге несколько выделены два вопроса, которые вызывают затруднения при програм мировании: как сформировать аппаратно независимые короткие временные задержки (от единиц до десятков микросекунд) достаточной точности в DOS и Windows, как правильно пользоваться совмещениями, «не бояться» их и применять везде, где только возможно. Напомню, что под совмещениями принято понимать свойство язы ка программирования перераспределять одну и ту же область памяти для двух (или бо лее) структур данных, имеющих различные форматы, например: строку данных длиной 100 байт и массив однобайтных чисел размерностью 100 (в Clarion — string(100) и byte dim (100) ) или двухбайтное число (ushort — в Clarion, unsigned short — в Си) и 2 однобайтных числа (byte — в Clarion и unsigned char — в Си), или однобайтное число формата unsigned char и 8 однобитных чисел формата sbit (Си для микро контроллера). В книге показано какое огромное преимущество (как по экономии памяти, так и по увеличению быстродействия и в микроконтроллере, и в компьюте ре) имеет применение совмещений. *** Книга снабжена двумя приложениями. В Приложении 1 в краткой справочной форме приведены все регистры (состояния, управ ления и данных), предназначенные для программирования интерфейса RS232 в компьютере;
11
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
там же приводится таблица распайки контактов 9штырьковых (DB9P) и 25штырьковых (DB25P) разъемов интерфейса RS232 (COM 1 и COM 2), использующихся в компьютере. В Приложении 2 приводятся описания автоматизированных систем сбора и обработки ин формации, поступающей с датчиков аналоговых (давления, температуры, влажности) и частот ных (количество импульсов с тахометрических и ротационных счетчиков объема газа или во ды) сигналов, сконструированные автором, на базе современных микроконтроллеров. Приве дены технические характеристики систем и их фотографии на объектах. Системы сбора сопря гаются с компьютером по интерфейсу RS232. Эти системы применяются для поверки и граду ировки счетчиков объема газа и воды и работают на соответствующих установках на протяже нии уже более 10 лет. Приведен адрес сайта автора, где можно более подробно ознакомиться с этими система ми; кроме того, на сайте представлены некоторые программы для внутрисистемного програм мирования (ISP) микроконтроллеров ADUC8XX, MSC12XX и LPC9XX и внутрисхемного программирования (ICP) микроконтроллеров LPC90X с помощью микроконтроллеров MSC1210 и LPC938, которые, в свою очередь, сопрягаются с компьютером по RS232, и неко торые другие программы. Приведен также адрес электронной почты автора.
12
Введение Последовательный интерфейс RS232С был разработан еще в 1969 г. и введен ассоциаци ей электронной промышленности (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 прочно и надолго вошел в состав микроконтроллеров. Такое положение интерфейса, повидимому, объясняется еще
13
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
и тем, что программирование современных микроконтроллеров (которое происхо дит достаточно медленно) производится в «системе» (InSystemProgramming — ISP), т. е. в том же устройстве, где установлен микроконтроллер. Другими словами, современный микроконт роллер не требуется больше программировать отдельно в программаторе, а потом уже вставлять в устройство. Программирование в системе, помимо собственно удобства прог раммирования, позволяет еще производить быструю отладку программы. В настоящее время интерфейс RS232 переживает свое «третье» рождение в связи с не вероятным «бумом», поднявшимся во всем мире, причиной которому — беспроводные техно логии передачи информации. Скорость обмена информацией, например, в беспроводных устройствах малого и среднего радиуса действия, едва дотягивает до 9600 бод, а иногда и много меньше (1200 бод). Об увеличении скорости обмена информацией в таких устройствах ни в настоящее время, ни в скором будущем, повидимому, нет даже и речи, поскольку с каж дым годом ужесточаются требования на ограничение мощности радиотрансиверов. Сейчас новшества касаются только увеличения чувствительности приемников, входящих в состав радиотрансиверов, и улучшения их (приемников) соотношения сигнал/шум. Это улучшение достигается различными методами (например, скачкообразным изменением частоты моду ляции, применением избыточного кодирования и другими «хитроумными» способами), но ни в коем случае не увеличением мощности передатчиков, дабы не «засорять эфир». В этих ус ловиях об увеличении скорости обмена говорить не приходится. Максимальная скорость обмена, которую допускает интерфейс RS232 (в компьютере), составляет 115 200 бод и вряд ли будет в скором времени перекрыта подобными устройства ми беспроводной связи. В связи с вышеизложенным интерфейс RS232 вряд ли скоро уйдет из нашей жизни в отряд «отставников», поэтому с ним придется еще долго работать. Вместе с тем интерфейс RS232 не лишен многих недостатков. Кроме того, имеется много тонкостей при ис пользовании этого интерфейса в программах (как для компьютера, так и для микроконтролле ра), а также «глюков», которые могут вызвать недоумение (и даже досаду) у многих разработ чиков как аппаратных, так и программных средств для RS232. Целью настоящей книги является «снятие» некоторых «явных» препятствий на пути исполь зования интерфейса RS232 как в плане аппаратных средств, так и в плане программного обеспечения, а также показать некоторые новые возможности этого интерфейса. Автор, специализирующийся на разработке и производстве компьютерных и автоном ных систем (на базе микроконтроллеров) сбора и обработки информации, поступающей с различного рода датчиков, не претендует на «полноту охвата» темы, однако если изложен ный материал будет полезен многим разработчикам аппаратных средств, связанных с ис пользованием микроконтроллеров, а также программистам, то свою задачу автор посчита ет выполненной. Книга может быть также полезна студентам вузов компьютерного профиля. Материал книги условно делится на две части. В первой части рассматриваются аппарат ные средства сопряжения микроконтроллеров с компьютером по интерфейсу RS232, во вто рой — программные средства для них. Приведено много схемных решений, фотографий, а так же текстов программ как для микроконтроллеров, так и для компьютера. Причем программы для компьютера больше ориентированы на ОС Windows 98/XP.
14
Аппаратные средства интерфейса RS232 1.1. 1.2. 1.3.
1.4. 1.5.
Предварительные замечания .............................................................16 Новые преобразователи интерфейса RS232 ...................................16 Примеры применения новых преобразователей для сопряжения микроконтроллеров с компьютером по интерфейсу RS232...........................................................................21 Гальванические развязки для интерфейса RS232..........................49 Что делать, если длина линии связи интерфейса RS232 превышает 20 м? ..................................................................................63
1
Аппаратные средства интерфейса RS232
НОВЫЕ ПРЕОБРАЗОВАТЕЛИ ИНТЕРФЕЙСА RS232
Что касается нестандартных преобразователей интерфейса RS232, то в дополнение к уже описанным в первой части книги можно отнести новые КМОПтранзисторы с изоли рованным затвором p и nпроводимости (например BS250, 2N7000 и др.), которые с ус пехом могут служить приемниками RS232, т. к. их затвор (Uзи =±20 В) без какихлибо дополнительных резисторов может непосредственно контактировать с выходными ли ниями RS232 (±10 В). Рассмотрим новые специализированные микросхемы преобразователей интерфейса RS232 более подробно.
1.2.1. Новые специализированные микросхемы преобразователей интерфейса RS232 Кратко охарактеризуем свойства новых специализированных микросхем преобразовате лей интерфейса RS232 (рис. 1.2.1).
1.1. Предварительные замечания Основная цель настоящей главы — показать на примерах аппаратных средств сопряже ния микроконтроллеров с компьютером возможности интерфейса RS232 для конструирова ния систем сбора и обработки информации, поступающей с различного рода датчиковпреоб разователей физической (измеряемой) величины в электрический сигнал. В начале главы приводится описание новых специализированных микросхем преобра зователей уровней интерфейса RS232 (±10 В÷±12 В) в TTL–уровни (±5 В÷±3 В) и обратно, которые в настоящее время стали широко доступны (они не вошли в первую часть книги [4]). Помимо специализированных микросхем преобразователей приводятся несколько приме ров применения некоторых электронных компонентов, которые могут быть использованы в качестве таких преобразователей (они также не вошли в [4]). Для гальванически развязан ного интерфейса RS232 приводятся новые микросхемы гальванических развязок, среди ко торых — совершенно новый тип развязок на основе использования свойств электромагнит ного поля. Для иллюстрации применения на практике новых преобразователей интерфейса RS232 во второй части главы приводятся готовые схемные решения по сопряжению микроконтроллеров с компьютером по этому интерфейсу. Эти схемы сопряжения в основном предназначены для программирования микроконтроллеров, а для штатного режима их работы — только для тести рования самого обмена по RS232. В свою очередь, на эти схемы сопряжения автор будет ссы латься во второй главе, где будут приведены программные средства для обмена по RS232.
Рис. 1.2.1. Специализированные микросхемы преобразователей интерфейса RS232
1.2. Новые преобразователи интерфейса RS232 Новые преобразователи интерфейса RS232 обладают несомненными преимуществами (высокой скоростью обмена, малыми габаритами и потреблением энергии, а также достаточ но низкой стоимостью) перед использующимися ранее, например: MAX318X, MAX3190, ADM3202, MAX1406. Кроме того, переход на 3вольтовое питание, которое стало поддержи ваться многими современными микроконтроллерами, позволил поновому подойти к исполь зованию стандартных преобразователей интерфейса (например ADM231L). Другой пример — двунаправленный преобразователь SN75155 (корпус DIP8), кото рый давно уже не используется, также очень удобно применять в таких приложениях.
16
17
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Микросхема ADM3202 от ф. Analog Devises отличается высокой скоростью работы (до 460 кбод); емкости конденсаторов, требуемых для работы преобразователя, реаль но не превышают 0,1 мкФ; микросхема может работать и при Vcc=+3 В, и при Vcc=+5 В. Размах сигнала драйвера (передатчика) RS232 реально составляет ±10 В (Vcc=+5 В) и ±6 В (Vcc=+3 В) при работе на нагрузку в 5 кОм. Сигнал очень чистый, без какихлибо па разитных искажений. Кроме того, ADM3202 отличается пониженным потреблением энергии (особенно при питании от +3 В). Микросхема ADM231L этой же фирмы также реально работает на скорости 115 кбод (в ее описании указывается, что максимальная скорость обмена составляет 230 кбод), емкости конденсаторов не превышают 1,0 мкФ. Размах сигнала драйвера повышен и составляет ±11,5 В при питании от первого источника питания V+=+12 В при работе на нагрузку 5 кОм. Уникальной особенностью микросхемы является независимость разма ха сигнала драйвера от напряжения второго источника питания Vcc, которое может быть и +3 В, и +5 В. Сигнал также имеет высокую чистоту без паразитных составляющих. ADM231L отличается пониженным потреблением энергии. Микросхема MAX1406 от ф. MAXIM отличается высокой скоростью работы (до 230 кбод), повышенным размахом сигнала драйвера (±11,5 В) при работе на нагрузку в 5 кОм, независи мостью этого размаха от напряжения Vcc и высокой чистотой сигнала. Микросхема питается от 3 источников питания (V+=+12 В, V–=–12 В и Vcc=+3÷+5 В), в связи с чем она не содержит преобразователей (удвоителей и инверторов напряжения, как, например, ADM3202 и ADM231) и не требует большого количества конденсаторов для работы. Особенностью микрос хемы является наличие 3 приемников и 3 передатчиков, что, как будет видно из дальнейшего изложения, позволяет сопрячь с ее помощью компьютер с микроконтроллером (который может работать как в режиме программирования, так в штатном режиме) без какихлибо дополни тельных преобразователей интерфейса RS232. MAX1406 отличается пониженным потреблени ем энергии. Микросхема передатчика RS232 MAX3190 от ф. MAXIM отличается повышенной скоростью работы (до 460 кбод), имеет размах сигнала драйвера до ±10 В при работе на два входа прием ников (т. е. на нагрузку в 2,5 кОм) при питающих напряжениях V+=+12 В и V–=–12 В. Кроме то го, она потребляет очень мало энергии при работе и может быть переведена в режим сверхниз кого потребления — в «спящий» режим. Особенностью микросхемы является уникально малый корпус SOT236 размером 3×3 мм. Микросхемы приемников MAX3181 и MAX3183 от ф. MAXIM работают на сверхвысокой скорости для интерфейса RS232 (до 1,5 Мбод), отличаются сверхнизким потреблением энер гии и уникально малым корпусом SOT235 размером 3×3 мм. Микросхема MAX3181 являет ся инвертирующим приемником, как и подавляющее большинство всех микросхем приемни ков RS232, а MAX3183 — не инвертирующим, что является уникальным свойством, позволя ющим, как будет видно из дальнейшего изложения, напрямую подключать к нему вход RST микроконтроллера с активно низким уровнем (например P89LPC9XX). И наконец последняя микросхема, которую хотелось бы представить, — это микросхема SN75155 от ф. Texas Instruments, в которой в одном корпусе всего с 8 выводами (DIP8, SOIC8) размещается и приемник, и передатчик. Микросхема не нова, однако мало где применяется и особой популярностью не пользуется, а зря. Микросхема реально работает на высокой скорос ти (115 кбод), требует всего 2 источников питания (V+=+12 В, V–=–12 В), т. к. источник пита ния +5 В встроен. В связи с этим для ее работы не требуется дополнительных конденсаторов для инверторов и удвоителей напряжения (как, например, у ADM3202 и ADM231L). Размах сиг
18
НОВЫЕ ПРЕОБРАЗОВАТЕЛИ ИНТЕРФЕЙСА RS232
нала драйвера составляет ±10 В при работе на 2 входа приемника (т. е. на нагрузку в 2,5 кОм). Недостатками микросхемы являются стандартное (не пониженное) потребление энергии и не возможность работы с микроконтроллером при питании его от +3 В (при 5вольтовом питании микроконтроллера микросхема работает идеально).
1.2.2. Нетрадиционные преобразователи интерфейса RS232 Помимо специализированных микросхем преобразователей интерфейса RS232, о которых было рассказано выше, существуют электронные компоненты, вообще говоря, не являющимися преобразователями, но которые можно использовать в качестве таких преобразователей. О неко торых таких компонентах было рассказано в первой части книги [4]. Ниже представлены компонен ты, не вошедшие в первую часть книги. Это КМОПтранзисторы прямой (BS250 от ф. Vishay) и обрат ной (2N7000 от ф. Fairchild или Vishay) проводимости с изолированным затвором и КМОПкоммута тор (DG419 от ф. Vishay). Кратко охарактеризуем их свойства, внутреннюю структуру и цоколевку.
Рис. 1.2.2.1. Нетрадиционные преобразователи интерфейса RS232
Транзисторы выпускаются в корпусе TO92 (см. рис. 1.2.2.1). Сопротивление транзисторов в открытом состоянии составляет около 10 Ом, максимальный ток стока — чуть более 200 мА, максимальное напряжение стокисток — не более 50÷60 В, время включения и выключения — около 10 нс, мощность рассеяния — около 0,5 Вт. Максимальное напряжение затвористок (Uзи _max) составляет ±20 В. Последнее свойство позволяет подключать затвор транзистора непосредственно к линиям RS232 (напомню, что сигнал передатчика RS232 составляет около ±10÷±12 В), в связи с чем транзисторы могут использоваться в качестве приемников RS232. Единственное, что необходимо предусмотреть, — это нагрузочный резистор номиналом в 5 кОм, который следует подключить между затвором и общим проводом («землей»), т. к. со противление (изолированного) затвора транзисторов составляет сотни MOм, а стандарт RS232 предусматривает входное сопротивление приемника в 5 кOм.
а)
б) Рис. 1.2.2.2. Схемы применения транзисторов 2N7000 и BS250 в качестве приемников интерфейса RS232: инвертирующих (а) и неинвертирующих (б)
19
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Из приведенных вариантов использования КМОПтранзисторов 2N7000 и BS250 в каче стве преобразователей интерфейса RS232 — инвертирующих и неинвертирующих приемни ков RS232 (рис. 1.2.2.2) — видно, что транзисторы могут использоваться в ключевом режиме как в схемах с общим истоком (классический ключ) — в таком режиме работают инвертирую щие приемники, так и с общим стоком (истоковый повторитель) — в таком режиме работают неинвертирующие приемники. Схемы достаточно просты и в особых комментариях не нужда ются. Проверка работы схем заключалась в подаче на затвор транзистора сигнала меандра частотой 115 200 Гц, сформированного передатчиком микросхемы ADM3202, и наблюдении выходного сигнала. Во всех случаях выходной сигнал представлял собой практически прямо угольный меандр.
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
На рис. 1.2.2.3 приведены примеры использования коммутатора DG419 в качестве пре образователя интерфейса RS232 — приемника (инвертирующего и неинвертирующего) и пе редатчика (инвертирующего). Схемы достаточно просты и в комментариях не нуждаются.
а)
б)
*** Микросхема коммутатора DG419 выпускается в корпусе SOIC8 или DIP8. Напряжения питания V+, V– и VL лежат в следующих пределах: V+=+10÷+15 В, V–=–10÷–15 В, VL=+3÷+5 В. Сопро тивление коммутатора в открытом состоянии составляет около 20 Ом. Коммутатор управляется нап ряжением, поданным на его управляющий вход (вывод 6). При лог. 1 на управляющем входе выво ды 1й и 8й замыкаются, на что указывает символ «1», стоящий над контактом 8. При лог. 0 замыка ются контакты, связанные с выводами 2м и 8м (при этом контакты 1й и 8й размыкаются). Микросхема DG419 от ф. Vishay по своей структуре и функциям не отличается от микросхем ADG419 от ф. Analog Devices и DG419 от ф. MAXIM, приведенных в первой части книги [4]. Однако есть одно и очень существенное отличие в свойстве управляющего входа. Дело в том, что коммутатор управляется сигналом, поданным на его управляющий вход (6й вывод), и этот сигнал в коммутаторах ADG419 (Analog Devices) и DG419 (MAXIM) должен строго соответство вать TTLуровню ( лог. 0 — от 0 до +0,8 В и лог. 1 — от +2,4 до +5 В при VL=+5 В, V–=–12 В, V+=+12 В). При подаче на этот вход управления сигнала ниже 0 В (например –10 В) эти две микросхемы ав томатически коммутируют этот сигнал на «землю», т. к. оснащены входными диодами, защища ющими вход управления от отрицательных напряжений (ниже 0 В). У микросхемы DG419 от ф. Vishay таких ограничительных диодов нет, поэтому при VL=+5 В уровень напряжения управ ляющего сигнала Uупр. в состоянии лог. 0 должен находиться в пределах V–
20
в)
Рис.1.2.2.3. Схемы применения коммутатора DG419 в качестве преобразователя интерфейса RS232: инвертирующего (а) и неинвертирующего (б) приемника и инвертирующего передатчика (в)
Практическое применение как специализированных микросхем преобразователей RS232, так и нетрадиционных преобразователей, будет более понятно, когда будут рассмотре ны конкретные схемы сопряжения компьютера с микроконтроллерами.
1.3. Примеры применения новых преобразователей для сопряжения микроконтроллеров с компьютером по интерфейсу RS232 1.3.1. Предварительные замечания Вначале несколько слов по поводу оценочных и «эволюционных» плат, мастерKIT'ов, эму ляторовпрограмматоров и тому подобных устройств, предназначенных для «быстрой» раз работки аппаратных и программных средств на базе микроконтроллеров. Эти устройства вы пускаются либо самими производителями микроконтроллеров, либо «третьими» фирмами. Разработчику любой системы, состоящей из компьютера и устройства связи с объектом (УСО), сопряженного с ним по интерфейсу RS232, необходимо помнить следующие моменты по аппарат ным и программным средствам сопряжения вышеуказанных устройств с компьютером. Сначала об аппаратных средствах сопряжения предлагаемых устройств. Аппаратные средства сопряжения этих устройств имеют следующие особенности: в подавляющем большинстве случаев схемы сопряжения не приводятся или приводят ся с ошибками; если схемы и приводятся, разработчик вынужден либо копировать их в своих разра ботках (что не всегда приемлемо, т. к. элементная база, используемая в таких устрой ствах, или безнадежно устарела, или, наоборот, состоит из микросхем, которые у нас труднодоступны), либо хотя бы следовать той логике сопряжения, которая приводится, иначе поставляемое программное средство работать не будет, а вот логика сопряже ния у разработчика как раз таки должна быть своя;
21
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
часто приводимые аппаратные средства сопряжения очень громоздки и в них трудно ра зобраться, а разбираться все равно необходимо, иначе, если собственная разработка рабо тать не будет, трудно, либо вообще невозможно, определить причину неисправности; если схема сопряжения реализована даже по интерфейсу RS232, то различные устройства поразному управляют состояниями микроконтроллера: одни, напри мер, управляют выводом RST микроконтроллера от линии DTR RS232 компьютера, другие используют линию RTS, третьи устанавливают микрокнопку, нажав на кото рую можно сформировать сигнал RST и «сбросить» микроконтроллер; иногда для сопряжения используется сразу два порта RS232 компьютера и т. п. Программные средства сопряжения подобных устройств с компьютером по RS232 имеют еще больше недостатков: исходные тексты программ, естественно, не приводятся, а предлагаются уже готовые программы исполняемого формата (*.exe); программы используют драйверы, которые необходимо установить в компьютере и которые часто конфликтуют с другими программами; скорость обмена по RS232 очень низкая (практически не более 9600 бод); при установ ке более высокой скорости в подавляющем большинстве случаев обмен срывается. Вышеуказанные недостатки аппаратных и программных средств сопряжения таких устройств не позволяют использовать их даже в достаточно простых разработках, а уж о серьезных и говорить не приходится. Единственное преимущество таких устройств в том, что они позволяют быстро написать и проверить работоспособность какойлибо программы для микроконтроллера. Но после этого, когда нужно уже разработать собственное аппаратное средство сопряжения для своей разра ботки и написать программы сопряжения и для микроконтроллера, и для компьютера (не по тащишь же какуюлибо оценочную плату заказчику!), «эйфория» от быстрой разработки какой либо программы для микроконтроллера очень скоро проходит, оценочная плата убирается «до лучших времен», и разработчик вынужден делать все сам и с самого начала. Вот здесь, по мнению, автора, и могут пригодиться те примеры сопряжения микроконт роллеров с компьютером по RS232, которые приводятся далее. Кроме того, автор «не броса ет» разработчика только на одних аппаратных средствах схем сопряжения. Для некоторых из них во второй главе приводятся тексты программ (с комментариями) как для микроконтролле ра, так и для компьютера. И еще об одном. Вышеуказанные устройства с поддерживающим их программным обес печением, как уже говорилось, достаточно дoроги (десятки и сотни долларов); предлагаемые же автором схемы и программное обеспечение (исходные тексты программ — в книге, испол няемые файлы — на сайте автора) совершенно бесплатны. И наконец последнее. Автор ни в коем случае не отговаривает разработчиков от приоб ретения подобных устройств. В конце концов — это дело вкуса и средств. Цель настоящей кни ги — показать, каким образом сконструировать схемы сопряжения микроконтроллера и компьютера и написать соответствующее программное обеспечение, и не более того. Автор никоим образом не специализируется на разработке, производстве и тем более — продаже устройств для программирования микроконтроллеров по интерфейсу RS232. Основная специ ализация автора — разработка и производство компьютерных систем сбора на базе микро контроллера и компьютера. Проблема, затронутая автором в настоящей книге, является как
22
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
бы побочным продуктом основной специализации. Поэтому автор с легким сердцем «отдает» принципиальные схемы сопряжения и исходные тексты программ. Кроме того, приведенные в книге аппаратные и программные средства сопряжения между микроконтроллером и компьютером по интерфейсу RS232 работают ничуть не хуже, а даже лучше «фирменных», если, например, сравнивать не «красоту» и универсальность программных средств устройств (описанных выше), а характеристики их обмена с компьютером по RS232 — скорость, надежность обмена и простоту схемных решений. Все «фирменные» программные средства для нижеприведенных микроконтроллеров (кроме программных средств для микроконтроллеров от ф. ATMEL) работают на скорости, не превышающей 38 400 бод, и даже на этой скорости програм мы часто «зависают». Нельзя не убедиться еще и в том, насколько «фирменные» схемы сопряже ния с компьютером громоздки и часто сконструированы на «допотопной» элементной базе. Насколько же просты схемы сопряжения, предложенные автором, читатель сможет убедиться уже через несколько страниц. Кроме того, все без исключения аппаратные средства и поддерживаю щие их программные средства идеально работают на скорости обмена 115 200 бод (разумеется, на более низких скоростях они также работают). Теперь, когда, повозможности, все оговорки сделаны, перейдем к делу. *** В качестве иллюстраций, показывающих применение новых преобразователей на практи ке, ниже приведены схемы сопряжения микроконтроллеров MSC121X (ф. Texas Instruments), ADUC8XX (ф. Analog Devices), P89LPC9XX (ф. Philips semiconductor), AT89C51ED2 (ф. ATMEL) и C8051FXXX (ф. Silicon Laboratories) с компьютером для целей программирования и штатного режима работы. Выбор именно этих микроконтроллеров обусловлен следующими причинами. Вопервых, эти микроконтроллеры поддерживают внутрисистемное программирование (ISP) и именно по интерфейсу RS232 (кроме C8051FXXX). Напомню, ISP — свойство микроконтролле ров, заключающееся в том, что загрузка программы в микроконтроллер происходит прямо на том же устройстве (точнее — готовом изделии), которое предназначено для использования. Ес ли устройство (например система сбора) обменивается в процессе своей работы с компьютером по интерфейсу RS232 и программируется по этому же интерфейсу в режиме ISP, то никаких до полнительных устройств, специально предназначенных для программирования микроконтрол леров (программаторов, эмуляторовпрограмматоров и т. п.), не требуется. Следует отметить, что режим ISP микроконтроллеров не обязательно должен иметь интер фейс RS232. Существует микроконтроллеры, которые могут быть запрограммированы в режи ме ISP и по другим интерфейсам. Например, микроконтроллеры AT89SXX (ф. ATMEL) поддер живают ISP по интерфейсу SPI; микроконтроллеры C8051FXXX (ф. Silicon Laboratories) — по интерфейсу JTAG и C2 и т. п. Поскольку компьютер не имеет этих интерфейсов, необходимо приобретать дополнительные устройства, предназначенные для программирования микроко нтроллеров и использующие интерфейсы, имеющиеся у компьютера (USB, RS232, принтерный параллельный порт). Стоимость таких устройств, как уже говорилась, весьма высока и может достигать десятков и сотен долларов. Вовторых, 3 из отмеченных 5 семейств микроконтроллеров (MSC121X, ADUC8XX, P89LPC9XX), помимо ISP по RS232, обладают еще 2 свойствами, которые намного упрощают конструирование систем сбора на их основе: встроенные прецизионный системный таймер (разрядностью 23÷24 бита) и АЦП (разрядностью 10÷24 бита). Выбор микроконтроллера AT89C51ED2, не имеющего в своем составе ни аналогоцифрового пребразователя, ни системного таймера, обусловлен более существенными причинами, чем нали
23
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
чие этих 2 компонент. Эти причины будут приведены несколько позже, а сейчас несколько слов о свойствах АЦП, требуемых для конструирования систем сбора. АЦП, который используется в системах сбора, по мнению автора, должен обладать следу ющими свойствами: точность АЦП должна составлять не менее 16 разрядов, АЦП должен быть оснащен самокалибровкой «нуля» и полной шкалы, метод преобразования должен быть Σ∆, т. к. этот метод не может обойтись без встроенных цифровых фильтров, которые, помимо своей основной работы (фильтрации высокочастотного шума модулятора), прекрасно отфильтровывают и низкочастотный шум, присутствующий в трактах измерений сигналов с датчиков. Кроме того, цифровой фильтр имеет полюс на частоте питающей сети 50 Гц зна чением до –|120÷150| дБ, скорость АЦП одного канала должна составлять несколько сотен Гц (лучше не менее 1000 Гц) при достаточно многоканальной системе сбора (8÷16 каналов), т. к. поми мо собственно аналогоцифрового преобразования АЦП должен еще проводить ка либровку «нуля», полной шкалы, устанавливать цифровой фильтр и, кроме того, «про пускать» однодва «холостых» преобразования перед тем, как осуществить рабочее преобразование (а каждое такое действие требует времени в 2÷3 раза больше, чем собственно аналогоцифровое преобразование). В связи с этим нетрудно подсчитать, что скорость получения рабочего аналогоцифрового преобразования одного канала примерно на порядок меньше скорости работы самого Σ∆ АЦП (т. е. если частота АЦП 1000 Гц, то частота рабочего аналогоцифрового преобразования одного канала бу дет составлять не более 100 Гц). А теперь посмотрим, что мы имеем от встроенных АЦП трех вышеуказанных семейств мик роконтроллеров. АЦП микроконтроллеров семейств P89LPC9XX имеют точность только 10 разрядов, не имеют ни калибровки нуля, ни полной шкалы, ни НЧфильтров, т. к. они являются не Σ∆, а АЦП последовательных приближений. В связи с этим эти микроконтроллеры имеют очень ограниченное применение в системах сбора. АЦП микроконтроллеров семейств MSC12XX хотя и являются Σ∆, но дают приемлемую точность (около 14÷15 разрядов) на частоте не более 100 Гц, т. е. частота рабочего аналогоцифрового пре образования одного канала составляет не более 10 Гц. В связи с этим эти микроконтроллеры могут быть использованы в сравнительно малоканальных системах сбора (не более 2÷5 каналов). В этом случае общее время аналогоцифрового преобразования всех каналов будет составлять соответ ственно 2÷5 Гц. Поэтому если от системы сбора требуется оперативная информация каждые, напри мер, 0,1 с, а каналов 8÷16, то АЦП таких микроконтроллеров просто «не потянут» по скорости. АЦП микроконтроллеров семейств ADUC8XX еще медленнее (частота работы их АЦП около 70÷80 Гц). Поэтому они могут быть использованы в еще более «медленных» систе мах сбора. Тем не менее семейства микроконтроллеров MSC12XX и ADUC8XX не следует сбрасывать со счетов. Что же делать, если требуется многоканальная система сбора (8÷16 каналов), а обнов ление информации по АЦП должно проводиться, например, каждые 0,1 с? Ответ напрашива ется сам собой: либо использовать внешний достаточно быстрый Σ∆АЦП, который может проводить аналогоцифровое преобразование с частотой не менее 1000 Гц, либо применять микроконтроллер со встроенным достаточно быстрым АЦП.
24
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
Микросхем Σ∆АЦП существует великое множество. Один из них — ADS1210 от ф. BurrBrown (вошедшей сейчас в ф. Texas Instruments). Этот АЦП показал уникальные результаты и использует ся в системах сбора, сконструированных автором, которые работают уже на протяжении многих лет в нескольких организациях (см. приложение 2). Кроме того, микросхема ADS1210P имеет кор пус DIP18 удобный для макетирования, что также является его несомненным достоинством. К какому микроконтроллеру следует подключать такой АЦП? Естественно, к такому, кото рый имеет ISP по RS232, обладает возможностью работы с периферийными устройствами по параллельной шине АДРЕС/ДАННЫЕ (т. е. имеет сигналы ALE, RD и WR), может работать от ис точника питания в 3 и 5 В (т. к. некоторые периферийные устройства, например, таймеры 82C54 работают только при питании 5 В); кроме того, хорошо бы, чтобы такой микроконтрол лер имел бы корпус, удобный для макетирования (например PLCC). Вот здесь как раз и может использоваться микроконтроллер AT89C51ED2 (обладающий всеми вышеперечисленными свойствами и многими не перечисленными выше). В связи с вышеизложенным, автор счел необходимым включить в книгу рассмотрение сопряжения этого микроконтроллера с компьютером по интерфейсу RS232. Теперь несколько слов о микроконтроллерах семейств C8051FXXX от ф. Silicon Labortories (в которую вошла бывшая ф. Cygnal). Автором были опробованы в работе и протестированы 2 микроконтроллера этой фирмы: C8051F067 и C8051F330D. Почему были выбраны именно эти микроконтроллеры? Микроконтроллер C8051F067 имеет в своем составе сдвоенный высокоскоростной 16 разрядный АЦП последовательных приближений («SAR», как его называют), который обладает уникальным быстродействием (до 1 МГц), поэтому заманчиво было бы применить такой мик роконтроллер в системах сбора. Микроконтроллер расположен в корпусе TQFP64 (аналогич ном корпусу MSC1210). Для таких корпусов автором еще в [4] был предложен переходник TQFP64PGA64 для удобства ручного макетирования. Микроконтроллер C8051F330D — относительно новый и является одним из всего 2 мик роконтроллеров семейства C8051FXXX, имеющих корпус DIP(20 или 24), пригодный для маке тирования. Кроме того, этот микроконтроллер содержит в своем составе 10разрядный АЦП, который может быть сконфигурирован как АЦП с несколькими входами (до 16). (Есть, правда, еще один микроконтроллер в корпусе DIP14 (C8051F300P), но у него только 8разрядный АЦП, и он относительно нераспространен.) Оба микроконтроллера имеют ISP: C8051F067 — по интерфейсу JTAG, C8051F330D — по интерфейсу C2. Тестирование проводилось с использованием USBDEBUGадаптера. При тестировании возникли проблемы, с которыми автор хотел бы поделиться с чи тателем. Но вначале о проблемах, которые можно почерпнуть из самих описаний на микроко нтроллеры (datasheet). Перечислим проблемы вместе с методами их «снятия». Вопервых, для целей ISP требуется приобретать не оченьто дешевый USBDEBUGадап тер (стоимостью около 2000 руб.). Вовторых, микроконтроллер C8051F067 не имеет средств работы с внешней па мятью программ/данных (у него отсутствуют сигналы ALE, WR и RD) и поэтому не может ра ботать автоматически с периферийными устройствами (например с таймерами 82C54). Данная проблема в принципе легко снимается путем «ручного» программирования подоб ного сопряжения, тем более что этот микроконтроллер довольно быстрый (инструкция вы полняется за 12 такта). Втретьих, микроконтроллер не может работать напрямую с внешними устройствами, имеющими 5вольтовое питание (с теми же таймерами 82C54 и с другими устройствами),
25
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
т. к. питание микроконтроллера производится от источника питания до 2,7÷3,6 В. Эта проб лема решается с помощью использования микросхем двунаправленных преобразователей уровней +3 В+5 В (например ADG3300 от ф. Analog Devices). Вчетвертых, и это уже существенно, SARАЦП не имеет низкочастотных фильтров. Эта проблема может быть снята двумя способами: аппаратным (с помощью НЧфильтров на опе рационных усилителях либо пассивных, например LC или RC) или программным — с по мощью программирования цифровых фильтров непосредственно в микроконтроллере (при его быстродействии это вполне реально; в разделе «Применения» (Application) по этому микроконтролеру даже приводятся образцы подобных программ (см. www.silabs.com). Впятых, эти микроконтроллеры содержат так называемую матрицу соединений, разобрать ся с которой не такто просто. Чтобы вывести, например, байт по интерфейсу RS232 нужно сделать массу манипуляций с этой матрицей (в качестве примера в разделе по программному обеспече нию приводятся 2 программы по выводу символа через интерфейс RS232). Вшестых (и это уже показало тестирование), все микроконтроллеры семейства C8051FXXX не позволяют управлять портами ввода/вывода, если они заняты альтернативны ми функциями. В частности, если, например, выбраны 2 порта ввода/вывода для интерфейса RS232 (p0.0TxD, p0.1RxD для микроконтроллера C8051F067 и p0.4TxD, p0.5RxD для микро контроллера C8051F330D), т. е. выбраны альтернативные функции, то линией TxD для уста новки ее в произвольное состояние уже управлять нельзя (хорошо еще, что прочитать состояние линии RXD можно). По этому выводу можно только передавать байты по RS232 стандартным образом (из SBUF). Для управления этими линиями (т. е. для их установки в 0 или 1 необходимо отключить альтернативную функцию (в данном случае обмен по RS232). При чем, эта функция отключается только одним битом, поэтому, например, нельзя отключить ли нию TxD (для управления, например, синхронизацией) и оставить линию RxD. Это очень суще ственное упущение разработчиков этих микроконтроллеров, которое делает невозможным (без дополнительных аппаратных средств) обмен по RS232 между микроконтроллерами и компьютером с помощью нового алгоритма, разработанного автором. Напомню, что подоб ный алгоритм обмена заключается в аппаратной синхронизации каждого байта, но не линия ми квитирования DTRDSR или RTSCTS, а линиями данных TxD и RxD (более подробно об этом алгоритме обмена можно прочитать в [4] и в разделе по программному обеспечению в насто ящей книге). Данная проблема может быть решена аппаратным способом следующим образом. Предположим, нужно управлять линией TxD (т. е. устанавливать ее в 0 или 1) и одновре менно использовать ее в качестве вывода байта по RS232. Если взять дополнительный вывод микроконтроллера, управлять которым разрешено матрицей соединений, и подключить его к одному из входов элемента И, а ко второму — вывод микроконтроллера TxD, то на выходе та кого элемента И можно получить требуемое (далее будет приведена подобная схема). Другое решением этой проблемы — отказаться от такого алгоритма обмена вообще и исполь зовать программную синхронизацию (например известный алгоритм XonXoff). И наконец вседьмых: корпус TQFP64 очень неудобен для макетирования. Решение этой проблемы — в использовании платыпереходника, разработанного автором для мик роконтроллеров MSC12XX, имеющих такой же тип корпуса. Но попробуйте вручную распа ять корпус с 64 ножками, расстояния между которыми составляет всего 0,5 мм, а ширина ножки — 0,3 мм! Хотя это и возможно, но является не такойто уж простой задачей. Забе гая немного вперед, отметим, что далее в книге приведены фотографии подобных платпе реходников с уже распаянными на них микроконтроллерами. В этом смысле гораздо удоб нее использовать корпус PLCC68 (как, например, у AT89C51ED2).
26
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
Если бы проблем было немного, то можно было бы вполне использовать микроконтролле ры семейств C8051FXX в системах сбора. Наличие же такого количества (хотя частично и «сни маемых») неудобств делают использование этих микроконтроллеров в многоканальных, доста точно универсальных системах сбора весьма проблематичным. Тем не менее автор счел необходимым привести схему сопряжения микроконтроллеров семейств C8051FXX с компьютером по интерфейсу RS232 не для целей программирования, а только для штатного режима работы. Для целей программирования приведена схема соп ряжения этих микроконтроллеров с интерфейсами JTAG (C8051F067) и C2 (C8051F330) USBDEBUGадаптера. В разделе, посвященном программному обеспечению, будут приве дены программы обмена информацией с компьютером по интерфейсу RS232, использую щие аппаратную синхронизацию с помощью линий данных TxD и RxD для микроконтролле ров C8051F330D и C8051F067. Надеюсь, эти схемы сопряжения будут интересны читателю, т. к. они позволяют, по крайней мере, отказаться от покупки дорогостоящих эволюционных или оценочных плат на эти микроконтроллеры (толку от которых, как уже указывалось, нем ного) и ограничиться только приобретением не такого уж дорогого (55–60 долл.) USB DEBUGадаптера.
1.3.2. Управление состояниями микроконтроллера с помощью компьютера по интерфейсу RS232 Для запуска и внутрисистемного программирования (ISP) на определенные выводы мик роконтроллера необходимо подавать два управляющих сигнала. Первым таким выводом явля ется вход сброса (RESET–RST). Практически все микроконтроллеры (кстати сказать, и микропроцессоры) имеют вход сброса (RST), который предназначен для полного сброса микроконтроллера и запуска его в работу. В подавляющем числе микроконтроллеров этот вход RST имеет активный высокий уро вень, т. е. если подать на вход RST уровень лог. 1, то микроконтроллер будет сброшен и оста новлен. При подаче на вход RST лог. 0 микроконтроллер включается в работу — «запускается». У микроконтроллеров семейств MSC121X, ADUC8XX и AT89C51ED2(RD2) вход RST как раз и является таковым, т. е. имеет активный высокий уровень. Семейства же P89LPC9XX и C8051FXXX отличаются тем, что вход RST у них имеет активно низкий уровень, т. е. подача на вход RST лог. 0 останавливает и сбрасывает эти микроконтрол леры, а подача лог. 1 — запускает. Помимо уровня сигналов, вывод RST характеризуется еще и тем, что это именно вход, т. е. он предназначен для того, чтобы им управлять извне. Как правило, если RST имеет ак тивный высокий уровень, то в микроконтроллере он соединен с внутренним подтягиваю щим резистором номиналом в несколько сот кOм, подключенным к общему проводу («зем ле»). Так, например, значение этого подтягивающего резистора в микроконтроллерах MSC12XX составляет около 500 кOм, в ADUC8XX — около 100 кOм. Если же RST имеет ак тивный низкий уровень, то подтягивающий резистор подключен к шине питания. Напри мер, в микроконтроллерах P89LPC9XX значение этого подтягивающего резистора, подклю ченного к шине питания, составляет около 20 кOм. Кроме того, поскольку вывод RST является входом, его можно либо непосредственно со единять с шиной питания или общим проводом, либо управлять им двухтактным сигналом (который имеют все современные микросхемы (логики) и который еще называют пушпульным — от английских слов «push» и «pull»).
27
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Необходимо отметить, что вывод RST в микроконтроллере является основным. Это озна чает, что он используется как при запуске и сбросе микроконтроллера, так и при его програм мировании. При программировании микроконтроллера по ISP (по RS232) используется еще один до полнительный вывод, при подаче на который определенного сигнала микроконтроллер пере водится в режим программирования. Иногда этот сигнал используется не самостоятельно, а совместно с сигналом, поданным на вывод RST (т. е. перевод микроконтроллера в режим ISP производится путем манипулирования уровнями и длительностью обоих сигналов). В микроконтроллерах MSC12XX, ADUC8XX и AT89C51ED2(RD2) таким вторым выводом является вывод PSEN, одно из назначений которого — управлять микросхемами внешней памяти программ. В этом случае вывод PSEN является уже не входом, а выходом, т. е. он «сам» подает определенные сигналы на упомянутые микросхемы. В этих трех семействах микроконтроллеров вывод PSEN соединен с внутренним подтягивающим резистором номи налом около 10 кOм, подключенным к шине питания. Свойство PSEN являться выходом не позволяет ни непосредственно соединять его с шиной питания или общим проводом, ни управлять им двухтактным сигналом (в некоторых случаях, когда двухтактный сигнал не очень мощный, т. е. когда ток такого сигнала не превышает нескольких мА в состоянии лог. 0 и 1÷2 мА в состоянии лог. 1, такое управление допускается). Для подачи на этот вывод уровня лог. 0 необходимо к нему подключить резистор номиналом в 1 кOм, соединенный с «землей». Для подачи уровня лог. 1 вывод PSEN можно либо просто оставить свободным (напомню, что у него есть собственный подтягивающий к шине питания резистор), либо со единить с шиной питания через высокоомный резистор. Для соблюдения необходимых вре менных соотношений (иногда с точностью до 1 мкс) при манипулировании сигналом на вы воде PSEN этот высокоомный резистор не должен превышать 10÷100 кOм, чтобы не затя гивать длительности фронтов и спадов (свыше, например, 1 мкс). В идеале резистор должен быть около 10 кOм. Для перевода микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) в режим ISP вывод PSEN должен находиться в состоянии лог. 0. В штат ном режиме работы PSEN должен оставаться в лог. 1. В микроконтроллерах семейства P89LPC9XX вторым выводом, предназначенным для перевода микроконтроллера в режим программирования, является вывод питания Vdd. В связи с тем, что потребление тока у этих микроконтроллеров достаточно низкое (не бо лее 3 мА), этим выводом можно легко манипулировать обычным двухтактным сигналом, либо оставлять свободным или соединять непосредственно с общим проводом (выклю чать), либо подключать к шине питания (включать). Необходимо только помнить, что подк лючение к шине питания должно осуществляться с помощью электронного компонента с достаточно низким сопротивлением (несколько Ом), чтобы напряжение питания остава лось в норме (около 3 В). Для таких целей идеально подходят обычные маломощные KMOП транзисторы (например, BS250 или 2N7000, о которых было упомянуто ранее). Можно так же использовать коммутатор DG419. Поскольку микроконтроллеры семейства C8051FXX не используют интерфейс RS232 для целей ISP (для этих целей используются два интерфейса: C2 или JTAG), по интерфейсу RS232 можно управлять только их выводом RST — для сброса и запуска. Теперь несколько слов об управляющих сигналах в интерфейсе RS232 компьютера. Напомню (см. приложение 1), что порт RS232 (например COM 1) компьютера имеет только 2 выходных линии (DTR и RTS), состояниями сигналов на которых можно управлять программно, записывая необходимые биты в порт управления с адресом 3fch. Причем 0й бит управляет состоянием сигнала на линии DTR, а 1й бит — на линии RTS. Если, например,
28
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
значение регистра управления 3fch равно 0, то линии DTR и RTS сброшены, т. е. находятся в состоянии лог. 0 и (обe) имеют потенциалы в –10 В. Записав, например, в порт 3fch единицу, получим: DTR=+10 В, RTS=–10 В. Начальные состояния линий DTR и RТS — сброшенные, т. е. при включении компьютера и загрузке в него той или иной операционной системы DTR=RTS=–10 В. Для управления выводами RST и PSEN семейств микроконтроллеров MSC12XX, ADUC8XX и AT89C51ED2(RD2) и выводами RST и Vdd семейств микроконтроллеров P89LPC9XX и C8051FXXX (только RST) можно (и нужно) использовать сигналы линий DTR и RTS. Причем при составлении схем сопряжения необходимо «подгадать» таким образом, чтобы при включении компьютера все (из рассматриваемых) микроконтроллеры находились в состоянии сброса, вывод PSEN у семейств MSC12XX, ADUC8XX и AT89C51ED2 находился бы в состоянии лог. 1 (штатный режим работы), а питание (вывод Vdd) у семейств P89LPC9XX было бы включено (также штатный режим). Для управления выводом RST лучше всего использовать сигнал DTR (т. к. для управле ния им используется самый младший бит регистра управления), а для PSEN или Vdd — сиг нал RTS. Тогда, например, для запуска микроконтроллеров достаточно записать в регистр 3fch единицу. И вообще, для манипулирования выводами RST, PSEN или Vdd достаточно записы вать в регистр управления ту или иную комбинацию из нулей и единиц (а их, понятно, четыре: в двоичном виде — 00; 01; 10 и 11, в шестнадцатеричном — 0; 1; 2 и 3). Итак, подытожим все вышесказанное по поводу управления состояниями микроконтрол леров с помощью интерфейса RS232 компьютера. 1. В начальном состоянии интерфейса RS232 (линии DTR и RТS сброшены, т. е. находятся под потенциалами в –10 В) микроконтроллеры должны находиться в сброшенном сос тоянии (RST микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) должен быть в состоянии лог. 1, т. е. под потенциалом питания (3 или 5 В), а RST семейств микроконтроллеров P89LPC9XX и C8051FXXX — в состоянии лог. 0, т. е. под потенциалом в 0 В. Кроме того, вывод PSEN микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) должен быть в состоянии лог. 1, т. е., например, подключаться к шине питания через резистор номиналом в 10 кОм, а питание (вывод Vdd) семейств микроконтроллеров P89LPC9XX должно быть включено. Такое состояние микроконт роллеров является состоянием сброса. Оно должно предшествовать запуску микроко нтроллеров в работу. 2. Для запуска микроконтроллеров в штатный режим работы линию DTR необходимо установить в состояние лог. 1 (+10 В). При этом вывод RST микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) должен установиться в состояние лог. 0 (0 В), а вывод RST микроконтроллеров семейств P89LPC9XX и C8051FXXX — в состо яние лог. 1 (+3 В). Кроме того, вывод PSEN микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2) должен оставаться в состоянии лог. 1, т. е. оставаться подключенным к шине питания через резистор номиналом в 10 кОм, а питание микро контроллеров семейств P89LPC9XX должно оставаться включенным (Vdd=+3 В). 3. Для остановки микроконтроллеров их состояние, а также состояние линий DTR и RTS, должно соответствовать п. 1 (состоянию сброса). 4. Переключение микроконтроллеров в состояние программирования должно осу ществляться путем манипулирования сигналами DTR и RTS. Эти сигналы, в свою
29
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
очередь, должны управлять сигналами на выводах RST, PSEN и Vdd соответству ющих микроконтроллеров согласно их спецификации программирования в ре жиме ISP, т. е. устанавливать на выводах микроконтроллеров соответствующие потенциалы согласно приведенным в описаниях на микроконтроллеры времен ным диаграммам. Перевод микроконтроллеров в режим ISP должен осуществляться из состояния сброса (п. 1). Таким образом, схемы формирования соответствующих сигналов на выводах микро контроллеров с помощью линий управления DTR и RTS и сами схемы сопряжения микро контроллеров с компьютером должны быть составлены так, чтобы удовлетворялись все 4 пункта.
1.3.3. Схемы формирования сигналов RST и PSEN для микроконтроллеров семейств MSC12XX, ADUC8XX и AT8951ED2(RD2) Рис. 1.3.3.1. Схемы формирования сигнала RST
Рис. 1.3.3.2. Схемы формирования сигнала RSEN
30
Свойства приведенных ранее КМОПтранзисторов и микросхемы DG419 являться приемниками RS232 могут быть использованы в практичес ких приложениях для формирования сиг налов запуска и остановки микроконт роллеров, а также для программирова ния микроконтроллеров в режиме ISP. На рис. 1.3.3.1,а приведены 2 аль тернативные схемы управления сиг налом на выводе RST, а на рис. 1.3.3.2 — 2 альтернативные схемы управле ния сигналом PSEN микроконтролле ров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2). Принципы их функ ционирования достаточно просты и в комментариях не нуждаются, а досто инства и недостатки сводятся к следу ющему. На рис. 1.3.3.1,а показана одна из альтернативных схем управления сигна лом RST с помощью сигнала DTR. Из схе мы видно, что для формирования сигна ла RST в соответствии с пп. 1÷4 (см. п. 1.3.2) достаточно сигнал DTR «пропус тить» через стандартный приемник RS232, обладающий инвертирующими свойствами и имеющий двухтактный вы ход. Эта схема наиболее проста, не со держит ни одного дополнительного ком понента и рекомендуется к применению.
Схема (рис. 1.3.3.1,б) может быть использована, если приемник RS232 либо занят други ми функциями, либо отсутствует вовсе. На рис. 1.3.3.2 показаны две альтернативные схемы формирования сигнала PSEN. Схема вверху (а) более предпочтительна, т. к. сигнал PSEN, сформированный ею, более помехозащи щен; кроме того, эта схема имеет более высокое быстродействие. Оба эти свойства определя ются тем, что, с одной стороны, сигнал PSEN (в одном из состояний) соединен с резистором но миналом в 10 кOм, с другой — высоким быстродействием коммутатора DG419. Схема внизу (б) более дешева, но менее «поворотлива», т. к. резистор 100 кOм несколько затягивает вре мя спада сигнала. Обе схемы удовлетворяют условиям пп. 1÷4 (1.3.2).
1.3.4. Схемы формирования сигналов RST и Vdd для микроконтроллеров семейств P89LPC9XX и C8051FXXX На рис. 1.3.4.1 приведены две альтернативные схемы управления сигналом на выводе RST (для P89LPC9XX и C8051FXXX), а на рис. 1.3.4.2 — две альтернативные схемы управления сигналом Vdd микроконтроллеров семейств P89LPC9XX. Принципы их функционирования дос таточно просты, а достоинства и недостатки сводятся к следующему. Рис. 1.3.4.1. Схемы формирования сигнала RST
Рис. 1.3.4.2.
Две схемы (рис. 1.3.4.1,а) на базе Схемы формирования сигнала Vdd КМОПтранзисторов обратной (2N7000) и прямой (BS250) проводимости имеют дос таточное быстродействие, очень просты, дешевы, но потребляют ток около 3 мА (ко торый проходит через резистор R1 при включении транзистора). Эти схемы могут быть рекомендованы, если нет ограниче ний на потребляемую энергию. Схема внизу (рис. 1.3.4.1,б) имеет бо лее высокое быстродействие, практически не потребляет энергии, т. к. выходной сиг нал (RST) двухтактный, но несколько громоздка и дорога. Схема, показанная на рис. 1.3.4.2,а, обладает достаточным быстродействием, очень прос та и дешева, имеет низкое сопротивление при включении питания (менее 10 Ом), но и повы шенное потребление энергии, т. к. резистор R2 параллелен нагрузке (а это вход Vdd микроко нтроллера) и через него проходит дополнительный ток в 3 мА. При необходимости резистор R2
31
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
можно удалить; в этом случае нагрузкой схемы будет сам микроконтроллер, ток потребления которого в активном режиме составляет не менее 3 мА. Однако если микроконтроллер будет переведен в «спящий» режим, его ток потребления намного снизится; это приведет к соответ ствующему увеличению внутреннего сопротивления (которое в этом случае может составить десятки KOм), что, в свою очередь, может привести к значительному затягиванию времени включения и выключения транзистора Т1. Все же схема (рис. 1.3.4.2,а) может быть рекомендована к применению, т. к. манипуляция с включением и выключением питания микроконтроллера (Vdd) в основном используется для его программирования (в режиме ISP). В штатном же режиме работы микроконтроллера его питание Vdd должно быть всегда включено (независимо от того, в каком состоянии находится вывод RST). Схема, показанная на рис. 1.3.4.2,б, имеет высокое быстродействие, низкое потреб ление энергии и не зависит от потребления тока микроконтроллером. Схема более дорога и громоздка. Сопротивление в открытом состоянии коммутатора (20 Ом) в два раза выше, чем у транзистора на схеме вверху (рис. 1.3.4.2,а). Эта схема может быть рекомендована к применению, если есть ограничение на потребляемую энергию.
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
Рис. 1.3.5.1. Схема сопряжения микроконтроллеров семейства MSC12XX с компьютером по интерфейсу RS232 для целей программи! рования в режиме ISP и штатного режима работы
*** Теперь читателю, «вооруженному» вышеизложенной информацией по поводу всех этих сиг налов 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
рые подаются на разъем соответственно с выводов P1.0, P1.1, P1.2 и P1.3 микроконтроллера. Этот разъем и соответствующие сигналы предназначены для программирования микроконт роллеров семейства P89LPC9XX в режиме внутрисхемного программирования (ICP) с помощью микроконтроллера MSC1210. Более подробно — см. далее (1.3.7). Схема (рис. 1.3.5.1) вручную смакетирована на плате (рис. 1.3.5.2). Микроконтроллер MSC1210 распаен на платепереходнике (вариант еe разводки приведен в [4], a внешний вид — на рис. 1.3.5.3), которая вставлена в панельку PGA64. Забегая немного вперед, отметим, что на этой же фотографии можно увидеть еще одну панельку PGA64 (показанную нижней стрелкой), в которую вставляется платапереходник с микроконтроллером ADUC847. Разъем IDC6 (X2 на рис. 1.3.5.1) для подключения кабеля сопряжения с платой ICP микроконтролеров Р89LPC9XX на фотографии (рис. 1.3.5.2) показан верхней стрелкой.
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
1.3.6. Сопряжение микроконтроллеров семейства ADUC8XX с компьютером Рассмотрим схему сопряжения микроконтроллеров семейства ADUC8XX с компьютером по интерфейсу RS232 для целей ISP и штатного режима работы (рис. 1.3.6.1). Из схемы видно, Рис. 1.3.6.1. Схема сопряжения микроконтроллеров семей! ства ADUC8XX с компьютером по интерфейсу RS232 для целей программирования в режиме ISP и штатного режима работы
Рис. 1.3.5.2. Фотография макетной платы схемы сопряжения для микроконтроллера MSC1210
Рис. 1.3.5.3. Фотография платы! переходника для микроконтроллера MSC1210 (корпус TQFP64)
34
35
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
что по формированию сигналов RST и PSEN схема сопряжения микроконтроллеров семейств ADUC8XX полностью аналогична схеме для микроконтроллеров семейств MSC12XX, поэтому подробно останавливаться на ней не будем. Отметим только, что на эту схему будем ссылаться при обсуждении поддерживающего ее программного обеспечения. На рис. 1.3.6.2 показана та же макетная плата (что и на рис. 1.3.5.2), но уже со вставлен ной платойпереходником с микроконтроллером ADUC847; внешний вид платыпереходника с микроконтроллером ADUC847 показан на рис. 1.3.6.3, с микроконтроллером ADUC834 — на рис. 1.3.6.4.
Рис. 1.3.6.4. Фотография платы! переходника для микроконтроллера ADUC834
Рис. 1.3.6.2. Фотография макетной платы схемы сопряжения микроконтроллера ADUC847
1.3.7. Сопряжение микроконтроллеров AT89C51ED2(RD2) с компьютером
Рис. 1.3.6.3. Фотография платы!переходника для микроконтроллера ADUC847
Из приведенной на рис. 1.3.7.1 схемы сопряжения микроконтроллеров семейства AT89C51ED2/RD2 с компьютером по интерфейсу RS232 для целей ISP и штатного режима работы видно, что по формированию сигналов RST и PSEN она полностью аналогична схеме для мик роконтроллеров семейств MSC12XX, поэтому подробно останавливаться на ней не будем. От метим только, что на эту схему мы будем ссылаться при обсуждении поддерживающего ее программного обеспечения. Фотография макетной платы схемы сопряжения микроконтроллера 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
Рис. 1.3.7.1. Схема сопряжения мик! роконтроллеров семей! ства AT89C51ED2/RD2 с компьютером по интерфейсу RS232 для целей программиро! вания в режиме ISP и штатного режима работы
нает интерфейс SPI (разница в том, что в SPI входные (MISO) и выходные (MOSI) данные «раз несены») и в точности соответствует синхронному режиму работы UART 51совместимого мик роконтроллера. Такой интерфейс (C2) имеют все микроконтроллеры семейства P89LPC9XX (кроме P89LPC932). Справедливости ради отметим, что микроконтроллеры семейств ADUC8XX и MSC12XX также снабжены подобным интерфейсом, но информация о нем для этих микроконтроллерах закрыта и предназначена для коммерческих эмуляторовпрограммато ров. Такой же интерфейс имеют некоторые микроконтроллеры C8051FXX (например C8051F330) от ф. Silicon Laboratories (информация открыта). Программирование некоторых «маленьких» (8ножечных) микроконтроллеров от ф. Philips (P89LPC90X) возможно только в режиме ICP, т. е. только по такому же интерфейсу (C2). И хотя подобный интерфейс непосред ственно никак не связан с интерфейсом RS232, автор счел необходимым привести пример программирования микроконтроллеров P89LPC9XX в режиме ICP по 3 причинам.
38
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
Рис. 1.3.7.2 Фотография макетной платы схемы сопряжения микроконтроллера AT89C51ED2 с компьютером по интерфейсу RS232 для целей ISP и штатного режима работы
Вопервых, хотя микроконтроллеры семейств P89LPC90X и «маленькие», они об ладают уникальными свойствами, среди которых: очень высокое быстродей ствие (2 такта на цикл); встроенный 10разрядный АЦП (P89LPC904); встроен ный 24разрядный системный таймер; возможность настроить выходной сигнал с порта на три типа выхода: стандартный, двухтактный (пушпульный) и с открытым стоком; кроме того, это семейство микроконтроллеров отличается крошечными габаритами (в SOIC корпусах) и потребляет уникально мало энергии (буквы LP — Low Power в названии микроконтроллера отражают это свойство). Вовторых, более мощные микроконтроллеры семейства P89LPC9XX, помимо интер фейса RS232 для ISP, имеют такoй же интерфейс (C2), и грех было бы не запрограм мировать микроконтроллер по такому интерфейсу, тем более что возможности прог раммирования этих микроконтроллеров в режиме ICP гораздо шире, чем в режиме ISP (см. описание на ICP и ISP для микроконтроллеров семейств P89LPC9XX). Втретьих (и это основная причина), на примере программирования микроконтроллеров семейства P89LPC9XX в режиме ICP с помощью микроконтроллера, сопряженного с компьютером по интерфейсу RS232 (например того же P89LPC938 или MSC1210), авто ром будут продемонстрированы свойства нового алгоритма обмена по интерфейсу RS232 уже для практических целей. Этот алгоритм разработан автором и приведен в первой части книги [4]. Его основное свой ство заключается в синхронизации каждого байта аппаратным способом, но не с помощью ли ний квитирования DTRDSR или RTSCTS (стандартного аппаратного способа), а с помощью ли ний данных TxD и RxD. В отличие от известного программного способа синхронизации XONXOFF (он также производится с помощью линий данных TxD и RxD) аппаратный способ синхрониза ции обладает несомненным преимуществом. Это преимущество заключается в высокой надеж ности обмена, что особенно важно на больших скоростях (например, 115 200 бод). Недостаток стандартного аппаратного способа синхронизации обмена по интерфейсу RS232 состоит в необ
39
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Рис. 1.3.8.1. Схема сопряжения микроконтроллера P89LPC938 с компьютером по интерфейсу RS232 для целей программирования в режиме ISP и штатного режима работы. (Штатный режим работы P89LPC938 может быть использован для программирования микроконтроллеров семейств P89LPC9XX в режиме ICP (плата ICP)
40
ходимости использования самих линий квитирова ния (DTRDSR или RTSCTS). Использовать же ли нии квитирования нежелательно по двум причи нам: вопервых, при сопряжении микроконтролле ра с компьютером линии квитирования заняты и используются для других целей (см. 1.3.2, пп. 1÷4), вовторых, даже безотносительно к то му, заняты ли линии квитирования или нет, для синхронизации они должны использоваться, а это дополнительные провода. Если осуществляется сопряжение компьютера с микроконтроллером с использованием общей «земли», т. е. они связаны гальванически , то лишние 2 провода осо бого значения не имеют (хотя и это не всегда так). Но если для связи используются гальванически развязанный интерфейс RS232 (о гальванических развязках речь будет идти впереди), то для каждой линии квитирования необходима своя гальвани ческая развязка; в этом случае схема сопряжения микроконтроллера с компьютером значительно усложняется. Использование же линий данных (TxD и RxD) для аппаратной синхронизации с одной стороны не требует дополнительных проводов (в т. ч. гальванических развязок) при осуществле нии обмена данными, с другой — позволяет произ водить обмен с теми же надежностью и скоростью, свойственными аппаратному способу синхрониза ции. Более подробно о самом алгоритме аппарат ной синхронизации обмена написано в [4]; кроме того, необходимые подробные пояснения будут также даны, когда будут рассматриваться програм мы обмена, использующие такую аппаратную синх ронизацию с помощью линий данных TxD и RxD. Вышеуказанные 3 причины и привели к необходимости конструирования автором двух следующих макетных плат (рис. 1.3.8.1 и 1.3.8.2). Как можно увидеть из схемы сопряжения микроконтроллера P89LPC938 с компьютером по интерфейсу RS232 (рис. 1.3.8.1), для формиро вания сигнала RST используется интерфейсный сигнал DTR, который, «пройдя» через приемник микросхемы преобразователя ADM231L (DD1, выводы 9,10), попадает на затвор КМОПтран зистора прямой проводимости BS250 (T2). Сток транзистора соединен с выводом RST микроконт роллера P89LPC938 (DD2).
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
Для формирования сигнала питания Vdd используется сигнал RTS, который напрямую по дается на затвор такого же транзистора (Т1). Сток транзистора T1 соединен с выводом Vdd микроконтроллера. Ранее уже обсуждались 2 вышеуказанные схемы формирования сигналов RST и Vdd (см. рис. 1.3.4.1,а и 1.3.4.2,а), поэтому не должно возникнуть какихлибо неяснос тей или затруднений в понятии принципа их функционирования. Остальные два передатчика и приемник преобразователя ADM231L используются для сопря жения линий данных микроконтроллера 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 с размахом около ±10 В. Максимальная скорость обмена преобразователя ADM231L составляет около 230 кбод, поэтому на скорости в 115 200 бод он работает безукоризненно. В качестве источника питания +3,3 В используется малопотребляющий стабилизатор LP2950Z3.3 (DA1). Для программирования микроконтроллеров семейств P89LPC9XX в режиме ICP с помощью микроконтроллера P89LPC938 на плате предусмотрен 6–контактный разъем типа IDC6 (X2), на который подаются сигналы PDA и PCL (обсуждавшиеся ранее), сигнал VddT, предназначенный для управления включением/выключением питания Vdd программируемого микроконтролле ра, и сигнал RSTT, предназначенный для управления его выводом RST. Все 4 сигнала (PDA, PCL, VddT и RSTT) формируются микроконтроллером P89LPC938 (DD2). Кроме сигналов управления, на разъем X2 подается питание (+3,3 В, контакт № 3) и «зем ля» (контакт № 1). На этой схеме можно заметить «маленький» микроконтроллер P89LPC904 (DD3), кото рый сопряжен с компьютером аналогично микроконтроллеру P89LPC938 (DD2). Это сдела но с целью проверки на работоспособность записанной в него тестовой программы обмена по RS232. Микроконтроллер P89LPC938 (DD2) установлен в панельку PLCC28, а микроконт роллер P89LPC904 — в панельку DIP8. Сигналы с линий интерфейса RS232 подаются на плату через разъем IDC10 (X1). Из схемы сопряжения микроконтроллеров P89LPC938 и P89LPC904 с интерфейсом C2 (рис. 1.3.8.2), предназначенной для программирования микроконтроллеров в режиме ICP, видно, что сигналы с линий интерфейса C2 (PCL, PDA, RSTT), а также питания (+3,3 В) и «земли» с разъема IDC6P (X1), попадают на соответствующие им выводы микроконтрол Рис. 1.3.8.2. Схема платы ICP для микроконтрол! леров P89LPC93X и P89LPC90X
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 микроконтроллера MSC12XX, сопряженной кабелем связи с платой ICP для микроконтролле! ров семейств P89LPC9XX (плата показана в прямо! угольнике, очерченном пунктиром)
Рис. 1.3.8.3. Схема кабеля связи платы ISP с платой ICP
На рис. 1.3.8.4 показаны фотографии общего вида двух плат, сопряженных между собой кабелем связи. Здесь необходимо добавить следующее. Плата ICP для P89LPC9XX может ис пользоваться совместно как с вышеописанной платой ISP для P89LPC93X, так и с другими микроконтроллерами. Если, например, разработчик имеет дело с микроконтроллерами се мейства MSC12XX, и ему необходимо запрограммировать микроконтроллер семейства P89LPC9XX, то на макетной плате, на которой установлен, например, микроконтроллер MSC1210 достаточно установить разъем IDC6P (X2 на рис. 1.3.5.1) и соединить соответству ющие сигналы разъема с портами микроконтроллера MSC1210 (см. схему на рис. 1.3.5.1). Далее соединить обе платы кабелем связи (по рис. 1.3.8.3). В этом случае необходимость в макетной плате ISP (рис. 1.3.8.1) отпадает.
Рис. 1.3.8.4. Фотография плат: а — ICP для микроконт! роллеров P89LPC93X и P89LPC90X; б — ISP для микроконт! роллеров семейств P89LPC93X (Эти две платы условно разделены пунктиром.) а)
б)
На рис. 1.3.8.5 показан общий вид платы ISP для микроконтроллера MSC12XX, сопряжен ной с платой ICP для микроконтроллеров семейств P89LPC9XX кабелем связи. На схемы плат ISP и ICP в дальнейшем мы будем ссылаться при обсуждении программных средствах для мик роконтроллеров семейств P89LPC9XX. Кроме того, будут приведены программы для микроко нтроллера MSC1210 (для него самого — программа для микроконтроллера и для его сопряже ния с компьютером по интерфейсу RS232 — программа для компьютера), с помощью которых можно запрограммировать микроконтроллеры семейства P89LPC9XX в режиме ICP непосре дственно с компьютера.
42
1.3.9. Сопряжение микроконтроллеров семейств C8051FXXX с компьютером Для программирования микроконтроллеров C8051F067 и C8051F330D с компьюте ром в режиме ISP и штатном режиме работы (рис. 1.3.9.1) используется USBDEBUG адаптер, который сопряжен с микроконтроллером C8051F067 по интерфейсу JTAG, а с микроконтроллером C8051F330D — по интерфейсу C2. С компьютером USBDEBUG адаптер сопрягается по интерфейсу USB. Кроме того, микроконтроллеры сопряжены с компьютером еще и по интерфейсу RS232, который предназначен только для штатного режима их работы. Сопряжение микроконтроллеров с USBDEBUGадаптером организовано следую щим образом. На плате установлен 10контактный разъем IDC10P — X2(JTAG/C2), к которому подключается ответный разъем IDC10M, расположенный на конце кабеля сопряжения USBDEBUGадаптера с микроконтроллерами. На разъем X2(JTAG/C2) из USBDEBUG адаптера приходят следующие сигналы: TCK/C2DAT (4й контакт), TMS (5й контакт), TDO (6й контакт) и TDI/C2CK (7й контакт). Контакты 2, 3 и 9 — «земляные», а 1, 8 и 10 не используются. На плате расположены три 3штырьковых разъема: P1, P2 и P3, на каждом из кото рых присутствует снимаемая двухконтактная перемычка (джампер, как его сейчас назы вают), предназначенная для переключения режима работы USBDEBUGадаптера. При замыкании контактов 2–3 на всех 3 разъемах (P1, P2 и P3) организуется режим работы по интерфейсу JTAG, предназначенному для программирования микроконтрол лера C8051F067. При этом сигнал TCK/C2DAT с разъема X2(JTAG/C2) попадает на ли нию (связь) TCK67, сигнал TMS — на TMS67 и сигнал TDI/C2CK — на TDI67. Необходи мо отметить, что линия TCK67 содержит подтягивающий к шине питания резистор R5. Кроме того, сигнал TDO с разъема X2(JTAG/C2) напрямую (без переключения) попадает на линию (связь) TDO67.
43
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Рис. 1.3.9.1 Схема сопряжения микроконтролле! ров C8051F067 и C8051F330D с компьютером для программиро! вания в режимах ISP и штатном
Линии TCK67, TMS67, TDI67 и TDO67 подключены соответственно к выводам TCK, TMS, TDI и TDO микроконтроллера C8051F067. Таким образом и организуется сопряжение USB DEBUGадаптера с микроконтроллером C8051F067. При замыкании контактов 1–2 на всех 3 разъемах (P1, P2 и P3) организуется ре жим работы по интерфейсу C2, предназначенному для программирования микроконт роллера C8051F330D. При этом из 2 сигналов (TCK/C2DAT и TDO), поступающих с разъ ема X2(JTAG/C2) соответственно на 2е контакты разъемов P1 и P2, с помощью резис тора R3 формируется один сигнал C2D. Этот сигнал по одноименной линии (C2D) попа дает на вход P2.0/C2D микроконтроллера C8051F330D. Сигнал TDI/C2CK, поступаю щий с разъема X2(JTAG/C2) на 2й контакт разъема P3, попадает на линию (связь) RST/C2CLK. Для переключения режимов работы обоих микроконтроллеров (программирова ние/штатный режим работы) на плате предусмотрен 3контактный разъем P4, также снабжен ный джампером. При соединении джампером контактов 2 и 3 разъема P4 организуется режим программирования. При этом сигнал RST/C2CLK, поступающий с разъема P3 на разъем P4,
44
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ 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) интерфейс организован аналогично схе мам, приведенным ранее и предназначенным для других микроконтроллеров. Но есть и неко торые отличия. Сигнал с линии TxD интерфейса RS232 компьютера поступает на вход приемника преобразователя ADM231L (DD1) — выводы 5 и 6. На выходе приемника формируется сигнал RXDM, который по одноименной связи попадает на входы приемников RS232— P0.1/RxD0 и P0.5/RxD соответственно микроконтроллеров C8051F067 и C8051F330D. Здесь ничего нового нет, и эта связь (т. е. передача информации от компьютера к микро контроллеру) ничем не отличается от всех предыдущих схем. Передача информации в об ратную сторону (т. е. от микроконтроллера к компьютеру) организована иначе и нуждает ся в некотором пояснении. Дело в том, что, как уже было упомянуто, все микроконтроллеры семейства C8051XXX не позволяют использовать вывод порта, занятый альтернативной функцией, как стандартный выход порта, если эта функция задействована (включена). Применитель но к линии TxD микроконтроллера это означает, что при установке бита разрешения использо вания интерфейса RS232 (битa UARTenable) вывод TxD уже нельзя устанавливать в произ вольное состояние программно. Другими словами, команды Си (TXD=0 или TXD=1) или коман
45
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ды ассемблера (setb TxD или clr TxD) не дадут никакого эффекта: сигнал порта останется в состоянии лог. 1. Сигнал на линии TxD будет изменяться, только если стандартным образом вывести какойлибо байт (например латинскую букву «A») по RS232 (на Си — SBUF=0x41, на ассемблере — mov SBUF, #41h). Это очень серьезное упущение фирмы Cygnal. Похожее свойство, но диаметрально противоположное существует в интерфейсе RS232 компьютера. Там нельзя прочитать состояние линии RxD интерфейса (лог. 1 или лог. 0), поэтому для обеспечения аппаратной синхронизации линиями данных (об этом уже не раз упо миналось) линию RxD в интерфейсе компьютера необходимо соединить с какойлибо входной линией квитирования (например с DSR). В этом случае, прочитав состояние линии DSR, мож но получить состояние линии RxD. Если посмотреть на практически любую предыдущую схему сопряжения микроконтролле ра с интерфейсом RS232 (в т. ч. на рис. 1.3.9.1), то можно заметить, что линия TxDM подклю чена сразу ко входам 2 передатчиков преобразователя RS232 (7й, 4й и 8й, 11й выводы микросхемы D1), выход одного из которых подключен к линии RxD, а выход второго — к линии DSR). Этим и обеспечивается возможность чтения состояния линии RxD. Кстати, состояние ли нии RxD микроконтроллеров семейства C8051FXXX, слава богу, прочитать можно независимо от того, выбран ли UART или нет. Хоть здесь не возникает проблем. Необходимо отметить, что возможность управления состоянием линии TxD программно присутствует во всех встречавшихся автору микроконтроллерах (кроме C8051FXXX). Поскольку программным способом данную проблему не решить, необходимо приме нить аппаратные средства. Для этого вспомним, что исходное состояние линии TxD мик роконтроллера перед передачей байта и конечное ее состояние после окончания переда чи байта — единичное (лог. 1). Передача начинается со стартового бита (лог. 0), затем следуют биты данных; заканчивается передача стоповыми битами (лог. 1). Таким обра зом, передача байта осуществляется (в том числе) «нулями». Если использовать еще одну линию микроконтроллера в качестве линии TxD*, то, подключив обе линии к 2входовому элементу «ИЛИ по нулям», на выходе такого элемента можно получить требуемое: при лог. 1 на выходе TxD (т. е. в отсутствии передачи байта), управляя линией TxD*, можно получить на выходе такого элемента точную копию состояния линии TxD*. С другой стороны, при лог. 1 на линии TxD* при передаче байта по линии TxD на выходе этого же 2входового элемента получим точную копию состояния линии TxD (т. е. передача байта будет происхо дить стандартным образом). Из теории конечных автоматов известно, что 2входовый элемент ИЛИ, управляемый ну левыми (инверсными) уровнями, преобразуется (конвертируется) в 2входовый элемент И. Это свойство отображено на рис. 1.3.9.1 в рамке, очерченной пунктиром, на примере 2вхо дового элемента И микросхемы 74AHC1G08. Решение излагаемой проблемы представлено верхним 2входовым элементом И, к одному из входов которого подключены «родные» сигна лы TxD (TxD067 и TxD330), а к другому — дополнительные TxD* (Tx0067 и Tx0330), обозначен ные так соответственно для микроконтроллеров C8051F067 и C8051F330D. Сигнал TxD067 по одноименной линии подключен к выводу P0.0/TxD0, сигнал Tx0067 — к выводу P0.2 мик роконтроллера C8051F067. Сигнал TxD330 подключен к выводу P0.4/TxD и сигнал Tx0330 — к выводу P1.7 микроконтроллера C8051F330D. Выход элемента 2И — сигнал TxDM, который проходит по одноименной линии и попадает на входы двух передатчиков преобразователя ADM231L (DD1). Если требуется сверхминиатюризация, то можно, конечно, использовать микросхему 74AHC1G08, т. к. она имеет миниатюрный корпус SOT235. Но для целей макетирования про
46
ПРИМЕРЫ ПРИМЕНЕНИЯ НОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ ДЛЯ СОПРЯЖЕНИЯ МИКРОКОНТРОЛЛЕРОВ С КОМПЬЮТЕРОМ ПО ИНТЕРФЕЙСУ RS232
ще использовать обычную микросхему 2входового элемента И (2И) (например SN74HC08) в DIPкорпусе либо элемент 2И–НЕ с последующим инвертированием. У автора «под рукой» ока залась подобная микросхема, правда, с триггером Шмитта (уж он «картину не испортит») — SN74HC132, которая и приведена на схеме (рис. 1.3.9.1). Для индикации работы схема оснащена светодиодом LD1. Схема питается напряже нием +12 В, которое подается на двухконтактный разъем P5 и непосредственно под ключается к преобразователю ADM231L. Остальные компоненты схемы питаются напря жением +3,3 В, для чего в схеме предусмотрен стабилизатор LP2950Z3.3 (DA1). Анало говое питание микроконтроллера C8051F067 (+3,3 А) соединяется с цифровым (+3,3) в одной точке перемычкой, обозначенной резистором R6 номиналом 0 Ом. Аналогично с помощью перемычки R7 соединяется аналоговая и цифровая «земля» этого микроконт роллера. Остальные элементы схемы, по мнению автора, в комментариях не нуждаются. На эту схему (рис. 1.3.9.1) в дальнейшем будем ссылаться при обсуждении поддерживаю щего ее программного обеспечения. Необходимо добавить, что существует вариант микросхемы микроконтроллера C8051F330 в корпусе DIP24. Такая микросхема имеет маркировку C8051F330P. По внутрен ней структуре эта микросхема полностью идентична микросхеме C8051F330D (DIP20) и отли чается от нее только разводкой выводов (рис. 1.3.9.2). При этом дополнительные 4 вывода в микросхеме C8051F330P не используются (NC). Рис. 1.3.9.2 Разводка выводов («цоколевка») микроконтроллера C8051F330P
На фотографии макетной платы схемы сопряжения микроконтроллеров C8051F067 и C8051F330D с компьютером (рис. 1.3.9.3) верхней большой стрелкой показаны три 3контакт ных разъема (P1, P2 и P3 схемы), служащие для переключения режима JTAGC2, нижней большой стрелкой — 3контактный разъем P4, переключающий режим работы платы: программирова ние/работа. Верхней маленькой стрелкой показан микроконтроллер C8051F330P (DIP24), ниж ней — C8051F330D (DIP20). Эти два микроконтроллера не впаены в плату, а просто поставлены на нее для демонстрации. Установка микроконтроллеров производится в панельку DIP24. Микроконтроллер C8051F330D (DIP20) вставляется в панельку DIP24 таким образом, чтобы 1й вывод микроконтроллера попал во 2й контакт панельки, т. е. она устанавливается в середину панельки. В этом случае выводы микроконтроллера как раз попадают в те контакты панельки, которые используются в схеме (рис. 1.3.9.1). Микроконтроллер C8051F067 вставлен в панельку PGA64. На рис. 1.3.9.4 приведена фотография платыпереходника TQFP64PGA64 с распаенным на ней микроконтроллером C8051F067.
47
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Рис. 1.3.9.3. Фотография макетной платы схемы сопряжения микроконтроллеров C8051F067 и C8051F330D с компьютером
ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232
Рис. 1.3.10. Схема кабеля связи микроконтроллеров с компьютером
1.4. Гальванические развязки для интерфейса RS232 Рис. 1.3.9.4 Фотография платы! переходника TQFP64!PGA64 с микроконтроллером C8051F067
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
Гальванически изолированный интерфейс RS232 применяется во многих устройствах, где по тем или иным причинам либо нежелательно, либо просто невозможно (или опасно) соеди нять напрямую общие цепи «земли» и питания компьютера и самого устройства. Выражение «нежелательно» означает, например, что соединять можно, и компьютер или устройство не выйдет из строя от такого соединения, но устройство будет работать либо некорре ктно, либо с большими сбоями (это не касается сбоев передачи по интерфейсу RS232). Например, если в устройстве применяется микроконтроллер с высокоточным (точнее — высоко чувствительным) АЦП, и это устройство соединяется с компьютером по интерфейсу RS232 напря мую, то такой АЦП может легко «ловить» шумы компьютера, в котором их масса, и передавать в этот компьютер вместо полезного значения измеряемой величины — шум. При этом передача информации по самому интерфейсу будет проходить совершенно без сбоев, и ни устройство, ни компьютер от такого соединения не пострадают. Применительно к системам сбора и обработ ки информации, получаемой с датчиков (а именно на такие применения микроконтроллеров ори ентирована настоящая книга), это означает, что такие системы обязательно должны иметь гальванически изолированный интерфейс RS232. Выражения же «невозможно» или «опасно» означают, что при соединении компьютера с устройством по интерфейсу RS232 без гальванической изоляции может выйти из строя либо само устройство, либо компьютер. Если, например, устройство находится под достаточно высо ким потенциалом по отношению к компьютеру (несколько сот либо даже тысяч вольт), то напря мую соединять устройство с компьютером по интерфейсу RS232 просто нельзя. Причем боль шая разность потенциалов может иметь место либо по необходимости (например, устройство напрямую контактирует с пантографом электровоза, находящегося под напряжением в 5000 В относительно «земли»), либо разность потенциалов может возникнуть не специально (напри мер, компьютер оснащен монитором с ЭЛТ, не заземлен, и на мониторе постепенно накаплива ется высокий электростатический заряд). Часто гальваническую изоляцию осуществляют для обеспечения искробезопасности. Например, требуется периодический съем информации с устройства измерения расхода газа (например пропанбутана), которое находится в его атмос фере. Прямое подключение, а особенно отключение интерфейса (вообще любой разрыв кон тактов) может привести к возникновению искры и, в конечном итоге, — к взрыву. Традиционный способ осуществления гальванической развязки — использование оптро нов. Широко известны недостатки оптронов, которые уже «навязли в зубах», — это низкая ско
49
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
рость обмена, большие токи включения и потребления, необходимость в дополнительных резис торах (для включения светодиода оптрона и для подтяжки выхода к питанию), частые сбои в ра боте, высокая стоимость скоростных оптронов и т. п. С этими недостатками так или иначе «сми рялись», поскольку все равно ничего другого до последнего времени придумано не было (если не считать емкостные развязки типа ISO150 от ф. BurrBrown (TI) стоимостью около 15 долл.). И вот, наконец, появилась возможность отказаться от использования оптронов. На этот раз отличилась ф. Analog Devices. Она выпустила уникальные по своим свойствам гальвани ческие развязки семейства iCoupler. Эти одно и многоканальные развязки (ADUM120X) ис пользуют совершенно иной принцип передачи информации, чем, например, оптроны или ем костные развязки типа ISO150 ф. BurrBrown (TI). В развязках ADUM120X информация пере дается посредством высокочастотного магнитного поля, как в трансформаторных связях. Уни кальность их в том, что эти устройства работают на скоростях от 0 до 25 Мбод(!), при этом потребление энергии на скорости 0,1 Мбод (например 115 кбод) приблизительно в 10(!) раз меньше, чем у стандартного оптрона 6N137. Включение и выключение (т. е. переключение из одного логического состояние в другое) происходит напряжением (или уровнем сигнала, а не током, как в оптроне) с током в несколько микроампер. Эти развязки дешевле оптронов, если исходить из цены на 1 канал передачи. Кроме того, они выпускаются в корпусах SOIC, имеющих достаточно малые габариты. Например, 2канальная развязка с передачей в 2 направлениях ADUM1201AR (0÷1 Mбод, 2,5 долл.) выпускается в корпусе SOIC8 и имеет размер 551 мм. И, наконец, эти развязки не требуют для работы никаких внешних компо нент (как, например, оптроны, которые требуют как минимум по одному резистору во входной и выходной цепях). Сейчас эти микросхемы достаточно доступны. Единственный, по мнению автора, недостаток этих развязок состоит в том, что они рабо тают только с TTLуровнями сигналов и их нельзя напрямую подключать к линиям интерфейса RS232 (как, например, оптроны). Правда, этот недостаток легко преодолим, т. к. существует масса преобразователей интерфейса RS232 (см., например, 1.2.1 и 1.2.2). Кроме того, в не которых случаях, когда не требуется высокая скорость работы (например, для формирования сигналов управления режимом работы микроконтроллера, таких как RST, PSEN и т. п.), для развязок вполне можно использовать достаточно дешевые оптроны. В первой части книги [4] были приведены гальванические развязки, которые питаются энергией от самих линий интерфейса RS232, а также развязки, для питания которых исполь зуются изолированные DCDCпреобразователи. Еще три года назад (2003 г.) единственными реально работающими DCDCпреобразователями для подобных целей были DCDCпреобра зователи семейства DCP05XX или DCR05XX мощностью 1÷2 Вт от ф. BurrBrown (TI) и стои мостью около 10–11 долл. (кстати, цена на них до сих пор так и не изменилась). Поэтому при ходилось использовать их в самых крайних случаях. В большинстве случаев для питания галь ванических развязок автор рекомендовал тогда использовать сами линии интерфейса RS232, т. к. такое питание «бесплатное». Но, как известно, бесплатный сыр бывает только в мышеловках — гальванические развязки с питанием от линий интерфейса имеют много недостатков, перечислять которые очень долго (и не нужно). В последнее время ситуация с качеством и ценой новых DCDCпреобразователей суще ственно изменилась. Появились новые DCDCпреобразователи, которые имеют уровень шу мов в несколько раз (!) ниже, чем у DCR05XX или DCP05XX, и стоимость которых более чем в 2 раза меньше последних. Примером могут служить DCDCпреобразователи RSDXX и RQD–XX мощностью 0,25÷1,0 Вт от ф. Recom им подобные. Энергии этих DCDCконверте ров вполне достаточно для питания даже старых преобразователей интерфейса RS232 (типа
50
ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232
SN75155); она в несколько раз больше, чем требуется для питания стандартных преобразова телей RS232 и на порядок (а то и на два) больше, чем требуется для питания современных пре образователей интерфейса RS232. В связи с этим о питании гальванических развязок для ин терфейса RS232 от самих линий этого интерфейса наконец можно забыть. Во всяком случае, все дальнейшее изложение будет посвящено гальваническим развязкам с питанием от DCDCпреобразователей. Преимущества таких развязок (применительно к интерфейсу RS232) заключаются в следующем: повышенная надежность работы, поскольку размах сигнала на линии RxD компьюте ра может достигать ±10 В и более, т. к. передатчик берет энергию от отдельного источ ника питания; длина кабеля связи может достигать 10÷15 м; развязки проще и занимают меньше места на плате, чем с питанием от линий RS232; высокая предсказуемость и «детерминированность» поведения сигналов, вследствие чего резко снижается вероятность «зависания» компьютера, особенно при работе в ОС Windows; подходят для любых типов компьютеров, в т. ч. имеющих «слаботочный» интерфейс RS232; не создают высокочастотных электромагнитных помех повышенного уровня, поэтому рекомендуются для работы с прецизионными АЦП. В качестве примеров гальванически изолированного интерфейса RS232 с применением DCDCконверторов и развязок ADUM120X будут приведены несколько схем, снабженных небольшими комментариями. Для микросхем в планарных корпусах будут приведены вариан ты разводки платпереходников в корпуса DIP для возможности их легкого макетирования и, кроме того, фотографии самих переходников с распаенными на них микросхемами в порядке возрастания их сложности, качества и соответственно стоимости (по фотографиям еще раз можно будет убедиться в реальности описываемых устройств).
1.4.1. Простой гальванически изолированный интерфейс RS232 на базе микросхем развязки ADUM1201, преобразователя SN75155 и оптронов В схеме сопряжения компьютера с микроконтроллером (например одним из семейств MSC12XX, ADUC8XX и AT89C51ED2/RD2) с помощью гальванически изолированного интер фейса RS232 микроконтроллер показан условно в правой нижней части схемы (рис. 1.4.1.1). В качестве гальванических развязок помимо двунаправленной развязки ADUM1201 (DD2) используются широко известные, легкодоступные и дешевые оптроны H11L1 (DD3) и TLP521 (DD4). В схеме также применена известная высокоскоростная, но малоиспользуемая (изза ее повышенного потребления тока) микросхема одноканаль ного приемопередатчика SN75155 (DD1) от ф. Texas Instruments. Ток потребления час ти схемы со стороны компьютера составляет около 12 мА, из них 11 мА потребляет SN75155. Для питания части схемы со стороны компьютера используется DCDCкон вертер RQD0512 (DD5) от ф. Recom мощностью в 1 Вт, преобразующий входное напря жение +5 В в 2 напряжения: +12 В и –12 В, и выдающий ток по 42 мА на каждое нап ряжение питания (т. е. с лихвой перекрывающий энергию, требующуюся для питания развязки). Микроконтроллер показан схематично; к нему подходят сигналы данных RS232 (TxDM и RxDM) и сигналы управления (RST и PSEN).
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м выводом микросхе
В прямоугольнике, очерченном пунктирной линией, показана схема кабеля связи с компьютером. Линия 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
Рис. 1.4.1.3. Плата!переходник SOIC8DIP8 для развязки ADUM1201: а — фотография; б — процедура «подгибания» ножек микросхемы под ее «дно»
а)
б)
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), то микросхема свобод но умещается на платупереходник и еще даже остается свободное пространство, что намно го упрощает пайку микросхемы. Для того чтобы еще более прояснить ситуацию, напомню, что, как известно, аналогичное расположение выводов имеют все конденсаторы, резисторы и ди оды, предназначенные для поверхностного монтажа, а также микросхемы в корпусах QFN. Следует также отметить, что процедуру «подгибания» ножек микросхемы можно производить только один раз, иначе ножки могут сломаться. По фотографии платыпереходника SOIC8DIP8 для развязки ADUM1201 (рис. 1.4.1.3), видно, что микросхема ADUM1201 (с подогнутыми ножками) очень удачно «вписывается» в то пологию платы, а штырек, связанный с 1м выводом микросхемы, не откусан и служит для удобства ориентации (как уже говорилось ранее).
Рис. 1.4.2.1. Схема гальванической развязки на базе микросхем развязок ADUM1201, ADUM1200 и преобразователя интерфейса ADM3202 для микроконтроллеров семейств MSC12XX, 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), поэтому в условном показе микроконт роллера нет необходимости. В связи с тем, что преобразователь ADM3202 имеет 2 передатчика (10й, 7й и 11й, 14й выводы DD1), линии RxD и DSR разнесены. Это значительно повышает надежность передатчи ков, т. к. каждый из них работает на 1 вход. Схема кабеля сопряжения с компьютером показа на в прямоугольнике, очерченном пунктиром. Как можно увидеть из его схемы, для каждой из линий RxD и DSR предусмотрен отдельный провод, хотя эти два сигнала формируются преобра зователем ADM3202 из одного и того же сигнала (RxDa), для формирования которого исполь зуется единственный канал развязки ADUM1201 (2й, 7й выводы DD2). Часть схемы, непосре дственно контактирующая с интерфейсом компьютера (слева от пунктирной линии, условно по казывающей изоляционный барьер), питается от единственного источника питания напряже нием +5 В (сигнал «+5 A»), формируемым DCDCпреобразователем RQS0505 мощностью все го 0,25 Вт. Размер DCDCконвертера RQS0505 (и соответственно стоимость) меньше разме ра конвертера RQD0512, примененного в предыдущей схеме (рис. 1.4.1.1). Кроме того, отпа дает необходимость в дополнительном стабилизаторе +5 В (DD6 — см. рис. 1.4.1.1).
54
Для более удобного макетирования устройств, использующих обе развязки ADUM1201 и ADUM1200, автор рекомендует изготовить платупереходник 2SOIC8DIP12, схема и вари ант разводки которой приведены на рис. 1.4.2.2. Для того чтобы микросхемы «вписались» в то пологию платыпереходника, их ножки следует подогнуть так же, как и для переходника SOIC8DIP8, т. е. так, как показано на рис. 1.4.1.3. Микросхема приемника RS232 MAX3181 (DD5 — рис. 1.4.2.1) выпускается в планарном корпусе SOT235, который, как и корпус SOIC8, неудобен для макетирования, поэтому автор рекомендует изготовить переходник SOT236DIP6 аналогично переходнику SOIC8DIP8 (рис. 1.4.1.2), схема и вариант разводки не приводятся в виду их простоты. Изза малого раз мера микросхемы MAX3181 она свободно умещается на платепереходнике без процедуры «подгибания» ножек. На рис. 1.4.2.3 приведена фотография вышеуказанных 2 плат переходников: 2SOIC8DIP12 и SOT236DIP6. Кроме того, следует отметить, что микросхема приемника MAX3181 труднодоступна (в малых количествах), поэтому вместо нее можно применить КМОПтранзистор 2N7000.
55
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232
1.4.3. Гальванически изолированный интерфейс RS232 на базе микросхем развязок ADUM1201, ADUM1200 и преобразователя MAX1406
Рис. 1.4.2.2. Вариант разводки платы!переходника 2SOIC8DIP12 для двух развязок 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
а)
б)
Схема замены микросхемы MAX3181 на транзистор 2N7000 приведена в прямоугольни ке, очерченном пунктиром, в левой нижней части рис. 1.4.2.1. Несколько слов о достои нствах этой схемы (рис. 1.4.2.1). Схема достаточно проста, в ней применены относитель но легкодоступные (и дешевые) компоненты и не содержится ни одного резистора (если использовать приемник MAX3181). Кроме того, схема идеально работает на скорости 115 200 бод, т. к. максимальные скорости работы ADM3202 и MAX3181 значительно вы ше и составляют 460 кбод и 1,5 Мбод соответственно. Длина кабеля связи с компьюте ром может достигать 20 м. Автор рекомендует эту схему гальванических развязок для большинства применений (и не только конкретно для микроконтроллеров семейств MSC12XX, ADUM8XX и AT89C51ED2/RD2).
56
Рис. 1.4.3. Схема гальванической развязки на базе микросхем развязок ADUM1201, ADUM1200 и преобразователя интерфейса MAX1406 для микроконтролле! ров семейств MSC12XX, ADUC8XX и AT89C51ED2(RD2)
57
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
питании +5 В). Длина кабеля связи (на такой скорости работы схемы) может достигать 20 м. Еще одно достоинство схемы в том, что она более удобна для макетирования, чем предыду щая (рис. 1.4.2.1), если использовать микросхему MAX1406 в корпусе DIP16 (MAX1406CPE). Правда, стоимость такой микросхемы (при малом количестве) довольно высока — чуть ме нее 5 долл. И последнее, что необходимо отметить по поводу микросхемы MAX1406. Эта мик росхема была выпущена ф. MAXIM для прямой замены более старых микросхем MC145406 от ф. Motorola и SN75C1406 от ф. Texas Instruments в устройствах, где требу ется высокая скорость обмена (в 115 200 бод), поскольку ни MC145406, ни SN75C1406 такую скорость обмена не поддерживают. Автор настоятельно рекомендует ни в коем случае не применять 2 последние микросхемы в качестве преобразователей интерфейса RS232 (в схеме на рис. 1.4.3). Эксперименты, проведенные автором с этими микросхема ми, показали, что скорость обмена свыше 38 400 бод от них получить невозможно; кро ме того, даже на такой скорости обмена эти 2 микросхемы работают нестабильно, что приводит к частым «зависаниям» компьютера.
ГАЛЬВАНИЧЕСКИЕ РАЗВЯЗКИ ДЛЯ ИНТЕРФЕЙСА RS232
Рис. 1.4.4.1.1. Схема гальванически изолированного преоб! разователя интерфей! са ADUMAX на базе ADUM1201, ADUM1200, MAX3181 и MAX3190
1.4.4.Гальванически изолированный интерфейс RS232 на базе микросхем развязок ADUM1201, ADUM1200 и преобразователей MAX3190 и MAX3181 Малый размер микросхем гальванических развязок ADUM1201 и ADUM1200 и кро шечный размер преобразователей MAX3190, MAX3181 и MAX3183 позволяют конструиро вать очень малые по габаритам устройства гальванически развязанного интерфейса RS232, которые могут свободно умещаться на плате размером с обычную микросхему в DIPкорпусе. Такая плата, оснащенная «ножками», подобным ножкам микросхем в DIPкор пусах, может представлять собой чтото типа гибридной микросхемы в DIPкорпусе, кото рая может быть, с одной стороны, легко сконфигурирована под ту или иную задачу и, с дру гой, — очень удобной для макетирования. Впоследствии такая «микросхема» после доста точно скрупулезного тестирования может быть установлена уже в готовое изделие. Ниже приводится 2 варианта подобных «гибридных микросхем» гальванически изолированного интерфейса, предназначенного для программирования и штатного режима работы микро контроллеров семейств MSC12XX, ADUC8XX и АТ89C51ED2(RD2) (1й вариант) и микроко нтроллеров семейств P89LPC9XX (2й вариант), который (с некоторыми упрощениями) мо жет быть также использован для микроконтроллеров C8051F067/330D.
1.4.4.1. Плата гальванически изолированного интерфейса на базе развязок ADUM1201, ADUM1200, MAX3181 и MAX3190 для микроконтроллеров семейств MSC12XX, ADUC8XX и AT89C51ED2/RD2 Схема гальванически изолированного преобразователя интерфейса на базе ADUM1201, ADUM1200, MAX3181 и MAX3190 (рис. 1.4.4.1.1) состоит из 3 инвертирующих приемников RS232 — MAX3181 (DD4, DD5 и DD6), одного инвертирующего передатчика RS232 — MAX3190 (DD3), одной 2канальной двунаправленной развязки ADUM1201 (DD1) и одной 2канальной однонаправленной развязки ADUM1200 (DD2). Назовем услов но такое устройство «ADUMAX». В варианте разводки платы (рис. 1.4.4.1.2) компоненты размещены с двух сторон. На од ной стороне платы (в верхней части) размещенa двунаправленная развязка ADUM1201 (DD1)
58
Рис. 1.4.4.1.2. Вариант разводки платы гальванически изолированного преобразователя интерфейса ADUMAX на базе ADUM1201, ADUM1200, MAX3181 и MAX3190
совместно с инвертирующими передатчиком MAX3190 (DD3) и приемником MAX3181 (DD4), на другой (в нижней части) — 2канальная однонаправленная развязка MAX1200 (DD2) и два инвертирующих приемника MAX3181 (DD5 и DD6). На фотографии платы «микросхемы» ADUMAX (рис. 1.4.4.1.3) можно увидеть, что такая тополо гия разводки компонентов позволила расположить 6 микросхем, 5 конденсаторов и 14 штырь ков, которые являются «ножками» микросхемы, на довольно ограниченном пространстве, по пло щади равном площади стандартной микросхемы в корпусе DIP16. На фотографии (рис. 1.4.4.1.3,а) можно заметить явно выступающий (не откусанный) штырек, соответствующий 1му выводу «мик росхемы» ADUMAX, по которому легко ориентировать плату при установке в панельку.
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 и MAX3190 для микроконтроллеров семейств P89LPC9XX
а) Рис. 1.4.4.1.3. Фотография платы гальванически изолированного преобразова! теля интерфейса ADUMAX на базе ADUM1201, ADUM1200, MAX3181 и MAX3190: а — верхняя часть платы; б — нижняя
Рис. 1.4.4.1.4. Схема гальванической развязки на базе ADUMAX для микроконт! роллеров семейств MSC12XX, ADUC8XX и АТ89C51ED2 (RD2)
б)
Схему платы гальванически изолированного интерфейса на базе развязок ADUM1201, 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). В остальном схемы и соотве тственно разводка плат идентичны. Схема гальванической развязки на базе ADUMAX1 для микроконтроллеров семейств P89LPC9XX (рис. 1.4.4.2.2) формирует сигналы для микроконтроллера RxDM, RST и Vcc из сиг налов интерфейса RS232 TxD, DTR и RTS соответственно, а сигнал интерфейса RxD формиру
Рис. 1.4.4.2.1. Схема гальванически изолированного преобразователя интерфейса ADUMAX1 на базе ADUM1201, ADUM1200, MAX3181, MAX3183 и MAX3190
60
61
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ется сигналом микроконтроллера TxDM. Сигнал Vcc формируется на стоке КМОПтранзистора BS250 (T1), исток которого соединен с источником питания +3,3 В, а на затвор подается сиг нал ТТЛуровня с выхода приемника ADUMAX1 (выводы 10 и 16). На вход этого же приемника подается сигнал RTS с интерфейса RS232. Пунктиром показан изоляционный барьер. Схема тестировалась на скорости обмена в 115 200 бод и показала отличные результаты. Длина ка беля связи с компьютером может достигать 20 м. В прямоугольнике, очерченном пунктиром, показана схема кабеля связи с компьютером. Схема достаточно проста и занимает мало места на плате. Подобную схему можно приме нить и для микроконтроллеров C8051F067/330D (исключая линию RTS и транзистор T1).
Рис. 1.4.4.2.2. Схема гальванической развязки на базе ADUMAX1 для микроконт! роллеров семейств P89LPC9XX
ЧТО ДЕЛАТЬ, ЕСЛИ ДЛИНА ЛИНИИ СВЯЗИ ИНТЕРФЕЙСА RS232 ПРЕВЫШАЕТ 20 М?
1.5. Что делать, если длина линии связи интерфейса RS232 превышает 20 м? Иногда возникает задача «удлинить» линию связи для интерфейса RS232; при этом за дача поставлена так, что нельзя изменять ни схему устройства на базе микроконтроллера, ни его программное обеспечение, ни программное обеспечение компьютера, с которым этот микроконтроллер связан по интерфейсу RS232. С подобными задачами автор сталки вался достаточно часто. Ниже приведены пример подобной ситуации и достаточно простое, на взгляд автора, решение возникшей проблемы, которая некоторых разработчиков может поставить в тупик (рис. 1.5.1). Задача была поставлена следующим образом. Имеется прибор (на базе микроконтроллера), который сопрягается с компьютером все го двумя линиями интерфейса RS232 — TxD и RxD и, естественно, «землей» — сигналом SG. Причем связь между компьютером и прибором по интерфейсу RS232 должна быть дуплекс ной (как это обычно делается в интерфейсе RS232), т. е. передатчик и приемник должны ра ботать независимо друг от друга (так было написано программное обеспечение для компь ютера и микроконтроллера в приборе). В качестве прибора был предоставлен «Газовый корректор», предназначенный для изме рения расхода и объема газа, проходящего по газовой магистрали (трубе). Прибор располагал ся непосредственно на магистрали, а компьютер — на расстоянии около 1 км ( 900 м) от при бора. Программное обеспечение, имеющееся на компьютере, по снятию показаний прибора было уже давно куплено и оплачено, поэтому изменить его уже было невозможно; кроме того Рис. 1.5.1. Схема двунаправленного преобразо! вателя RS232RS485/RS422
62
63
АППАРАТНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
отсутствовала возможность както изменить программное обеспечение и в приборе, т. к. при бор был разработан достаточно давно. Попытки заказчика применить стандартный преобра зователь интерфейса RS232 в интерфейс RS485 ни к чему не привели ввиду того, что в пре образователе интерфейса RS485 была предусмотрена только полудуплексная связь, как это обычно осуществляется в этом интерфейсе. Для решения задачи автор использовал достаточно известные преобразователи RS485/RS422TTL(ADM488), работающие в дуплексном режиме, и уже упоминавшийся преоб разователь интерфейса RS232 ADM3202 (рис. 1.5.1). Как видно из схемы, все сигналы интер фейсов и питание выведены на клеммы (K01÷K08). Для индикации включения питания ис пользуется светодиод VD1. Для питания устройства применяется достаточно дешевый стабили зированный источник питания +5 В/200 мА. Расположение элементов (а) и вариант разводки платы устройства преобразователя интерфей сов (б, в) приведены на рис. 1.5.2 . Использование микросхем в корпусах DIP существенно облегча ет производство устройства. Для распайки компонентов не требуется высокой квалификации мон тажника (вся работа по монтажу плат была довольно ловко проделана школьником 9го класса).
ЧТО ДЕЛАТЬ, ЕСЛИ ДЛИНА ЛИНИИ СВЯЗИ ИНТЕРФЕЙСА RS232 ПРЕВЫШАЕТ 20 М?
Рис. 1.5.4. Фотография общего вида двух устройств — преобразователей RS232RS485/RS422
а Рис. 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
Программные средства интерфейса RS232
Для сопряжения устройств с компьютером и прибором (рис. 1.5.5) используется обыкно венный (неэкранированный) 4жильный телефонный провод длиной 1÷1,5 м. Линия связи между двумя устройствами представляет собой достаточно дешевый провод, состоящий из 2 неэкранированных витых пар в одной общей оплетке. Тестирование устройств показало идеальную их работу в дуплексном режиме на скорос ти в 115 200 бод на линии связи длиной в 1 км (!).
2.1. 2.2. 2.3. 2.4. 2.5. 2.6.
Предварительные замечания ............................................................68 Формирование коротких машиннонезависимых временных задержек ...........................................................................71 Применение совмещений в программах для микроконтроллера и компьютерa ...............................................75 Использование нового алгоритма обмена информацией по RS232 между компьютером и микроконтроллером ..................83 Программирование интерфейса RS232 в ОС Windows98/XP .....125 Применение интерфейса RS232 для программирования микроконтроллеров в системе (In_System_ProgrammingISP) .....161
ПРЕДВАРИТЕЛЬНЫЕ ЗАМЕЧАНИЯ
2
Программные средства интерфейса RS232 2.1. Предварительные замечания
Программные средства для интерфейса RS232, по которому компьютер и микроконтрол лер обмениваются информацией между собой, условно можно разделить на две части. К пер вой части отнесем программы, написанные для компьютера, ко второй — программы для мик роконтроллера. В свою очередь, программы для компьютера условно можно разделить также на две час ти. К первой отнесем программы, написанные для операционной системы (ОС) DOS, ко второй — для Windows. Если ОС DOS с последней седьмой (MSDOS V7.0) версией больше не модифицируется, то системы Windows постоянно обновляются. Систем Windows несколько. Мы будем рассматри вать только две — последнюю версию Windows98 2й редакции (Win'98, SE2) и WindowsXP для профессионалов с сервисным пакетом 2й редакции — WindowsXP professional, service pack 2 (Win'XP, SP2). Все промежуточные системы Windows, предшествующие Win'98, SE2 (WindowsV3.1, Windows95) и Win'XP, SP2 (Windows2000, WindowsMе и др.), а также стоящая несколько особняком WindowsNT, рассматриваться не будут по причинам, которые более пред метно и четко будут сформулированы позже. Вначале несколько слов о системе Windows98, SE2 и ее предшественниках. Win'98 — псевдoмногозадачная операционная система, которая зарекомендовала себя как исключительно надежная (поэтому до сих пор и используется) и в которой все еще допус кается полноправное применение DOS. Программы для DOS работают в Win'98 как в режиме «эмуляции», так и непосредственно (используется DOS7.0). Псевдомногозадачность Win'98 проявляется в том, что несколько запущенных программ могут работать «одновременно», но в действительности в каждый момент времени работает только одна программа, которая мо жет «захватить» все ресурсы компьютера, а остальные программы ждут своей очереди. Имен но этим свойством Win'98 похожа на DOS, в которой в каждый момент времени может рабо тать вообще только одна программа (именно та, которая запущена). В Win'98 программисту доступны все ресурсы компьютера, в том числе — прямой ввод/вывод через порты. Благода ря этой особенности программирование интерфейса RS232 практически мало чем отличает ся от его программирования в DOS. Существуют, конечно, некоторые нюансы, на которые бу дет обращено особое внимание. Windows 3.1 — система, которая была написана как программа DOS, поэтому большого распространения не получила. В Windows'95 было допущено много ошибок, которые посте
68
пенно были все выявлены, и в результате их устранения, а также благодаря некоторым допол нительным новшествам появилась система Win98,SE2. Системыпредшественницы Win'XP, SP2 (Win'2000, Win'Me и др.), которые были созданы уже после Win98, постепенно становились «более» многозадачными, т. е. «псевдомногозадач ность» постепенно превращалась в действительно «многозадачность», а приставка «псевдо» постепенно исчезала. Кроме того, эти системы начали сочетать в себе некоторые сетевые воз можности. После появления системы Win'XP, SP2, которая вобрала в себя лучшие свойства системпредшественниц, а также сетевые свойства Win'NT, системы Win'2000, Win'Me и др. начали постепенно уходить из обращения. Win'XP — действительно многозадачная операционная система, в которой каждой из нескольких запущенных и работающих программ отводится определенный «квант» време ни. В Win'XP уже практически нет никакой связи с DOS. Программисту доступны далеко не все ресурсы компьютера: прямой ввод/вывод через порты запрещен. И хотя и существуют некоторые «обходные» пути, позволяющие преодолеть это запрещение (например извест ная программa USERPORT, после запуска которой в Win'XP можно обращаться напрямую к портам ввода/вывода), основная идеология Win'XP — не разрешать никакой программе «захватить» все ресурсы компьютера и, в частности, — запрет на прямой ввод/вывод че рез порты. В настоящее время операционная система Win'XP наиболее распространена. Однако система Win'98, SE2 до сих пор применяется, т. к. она тесным образом связана с DOS, которая является исключительно надежной благодаря своей простоте, хорошей изу ченности и предсказуемости работы. В связи с вышеизложенным все программы для Windows будут приведены для Win'XP; в Win'98 они также работают, хотя некоторые значительно медленнее, чем в DOS и Win'XP, но их работа в Win'XP — наиболее общий случай для систем Windows. Кроме того, несколько программ будет приведено для работы в DOS по двум причинам. Вопервых, система DOS до сих пор используется благодаря своей надежности, вовторых, на приме ре программ, написанных для DOS, будет показано, что программирование обмена компьютера с микроконтроллером по интерфейсу RS232 в Win'XP мало чем отличается от программирования в DOS (если использовать «запрещенные» в Win'XP прямые процес сорные команды ввода/вывода в порт: in и out). В Win'XP (кстати сказать, и в Win'98) обращение к интерфейсу RS232 возможно через спе циальный программный интерфейс (простите за тавтологию), разработанный компанией Microsoft специально для работы приложений (Application Programm Interface — API). Функции API издавна «славятся» своей «заглюченностью», поскольку API — бесплатный. Но бесплатный сыр, как уже упоминалось, бывает только в мышеловках, в каковую и сможет «угодить» неза дачливый программист («чайник», как его сейчас называют), если попытается использовать для программирования RS232 описанные в MSDN ( http://msdn.microsoft.com/library ) или в других справочниках и руководствах эти самые функции API. В книге для полноты изложения показано, как достаточно просто запрограммировать обмен по RS232 в Windows с помощью APIфункций. Кроме того, было выявлено, что использование API, особенно в Win'98, резко «тормозит» обмен по RS232, в связи с чем автор не рекомендует пользоваться APIфункциями, предназначенными для программирования интерфейса RS232. Теперь относительно языка программирования. Продолжая традицию программиро вания на языке Кларион, который использовался для программирования обмена между микроконтроллером и компьютером по интерфейсу RS232 в системе DOS (Clarion v3.101) и программы на котором приведены в первой части книги [4], в настоящей книге автор
69
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
приводит все программы для компьютера, написанные для Win'XP, также на языке Кларион для Windows. В настоящее время (конец 2005 г.) последняя версия этого языка — Clarion v6.0. Программы для DOS будут приведены на языке Clarion для DOS (ClarionV3.101) с исполь зованием пакета подпрограмм графического интерфейса для пользователя (Graphic User Interface) — GUI–3. Программы для микроконтроллера в основном будут приведены на языке Си (CKeil, v6.14), хотя некоторые простые программы для микроконтроллера будут приведены и на ас семблере. Но прежде чем заниматься изложением материала по программированию интерфейса RS232 (и для микроконтроллера и для компьютера), автор хотел бы уделить некоторое внима ние двум проблемам, которые часто вызывают затруднения у многих программистов (иногда даже достаточно высокого класса). Первая проблема — как при написании программ (в DOS и Windows) обеспечить доста точно короткую аппаратно независимую (или, другими словами, машиннонезависимую) вре менную задержку (в несколько микросекунд). При написании программ для микроконтролле ра такая проблема никогда не возникает, т. к. программисту всегда известен тип микроконт роллера (и его скоростные качества) и частота его тактового генератора. Поэтому эта пробле ма касается только программ для компьютера. Вторая проблема — грамотное и повсеместное использование совмещений. Напомню, что совмещением называется такая структура данных, когда две или более переменных разного формата разделяют между собой одну и ту же область памяти. Например, двухбайтовая переменная (USHORT — в Кларионе или unsigned short в СИ) и две однобайтные переменные (BYTE — в Кларионе и unsigned char в Си) могут распо лагаться в одной и той же области памяти. При обмене информации по 8разрядному интерфейсу (например RS232) удобнее использовать однобайтные переменные; при расчетах либо для других целей, когда переменная уже находится в процессоре (или в микроконтроллере), удобнее работать с двухбайтной переменной. Но поскольку обе пе ременные располагаются в одной и той же области памяти, нет необходимости преоб разования 2 однобайтных переменных в 1 двухбайтную переменную (и обратно). А такое преобразование часто «тянет» за собой использование, например, библиотек с плавающей запятой, что резко увеличивает время преобразования и объем памяти программ. При использовании совмещений проблема преобразования «исчезает», т. к. каждый тип переменной определен, и переменную любого типа можно использовать в программе «напрямую». И еще будет рассмотрен более подробно вопрос об использовании нового алгорит ма обмена по интерфейсу RS232, разработанного автором, о котором уже было упомя нуто в настоящей книге и который приведен в ранее опубликованной 1й части книги [4]. В связи с увеличением быстродействия как современных компьютеров, так и совре менных микроконтроллеров, использование такого алгоритма обмена, как будет пока зано далее, приобретает еще большее значение, особенно это касается надежности и скорости обмена. Будут приведены некоторые уточнения и «обновления» этого алгорит ма, временная диаграмма сигналов передатчика и приемника, участвующих в обмене информацией. В результате будут даны рекомендации по использованию такого алго ритма обмена как в программах для микроконтроллера, так и в программах для компь ютера. Кроме того, будут приведены примеры применения этого алгоритма уже в прак
70
ФОРМИРОВАНИЕ КОРОТКИХ МАШИННОНЕЗАВИСИМЫХ ВРЕМЕННЫХ ЗАДЕРЖЕК
тических целях для программирования микроконтроллеров семейств P89LPC9XX в ре жиме ICP, о котором уже упоминалось ранее. Таким образом, дальнейшее изложение будет вестись в следующей последователь ности. Вначале будут рассмотрены: вопрос о том, каким образом обеспечить машинно независимую короткую временную задержку в программах для DOS и Windows; вариан ты применения совмещений в программах для микроконтроллера (на Си и ассемблере) и в программах для компьютера (на языке Кларион); вопрос об использовании нового алгоритма обмена по RS232 (для компьютера и для микроконтроллера); функции API для программирования интерфейса RS232 в Windows и их использование совместно с но вым алгоритмом обмена, разработанным автором; вопрос об использовании прямых команд процессора ввода/вывода в порт (in и out) в Win'XP с приведением тестовых программ обмена по RS232 и сравнением быстродействия систем DOS, Win'98 и Win'XP. Дальнейшее изложение будет посвящено программированию в системе (ISP) микро контроллеров MSC12XX, ADUC8XX, AT89C51ED2(RD2) и P89LPC93XX с компьютера по интерфейсу RS232. Для микроконтроллеров MSC12XX, ADUC8XX и P89LPC93XX будут приведены программы автора для DOS и Win'XP. Для микроконтроллера AT89C51ED2(RD2) имеется бесплатно распространяемое программное обеспечение, разработанное ф. ATMEL и предназначенное для программирования в системе (ISP) —FLIP V.2.4.4. Для использования этой программы будут приведены некоторые момен ты по настройке. Будет рассмотрен вопрос о программировании микроконтроллеров P89LPC9XX в режиме ICP под управлением микроконтроллеров (P89LPC93X и MSC12XX) и компьютера и приведены программы, разработанные автором, для микроконтроллеров P89LPC93X и MSC12XX, а также программы для DOS и Win'XP, выполняющие программирование микроконтроллеров P89LPC9XX, и, наконец, будут рассмотрены вопросы о программировании микроконтроллеров C8051FXXX по интерфейсам JTAG и C2 (с помощью USBDEBUGадаптера) и штатный режим их работы по интерфейсу RS232.
2.2. Формирование коротких машиннонезависимых временных задержек 2.2.1. Общие положения Короткие и достаточно точные временные задержки, как будет видно из дальнейше го изложения, играют очень важную роль в обмене сигналами по интерфейсу RS232 между компьютером и микроконтроллером. Формирование коротких машиннонезави симых временных задержек существенно различается в операционных системах DOS и Windows. В DOS, к сожалению, нет штатных программных средств, которые могут обес печить аппаратно независимые короткие временные задержки, тогда как в Windows они присутствуют. В связи с этим методы программного формирования временных задержек различны в DOS и Windows. Поэтому вначале рассмотрим программное фор мирование задержек в DOS, а затем — в Windows. Поскольку, как уже упоминалось, львиная доля всех программ, представленных в кни ге, написана на языке Кларион, примеры программ будут приведены для DOS на языке
71
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Кларион для DOS (последняя версия языка — Clarion v.3.100), а для Windows на языке Кларион для Windows (в настоящее время (2005 г.) последняя версия этого языка — Clarion v.6.0).
2.2.2. Программное формирование коротких аппаратно-независимых временных задержек в DOS Язык Clarion v.3.100 для DOS имеет несколько опций (сред) работы. Это режимы: статический (Static Model), оверлейный (Overlay Model) и защищенный (Protected Mode). Наиболее скоростной — статический, но программы, написанные для этого режима, очень короткие, поскольку он может работать с очень ограниченной областью памяти компьютера. Оверлейный режим на современных компьютерах вообще не работает. Защищенный режим использует всю область памяти компьютера, т. к. применяется только при опции расширенной памяти (DOS Extender). Скорость работы компьютера разная для статического и защищенного режимов. Кроме того, различные компьютеры, естественно, работают с разной скоростью. Единственная стабильная временная база, на которую можно положиться в программном отношении, — это системный таймер, отсчитывающий время на всех компьютерах одинаково. Но минимальный интервал времени системного таймера составляет около 18 мс, что для коротких временных за держек (5÷30 мкс) — очень много. Поэтому единственная возможность получить точ ную временную задержку заключается в следующем. Запускается системный таймер, далее организуется цикл счета до какоголибо большого числа N (например, до милли она или больше), после окончания счета опрашивается таймер и сравнивается со зна чением, которое предшествовало счету, т. е. определяется время счета Т. Далее N де лится на Т, в результате чего можно получить частоту счета F[1/c]. Зная частоту счета, не составляет большого труда сформировать любую временную задержку. Эта идея дос таточно примитивна, но, к сожалению, в DOS другого пути нет. Второй вариант — запус тить таймер и одновременно запустить счетчик цикла. После прошествия времени Т (например 10 с) остановить счет и выяснить, до какого числа i досчитал счетчик цикла. Приведем пример. ! ! Определение параметров для ! вычислении временной задержки. ! T#=clock() i#=0 loop if (clock()T#)>1000 then break. i#=i#+1 . show(10,10,'10 сек.=') setcursor(10,20) type(i#) !
В этом примере после 10 с счета на экран выведется значение переменной i#. Предполо жим, что, к примеру, i#=20000000. Тогда, разделив i# на 10 000 000 (10 с = 10 000 000 мкс),
72
ФОРМИРОВАНИЕ КОРОТКИХ МАШИННОНЕЗАВИСИМЫХ ВРЕМЕННЫХ ЗАДЕРЖЕК
получим 2. Это значит, что 1 цикл счета длится около 2 мкс. Для получения, например, 10 мкс, достаточно организовать цикл счета до 5: ! ! Временная задержка 10 мкс. ! loop i#=1 to 5 . !
Данную процедуру, конечно, можно достаточно просто автоматизировать, вставляя каж дый раз в программу вычисление цикла, например, до 10 с и автоматически вычисляя время цикла. Правда, при этом нужно будет ждать 10 с. Можно этого и не делать, а один раз опреде лить параметр цикла и в дальнейшем его использовать (так, например, написаны все програм мы автора).
2.2.3. Программное формирование коротких аппаратно-независимых временных задержек в Windows В операционных системах Windows задача формирования коротких аппаратнонезависи мых временных задержек значительно упрощается. Дело в том, что и в Win'98 и в Win'XP для определения интервалов времени для собственных нужд используется так называемый «Представительский счетчик» — QueryPerformanceCounter, который постоянно считает с опре деленной частотой F — QueryPerformanceFrequency. Эта частота различна для Win'98 и Win'XP и составляет около 2 MГц в Win'98 и около 7 МГц — в Win'XP (для компьютера типа P4, 1,7 ГГц). Эта частота счета жестко привязана к временной базе системного таймера. Для получе ния необходимой временной задержки точное значение частоты F выяснять совсем не обяза тельно. Достаточно разделить эту частоту на 1 000 000, чтобы получить временную базу для счетчика в 1 мкс. Умножив это значение, например на 25, и заставив считать счетчик до это го значения, можно получить временную задержку в 25 мкс. Причем организованная таким образом временная задержка будет абсолютно аппаратнонезависимой, т. е. будет давать од ну и ту же задержку для разных компьютеров и операционных систем (Win'98 или Win'XP). Разрядность счетчика — 8 байт, поэтому максимальное число, до которого счетчик может досчитать, а затем сброситься и начать считать заново, составляет 0ffffffffffffffffh=18 446 744 073 709 551 615. Это очень большое число, трудно поддаю щееся «озвучиванию», тем не менее, с ним можно оперировать. В Кларионе не предусмот рены 8байтовые числа, поэтому для определения такого числа для счетчика (COUNTER) используются два 4байтовых числа (ULONG и LONG), объединенные в группу (GROUP). Аналогичным образом определяется и частота счета (FREQUENCY). Такая структура дан ных называется совмещением, о котором уже упоминалось. Более подробно о совмеще ниях и их применении в программах будет изложено несколько позже. Для работы со счетчиком необходимо использовать APIфункции (о которых также уже упо миналось). Прототипы APIфункций для счетчика и частоты в Кларионе известны и четко опре делены. Например, для счетчика имеется следующий прототип: QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL
73
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Ниже приведен фрагмент программы, написанной на Clarion v.6.0, использующей заде ржку в 25 мкс. Оператор do DEL25
как раз и выполняет задержку в 25 мкс: ! PROGRAM ! ! Переменные для частоты и счетчика ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . !
! ! Прототипы APIфункций — для WIN'XP. ! ! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL END ! ! ! CODE ! ! ! ! Вычисление временной задержки в 25 мкс. ! loop until QueryPerformanceFrequency(FREQUENCY). !Определение !частоты работы счетчика. DC=int(25*FRE:FREQL/1000000) !Вычисление времени счета в 25 мкс. ! ! !
74
ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА
!
— do DEL25
!Задержка 25 мкс.
! ! ! ! ! Подпрограммы ! ! ! ! ! DEL25 routine loop until QueryPerformanceCounter(COUNTER). !Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия еlse ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC then break. ! DC(=25 мкс.) . ! !
2.3. Применение совмещений в программах для микроконтроллера и компьютера Под совмещением принято понимать такую структуру данных, когда несколько перемен ных разного формата перераспределяют одну и ту же область памяти. Например, в памяти компьютера или микроконтроллера может располагаться одна 2байтная переменная (типа USHORT — в Кларионе и/или unsigned short — в Си) и две 1байтные переменные (типа BYTE — в Кларионе или unsigned char — в Си). Приведем пример. Пусть требуется передать из компьютера в микроконтроллер по интерфейсу RS232 длину какойлибо строки, состоящей из N байт. Причем N может насчитывать несколько тысяч байт (например, N — длина программы для микроконтроллера). Целесообразно выбрать формат переменной N как 2байтной, например USHORT. С другой стороны, переменная типа USHORT не может быть передана по 8разрядному (1байтному) интерфейсу (RS232), поэтому ее целе сообразно разбить на две 1байтные переменные (формата BYTE), являющиеся, например, старшим (NH) и младшим (NL) байтами переменной N. Затем передать, например, вначале младший байт NL, а затем — старший NH. При приеме 2 байт микроконтроллер должен восста новить из двух 1байтных переменных (NL и NH) 2байтную переменную N и уже оперировать
75
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ею, например, использовать ее как максимальное значение счетчика принимаемых байт строки и т. п. Решение поставленной задачи «в лоб» может быть достаточно простым и заключаться в следующем. Вначале «разбиваем» 2байтную переменную N на две 1байтные переменные NH и NL. Это можно сделать, например, так: NH=int(N/256) NL=N256*NH T. e. старший байт NH получается от целочисленного деления N на 256, а младший байт NL — как разность между N и значением старшего байта, умноженным на 256. После приема двух байт NH и NL микроконтроллер должен восстановить исходное число N. Это можно сделать, например, так: N=NH*256+NL т. е. исходное число может N быть восстановлено как сумма значений старшего байта NH, ум ноженного на 256, и младшего байта. Фрагмент программы на Кларионе для компьютера при N=35000 для такого решения приведен ниже. ! PROGRAM N NH NL BT
USHORT BYTE BYTE BYTE
! Переменная N !Старший байт N !Младший байт N !Переменная для п/п передачи байта
CODE
ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА
— Вывод BT по RS232 !
Фрагмент программы на Си приема числа N для микроконтроллера может выгля деть так: // //Определение переменных // unsigned char NL,NH; unsigned int N; // // П/п ввода байта // unsigned char inbyte() { . Прием байта по RS232 . return(byte); } // // //Основная программа // void main(void) { NH=inbyte(); NL=inbyte(); N=NH*256+NL; } //
N=35000 NH=int(N/256) NL=NNH BT=NH do OUTBYTE BT=NL do OUTBYTE return ! ! Подпрограмма вывода байта ! OUTBYTE routine
76
Как видно из этих двух фрагментов, для того чтобы передать переменную N по интерфейсу RS232, ee необходимо преобразовать в две переменные NH и NL, а для того чтобы получить — восстановить из NL и NH. Процедуры разбивки и восстановления используют операции деления и умножения. Для компьютера такие процедуры не составляют особой сложности, т. к. он обладает колоссальными памятью и быстродействием по сравнению с микроконтроллером, поэтому эти процедуры будут «мгно венно» выполнены. А вот для микроконтроллера эти процедуры потребуют немалых затрат как по па мяти программ, так и по быстродействию, т. к. для таких операций будут привлечены дополнительные библиотеки. Это, в свою очередь, потребует дополнительной памяти программ и некоторые времен ные ресурсы, чтобы выполнить соответствующие подпрограммы библиотек. При большой скорости передачи данных от микроконтроллера потребуется значительное быстродействие и, как следствие этого, — достаточно большая частота генератора (не важно — внутреннего или внешнего). Если мик роконтроллер работает от батарейного источника питания, то такой источник (от большого количест
77
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ва программ или подпрограмм, написанных подобным образом) быстро кончится. Кроме того, от та кого «разбазаривания» ресурсов микроконтроллера его основная программа может просто не по меститься в и без того достаточно «скудную» его память программ. Можно ли оптимизировать решение поставленной задачи и, если да, то каким образом? Вот здесь как раз и приходят на помощь совмещения. Ниже приведен фрагмент программы для микроконтроллера, использующей совмещения. // // Совмещение "u.N" с "u.bt.NL" и "u.bt.NH". // Переменные u.N (размерностью ushort) и // u.bt.NL и u.bt.NH (обе размерностью byte(unsigned char)) // перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных NH(первая) и NL(вторая) // в структуре (struct) строго определен и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short N; // Длина строки("u.N"). struct{ unsigned char NH; // Ст.байт длины строки("u.bt.NH"). unsigned char NL; // Мл.байт длины строки("u.bt.NL"). }bt; }u; // // // П/п ввода байта // unsigned char inbyte() { . Прием байта по RS232 . return(byte); } // void main(void) { u.bt.NL=inbyte(); u.bt.NH=inbyte(); temp_L=u.l;
//Прием мл.байта длины строки. //Прием ст.байта длины строки. //Переменная u.Nдлина строки(ushort) //заполняется автоматически после //заполнения переменных //u.bt.NL и u.bt.NH.Переменная temp_L //введена чтобы показать использование u.l
Как можно заметить из приведенного выше фрагмента программы для микроконт роллера, при использовании совмещений значительно экономится память программ,
78
ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА
т. к. фрагмент не содержит ни одной операции умножения или деления; кроме того, пере менные N, NH и NL в сумме занимают всего 2 байта памяти (а не 4, как в предыдущем при мере), т. к. распределяются в одной и той же области памяти размером в 2 байта. Наде юсь, этот факт достаточно очевиден. Совмещения не только значительно экономят память и увеличивают быстродействие. Они существенно облегчают программирование. Приведем еще пример. Предположим, требуется передать по интерфейсу RS232 строку S, содержащую N байт. Решение такой задачи «в лоб» заключается в том, что из строки необходимо последова тельно выделять каждый байт и уже его передавать по интерфейсу. Другими словами, вна чале нужно выделить первый байт строки и передать его, затем второй, третий и т. п. Выде ление конкретного байта из строки потребует использования строковых операций. Такие операции присутствуют как в Кларионе, так и в Си. Но, с одной стороны, они выполняются очень долго, с другой, — требуют достаточно внимательного отношения к индексам: здесь очень легко ошибиться. Приводить пример с выделением байт из строки, на взгляд автора, — лишнее. Гораздо удобнее использовать совмещение строки S с массивом байт размер ностью М, равной количеству байт в строке N. Такое совмещение (в Кларионе) выглядит сле дующим образом (при N = 75): S M
string(75) byte,dim(75),over(S)
Оператор over (S) как раз и выполняет подобное совмещение. Таким образом, массив М размерностью в 75 байт и строка S длиной 75 байт распределяются в одной и той же об ласти памяти (размером в 75 байт). Причем, элемент массива M[1] соответствует 1му бай ту строки S, M[2] — 2му и т. п. Для вывода всей строки S достаточно организовать 75разо вый цикл вывода iго элемента массива M[i]: loop i=1 to 75 B=M[i] do OUTBYTE
. Здесь B — переменная, которая используется в подпрограмме вывода байта OUTBYTE (чтобы не «загромождать» излагаемое лишними подробностями, и подпрограмма OUTBYTE, и пере менная B не приводятся). Как видно из приведенного примера, совмещения не только экономят память, но и значи тельно увеличивают удобство программирования, что повышает надежность программ (оши биться с индексом i в приведенном 75циклoвом выводе элемента массива M[i] просто невоз можно). Помимо совмещений между собой чисел разного формата, массивов со строками и т. п., име ется возможность совмещения какоголибо бита 1байтного числа с битовой переменной. Приведем еще пример. Предположим, требуется последовательно вывести байт данных через какойлибо вывод микроконтроллера, стробируя вывод каждого бита сигналом, подаваемым с другого вывода.
79
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Такие задачи часто возникают при «ручном» программировании вывода через различные последовательные интерфейсы (например SPI, C2, MicroWare и т. п.). Попросите хорошего программиста выполнить подобную задачу на ассемблере. Скорее всего, он вам предложит чтото вроде следующего фрагмента: ; ; Алгоритм вывода байта в P89LPC938 ; ; ; Установка названий бит ; PDA: .reg p1.2 ;Бит данных PCL: .reg p1.3 ;Бит строба (Clock) ; OUTBLPC .macro mov b,#8 METO#: rrc a mov PDA,c nop nop nop clr PCL nop nop nop setb PCL nop nop nop djnz b,METO# .endm ;
В этом фрагменте (макросе) байт данных, находящийся в аккумуляторе, выводится через порт p1.2 микроконтроллера (обозначенный PDA) и стробируется сигналом, который подается через порт p1.3 (обозначенный PCL). Как можно заметить, байт сдвигается вправо через флаг переноса c (команда rrc а), в связи с чем младший бит байта попадает во флаг переноса, а от туда уже в битовую переменную PDA, ассоциируемую с портом p1.2 (команда mov PDA,c). Далее, через некоторое время, равное длительности 3 команд nop и требующееся для более стабильной установки бита на выводе PDA, по выводу PCL подается строб, представляющий собой импульс длительностью также 3 команды nop. После 8 сдвигов (число 8 заранее зано сится в bрегистр) байт полностью выводится. Задача достаточно примитивная, поэтому легко выполнимая и ясная для понимания. (Необходимо отметить, что фрагмент приведен из одной из программ автора, предназначенной для программирования микроконтроллера P80LPC938 в режиме ICP с помощью микроконтроллера MSC1210). Но попробуйте попросить этого же программиста написать программу для подобной зада чи на Си (а вот там, к сожалению, такая пересылка бита из флага переноса c в переменную
80
ПРИМЕНЕНИЕ СОВМЕЩЕНИЙ В ПРОГРАММАХ ДЛЯ МИКРОКОНТРОЛЛЕРА И КОМПЬЮТЕРА
PDA не проходит). В 99 случаях из 100 программист на Си (даже достаточно высокого класса) предложит вам нечто, подобное фрагменту, приведенному ниже. //************************************************************************* //* prog90x.c //* By : Bauke Siderius //* Discription : ISP/ICP gateway code for LPC90x programmer using MCB900 //* //************************************************************************* //* Versions //************************************************************************* //* //* v1.2 August 2003 //* Added a delay before entering ICP. //* //* v1.1 August 2003 //* Put ports in input only when not in use. //* Fixed CRC read out. //* //* v1.0 May 2003 //* Initial version. //* //************************************************************************* . . . . //************************************************************************* //* shift_out() //* Input(s) : data_byte. //* Returns : none. //* Description : function to shift out data to the part being programmed //************************************************************************* void shift_out(char data_byte) { char shift_bit; char temp_byte = 0; temp_byte = data_byte; // put databyte in a temp byte for(shift_bit = 0; shift_bit < 8; shift_bit++)// shift out 8 bits { PCL = 0; // hold clock line low if(temp_byte & 0x01) // check if LSB is set { PDA = 1; // set dataline high } else { PDA = 0; // set dataline low }
81
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
temp_byte = (data_byte >>= 1); // shift databyte right one, put in temp PCL = 1; // clock databit } PDA = 1; PCL = 1;
// set dataline high after transfer // hold dataline high after transfer
} //************************************************************************
Вышеприведенный фрагмент взят из программы для эволюционной платы MCB900, пред назначенной для программирования микроконтроллеров P80LPC9XX. Как можно убедиться, если внимательно рассмотреть этот фрагмент, выводимый байт, находящийся в байтовой переменной temp_byte, так же, как и в предыдущем случае, сдвигается вправо и стробирует ся битом PCL. Но как происходит установка и вывод бита данных PDA! А происходит она в зависимости от значения младшего бита байтовой переменной temp_byte. Для анализа и вывода младшего бита используется достаточно громоздкая конструкция: вначале он выде ляется, затем, если равен 1, то бит PDA устанавливается в 1, иначе PDA=0: if(temp_byte & 0x01)
// check if LSB is set
{ PDA = 1; } else { PDA = 0; }
// set dataline high
// set dataline low
Между тем, пользуясь совмещением младшего бита выводимого байта с какойлибо бито вой переменной, аналогичную процедуру вывода бита можно «уложить» всего в одну команду! Фрагмент подобной программы (автора) на Cи приведен ниже. // //Для P89LPC938 // sbit PDA = P0^4; sbit PCL = P0^5; // //Совмещение бита BITIO с 0м битом байта BYTEIO // bdata unsigned char BYTEIO; sbit BITIO=BYTEIO^0; // . . . // // П/п ввода/вывода байта в P89LPC9XX // void OUTBLPC(unsigned char OUTB) { unsigned char j;
82
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
BYTEIO=OUTB; for (j=0;j<8;j++){ PDA=BITIO; PCL=0; DEL50(); PCL=1; DEL10(); BYTEIO=_cror_(BYTEIO,1); } } //
Здесь использовано совмещение битовой переменной BITIO с младшим (нулевым) битом бай товой переменной BYTEIO (конкретно: BYTEIO^0). В связи с этим, биту, выводимому через порт PDA, просто присваивается значение бита BITIO аналогично присвоению бита переноса c биту PDA, как это сделано в вышеприведенной ассемблерной процедуре. Присвоение организуется всего одной командой (PDA = BITIO), и никакого выделения и анализа этого бита не требуется. Здесь впо ру заметить, что «товарищ» мистер Bauke Siderius не любит, не хочет использовать либо просто не знает подобных битовых совмещений. Приведенные примеры, на взгляд автора, достаточно красноречиво свидетельствуют о явной пользе и большом преимуществе совмещений перед простыми преобразованиями данных из одного формата в другой.
2.4. Использование нового алгоритма обмена информацией по RS232 между компьютером и микроконтроллером 2.4.1. Суть нового алгоритма обмена Новый алгоритм обмена по интерфейсу RS232, разработанный автором и опубликован ный в [4], заключается в аппаратной синхронизации каждого передаваемого/принимаемого байта линиями данных (TxD и RxD) этого же интерфейса. В этом его существенное отличие от стандартной аппаратной синхронизации линиями квитирования (DTRDSR или RTSCTS). Кро ме того, от существующей программной синхронизации линиями данных (TxD и RxD), которую принято называть «XonXoff», новый алгоритм отличается именно «аппаратностью», т. е. синхро низация осуществляется не посылкой информационного байта (например, Xoff) по линиям дан ных, а изменением их состояния, как это устроено в аппаратной синхронизации линиями квитирования. Такая аппаратная синхронизация, с одной стороны, экономит линии, по которым осу ществляется обмен данными, с другой, — позволяет использовать выходные линии квити рования компьютера (DTR и RTS) для управления режимами работы микроконтроллера (штатный режим/режим внутрисистемного (ISP) программирования). При этом линия DTR управляет сбросом (вывод RESET микроконтроллера), а линия RTS — переводом его из штатного режима работы в режим программирования. В большинстве случаев (микро контроллеры семейств MSC12XX, ADUC8XX, AT89C51ED2/RD2) линия RTS управляет сиг налом, подаваемым на вывод PSEN. Суть аппаратной синхронизации линиями данных зак лючается в следующем.
83
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Предположим, что передается некоторый поток данных от компьютера к микроконтроллеру (например 1000 байт). В обмене в этом случае участвует только одна линия интерфейса — линия ТxD компьютера, которая соединена с линией RxD микроконтроллера. Вторая линия — линия TxD микроконтроллера, соединенная с линией RxD компьютера, в это время не используется (простаивает). Так вот, основная идея нового алгоритма заключается как раз в том, что «проста ивающую» линию можно использовать для аппаратной синхронизации обмена байтами между компьютером и микроконтроллером. Что означает словосочетание «аппаратная синхрониза ция»? Она означает, что синхронизация осуществляется не посылкой информационного байта по простаивающей линии (например Xoff, как это организовано в программной синхронизации), а изменением состояния линии TxD микроконтроллера (с лог. 1 в лог. 0 и обратно), как это проис ходит при аппаратной синхронизации какойлибо линией квитирования (например линией DTR). В начале передачи каждого байта компьютер запрашивает у микроконтроллера разрешение на передачу. Для этого он анализирует свою линию данных RxD (которая соединена с линией TxD мик роконтроллера). Если линия находится в состоянии запрета на передачу (например в лог. 1), компь ютер не передает байт, а продолжает опрашивать эту линию, пока не получит разрешения (напри мер, лог. 0). Получив разрешение, компьютер передает только один байт, ожидает конца переда чи этого байта (т. е. ждет, пока не выведется последний бит передаваемого байта) и опять переходит в режим опроса линии для получения разрешения на передачу следующего байта. Микроконтроллер, принимающий поток байт, выполняет следующие действия. Вопер вых, именно он является инициатором начала обмена, поскольку именно он первый дает разрешение компьютеру на передачу очередного (первого) байта. Напомню, что в начале пе редачи компьютер ждет разрешения на передачу, т. е. находится в режиме ожидания. Переклю чив свою линию TxD из запрещающего состояния в разрешающее (т. е. дав компьютеру раз решение на передачу байта), микроконтроллер ожидает передачи байта от компьютера. В чем суть ожидания передачи байта от компьютера? Суть в том, что в начале поступления байта в микроконтроллер его линия RxD изменяет свое состояние, поскольку передача бай та начинается со стартбита. Поэтомуто линия RxD микроконтроллера и изменяет свое состояние с лог. 1 на лог. 0. В этот момент, с одной стороны, стартбит инициирует UART мик роконтроллера на прием байта (и этот прием уже происходит без участия процессора микро контроллера), с другой, — микроконтроллер, «определив», что «процесс пошел», должен сбро сить разрешение (т. е. установить запрещающий потенциал на своей линии TxD). Момент времени сброса разрешения компьютеру на передачу следующего байта очень ва жен. Другими словами, требуется определить, когда именно микроконтроллер должен сбросить это разрешение (т. е. установить запрет на передачу). С одной стороны, ответ на этот вопрос напрашивается сам собой: именно тогда, когда микроконтроллер определит начало поступле ния байта (т. е. в момент времени начала стартбита). Но здесь кроется одна «ловушка». Дело в том, что многие современные микроконтроллеры уже достаточно быстрые, по сравнению с предыдущим поколением. Команды современных микроконтроллеров уже выполняются не за 12 тактов, как это было ранее. Многие из них являются «однотактными», т. е. выполняют коман ду процессора всего за один такт генератора (например микроконтроллеры ADUC8XX, C8051FXXX), некоторые — 2тактными (P89LPC9XX), 4тактными (MSC12XX) и 6тактными (AT89C51ED2/RD2). Кроме того, современные компьютеры также уже давно не «медленные». Поэтому сбрасывать разрешение сразу после начала стартбита нельзя, поскольку вре мя от начала разрешения передачи и начала стартбита последующего за этим разрешением передачи байта может составлять от нескольких микросекунд до их долей (в зависимос
84
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
ти от скорости микроконтроллера). Такой короткий импульс разрешения просто не «пройдет» че рез преобразователь интерфейса (ADM3202, MAX1406, ADM231 и др.). В результате обмен мо жет просто сорваться. С другой стороны, ждать, пока байт полностью не поступит в микроконт роллер, и уже после этого сбросить разрешение тоже нельзя, поскольку компьютер после окон чательного вывода байта сразу же приступает к анализу линии, по которой передается разре шение на передачу следующего байта. Поскольку микроконтроллер всетаки более медленное устройство, чем компьютер, он может не успеть «среагировать» и сбросить это разрешение нем ного позже момента начала анализа компьютером линии разрешения. В результате, проанали зировав линию разрешения и определив, что она находится в состоянии разрешения передачи, компьютер передаст следующий байт, и на этом обмен сорвется. В связи вышеизложенным, на взгляд автора, идеальным моментом времени сброса раз решения является момент времени, соответствующий передаче половины байта (т. е. «середи на» байта). В этом случае потенциалы разрешения и запрета будут чередоваться, и форма сиг нала на линии разрешения (т. е. на линии TxD микроконтроллера, одновременно являющейся RxD компьютера) будет представлять собой чтото похожее на прямоугольный меандр. Причем длительность импульса такого «меандра» будет приблизительно равна половине длительности передачи одного байта. Такой длинный импульс, с одной стороны, свободно пройдет через вы шеупомянутые преобразователи интерфейса, с другой стороны, сброс разрешения в середине передаваемого байта никак не повлияет на передачу следующего байта компьютером, пос кольку в это время он анализирует не линию разрешения, а бит, ответственный за конец вы вода последнего бита байта. И этим анализом компьютер будет «заниматься» до окончания вы вода байта, прежде чем приступить к анализу линии разрешения. А эта линия разрешения к этому моменту, как можно догадаться, будет уже давно сброшена, что и требуется. Подсчитаем длительность времени от момента стартбита до «середины» байта при скорос ти 115 200 бод. Очевидно, что при частоте 115 200 Гц длительность передачи одного бита бу дет: 1/115 200=0,000 008 68 с или около 8,7 мкс. Передача всех 10 бит (1 стартбит + 8 бит данных + 1 стопбит) будет занимать около 87 мкс. Половина этого времени составляет около 43 мкс. Если сделать некоторый запас по реакции микроконтроллера (5÷15 мкс), то после обнаружения стартбита необходимо сделать задержку в 25÷30 мкс и затем сбросить разрешение. О том, как осуществить столь короткую и машиннонезависимую задержку в компьютере, уже говорилось ранее. В микроконтроллере организовать подобную временную задержку достаточно просто, пос кольку программисту всегда известна частота тактового генератора микроконтроллера. Резюмируем вышеизложенное, привязав все к временной диаграмме аппаратной синхронизации передачи байта, составленной на основе предыдущих рассуждений (рис. 2.4.1). Рис. 2.4.1. Временная диаграмма аппаратной синхронизации передачи байта
85
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Итак, передатчик ожидает разрешение на передачу байта. На временной диаграмме это — время от 0 до получения такого разрешения (до перехода RxD с высокого уровня в низкий). Далее приемник посылает разрешение на передачу байта по линии RxD передат чика, устанавливая ее в нулевой уровень. На верхнем графике этот факт отражен тем, что уровень RxD переключается с единичного в нулевое состояние. Получив разрешение на передачу байта, передатчик начинает его передавать, но не мгновенно, а спустя некото рое время реакции на разрешение передачи (на диаграмме оно обозначено Tpp). Далее приемник ждет начало стартбита, т. е. переключения линии TxD приемника с единичного уровня в нулевое. После определения факта начала передачи по стартбиту приемник, спустя некоторое время реакции на начало передачи (Трн), запускает задержку длитель ностью около 25 мкс. По прошествии времени задержки (Тз) приемник сбрасывает разрешение, т. е. переклю чает линию RxD передатчика из низкого состояния в высокое. Далее после окончания пере дачи байта передатчик переходит к анализу разрешения передачи следующего байта, т. е. состояния линии RxD. В этот момент она давно уже в единичном состоянии, и передатчик про должает ожидать разрешения на передачу. Приемник, приняв байт полностью до последнего стопбита и записав его, например, в память, через некоторое время (назовем его временем реакции на конец приема — Трк), когда он полностью готов принять следующий байт, опять выставляет разрешение на передачу (уже следующего) байта. На временной диаграмме этот факт отражен переключением линии RxD с единичного состояния в нулевое. Далее процесс повторяется. Необходимо отметить, что достоверность обмена может быть значительно повыше на, если передатчик сделает дополнительный анализ линии RxD на сброс разрешения. Как видно из временной диаграммы, сброс разрешения (т. е. установка приемником линии RxD передатчика в высокий уровень) происходит гдето в середине (по времени) передачи байта. Если передатчик проверит линию RxD на предмет сброса разрешения (т.е. переключения ее в высокий уровень), то этот факт для передатчика будет означать, что приемник начал принимать передаваемый передатчиком байт и именно в связи с этим сбросил разрешение. Другими словами, дополнительная проверка сброса разре шения позволяет передатчику определить, что приемник работает «как положено» и пе реключает линию RxD передатчика с высокого уровня в низкий (и обратно). Без такой проверки можно оказаться в следующей ситуации. Предположим, что приемник вообще не работает, и какимлибо образом линия RxD передатчика находится в разрешающем состоянии. В этом случае передатчик будет передавать байт за байтом в «пустоту», посколь ку он проверяет линию RxD только на предмет разрешения. Проверив же линию RxD на предмет запрета и определив, что приемник такого запрета не выдает, передатчик «мо жет сделать вывод», что приемник не работает, что линия RxD не переключается из высокого состояния в низкое (и обратно). В связи с этим передатчик может прекратить передачу (и выдать, например, сообщение об ошибке или какимлибо иным способом просигнализировать о сбое обмена). И еще одно существенное замечание. Во время передачи байта, т. е. с начала старт бита и до конца последнего стопбита, ни процессор передатчика, ни процессор приемни ка не принимает никакого участия в обмене, поскольку и в компьютере, и в микроконт роллере этим занимается UART, т. е. аппаратные средства. Поэтому все проверки состоя ния линий, переключения их из одного состояния в другое, организация задержек (напри
86
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
мер в 25 мкс) и т. п. не оказывают никакого влияния на скорость передачи. Например, за держка в 25 мкс и проверка передатчиком сброса разрешения проводятся во время пе редачи и приема байта и никоим образом не «тормозят» обмен. Как будет видно из даль нейшего изложения, реальная скорость обмена при использовании излагаемого алгорит ма отличается от идеальной не более чем на 1÷2 % и больше зависит от используемой операционной системы и «метода», примененного для обращения к портам ввода/вывода (в частности к порту RS232). Такое сравнение сделано автором, и его результат будет представлен читателю несколько позже. Вернемся к временной диаграмме. Если посмотреть еще раз на временную диаграм му (рис. 2.4.1), то можно заметить, что график зависимости напряжения от времени на линии RxD представляет собой почти симметричный прямоугольный меандр. Длитель ность импульса такого меандра составляет половину времени на передачу 1 байта. Такой импульс легко воспринимается преобразователем интерфейса (об этом уже было упомя нуто ранее). Теперь несколько слов о том, каким образом компьютер может анализировать линию разрешения. Дело в том, что в интерфейсе RS232 компьютера непосредственные чтение и анализ состояния самой линии RxD (т. е. лог. 0 или лог. 1) невозможны. Но, нап ример, соединив эту линию RxD с какойлибо входной линией квитирования (например DSR), состояние которой поддается чтению, можно добиться требуемого: прочитав (в определенное время) состояние линии DSR, можно узнать и состояние линии RxD, т. e. в то время, когда линия RxD используется как линия разрешения, чтение линии DSR покажет ее состояние. Когда же линия RxD используется как линия данных, т. е. при передаче информации из микроконтроллера в компьютер, состояние линии DSR просто не нужно читать и анализировать, т. к. в таком режиме ее состояние не представляет никакого интереса. В обратную сторону, т. е. при передаче информации от микроконтроллера в компьютер, обмен информацией идет подобным же образом, т. е. логика работы аппаратной синхрони зации остается прежней. Есть, правда, некоторые нюансы, на которых мы остановимся несколько позже. Резюмируя все вышесказанное, приведем логическую блоксхему сопряжения компьюте ра и микроконтроллера для целей штатного режима работы при условии аппаратной синхро низации обмена линиями данных (рис. 2.4.2).
Рис. 2.4.2. Логическая блок!схема сопряжения компьютера с микроконтроллером для целей штатного режима работы при аппаратной синхронизации линиями данных с одним передатчиком
Как можно увидеть из приведенной схемы, линия RxD соединена с линией DSR непосред ственно в разъеме RS232 компьютера. Такое соединение целесообразно применять, если в примененном преобразователе интерфейса имеется только один передатчик (см. например, рис. 1.4.1.1, 1.4.4.1.4 и 1.4.4.2.2).
87
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
Если же преобразователь интерфейса имеет 2 передатчика, то блоксхема может быть представлена иначе (рис. 2.4.3). Как можно увидеть из блоксхемы, отсутствующее непосред ственное соединение линий RxD и DSR (как в блоксхеме рис. 2.4.2) заменено на соответству ющее соединение этих сигналов, когда они имеют еще TTLуровни, т. е. это соединение ор ганизовано на входах 2 передатчиков.
Рис. 2.4.3. Логическая блок!схема сопряжения компьютера с микроконтроллером для целей штатного ре! жима работы при аппа! ратной синхронизации линиями данных с 2 передатчиками
Использование 2 передатчиков несколько более предпочтительно, чем использова ние одного, поскольку в этом случае каждый передатчик работает только на один прием ник (на одну нагрузку, составляющую 5 кОм). При использовании же одного передатчика (рис. 2.4.2) он работает уже на 2 приемника, каждый из которых имеет нагрузку в 5 кОм, т. е. нагрузка передатчика в этом случае составляет уже 2,5 кОм. Это несколько снижает длительность фронта и спада сигнала передатчика, но поскольку современные микросхе мы передатчиков достаточно мощные, то к особым негативным результатам не приводит. Использование двух передатчиков имеет смысл, если они присутствуют в преобразовате ле интерфейса (не выбрасывать же их!). По блоксхеме (рис. 2.4.3) с компьютером сопря жено большинство микроконтроллеров, приведенных в настоящей книге, поскольку в схе мах их сопряжения используются преобразователи, имеющие два передатчика. Как мож но догадаться, применение двух передатчиков вместо одного никоим образом не наруша ет логику алгоритма обмена. И еще один момент нуждается в обсуждении. Как видно из рис. 2.4.2 и 2.4.3, линия RxD микроконтроллера не требует «раздвоения», подобного линиям RxD и DSR. Это возможно потому, что чтение состояния линии RxD микроконтроллером не вызывает никаких труднос тей, поскольку эта линия является, помимо входа приемника RS232, обычным цифровым входом, т. е. портом ввода/вывода. Точнее, этот цифровой порт микроконтроллера обладает альтернативной функцией — входом интерфейса RS232. При аппаратной синхронизации требуется не только читать состояние линии RxD, но еще и устанавливать линию TxD в то или иное состояние, соответствующее разрешению или запрету передачи. Линию TxD компьютера возможно установить программно в произвольное состояние (установив или сбросив бит № 6 регистра управления линиями (адрес 3fbh), т. е. бит BREAK (см. приложение 1). Что касается микроконтроллеров, то большинство из них позволяет устанавливать линию TxD в произвольное состояние, как если бы она являлась обычным выходом циф рового порта ввода/вывода. Исключением являются микроконтроллеры семейств C8051FXXX ф. Silicon Laboratories. В этих микроконтроллерах, если порт ввода/вывода выбран матрицей соединений для передачи информации по интерфейсу RS232, т. е. как
88
Рис. 2.4.4. Логическая блок!схема сопряжения компьютера с микроконтроллерами семейств C8051FXXX для целей штатного режима работы при аппаратной синхронизации линиями данных с 2 передатчиками
линия ТxD, то он уже недоступен как обычный порт вывода, и программным способом его состояние изменять уже невозможно. Тем не менее, решить задачу аппаратной синхро низации для микроконтроллеров этого семейства возможно, но только привлекая допол нительные аппаратные средства. Одно из решений, предложенное автором, заключается в том, что нужно выбрать еще один какойлибо дополнительный цифровой порт вво да/вывода (PX.X), состояние выхода которого можно изменять программным способом (для этого требуется освободить порт от всех альтернативных функций) и объединить его выход с линией TxD по схеме 2И (этот вариант уже обсуждался в 1.3.9, см. рис. 1.3.9.1). В этом случае логическая блоксхема сопряжения компьютера с микроконтроллером несколько модифицируется (рис. 2.4.4).
2.4.2.Подпрограммы передачи и приема байта для компьютера и микроконтроллера, использующие логику нового алгоритма обмена Ниже приведены подпрограммы приема и передачи байта, составленные в соответ ствии с логикой работы вышеизложенного алгоритма обмена и временной диаграммой (рис. 2.4.1). Подпрограммы приведены для компьютера на языке Кларион для DOS (Clarion V.3100 — Clarion Software Inc.), а для микроконтроллера — на 2 языках: ассемблере (8051 Macro Assembler Version 4.02a 2500 A.D. Software Inc, 1985) и Си (C51 — Keil Software Inc. V6.14). Подпрограммы на Clarion v.3100 имеют следующий вид: ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine out(3fbh,Y47h) !Установка TxD (разрешение передачи) loop; in(3feh,B); if band(B,2) then break.. !Ожидание стартбита (устки DSR) do DEL20 !Задержка 20 мкс out(3fbh,Y07h) !Сброс линии TxD (запрет передачи) in(3feh,B) !Очистка регистра 3feh чтением loop;in(3fdh,B);if band(B,1) then break.. !Оже конца прихода байта(бит "DR"data ready) in(3f8h,M1[i]) !Чтение байта данных ! ! П/п вывода байта (байт в M[i] ) ! OUTBYTE routine
89
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
loop;in(3fdh,B);if band(B,20h);break.. !Оже готовности передатчика (transmitter empty). loop;in(3feh,B);if band(B,20h);break.. !Оже разреш.передачи(установки DSR) out(3f8h,M[i]) !Вывод байта 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 чтением !
Подпрограммы на Си имеют следующий вид. // // П/ п вывода байта // void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения на передачу байта (от компьютера). SBUF=byte; // Вывод байта. while (!RXD); // Ожидание запрета на передачу (от компьютера). while (!TI); // Ожидание окончания вывода байта микроконтроллером. TI = 0; // Сброс флага передачи (TI). } // // П/п ввода байта // unsigned char inbyte() { unsigned char byte; TXD=0; // Установка разрешения компьютеру передавать байт. while (RXD); // Ожидание стартбита. DEL10(); // Задержка длительностью полбайта (115200 бод). TXD=1; // Запрет компьютеру передавать байт. while(!RI); // Ожидание окончания прихода байта в микроконтроллeр. byte=SBUF; // Ввод байта в микроконтроллер. RI = 0; // Сброс флага приема байта (RI). return(byte); } //
На ассемблере представлены макросы ввода и вывода байта. В связи с тем, что в макросах зап рещено использовать комментарии на русском языке, они приведены на английском. Надеюсь, это не вызовет особых затруднений у читателя, поскольку их перевод содержится в вышеприведенных подпрограммах на Кларионе и Си. Макросы на ассемблере даны ниже. ; ; Макрос ввода байта ; INBYTE .macro clr TxD ;Enable transfer jb RxD,$ ;Waiting startbit call DEL10 ;Call delay 10 mks setb TxD ;Disable transfer jnb ri,$ ;Waiting set flag ri
90
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
mov a,sbuf clr ri .endm
;Input byte from buffer ;Clear flag ri
; ; Макрос вывода байта ; 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) clr ti ;Clear flag ti .endm ;
В качестве микроконтроллера взят один из современных — MSC1210Y5. Этот 4тактный мик роконтроллер занимает промежуточное положение по быстродействию между микроконтролле рами: достаточно скоростными 1тактными (например ADUC847, C8051F067/330D) и 2тактными (например P89LPC938), среднескоростным 6тактным (AT89C51ED2) и стандартным 12тактным (например AT89S8252). Для микроконтроллера MSC1210 выбранная 10мкс задержка (с учетом времени его реакции на начало передачи Трн — см. рис. 2.4.1) переключает его линию TxD (т. е. RxD компьютера) приблизительно между 4м и 5м битом, т. е. примерно в «середине» прини маемого байта. При использовании более высокоскоростного микроконтроллера, чем MSC1210, заде ржку можно немного увеличить (в компьютере — см. подпрограмму на Кларионе), например, установлена задержка в 20 мкс), в противном случае — уменьшить. Необходимо только пом нить, что точное значение задержки не так уж и важно. Главное условие, чтобы переключе ние линии RxD с низкого уровня в высокий (см. рис. 2.4.1) осуществлялось не ранее чем спус тя 1–2 бита (по времени) после начала стартбита (чтобы на такой короткий импульс среаги ровал преобразователь интерфейса), но и не позже чем за 1–2 бита до начала стопбита (чтобы передатчик «поймал» запрет передачи).
2.4.3.Тестовые программы обмена информацией между микроконтроллером и компьютером по интерфейсу RS232, использующие логику нового алгоритма 2.4.3.1. Общие положения Ниже будут приведены реально работающие программы для микроконтроллеров MSC1210, ADUC834/845, P89LPC938/904, AT89C51ED2/RD2 и C8051F067/F330D, напи санные на языке C51 (для интересующихся будут приведены программы для некоторых мик роконтроллеров и на ассемблере) и программа для компьютера, написанная на языке Clarion V3.100 и работающая в операционной системе DOS. Что касается программ для компьютера, работающих в ОС Win'98/XP, то они будут приведены несколько позже, поскольку, с одной стороны, в программах для ОС Win'98/XP за основу будет взята именно программа для DOS,
91
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
с другой, — прежде чем приводить программы для Win'98/XP, необходимо будет объяснить предварительные положения и соображения, без уяснения которых, по мнению автора, по нять некоторые моменты программирования в ОС Win'98/XP будет непросто. Хотя программы для микроконтроллеров и снабжены комментариями, все же автор счел нужным привести краткие пояснения к каждой программе, т. к. в комментариях отражены не все моменты и нюансы работы каждого конкретного микроконтроллера. В основном эти пояснения будут касаться инициализации интерфейса RS232, таймеров, которые предназначены для гене рации скорости обмена, и некоторых других особенностей представляемых микроконтроллеров.
2.4.3.2. Тестовая программа обмена для микроконтроллера MSC1210 Ниже приведены две тестовые программы для микроконтроллера MSC1210: первая — на Си, вторая — на ассемблере. Программы функционируют при условии сопряжения микроко нтроллера MSC1210 с компьютером по схемам (рис. 1.3.5.1 и 1.3.10). Для функционирования программ совместно с компьютером должна использоваться компьютерная программа, при веденная в 2.4.3.7. В качестве генератора скорости обмена используются таймер T2 и внеш ний генератор с кварцевым резонатором частотой 11 059 200 Гц. Скорость обмена установ лена 115 200 бод. Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том же порядке, в котором байты поступили в микроконтроллер. Программа на ассемблере записывает поступившие байты в стек, а затем считывает их оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. Программа на Си // Программа вывода строки байт для MSC1210, // скорость обмена 115200 бод, кварц 11059200 Гц. // см. inrs115.asm // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "reg1210.h" /* для RS232 */ // // Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". // Переменные u.l (размерностью ushort) и // u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) // перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных lenh(первая) и lenl(вторая) // в структуре (struct) строго определен и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short l; // Длина строки("u.l"). struct{ unsigned char lenh; // Ст.байт длины строки("u.bt.lenh").
92
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
unsigned char lenl; }bt; }u; //
// Мл.байт длины строки("u.bt.lenl").
unsigned char c,j,a[80]; unsigned short temp_L; //Переменная для временного(temp) //хранения длины строки. void DEL10(void) { for (j=0;j<10;j++); } void initrs(void) { SCON=0xec; T2CON=0x34;
// Инициализация // интерфейса // RS232.
RCAP2=3; //Vобм.=115200 бод. THL2=3; // //
RCAP2=36; //Vобм.=9600 бод. THL2=36; }
void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения на передачу байта (от компьютера). SBUF=byte; // Вывод байта. while (!RXD); // Ожидание запрета на передачу (от компьютера). while (!TI); // Ожидание окончания вывода байта микроконтроллером. TI = 0; // Сброс флага передачи (TI). } unsigned char unsigned char TXD=0; while (RXD); DEL10(); TXD=1; while(!RI); byte=SBUF; RI = 0; return(byte); }
inbyte() { byte; // Установка разрешения компьютеру передавать байт. // Ожидание стартбита. // Задержка длительностью полбайта (115200 бод). // Запрет компьютеру передавать байт. // Ожидание окончания прихода байта в микроконтроллeр. // Ввод байта в микроконтроллер. // Сброс флага приема байта (RI).
/**************************************************/ void main(void) { initrs(); P3DDRL=0x07; REN=1; // Установка на прием.
93
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
CKCON = 0x03; START: u.bt.lenl=inbyte(); u.bt.lenh=inbyte(); temp_L=u.l;
for(u.l=0;u.l
REN=0; for(u.l=0;u.l
// MOVX=12 cycle stretch(1 мкс).
//Прием мл.байта длины строки. //Прием ст.байта длины строки. //Запоминание длины строки //в переменной temp_L. //Переменная u.lдлина строки(ushort) //заполняется автоматически после //заполнения переменных //u.bt.lenl и u.bt.lenh. //Прием из компьютера //очередного //байта строки. //Изменение u.l (например, u.l++) //влечет за собой автоматическое //и соответственное изменение //u.bt.lenl и u.bt.lenh. //Если u.l — адрес памяти, //то u.bt.lenl и u.bt.lenh //соответственно младший //и старший байты этого адреса. //Установка RS232 на передачу. //Передача в компьютер //очередного //байта строки.
REN=1;
//Установка RS232 на прием.
c=inbyte(); if (c==0x40) goto START;
//Если принятый символ="@", //то продолжение работы, //иначе — конец.
E: goto E; }
Программа на ассемблере ; ; Программа приема MK строки символов по RS232 (с передачей длины строки) ; и вывода символов из МК в компьютер. ; Fкв=11059200 Гц. Скорость обмена — 115200 и 9600 бод. ; Синхронизация — с помощью линий TxD и RxD. ; Для проверки использовать программы HELLO.EXE(CLA). ; ;Макрос ввода байта
94
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
; ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!! ; ; Алгоритм ввода байта ; INBYTE .macro clr TxD ;Enable transfer jb RxD,$ ;Waiting startbit call DEL10 ;Call delay 10 mks setb TxD ;Disable transfer jnb ri,$ ;Waiting set flag ri mov a,sbuf ;Input byte from buffer clr ri ;Clear flag ri .endm ; ; Алгоритм вывода байта ; 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) clr ti ;Clear flag ti .endm ; .DATA ; ; Переменные ; T2CON equ 0c8h RCAP2H equ 0cbh RCAP2L equ 0cah ; CKCON equ 08eh USEC equ 0fbh PDCON equ 0f1h ACLK equ 0f6h PASEL equ 0f2h P3DDRL equ 0b3h ; .CODE .org 0000h ;Вектор прерывания по RST jmp MAIN .org 0003h ;Вектор прерывания по INT0 reti .org 001bh ;Вектор прерывания по TF1 reti .org 0053h ;вектор прерывания от TIC reti ;
95
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
; Основная программа ; .org 0060h mov sp,#20h MAIN: ; ; ; Инициал. посл. порта ; mov SCON,#11101100b ;8 бит,2 стопа,REN=0(запрет приема ReciveENable=0), ;TI=0,RI=0,Vобм определяется Т1 или Т2, ;SM1=SM2=1 режим 3. RB8=TB8=1. ; ;Инициализация таймерa T2 — как таймера. ; mov T2CON,#00110100b; TF2=0,EXF2=0,RCLK=1,TCLK=1,EXEN2=0, ; TR2=1start,CNT2=0,CAP2=0. ; mov RCAP2H,#0ffh ;Fобм.=Freq/(32*(65536(RCAP2H,RCAP2L))) ;65536RCAP2H,RCAP2L=6553665533=3 (253=fch) mov RCAP2L,#3
;Fобм.=11059200/(32*3)=115200 бод.
;mov ;mov ;mov ;mov
;Fобм.=22118400/(32*6)=115200 бод. ;Fобм.= 7372800/(32*2)=115200 бод. ;Fобм.= 3686400/(32*1)=115200 бод. ;65536RCAP2H,RCAP2L=65536(65536,(25636))=36 ;Fобм.=11059200/(32*36)=9600 бод. ;Fобм.= 3686400/(32*12)=9600 бод.
RCAP2L,#6 RCAP2L,#2 RCAP2L,#1 RCAP2L,#36
;mov RCAP2L,#12
mov PCON,#80h mov CKCON,#20h mov P3DDRL,#07h ; ;Ввод байт по посл. порту ; START: setb REN ;Разрешение приема. mov dptr,#0 INBYTE mov r0,a ; Мл. байт длины INBYTE mov r1,a ; Ст. байт длины spin: ;
INBYTE; Байт в a push a
;
96
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
inc dptr mov a,r1 cjne a,dph,spin mov a,r0 cjne a,dpl,spin ; ; Вывод байт по посл. порту ; clr REN ;Запрет приема. spout: pop a OUTBYTE djnz r0,spout ; ; Ввод команды продолжения работы ; setb REN ;Разрешение приема. IB: INBYTE cjne a,#40h,E jmp START E:
mov 0f2h,#0 jmp $ ; DEL10 mov b,#10 djnz b,$ ret ; .end ;
2.4.3.3. Тестовая программа обмена для микроконтроллеров ADUC847/834 Ниже приведены две тестовых программы для микроконтроллеров ADUC847/834. Пер вая — на Си, вторая на ассемблере. Программы функционируют при условии сопряжения микроконтроллеров с компьютером по схемам (рис. 1.3.6.1 и 1.3.10). Для функционирования программ совместно с компьютером должна использоваться компьютерная программа, при веденная в 2.4.3.7. В качестве генератора скорости обмена используется таймер T3 и внеш ний генератор с кварцевым резонатором частотой 32 768 Гц. Установка одной и той же скорости обмена (в данном случае 115 200 бод) для микроконт роллеров ADUC847 и ADUC834 несколько отличается. Различие проявляется в значении реги стра T3CON. При скорости обмена в 115 200 бод T3CON равен 0x82 для ADUC847 и 0x81 для ADUC834. В программе установлена скорость обмена в 115 200 бод для микроконтроллера ADUC847. Подпрограмма задержки длительностью по времени в полбайта, которую вызывает макрос ввода байта, использует разные максимальные значения итерационного цикла: для ADUC834 — 7, для ADUC847 — 20. Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том же порядке, в котором байты поступили в микроконтроллер.
97
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Программа на ассемблере записывает поступившие байты в стек, а затем считывает их оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. Программа на Си // Программа вывода строки байт для ADUC847/834, // скорость обмена 115200 бод, кварц 32768 Гц. // см. inrs115a.asm // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "aduc845.h" /* для RS232 */ void DEL7(void) { unsigned char j; for (j=0;j<20;j++); //7для ADUC834, 20847 } void initrs(void) { PLLCON=0; T3CON=0x82; // 0x85 9600| 0x81для ADUC834,0x82для ADUC847 115200 T3FD=0x2d; // 0x12 бод | 0x2d бод. SCON=0x40; } void outbyte(unsigned char byte) { while (RXD); SBUF=byte; while (!RXD); while (!TI); TI = 0; } unsigned char inbyte() { unsigned char byte; TXD=0; while (RXD); DEL7(); // Задержка длительностью полбайта (115200 бод). TXD=1; while(!RI); byte=SBUF; RI = 0; return(byte); } /**************************************************/ void main(void) { unsigned char c,lenl,lenh,a[80];
98
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
int i,l; initrs(); START: REN=1; lenl=inbyte(); lenh=inbyte(); l=lenh*256+lenl; for(i=0;i
E: }
Программа на ассемблере ; ; Программа приема MK строки символов по RS232 (с передачей длины строки) ; и вывода символов из МК в компьютер. ; Fкв=32768 Гц). Скорость обмена — 115200 и 9600 бод. ; Синхронизация — с помощью линий TxD и RxD. ; ; ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!! ; ; Макрос ввода байта ; INBYTE .macro clr TxD ;Enable transfer jb RxD,$ ;Waiting startbit call DEL7 ;Delay 7/20 mks setb TxD ;Disable transfer jnb ri,$ ;Waiting set flag ri mov a,sbuf ;Input byte from buffer clr ri ;Clear flag ri .endm ; ; Макрос вывода байта ; OUTBYTE .macro jb RxD,$ ;Waiting enable transfer
99
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
mov sbuf,a ;Output byte in buffer jnb RxD,$ ;Waiting disable transfer.WARNING!!! jnb ti,$ ;Waiting output last bit (flag ti) clr ti ;Clear flag ti .endm ; .DATA ; ; Переменные ; PLLCON equ 0d7h ; Умножитель частоты для работы процессора T3FD equ 09dh T3CON equ 09eh ; .CODE .org 0000h ;Вектор прерывания по RST jmp MAIN .org 0003h ;Вектор прерывания по INT0 reti .org 001bh ;Вектор прерывания по TF1 reti .org 0053h ;вектор прерывания от TIC reti ; ; Основная программа ; .org 0060h mov sp,#20h
MAIN: mov PLLCON,#0h ; ; ; Инициал. посл. порта ; ; ;Инициализация таймерa T3 для генерации бод. ; mov T3CON,#82h ;#82hдля ADUC847, #81hдля ADUC834|115200 mov T3FD,#2dh ; mov SCON,#40h;52h ; ;Ввод байт по посл. порту ; START: setb REN ;Разрешение приема.
100
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
mov dptr,#0 INBYTE mov r0,a ; Мл. байт длины INBYTE mov r1,a ; Ст. байт длины spin: ;
INBYTE; Байт в a push a
; inc dptr mov a,r1 cjne a,dph,spin mov a,r0 cjne a,dpl,spin ; ; Вывод байт по посл. порту ; clr REN ;Запрет приема. spout: pop a OUTBYTE djnz r0,spout ; ; Ввод команды продолжения работы ; setb REN ;Разрешение приема. IB: INBYTE cjne a,#40h,E jmp START E: jmp $ ; DEL7 mov b,#20 ;7ADUC834,20ADUC847 djnz b,$ ret ; .end ;
2.4.3.4. Тестовая программа обмена для микроконтроллеров AT89C51ED2(RD2) Ниже приведены две тестовых программы для микроконтроллера AT89C51ED2: первая — на Си, вторая — на ассемблере. Программы функционируют при условии сопряжения микроконтрол лера с компьютером по схемам (рис. 1.3.7.1 и 1.3.10). Для функционирования программ совмест но с компьютером должна использоваться компьютерная программа, приведенная в 2.4.3.7. В качестве генератора скорости обмена используются специальный генератор скорости обмена (Baud Rate Generator — BRG) и внешний кварцевый резонатор частотой 11 059 200 Гц. Скорость обмена установлена 115 200 бод.
101
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Программа на Си запоминает принимаемую строку из 75 байт и выводит ее обратно в том же порядке, в котором байты поступили в микроконтроллер. Программа на ассемблере записывает поступившие байты в стек, а затем считывает их оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. Программа на Си
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
return(byte); } /**************************************************/ void main(void) { initrs();
// // Программа вывода строки байт для AT89C51ED2, // скорость обмена 115200 бод, кварц 11059200 Гц. // см. inrs_ed2.asm // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "at89c51xd2.h" unsigned char c,j,lenl,lenh,a[80]; int i,l;
REN=1; START:
lenl=inbyte(); lenh=inbyte(); l=lenh*256+lenl; for(i=0;i
void DEL7(void) { for (j=0;j<7;j++) {} } void initrs(void) { CKCON0=1; PCON=0x80; SCON=0xec; BRL=250; //115200 бод BDRCON=0x1f; } void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения на передачу байта (от компьютера). SBUF=byte; // Вывод байта. while (!RXD); // Ожидание запрета на передачу (от компьютера). while (!TI); // Ожидание окончания вывода байта микроконтроллером. TI = 0; // Сброс флага передачи (TI). } unsigned char unsigned char TXD=0; while (RXD); DEL7(); TXD=1; while(!RI); byte=SBUF; RI = 0;
102
inbyte() { byte; // Установка разрешения компьютеру передавать байт. // Ожидание стартбита. // Задержка длительностью полбайта (115200 бод). // Запрет компьютеру передавать байт. // Ожидание окончания прихода байта в микроконтроллeр. // Ввод байта в микроконтроллер. // Сброс флага приема байта (RI).
// Установка на прием.
for(i=0;i
Программа на ассемблере ; ; Программа приема MK AT89C51ED2 строки символов по RS232 (с передачей ; длины строки); и вывода символов из МК в компьютер. ; Fкв.=11059200 Гц, X2режим. Скорость обмена — 115200 и 9600 бод. ; Синхронизация — с помощью линий TxD и RxD. ; Для проверки использовать программы OUTBYTEC.EXE(CLA) и OUTBYTE1.EXE(BAS). ; ;Макрос ввода байта ; ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ЯЗЫК В КОММЕНТАРИЯХ !!!!!!! ; ; Алгоритм ввода байта ; INBYTE .macro clr TxD ;Enable transfer jb RxD,$ ;Waiting startbit
103
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
call DEL7 ;Call delay 7 mks setb TxD ;Disable transfer jnb ri,$ ;Waiting set flag ri mov a,sbuf ;Input byte from buffer clr ri ;Clear flag ri .endm ; ; Алгоритм вывода байта ; 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) clr ti ;Clear flag ti .endm ; .DATA ; ; Переменные ; CKCON0 equ 08fh BRL equ 09ah BDRCON equ 09bh ; .CODE .org 0000h ;Вектор прерывания по RST jmp MAIN .org 0003h ;Вектор прерывания по INT0 reti .org 001bh ;Вектор прерывания по TF1 reti .org 0053h ;вектор прерывания от TIC reti ; ; Основная программа ; .org 0060h mov sp,#20h MAIN: ; ; ; Инициал. посл. порта ; mov PCON,#80h mov SCON,#11101100b ;8 бит,2 стопа,REN=0(запрет приема ReciveENable=0), ;TI=0,RI=0,Vобм определяется Т1 или Т2, ;SM1=SM2=1 режим 3. RB8=TB8=1.
104
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
;#52h и #40h работают! ; ;Инициализация BRG. ; mov CKCON0,#1 ;X2режим mov BRL,#250 mov BDRCON,#1fh ; ;Ввод байт по посл. порту ; START: setb REN ;Разрешение приема. mov dptr,#0 INBYTE mov r0,a ; Мл. байт длины INBYTE mov r1,a ; Ст. байт длины spin: ;
INBYTE; Байт в a push a
; inc dptr mov a,r1 cjne a,dph,spin mov a,r0 cjne a,dpl,spin ; ; Вывод байт по посл. порту ; clr REN ;Запрет приема. spout: pop a OUTBYTE djnz r0,spout ; ; Ввод команды продолжения работы ; setb REN ;Разрешение приема. IB: INBYTE cjne a,#40h,E jmp START E: jmp $ ; DEL7 mov b,#7 djnz b,$ ret ; .end
105
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
2.4.3.5. Тестовая программа обмена для микроконтроллеров P89LPC938/904 Ниже приведены две тестовых программы на Си для микроконтроллеров P89LPC938 и P89LPC904 и одна программа на ассемблере для P89LPC904. Программы функционируют при условии сопряжения микроконтроллеров с компьютером по схемам (рис. 1.3.8.1–1.3.8.3, 1.3.8.5 и 1.3.10). Для функционирования программ совместно с компьютером должна исполь зоваться компьютерная программа, приведенная в 2.4.3.7. В качестве генератора скорости обмена используется внутренний генератор скорости обмена (Baud Rate Generator — BRG) с частотой 7 372 800 Гц. Скорость обмена установлена 115 200 бод. Программы на Си запоминают принимаемую строку из 75 байт и выводят ее обратно в том же порядке, в котором они поступили в микроконтроллер. Программа на ассемблере записывает поступившие байты в стек, а затем считывает их оттуда и выводит в компьютер. Поэтому байты выводятся в компьютер в обратном порядке. Программа на Си для P89LPC938 // Программа вывода строки байт для P89LPC938, // скорость обмена 115200 бод, кварца нет, // частота внутреннего генератора 7372800 Гц. // см. inrs115l.asm // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "reg935.h" /* для RS232 */ // // Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". // Переменные u.l (размерностью ushort) и // u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) // перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных lenh(первая) и lenl(вторая) // в структуре (struct) строго определен и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short l; // Длина строки("u.l"). struct{ unsigned char lenh; // Ст.байт длины строки("u.bt.lenh"). unsigned char lenl; // Мл.байт длины строки("u.bt.lenl"). }bt; }u; // unsigned char c,j,a[80]; unsigned short temp_L; //Переменная для временного(temp) //хранения длины строки. void DEL10(void) {
106
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
for (j=0;j<10;j++); //10 } void initrs(void) { SSTAT=0x00; //Стандартный 51совместимый RS232. P1M1=0x02; //¦Вместе это означает: ¦ P1M2=0x01; //¦TxDpush/pull_output, RxDinput.¦ SCON=0x40; //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный бит=1. BRGCON=0x00; BRGR0=0x30; //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]= BRGR1=0x00; //7372800/[(0*256+48)+16]=7372800/64=115200. BRGCON=0x03; //Разрешение SBRGS и BRGEN. } void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения на передачу байта (от компьютера). SBUF=byte; // Вывод байта. while (!RXD); // Ожидание запрета на передачу (от компьютера). while (!TI); // Ожидание окончания вывода байта микроконтроллером. TI = 0; // Сброс флага передачи (TI). } unsigned char unsigned char TXD=0; while (RXD); DEL10(); TXD=1; while(!RI); byte=SBUF; RI = 0; return(byte); }
inbyte() { byte; // Установка разрешения компьютеру передавать байт. // Ожидание стартбита. // Задержка длительностью полбайта (115200 бод). // Запрет компьютеру передавать байт. // Ожидание окончания прихода байта в микроконтроллeр. // Ввод байта в микроконтроллер. // Сброс флага приема байта (RI).
/**************************************************/ void main(void) { initrs(); REN=1; // Установка на прием. START: u.bt.lenl=inbyte(); u.bt.lenh=inbyte(); temp_L=u.l;
//Прием мл.байта длины строки. //Прием ст.байта длины строки. //Запоминание длины строки //в переменной temp_L. //Переменная u.lдлина строки(ushort) //заполняется автоматически после //заполнения переменных //u.bt.lenl и u.bt.lenh.
107
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
for(u.l=0;u.l
REN=0; for(u.l=0;u.l
//Прием из компьютера //очередного //байта строки. //Изменение u.l (например, u.l++) //влечет за собой автоматическое //и соответственное изменение //u.bt.lenl и u.bt.lenh. //Если u.l — адрес памяти, //то u.bt.lenl и u.bt.lenh //соответственно младший //и старший байты этого адреса. //Установка RS232 на передачу. //Передача в компьютер //очередного //байта строки. //Установка RS232 на прием. //Если принятый символ="@", //то продолжение работы, //иначе — конец.
goto E; } //
Программа на Си для P89LPC904 // Программа вывода строки байт для P89LPC904, // скорость обмена 115200 бод, частота внутреннего // генератора 7372800 Гц. // см. inrs115l.asm // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "reg904.h" /* для RS232 */ // // Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". // Переменные u.l (размерностью ushort) и // u.bt.lenl и u.bt.lenh (обе размерностью byte(unsigned char)) // перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных lenh(первая) и lenl(вторая) // в структуре (struct) строго определен и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short l; // Длина строки("u.l").
108
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
struct{ unsigned char lenh; unsigned char lenl; }bt; }u; //
// Ст.байт длины строки("u.bt.lenh"). // Мл.байт длины строки("u.bt.lenl").
unsigned char c,j,a[80]; unsigned short temp_L; //Переменная для временного(temp) //хранения длины строки. void DEL10(void) { for (j=0;j<10;j++); //10 } void initrs(void) { SSTAT=0x00; P1M1=0x02; P1M2=0x01; SCON=0x40; бит=1. BRGR0=0x30; BRGR1=0x00; BRGCON=0x03; }
//Стандартный 51совместимый RS232. //¦Вместе это означает: ¦ //¦TxDpush/pull_output, RxDinput.¦ //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]= //7372800/[(0*256+48)+16]=7372800/64=115200. //Разрешение SBRGS и BRGEN.
void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения на передачу байта (от компьютера). SBUF=byte; // Вывод байта. while (!RXD); // Ожидание запрета на передачу (от компьютера). while (!TI); // Ожидание окончания вывода байта микроконтроллером. TI = 0; // Сброс флага передачи (TI). } unsigned char unsigned char TXD=0; while (RXD); DEL10(); TXD=1; while(!RI); byte=SBUF; RI = 0; return(byte); }
inbyte() { byte; // Установка разрешения компьютеру передавать байт. // Ожидание стартбита. // Задержка длительностью полбайта (115200 бод). // Запрет компьютеру передавать байт. // Ожидание окончания прихода байта в микроконтроллeр. // Ввод байта в микроконтроллер. // Сброс флага приема байта (RI).
/**************************************************/ void main(void) { initrs(); REN=1; // Установка на прием.
109
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
START: u.bt.lenl=inbyte(); u.bt.lenh=inbyte(); temp_L=u.l;
for(u.l=0;u.l
REN=0; for(u.l=0;u.l
//Прием мл.байта длины строки. //Прием ст.байта длины строки. //Запоминание длины строки //в переменной temp_L. //Переменная u.lдлина строки(ushort) //заполняется автоматически после //заполнения переменных //u.bt.lenl и u.bt.lenh. //Прием из компьютера //очередного //байта строки. //Изменение u.l (например, u.l++) //влечет за собой автоматическое //и соответственное изменение //u.bt.lenl и u.bt.lenh. //Если u.l — адрес памяти, //то u.bt.lenl и u.bt.lenh //соответственно младший //и старший байты этого адреса. //Установка RS232 на передачу. //Передача в компьютер //очередного //байта строки. //Установка RS232 на прием. //Если принятый символ="@", //то продолжение работы, //иначе — конец.
goto E; } //
Программа на ассемблере для P89LPC904 ; ; Программа для микроконтроллера P89LPC904 ; приема строки символов по RS232 ; (с передачей длины строки) и вывода символов ; из МК в компьютер. F(CCLK)=7372800 Гц. ; Скорость обмена — 115200 и 9600 бод. ; Синхронизация — с помощью линий TXD и RxD. ; ; ; Определение выводов TXD и RXD RS232 P89LPC904
110
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
; TXDLPC: .reg p1.0 ;a не p3.0!!! RXDLPC: .reg p1.1 ;а не p3.1!!! ; ; ; МАКРОСЫ ; ; В МАКРОСАХ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЙ ; ЯЗЫК В КОММЕНТАРИЯХ !!!!!!! ; ; ; Макрос ввода байта ; INBYTE .macro clr TXDLPC ;Enable transfer jb RXDLPC,$ ;Waiting startbit setb TXDLPC ;Disable transfer jnb ri,$ ;Waiting set flag ri mov a,sbuf ;Input byte from buffer clr ri ;Clear flag ri .endm ; ; Алгоритм вывода байта ; OUTBYTE .macro jb RXDLPC,$ ;Waiting enable transfer mov sbuf,a ;Output byte in buffer jnb RXDLPC,$ ;Waiting disable transfer.WARNING!!! jnb ti,$ ;Waiting output last bit (flag ti) clr ti ;Clear flag ti .endm ; .DATA ; ; Переменные ; P1M1 equ 91h P1M2 equ 92h BRGCON equ 0bdh BRG0 equ 0beh BRG1 equ 0bfh SSTAT equ 0bah ; .CODE .org 0000h ;Вектор прерывания по RST jmp MAIN .org 0003h ;Вектор прерывания по INT0
111
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
reti .org 001bh ;Вектор прерывания по TF1 reti .org 0053h ;вектор прерывания от TIC reti ; ; Основная программа ; .org 0060h ; mov sp,#20h MAIN: ; ; org $ mov sp,#20h ; ; Инициал. посл. порта ; SPINIT: mov SSTAT,#00h ;Стандартный 51совместимый RS232. mov P1M1,#02h ;¦Вместе это означает: ¦ mov P1M2,#01h ;¦TxDpush/pull_output, RxDinput.¦ mov SCON,#40h ;Все биты SCON,кроме SM1,равны 0, SM1=1. mov BRG0,#30h ;30h=48.Vobm=CCLK/[(BRG1*256+BRG0)+16]= mov BRG1,#00h ;7372800/[(0*256+48)+16]=7372800/64=115200. mov BRGCON,#03h ;Разрешение SBRGS и BRGEN. ; ;Ввод байт по посл. порту ; START: setb REN ;Разрешение приема. mov dptr,#0 INBYTE mov r0,a ; Мл. байт длины INBYTE mov r1,a ; Ст. байт длины spin: ;
INBYTE; Байт в a push a
; inc dptr mov a,r1 cjne a,dph,spin mov a,r0 cjne a,dpl,spin ; ; Вывод байт по посл. порту ; clr REN ;Запрет приема. spout: pop a
112
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
OUTBYTE djnz r0,spout ; ; Ввод команды продолжения работы ; setb REN ;Разрешение приема. IB: INBYTE cjne a,#40h,E jmp START E:
jmp $ .end ;
2.4.3.6 Тестовая программа обмена для микроконтроллеров C8051F067/330D В отличие от ранее рассмотренных микроконтроллеров, программирование микроконт роллеров C8051FXXX имеет свои особенности, основные из которых сводятся к следующему: 1. Определить источник тактирования микроконтроллера (SYSCLK) — либо внешний ге нератор (например кварцевый), либо внутренний. 2. Определить какие выводы микроконтроллера будут принимать участие в работе по матрице соединений. 3. Запретить сторожевой таймер (либо написать и включить в текст своей программы специальную программу сторожевого таймера). Без этого ни одна программа рабо тать не будет, поскольку сторожевой таймер по умолчанию включен. 4. Выводы микроконтроллера, использующиеся как альтернативные функции портов ввода/вывода, нельзя больше использовать в качестве портов вывода. Например, если использовать порт P0.0 в качестве линии TxD (по умолчанию в C8051067), то эту линию (а именно P0.0) нельзя устанавливать в произвольное состояние командами Си: TxD=0 или TxD=1. Ниже приведены две тестовых программы на Си для микроконтроллеров C8051F067 и C8051F330D. Программы функционируют при условии сопряжения микроконтроллеров с компьютером по схемам (рис. 1.3.9.1 и 1.3.10). Для функционирования программ совме стно с компьютером должна использоваться компьютерная программа, приведенная в 2.4.3.7. В программе для C8051F067 качестве генератора скорости обмена используется ге нератор с внешним кварцевым резонатором с частотой 11 059 200 Гц, в программе для C8051F330D — внутренний генератор частотой 24,5 МГц. Скорость обмена установлена в 115 200 бод. И та, и другая программа запоминает принимаемую строку из 75 байт и выводит ее обрат но в том же порядке, в котором они поступили в микроконтроллер. Программа на Си для C8051F067 // // Программа вывода строки байт для C8051F067,
113
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
// скорость обмена 115200 бод, кварц 11059200 Гц. // // // Includes // #include "c8051f060.h" // SFR declarations //#include "stdarg.h" #include "stdio.h" /* для printf */ //#include "stdlib.h" // // // Global CONSTANTS // #define SYSCLK 11059200 // SYSCLK frequency in Hz #define BAUDRATE 115200 // Baud Rate for UART0 // sbit TX0 = P0^2; sbit RX0 = P0^1; // unsigned char c,j,lenl,lenh,a[80]; int i,l; //########################################################### // // SYSCLK_Init // void SYSCLK_Init (void) { int i; OSCXCN = 0x65; // start external oscillator with // 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 // RSTSRC = 0x04; // enable missing clock detec tor reset CLKSEL = 0x01; // change to external crystal OSCICN = 0x00; // disable internal oscillator } // // // UART0_Init // // Configure the UART0 using Timer1, for
and 8N1. //
114
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
void UART0_Init (void) { SCON0 = 0x52; SSTA0 = 0x10;
// SCON: mode 1, 8bit UART, diable RX // Timer 1 generates UART0 baud rate and // UART0 baud rate divide by two disabled
TMOD = 0x20; // TMOD: timer 1, mode 2, 8bit reload TH1 = (SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate TR1 = 1; // start Timer1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base PCON |= 0x80; // SMOD = 1 TI0 = 1; // Indicate TX ready c=SBUF0; } // // // PORT_Init // // // Configure the Crossbar and GPIO ports // void PORT_Init (void) { XBR0 = 0x04; // Enable UART0 on crossbar XBR1 = 0x00; XBR2 = 0x40; // Enable crossbar and weak pullups P0MDOUT = 0x05; // enable P0.0,P02 outputs as pushpull, } // //########################################################### void DEL10(void) { for (j=0;j<10;j++) {} } // void DEL100(void) { unsigned int i; for (i=0;i<100;i++) {} } // void outbyte(unsigned char byte) { while (RX0); // Ожидание разрешения на передачу байта (от компьютера). SBUF0=byte; // Вывод байта. while (!RX0); // Ожидание запрета на передачу (от компьютера). while (!TI0); // Ожидание окончания вывода байта микроконтроллером. TI0 = 0; // Сброс флага передачи (TI). } unsigned char inbyte() {
115
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
unsigned char TX0=0; while (RX0); DEL10(); TX0=1; while(!RI0); byte=SBUF0; RI0 = 0; return(byte); }
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
byte; // Установка разрешения компьютеру передавать байт. // Ожидание стартбита. // Задержка длительностью полбайта (115200 бод). // Запрет компьютеру передавать байт. // Ожидание окончания прихода байта в микроконтроллeр. // Ввод байта в микроконтроллер. // Сброс флага приема байта (RI).
/**************************************************/ void main(void) { //################################ WDTCN = 0xde; // disable watchdog timer WDTCN = 0xad; SFRPAGE=0x0f; // SYSCLK_Init (); PORT_Init ();
// initialize SYSCLK
SFRPAGE=0x00; // UART0_Init (); //################################ REN0=1;
//
// Установка на прием.
START: REN=1;
//Приeм.
lenl=inbyte(); lenh=inbyte(); l=lenh*256+lenl; for(i=0;i
116
//Передача.
// initialize UART0
REN0=1; //Прием. c=inbyte(); if (c==0x40) goto START; E: goto E; }
Программа для C8051F330D // Программа вывода строки байт для C8051F330D, // скорость обмена 115200 бод, кварца нет, // частота внутреннего генератора 24500000 Гц. // Используется UART0. // #include "stdarg.h" #include "stdio.h" /* для printf */ #include "stdlib.h" #include "c8051f330.h" // #define SYSCLK 24500000 // SYSCLK частота внутр.ген. в Гц. #define BAUDRATE 115200 // Скорость обмена в бодах. #define ONE 1 #define NUL 0 // sbit TX0 = P1^7; // Определение бита TXD UART0. sbit RX0 = P0^5; // Определение бита RXD UART0. // // Совмещение "u.l" с "u.bt.lenl" и "u.bt.lenh". // union{ unsigned short l; // Длина строки("u.l"). struct{ unsigned char lenh; // Ст.байт длины строки("u.bt.lenh"). unsigned char lenl; // Мл.байт длины строки("u.bt.lenl"). }bt; }u; // unsigned char c,j,a[80]; unsigned short temp_L; //Переменная для временного(temp) //хранения длины строки. // void DEL20(void) { for (j=0;j<20;j++); //10 } void initrs(void) { // PCA0MD &= ~0x40; // WDT — запрещен. //
117
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
OSCICN = 0x83; //Инициализация внутреннего RSTSRC = 0x06; //генератора. // XBR0 = 0x01; // UART разрешен. XBR1 = 0x40; // Матрица выходов разрешена. P0MDOUT |=0x10; // TxD0двухтактный выход, RxD0вход. P1MDOUT |=0x80; // Tx0 — двухтактный выход. // SCON0=0x10; //Инициализация RS232 (UART0). TH1=(SYSCLK/BAUDRATE/2); //Синхронизация от CKCON |= 0x08; //таймера T1. TL1=TH1; TMOD &= ~0xf0; TMOD |= 0x20; TR1=1; // TI0=1; } void outbyte(unsigned char byte) { while (RX0); // Ожидание разрешения на передачу байта (от компьютера). SBUF0=byte; // Вывод байта. while (!RX0); // Ожидание запрета на передачу (от компьютера). while (!TI0); // Ожидание окончания вывода байта микроконтроллером. TI0 = 0; // Сброс флага передачи (TI0). }
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
//заполнения переменных //u.bt.lenl и u.bt.lenh. for(u.l=0;u.l
REN0=0; for(u.l=0;u.l
unsigned char inbyte() { unsigned char byte; TX0=NUL; // Установка разрешения компьютеру передавать байт. while (RX0); // Ожидание стартбита. DEL20(); // Задержка длительностью полбайта (115200 бод). TX0=ONE; // Запрет компьютеру передавать байт. while(!RI0); // Ожидание окончания прихода байта в микроконтроллeр. byte=SBUF0; // Ввод байта в микроконтроллер. RI0 = 0; // Сброс флага приема байта (RI0). return(byte); } /**************************************************/ void main(void) { initrs(); REN0=1; // Установка на прием. START: u.bt.lenl=inbyte(); u.bt.lenh=inbyte(); temp_L=u.l;
118
//Прием мл.байта длины строки. //Прием ст.байта длины строки. //Запоминание длины строки //в переменной temp_L. //Переменная u.lдлина строки(ushort) //заполняется автоматически после
//Прием из компьютера //очередного //байта строки. //Изменение u.l (например, u.l++) //влечет за собой автоматическое //и соответственное изменение //u.bt.lenl и u.bt.lenh. //Если u.l — адрес памяти, //то u.bt.lenl и u.bt.lenh //соответственно младший //и старший байты этого адреса. //Установка RS232 на передачу. //Передача в компьютер //очередного //байта строки. //Установка RS232 на прием. //Если принятый символ="@", //то продолжение работы, //иначе — конец.
goto E; } //
2.4.3.7. Тестовая программа обмена для компьютера в ОС DOS Для функционирования любой из тестовых микроконтроллерных программ, приведен ных в 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. Программа инициализирует интерфейс RS232 компьютера (порт COM 1:N,8,1,115 200), запускает микроконтроллер, передает в него строку из 75 байт (представляющую собой символы латинского и русского алфавита), принимает эту строку от микроконтроллера и обе строки выводит (для сравнения) на экран монитора. В программу включена (INCLUDE) опция графического интерфейса пользователя (Graphic User Interface). Этот интерфейс позволяет работать в оконном режиме и поддерживает мышь (аналогично всем програм мам для ОС Windows). В качестве алгоритма обмена программа использует приведенный в 2.3.1 новый алго ритм обмена, разработанный автором. Ниже приведен текст программы Hello.cla, а вслед за ним — ее файлпроект.
119
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
Программа Hello.cla
ROW(3,7) ROW(4,20)
STRING('k='),COLOR(48) STRING('Начало передачи в микроконтроллер'),COLOR(48) ROW(6,4) STRING('Передаваемая строка:'),COLOR(48) ROW(10,20) STRING('Начало приема из микроконтроллера'),COLOR(48) ROW(12,4) STRING('Принятая строка:'),COLOR(48) ROW(16,27) STRING('(Esc)'),COLOR(49) COL(65) STRING('(Enter)'),COLOR(49) 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) ROW(13,4) ENTRY(@s75),USE(S1),COLOR(112,112,112)
! ! Программа передачи и приема строки из 75 символов по RS232 ! PROGRAM MAP INCLUDE('GUI.INC') . ! ! Определение переменных ! C byte A byte B byte S string(75) BT byte M byte,dim(75),over(S) S1 string(75) M1 byte,dim(75),over(S1) i ushort j ushort k ushort Y00h byte Y01h byte Y02h byte Y03h byte Y04h byte Y07h byte Y12 byte Y47h byte Y80h byte Y0fh byte !
.
CODE
setgraphic(89) !VGA LOADGUI setcolor(158) blank setcolor loadsymbols setmouse(10,15) open(SCREEN1) ! k=0 ! Y00h=00h;Y01h=01h;Y02h=02h;Y03h=03h;Y04h=04h;Y07h=07h; Y0fh=0fh;Y12=12;Y47h=47h;Y80h=80h do INIT !Инициализация RS232 OK
SCREEN1
120
SCREEN(18,80),PRE(SCR1),CENTER,GRAPHIC,CUA,COLOR(53) ROW(1,1) PAINT(1,80),COLOR(55) ROW(1,2) PAINT(1,78),COLOR(112) ROW(2,1) PAINT(17,1),COLOR(55) ROW(2,4) PAINT(16,75),COLOR(48) ROW(2,80) PAINT(17,1),COLOR(55) ROW(3,20) PAINT(1,34),COLOR(49) ROW(9,20) PAINT(1,35),COLOR(49) ROW(16,32) PAINT(1,42),COLOR(49) ROW(18,4) PAINT(1,75),COLOR(55) ROW(1,19) STRING('Тест порта RS232 {5} (COM1:115200,N,8,2)'),COLOR(112)
k=k+1 DISABLE(?CANSEL) DISABLE(?Ok) S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdifjhigklmnopqrstuvwxyz АБВГДЕЖЗИКЛМНОПРСТУФХЦЧ' ! Ч75й символ DISPLAY !Вывод на экран исходной строки. ! i=1 C=M[1] !Запоминание первого элемента строки. M[1]=75
121
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ИСПОЛЬЗОВАНИЕ НОВОГО АЛГОРИТМА ОБМЕНА ИНФОРМАЦИЕЙ ПО RS232 МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
do OUTBYTE !Передача мл. байта длины (75) M[1]=0 do OUTBYTE !Передача ст. байта длины (0)
! ! Инициализация СОМпорта. ! ! Установка скорости обмена. ! out(3fch,Y00h) ! Сброс линии DTR (Reset микроконтроллера).
M[1]=C !Восстановление первого символа строки. loop i=1 to 75 do OUTBYTE .
! in(3f8h,B) !Холостой ввод — делать ОБЯЗАТЕЛЬНО !!!(Для сброса бита DRdata ready). ! loop;in(3fdh,B);if band(B,1)=0;break.. !Оже сброса бита "DR"data ready.
S1=''!Обнуление S1 loop i=1 to 75 do INBYTE . DISPLAY !Вывод на экран принятой строки.
ENABLE(?Ok) ENABLE(?Cansel) loop accept case field() of ?CANSEL DISPLAY close(SCREEN1) goto E of ?Ok display i=1 M[1]=40h do OUTBYTE goto OK .!case .!loop ! E blank out(3fch,Y00h) !Сброс микроконтроллера return ! ! П/п инициализации RS232 ! INIT routine
122
out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y01h) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод. out(3f9h,Y00h) ! Установить ст.б. скор.=0. ! ! Установка режима. ! out(3fbh,Y07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. ! ! Установка запрета прерываний по СОМпорту. ! out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! out(3fch,Y00h) ! Сброс линии DTR (Reset микроконтроллера).00h do DEL100MS out(3fch,Y01h) ! Установка линии DTR (Запуск микроконтроллера).01h do DEL100MS do DEL100MS in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). do DEL100MS ! ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine out(3fbh,Y47h) !Установка TxD (разрешение передачи) loop; in(3feh,B); if band(B,2) then break.. !Ожидание стартбита (устки DSR) do DEL20 !Задержка 20 мкс out(3fbh,Y07h) !Сброс линии TxD (запрет передачи) in(3feh,B) !Очистка регистра 3feh чтением loop;in(3fdh,B);if band(B,1) then break.. !Оже конца прихода байта(бит "DR"data ready) in(3f8h,M1[i]) !Чтение байта данных ! ! П/п вывода байта (байт в M[i] ) ! OUTBYTE routine loop;in(3fdh,B);if band(B,20h);break.. !Оже готовности передатчика (transmitter empty). loop;in(3feh,B);if band(B,20h);break.. !Оже разреш.передачи(установки DSR) out(3f8h,M[i]) !Вывод байта
123
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
!in(3feh,B) !Очистка регистра 3feh чтением loop;in(3feh,B);if band(B,2);break.. !Оже запрета передaчи(сброса DSR) loop;in(3fdh,B);if band(B,40h);break.. !Ожe выхода байта из РС(trasmitter holding register empty.OK to send). in(3feh,B) !Очистка регистра 3feh чтением ! DEL100MS routine T#=CLOCK();loop while CLOCK()T#<10. !Задержка 0,1 с. DEL200MS routine T#=CLOCK();loop while CLOCK()T#<20. !Задержка 0,2 с. DEL50 routine loop 15000 times . DEL1400 routine loop j=1 to 1400 . DEL20 routine loop 40000 times . !
Файлпроект Hello.pr #system auto exe #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) /debug(vid=>off,line_num=>off) #pragma link(%clapfx%dos.lib) #pragma link(%clapfx%xgui.obj) #set exports='hello' #link hello
После запуска программы на экран выводится окно (рис. 2.4.3.7). Рис. 2.4.3.7. Внешний вид окна программы
124
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
Нажатие кнопки «Продолжить» (мышью или клавишей Enter) приведет к повторному запуску программы; количество запусков отражает переменная k в левом верхнем углу. В данном случае k = 146. Нажатие кнопки «Выход» — к выходу из программы.
2.5. Программирование интерфейса RS232 в ОС Windows98/XP 2.5.1. Предварительные замечания Программирование интерфейса RS232 в ОС Windows не является чемто сверъесте ственным. Внешний вид программ, написанных на идентичных языках программирова ния (например Clarion v3.100 для DOS и Clarion v.6.0 для Windows), также практически одинаков. Исключением (по крайней мере для языка Кларион) является название экран ной формы. Если в Кларионе для DOS экранная форма называется SCREEN (Экран), то для Windows — Window (Окно). Структуры данных экранных форм также идентичны. Пре имущество экранной формы Window перед SCREEN заключается в том, что она обладает большей универсальностью, имеет больше возможностей и, самое главное, более авто матизирована. Если посмотреть на тексты всех программ, приведенных в книге, то мож но заметить, что структура Window в них уж очень «навороченная», поскольку там исполь зуются несколько шрифтов и масса разной другой информации. На первый взгляд кажет ся, что «грамотно» написать структуру экранной формы Window очень сложно и можно понаделать массу ошибок. Но на самом деле, ее писать вообще не требуется (!), посколь ку она генерируется языком Кларион автоматически. Необходимо только выбрать раз мер окна (не в тексте программы, а буквально на экране), установить на нем соответ ствующие кнопки и другие параметры и атрибуты. Все это делается мышью с уже готовым (выбранным по умолчанию) окном. После того как окно «устраивает» программиста, он нажимает определенную кнопку и экранная форма Window автоматически генерируется (точнее генерируется ее текст на языке Кларион). Более полную информацию по этому вопросу можно найти в документации по языку. Все остальные «вещи» в программах для DOS и Windows программируются практически одинаково. Есть, правда, одно свойство языка Clarion 6.0 (по сравнению, например, с языком Clarion5.5 и более ранними версиями), которое необходимо учитывать. Язык Clarion6.0 под держивает так называемую threadmodel, которая связана с многозадачностью операцион ной системы (в основном это касается Win'XP). Слово «thread» можно с большим приближе нием перевести как «некий процесс». Если в программе «одновременно идут» несколько процессов, то Clarion 6.0 поддерживает такие задачи. Более подробно с подобными вопро сами можно ознакомиться в руководстве по этому языку. Здесь же автору хотелось бы предостеречь программистов от одной (нетривиальной) ошибки, которую можно сделать, в результате чего программа работать не будет. Рассмотрим фрагмент программы, который присутствует практически во всех задачах (при программировании в ОС Windows):
125
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
START — accept ! case accepted() of ?Ok p=1 break of ?Cancel p=0 break end ! ot case ! end ! от accept if p=0 then goto E. goto START E
return
В приведенном фрагменте используется конструкция accept…end, которая применяет ся для определения ветвления программы в зависимости от нажатия кнопок «OK» или «Cancel»(Выход). Эти кнопки расположены внизу любого окна. Нажатие кнопки «OK» приведет к тому, что в программе будет осуществлен переход к метке START. Нажатие кнопки «Cancel» приведет к переходу к метке E, т. е. к выходу из программы. Конструкция на первый взгляд до вольно тривиальная и может быть, например, легко упрощена. Например так, как это сделано в программе на Кларионе для DOS (см. 2.4.3.7): START — accept ! case accepted() of ?Ok goto START of ?Cancel goto E end ! ot case ! end ! от accept E return
В чем отличие этих двух вариантов?
126
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
В первом варианте при нажатии кнопки «OK» переменной p присваивается значение 1 (p=1), и далее следует оператор break, который организует выход из процесса (thread'a) — accept … end. При нажатии кнопки «Cancel» переменной p присваивается значение 0 (p=0) и далее точно также следует оператор break , который аналогично организует выход из процесса (thread'a) — accept … end. После выхода из процесса accept … end ана лизируется переменная p, и в зависимости от ее значения программа переходит к метке START (при p=1) либо к метке Е (при p=0), по которой осуществляется выход из программы. В отличие от первого варианта второй более простой. Там нет никакой переменной p, и ветвление происходит сразу: при нажатии кнопки «ОК» программа переходит к метке START (goto START), а при нажатии кнопки «Cancel» — к метке E (goto E), и далее осущес твляется выход из программы. С точки зрения синтаксиса языка оба варианта безупречны. Мало того, в Clarion 5.5 (и в Clarion v.3.100 для DOS) оба варианта будут безукоризненно работать и не будут вызывать ни каких проблем. В Clarion6.0 второй вариант может в лучшем случае остановить программу, которая не бу дет подавать никаких «признаков жизни», и выход из ситуации можно осуществить, нажав классическое «CTRLALTDEL», а затем «завершить процесс». В худшем случае второй вариант может «повесить» компьютер, да так, что выход из ситуации можно будет осуществить только, нажав кнопку «RESET» на системном блоке. Отчего это? А от того что цикл accept…end — это процесс (thread), который «по умолчанию» организует Clarion6.0, выход из которого (процесса) во втором варианте не завершает его. А незавершенный процесс будет продолжаться бес конечно (вот отчего компьютер может «повиснуть»!). В первом варианте при любом условии (неважно «OK» или «CANCEL») вначале произво дится явное завершение процесса accept…end, а затем, когда процесс accept…end за вершен, уже анализируется переменная p и в зависимости от ее значения осуществляется со ответствующий переход. Но — и в этом вся соль — этот анализ происходит уже после того, как процесс accept…end завершен. Столь подробное объяснение приводится здесь для того, чтобы незадачливый програм мист «не попался». Но это лишь исключительный случай. В основном (еще раз повторюсь), программы в Кла рион для DOS и Windows отличаются очень мало.
2.5.2. Варианты программирования интерфейса RS232 в Win'98/XP Как уже упоминалось, программирование интерфейса RS232 в операционных системах Windows возможно двумя способами. Первый способ — использование функций API (Application Program Interface) — программный интерфейс для разработки приложений. Второй способ — ис пользование прямых команд ввода/вывода в порт (в данном случае — RS232 или COMпорт). Использование функций API — стандартный путь, на который указывают все документиро ванные источники по программированию в Windows. Применение APIфункций наталкивается на ряд проблем. В частности, APIфункции работают очень медленно, и, если речь идет о быст рой реакции на какоелибо кратковременное (например, несколько микросекунд) внешнее воздействие на порт RS232, то функции API не успевают отследить такое воздействие. Кроме того, некоторые функции работают с явными ошибками, т. е. либо выполняют не совсем те действия, которые, например, указаны в описании на конкретную функцию API, либо выполня ют дополнительные действия, которые не описаны.
127
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Использование прямых команд ввода/вывода в порт также имеет свои проблемы (на них мы остановимся позже). Однако программирование интерфейса прямыми командами ввода/вывода в порт хорошо известно, поскольку используется в DOS. Кроме того, прямые команды ввода/вывода в порт выполняются очень быстро, т. к. это «машинные» кoманды процессора. Они позволяют отследить самые быстротекущие процессы, происходящие с ин терфейсом RS232. В связи с вышеизложенным, рассмотрим программирование интерфейса RS232 вначале с помощью функций API, а затем — с помощью прямых команд ввода/вывода в COMпорт.
2.5.3. Программирование интерфейса RS232 с помощью функций API Рассмотрим кратко те функции API, которые имеют непосредственно отношение к програм мированию интерфейса RS232 в 32разрядном режиме. Полное описание всех функций API можно найти в MSDN (об этом уже говорилось ранее). Прототипирование функций API на Clarion 6.0 приводится в программе «Hello.clw», напи санной для работы в Windows98/XP (и приведенной ниже). Там же можно найти числовые значения констант, использующихся в APIфункциях. Необходимо отметить, что в Clarion 5.5 и 6.0 есть программа (WINAPI.EXE), в которой также описаны прототипы и значения кон стант APIфункций. Некоторые из них в этой программе неверны, поэтому пользоваться ими нужно с осторожностью. Первой функцией API, которой должно предваряться программирование RS232, является функция открытия порта — CreateFileA (создать файл). Она возвращает «hаndle» порта — числовое значение, которое операционная система приписывает открытому порту. Дословно «handle» — ручка (потянув за которую можно «открыть» порт). Функция CreateFileA работа ет правильно и претензий не вызывает. После открытия порта необходимо обратиться к функции построения контрольного блока COMпорта: BuildCommDCBA, в которой требуется перечислить параметры порта (скорость обмена, формат данных, количество стопбит и т. п.). Эта функция включает в себя два пара метра: ControlString и PortStruct. ControlString — строка символов, которая, например, может принимать следующее значение: ControlString='Com1:115 200,N,8,1', означающее, что будет открыт порт COM1 (который будет работать на скорости 115 200 бод), бит паритета не используется, коли чество бит данных — 8 и стопбит — 1. Параметр PortStruct — это массив байт, который определяет более полно струк туру работы COMпорта и в который, в частности, входят параметры из ControlString (скорость, бит паритета, количество бит данных и стопбит). Так вот, если, например, указать в ControlString скорость 115 200, а в PortStruct скорость 9600, то порт будет работать на скорости 9600 бод. Если же в ControlString указать 9600, а в PortStruct 115 200, то скорость работы порта может принять непредсказуе мое значение. По этой причине изменять в PortStruct параметры, установленные в ControlString, не рекомендуется. Необходимо отметить, что функция BuildCommDCBA не производит никаких действий с портом; в ней только перечисляется, какие параметры порта необходимо установить, но уста новку этих параметров функция не производит. Для установки параметров, указанных в функции BuildCommDCBA, в COMпорт исполь зуется функция SetCommState (установить статус порта). Эта функция претензий не вызы вает и работает правильно.
128
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
Для получения параметров уже работающего порта можно использовать функцию GetCommState — получить статус порта. Эта функция возвращает handle порта, его структу ру (PortStruct) и претензий не вызывает. Для передачи данных по последовательному порту можно использовать две функции API: TransmitCommChar (послать символ через COMпорт), которая выводит в порт один байт или WriteFile (запись файла), которая может выводить как массив (буфер) байт, так и все го один байт. Эти функции не вызывают претензий и работают правильно. Чтение информации из порта возможно только функцией ReadFile. Эта функция может прочитать из порта либо один байт, либо массив (буфер) байт только в том случае, если этот байт (или массив байт) поступил в COMпорт. В противном случае функция возвращает ошибку и мо жет, кроме того, «повесить» компьютер на неопределенно долгое время, если байт в порт не поступал. При чтении, например, одного байта, размер входного буфера уменьшается на 1. Раз мер входного буфера указывается в функции SetupComm (установка COMпорта), но если, нап ример, в порт поступает байт больше, чем указанный размер буфера (например 1), то байты не теряются, а накапливаются в буфере, и размер буфера растет. Этот факт является злейшей ошибкой, и исправлять ее пока никто не собирается. Возможно, до исправления этой ошибки в конце концов и доберутся разработчики WindowsXP (или последующих версий Windows). Функция PurgeComm (очистка COMпорта) предусмотрена для очистки входного буфера от поступивших байт, если, например, они не нужны. Очистить входной буфер можно, приме нив ту же функцию ReadFile. Если указать количество байт для чтения равным 1, то для очистки буфера размером в 10 байт необходимо 10 раз вызвать функцию ReadFile, если же равным 10, то эту функцию необходимо вызвать 1 раз. У читателя может возникнуть вопрос: а зачем вообще очищать входной буфер? Если в порт приходит 10 байт, то и читать нужно 10 байт. Здесь несколько причин. Вопервых, одним из параметров функции CreateFileA, открывающей COMпорт, является 5й по счету параметр (всего их 7), который именуется CreationDisposition (создание диспозиции) и который должен принимать значение Open_Existing (т. е. отк рыть существующий). Это означает, что открывается COMпорт со своим, уже построен ным, контрольным блоком (DCB), у которого все параметры приняты по умолчанию и, в частности, состояния линий квитирования DTR и RTS, как правило, установлены в высо кий уровень. После открытия порта (т. е. после того как отработала функция CreateFileA), но перед тем как будут выполнены функции BuildCommDCBA и SetCommState, в которых, например, линии DTR и RTS должны быть в состоянии сброса (т. е. низкого уровня), эти линии установятся в высокий уровень и будут в нем находиться до тех пор, пока функции BuildCommDCBA и SetCommState не отработают. После того как функции BuildCommDCBA и SetCommState отработают, состояния линий DTR и RTS установятся уже в низкий уровень. Таким образом, уровни напряжений на линиях DTR и RTS кратковременно перейдут из низкого состояния в высокий и обратно. Если использу ется гальванически развязанный интерфейс с питанием от линий RTS и DTR, то на линии RxD появятся несколько импульсов. Поскольку это — линия данных, то, как следствие, в буфер COMпорта введутся несколько байт (1–3), которые (это уже понятно) являются «бросовыми» и которые необходимо сбросить (т. е. очистить от них приемный буфер). Сколько этих байт введется и сколько раз надо применить функцию ReadFile, чтобы очистить буфер, — с точностью сказать невозможно. Если, предположим, ввелось 3 байта, а функцию ReadFile применили 2 раза, то в буфере будет «сидеть» один невер ный байт. Если же ввелось 2 байта, а функцию применили три раза, то компьютер «повис нет» и будет «ждать» прихода третьего байта (который может не прийти вовсе!).
129
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Вовторых, если опять же используются развязки с питанием от линий квитирования, то при установки этих линий в соответствующее состояние (уже по программе) на линии дан ных (RxD) опять может возникнуть несколько импульсов и во входной буфер опять введутся несколько байт. Это приведет к ситуации, описанной выше. Эти две причины являются некоторым препятствием к применению таких гальванических развязок, если для программирования RS232 используются функции API. Втрeтьих, если сигнал DTR используется для сброса и запуска микроконтроллера (т. е. ес ли он управляет сигналом RST), то при кратковременном пребывании сигнала DTR в высоком уровне микроконтроллер может запуститься и изменить (уже по своей программе) состояние линии RxD (например, дать разрешение на передачу байта). Это приведет к поступлению еще одного (неверного) байта во входной буфер. По этой причине, даже если не используются гальванические развязки или используются, но питаются энергией от отдельного источника питания, в микроконтроллере желательно предусмотреть некоторую (небольшую) аппаратную, либо программную задержку для исключения этого эффекта. И наконец вчетвертых. При использовании алгоритма обмена по RS232, применяю щего синхронизацию по линии RxD для разрешения и запрещения компьютеру передавать очередной байт, в буфер опять будут вводиться байты, правда, в этом случае их количест во уже строго определено и равно в точности тому количеству байт, синхронизацию поступ ления которых и обеспечивает такой алгоритм. Если, например, из компьютера в микроко нтроллер передается 75 байт, с 2 байтами длины (т. е. всего 77), а принимается также 75 байт, то ясно, что первые 77 байт, которые ввелись в буфер, необходимо очистить, при менив функцию ReadFile 77 раз (читая по 1 байту) или 1 раз (читая сразу 77 байт). После этого следующий прочитанный байт (78й) уже будет верен. Для определения сколько байт находится во входном буфере, существует структура COMSTAT (статус COMпорта), в которой это количество байт присутствует в переменной CbInQue (размер в байтах входной очереди). Структуру COMSTAT, в частности, заполняет API функция ClearCommError (сброс ошибки COMпорта). Поскольку, как указывалось, в неко торых случаях предсказать точное значение ненужных байт нельзя, то возможно применение следующего автомата: вызывается APIфункция ClearCommError, определяется количество байт во входном буфере CbInQue, затем 1 раз вызывается APIфункция ReadFile с CbInQue количеством читаемых байт. Применив APIфункцию PurgeComm совместно с опи санным автоматом, можно исключить «зависание» компьютера. Необходимо отметить, что при программировании COMпорта прямыми командами вво да/вывода в порт в DOS и в Windows98/XP таких проблем не возникает по нескольким причи нам. Вопервых, линии DTR и RTS изначально находятся в низком уровне и при инициализации порта не изменяются без нашего на то ведома (как в функциях API). Вовторых, размер буфера там аппаратный и умещает только 1 байт, т. е. если в буфере уже есть байт и приходит еще один, то предыдущий байт теряется. Втретьих, прямую команду процессора in, которая очища ет аппаратный буфер COMпорта, можно применять хоть 100 раз; при этом компьютер ни разу не зависнет, даже если во входном буфере давно уже нет байта и в помине. APIфункции же на писаны так, что приходящий байт вводится в программный буфер не зависимо от того, требуется ли нам это или нет. Вот что является причиной вышеописанных «глюков». Для установки выходных линий (DTR, RTS и TxD) COMпорта в произвольное состояние имеются три функции API, которые претензий не вызывают и работают правильно: 1) EscapeCommFunction — переназначить функцию COMпорта (вспомним клавишу Escape (Esc), находящуюся в самом верхнем левом углу клавиатуры), которая может устано
130
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
вить указанные линии в определенное состояние (какую конкретно и в какое состояние — ука зывается в параметрах для этой функции; 2) SetCommBreak (установка сигнала Break) — устанавливает линию TxD в единичное состояние (высокий уровень) 3) ClearCommBreak (сброс сигнала Break) сбрасывает линию TxD в нулевое состояние. Как видно, функция EscapeCommFunction дублирует две последних. Для чтения состояния входных линий DSR, CTS, DCD и RI существует функция GetCommModemStatus (получить статус модема). Эта функция поразному работает в Windows98 и WindowsXP. Если, например, линия DSR соединена с линией RxD и по ней поступает какаялибо ин формация, то при вызове этой функции в Windows 98 она даст правильный результат. В Windows XP в такой ситуации эта функция ведет себя непредсказуемо и пользоваться ей не рекомендуется. Для чтения состояния указанных линий (точнее — для проверки факта изменения этих состояний) и для других целей используются совместно две функции API — SetCommMask (установка маски COMпорта) и WaitCommEvent (ожидание наступления события COMпор та). Эти функции работают правильно и претензий не вызывают, однако во многих справочни ках и руководствах приводится неправильное толкование их совместного функционирования. Функция SetCommMask устанавливает так называемую маску порта, в которой в качест ве параметра или параметров указываются те биты, которые отвечают за наступление того или иного события. Если требуется отследить одно событие, то указывается один бит (точнее его название), если несколько — то несколько бит. Функция WaitCommEvent выполняет 2 задачи. 1я задача — при наступлении одного из указанных в функции SetCommMask событий она выдает ненулевое значение. Для определе ния, какое именно событие произошло, функция возвращает параметр, по которому это мож но определить, прочитав этот параметр. Это ее 2я задача. Если требуется отследить наступление каждого из 2 событий, но в разное время, то в функции SetCommMask необходимо указать 2 события, вызвать 2 раза функцию WaitCommEvent, в которой каждый раз необходимо проверить статус и сравнить его с битами того или иного события. Пример. Отследить 2 события: поступление байта в COMпорт (EV_RXCHAR) и установку DSR в высокий уровень (EV_DSR).
1. Устанавливаем маску с 2 событиями: EV_RXCHAR+EV_DSR: ! loop if SetCommMask(CommPort,EV_RXCHAR+EV_DSR) | then break. !Маска на приём байта и DSR . !
2. Ожидаем установки DSR в высокий уровень, после чего, например, выполняем команду ClearCommBreak: ! loop loop until WaitCommEvent(CommPort,EvtStatus,0).
131
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if band(EvtStatus,EV_DSR) !DSR if ClearCommBreak(CommPort) then break. . . !
3. Ожидаем приема байта в COMпорт: ! loop loop until WaitCommEvent(CommPort,EvtStatus,0). if band(EvtStatus,EV_RXCHAR) then break. . !
Если требуется отследить только одно событие, то можно установить маску на это событие, а затем просто вызвать функцию WaitCommEvent и не проверять возвращаемый им статус: 1. Устанавливаем маску на поступление байта в COMпорт: ! loop if SetCommMask(CommPort,EV_RXCHAR)| then break. !Маска на приём байта . !
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
Sleep(100) После этого программа будет ждать 100 мс, а затем будет выполнять следующий оператор. Приведенные функции API для COMпорта — это далеко не полный их перечень. Как уже указывалось, полный перечень находится, например, в MSDN. Для более детально го уяснения функций API рекомендуется просмотреть в MSDN хотя бы те, что были описаны выше, поскольку именно они используются для программы, приведенной авто ром далее.
2.5.3.1. Тестовая программа обмена для компьютера, использующая функции API, в ОС Win'98/XP После такого несколько «сумбурного» изложения автором основных функций API, читате лю может показаться, что запрограммировать интерфейс RS232 с их помощью просто невоз можно либо достаточно сложно. Отчасти это так и есть. Тем не менее автору удалось написать достаточно стабильно работающую программу HELLO.CLW, которая приводится ниже. Програм ма выполняет те же функции, что и тестовая программа для DOS (Clarion v.3.100), приведенная в 2.4.3.7, написана на языке Кларион для Windows — Clarion 6.0. Для работы с программой может использоваться любой из микроконтроллеров, работающий с программой для DOS (см. 2.4.3.7). В программе HELLO.CLW пользователь может выбрать скорость обмена по интерфейсу RS232 (9600 или 115 200 бод). Разумеется, программа для микроконтроллера должна быть написана так, чтобы указанные скорости обмена по RS232 микроконтроллера и компьютера совпадали. Ниже приведен текст программы HELLO.CLW и ее файлапроекта Hello.prj. Программа HELLO.CLW
2. Oжидаем наступление этого события (без проверки статуса, как в предыдущем случае): ! loop until WaitCommEvent(CommPort,EvtStatus,0). !
Совершенно очевидно, что в последнем случае функция WaitCommEvent выполняется намного быстрее, т. к. содержит не тройную проверку в цикле, а единственную. Во многих ру ководствах по программированию APIфункций, как уже упоминалось по поводу их не совсем правильного толкования, помимо проверки факта наступления события (п. 2) опять, как в пре дыдущем примере, сравнивается статус порта с битом этого единственного сoбытия (EV_RXCHAR), что является лишним и требует дополнительного времени (а иногда счет идет на доли микросекунды!). После окончания работы с COMпортом его необходимо закрыть. Это делается с помощью вызова функции CloseHandle (закрыть Handle), которая претензий не вызывает и работа ет правильно. И последняя функция API, которой хотелось бы коснуться, — установка временной заде ржки — функция Sleep (спать). Эта функция, вообще говоря, не принадлежит к функциям COM порта, но в связи с тем, что она отсутствует в Clarion 6.0, автор рекомендует ее использовать. Вызвать эту функцию просто:
132
! ! Программа передачи и приема строки из 75 символов по RS232 ! с помощью APIфункций Windows98/XP. ! Используется программа для микроконтроллера: INRS115.c ! PROGRAM !======================== INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW') !======================== ! ! Определение переменных ! C byte A byte B byte
133
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
S string(75) BT byte M byte,dim(75),over(S) S1 string(80) M1 byte,dim(80),over(S1) i ushort i0 ushort(1) j ushort k ushort STR string(15) CH BYTE N1 LONG N BYTE CH1 BYTE NX ULONG p byte SPEED string(6) NP string(4) ! ! Переменные для частоты и счетчика ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC long DELTAC long ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . ! ! ! Переменные для API ! CommPort UNSIGNED !(handle). PortCString CSTRING(5) !'COM1' и т.п. ControlCString CSTRING(50) !'COM1:115200,N,8,1' и т.п. GENERIC_READ ULONG(80000000H) GENERIC_WRITE ULONG(40000000H) ACCESS ULONG(0C0000000H) CREATE_ALWAYS OPEN_EXISTING
134
ULONG(2) ULONG(3)
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
OPEN_ALWAYS FILE_FLAG_OVERLAPPED FILE_FLAG_NOOVERLAPPED FILE_FLAG_NO_BUFFERING
ULONG(4) ULONG(40000000H) ULONG(0) ULONG(20000000H)
LPERRORS
ULONG
CLRDTR SETDTR CLRRTS SETRTS SETBREAK CLRBREAK RESETDEV
ULONG(6) ULONG(5) ULONG(4) ULONG(3) ULONG(8) ULONG(9) ULONG(7)
ModemStatus MS_CTS_ON MS_DSR_ON MS_RING_ON MS_RLSD_ON
ULONG ULONG(10h) ULONG(20h) ULONG(40h) ULONG(80h)
EvtStatus EV_BREAK EV_CTS EV_CTSS EV_DSR EV_RING EV_RLSD EV_RXCHAR EV_TXEMPTY
ULONG ULONG(0040h) ULONG(0008h) ULONG(0400h) ULONG(0010h) ULONG(0100h) ULONG(0020h) ULONG(0001h) ULONG(0004h)
PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR
ULONG(1) ULONG(2) ULONG(4) ULONG(8)
BytesToRead LONG !
! ! Структура DCB: ! PortStruct GROUP,PRE(PTS) DCBlenght ULONG(28) ! Длина блока DCB(28 байт). BaudRate ULONG!(800h) ! Скорость:11520000020000h, ! 5760000040000h,960000000800h. fbitFields
ULONG(1)
! Битовая маска.
135
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
wReserved XonLim XoffLim ByteSize Parity StopBits XonChar XoffChar ErrorChar EvtChar wReserved1
USHORT ! Резервный. USHORT(0) ! Нет Xon. USHORT(0) ! Нет Xoff. BYTE(8) ! Длина слова 8 бит. BYTE(0) ! Нет паритета. BYTE(1) ! Стопбит: 01,11.5,22. BYTE(0) ! Символ Xon. BYTE(0) ! // Xoff. BYTE(0) ! // Error. BYTE(0) ! // Event. USHORT ! Резервный. . ! Конец структуры. ! ! ! Структура COMSTAT: ! COMSTAT GROUP,PRE(CST) Status ULONG CbInQue ULONG CbOutQue ULONG . ! Конец структуры. ! MAP !=================================================== ! Прототипы для APIфункций. ! MODULE('Comm Prototipes') ! CreateFileA(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED),| SIGNED,RAW,PASCAL,NAME('CreateFileA') BuildCommDCBA(*CSTRING,*STRING),SIGNED,RAW,PASCAL,Name('BuildCommDCBA') SetCommState(SIGNED,*STRING),BOOL,RAW,PASCAL GetCommState(SIGNED,*STRING),BOOL,RAW,PASCAL TransmitCommChar(UNSIGNED,BYTE),UNSIGNED,PASCAL EscapeCommFunction(SHORT,ULONG),LONG,PASCAL CloseHandle(SIGNED),BOOL,PROC,PASCAL SetCommBreak(SHORT),SHORT,PASCAL ClearCommBreak(SHORT),SHORT,PASCAL GetCommModemStatus(SHORT,*ULONG),SIGNED,PASCAL SetCommMask(SHORT,ULONG),SHORT,PASCAL WaitCommEvent(UNSIGNED,*ULONG,LONG),SHORT,RAW,PASCAL ReadFile(UNSIGNED,*BYTE,ULONG,*LONG,LONG),BOOL,RAW,PASCAL,PROC WriteFile(UNSIGNED,*BYTE,ULONG,*LONG,LONG),BOOL,RAW,PASCAL PurgeComm(UNSIGNED,ULONG),UNSIGNED,RAW,PASCAL!Мой ClearCommError(UNSIGNED,*ULONG,*STRING),SHORT,RAW,PASCAL ! END ! MODULE('DELAY')
136
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END !=================================================== END !от MAP WinOut WINDOW('Тест порта RS232 (COM1:115200,N,8,2). Ввод/вывод — API.'),AT(,,340,164),| FONT('MS Sans Serif',8,,FONT:bold),CENTER,CENTERED,SYSTEM,GRAY,MAX BUTTON('Выход'),AT(52,128,50,21),USE(?Cancel),| 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) END ! WinIn WINDOW(' Ввод параметров порта'),AT(,,177,98),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),| CENTER,CENTERED,SYSTEM,GRAY,MAX,RESIZE MENUBAR END PROMPT('бод'),AT(132,42,18,15),USE(?Prompt1),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC) OPTION('Скорость обмена'),AT(76,10,89,49),USE(SPEED),BOXED,| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC) RADIO('115200'),AT(88,22,39,19),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC) RADIO(' 9600'),AT(88,38,34,19),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC),VALUE('9600') END PROMPT('бод'),AT(132,26,18,15),USE(?unnamed),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC) IMAGE('CHECK4.ICO'),AT(24,74,18,22),USE(?Image5) BUTTON('Запуск'),AT(48,74,76,20),USE(?Button3),| FONT('Tahoma',11,,FONT:bold,CHARSET:CYRILLIC),DEFAULT OPTION('<185> Порта'),AT(12,10,53,49),USE(NP),BOXED,| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC) RADIO('COM1'),AT(20,22,32,18),USE(?unnamed:1),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC), | TIP('COM1'),VALUE('COM1') RADIO('COM2'),AT(20,38,33,17),USE(?unnamed:2),| FONT('MS Sans Serif',10,,FONT:bold,CHARSET:CYRILLIC), | TIP('COM2'),VALUE('COM2') END END ! CODE
137
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
NP='COM1' SPEED='115200' open(WinIn) p=0 accept if accepted()=(?button3) then p=1; break. end if p=0 then return. ! ! Вычисление временной задержки в 25 мкс. ! loop until QueryPerformanceFrequency(FREQUENCY). !Определение частоты работы счетчика. DC=int(25*FRE:FREQL/1000000) !Вычисление времени счета в 25 мкс. ! ! do INIT
!Инициализация RS232 и микроконтроллера.
loop until(SetCommMask(CommPort,EV_TXEMPTY)).
! Установка маски на вывод байта
close(WinIn) k=0 OPEN(WinOut) ! disable(?Ok) disable(?Cancel) START ! S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИКЛМНОПРСТУФХЦЧ' k=k+1 show(5,30,'Начало передачи из PC') show(5,10,'') show(5,10,'k=') type(k) ! i=1 C=M[1] M[1]=75 do OUTBYTE M[1]=0 do OUTBYTE ! M[1]=C loop i=1 to 75 do OUTBYTE . !
138
!Передача мл. байта длины (75)
show(5,40,S) show(5,50,'Конец передачи из PC') show(5,60,'') ! sleep(5) !Для 9600 дополнительно. sleep(5) ! loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка вх. буфера. ! loop until(SetCommMask(CommPort,EV_RXCHAR)). ! Установка маски ! только(!) на прием байта. ! show(5,70,'Начало передачи из микроконтроллера') S1='' ! loop i=1 to 75 !Прием 75 байт строки do INBYTE !из . !микроконтроллера. ! show(5,80,S1) show(5,90,'Конец передачи из микроконтроллера') show(5,100,'') ! enable(?Ok) enable(?Cancel) p=0 accept ! case accepted() of ?Ok !blank !display disable(?Ok) disable(?Cancel) p=1 break of ?Cancel p=0 break end!ot case ! end! От accept
!Передача ст. байта длины (0) if p=0 then goto E. !Передача 75 байт строки. !в микроконтроллер.
blank loop until(SetCommMask(CommPort,EV_TXEMPTY)). ! Установка маски i=1 M[1]=40h
139
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
do OUTBYTE goto START E ! loop until(EscapeCommFunction(CommPort,CLRDTR)). !Сброс микроконтроллера. loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка вх. буфера. loop until(CloseHandle(CommPort)). !Закрытие CommPort'a. close (WinOut) RE return ! !Конец программы ! !========================================================================= ! ПОДПРОГРАММЫ ! ! ! П/п инициализации RS232 и микроконтроллера. ! INIT routine ! ! Инициализация COMпорта ! PortCString=NP !PortCString='COM1' !PortCString='COM2' CommPort=CreateFileA(PortCString,ACCESS,0,NULL,OPEN_EXISTING,| FILE_FLAG_NOOVERLAPPED,NULL) !Открытие порта loop until(GetCommState(CommPort,PortStruct)). !Получение статуса порта. ControlCString=NP & ':' & SPEED & ',N,8,2' loop until(BuildCommDCBA(ControlCString,PortStruct)).!Построение DCB. PTS:fbitFields=1 !Битовая маска. loop until(SetCommState(CommPort,PortStruct)). !Установка статуса порта. ! ! Инициализация микроконтроллера ! loop until(EscapeCommFunction(CommPort,CLRDTR)). !Сброс микроконтроллера. Sleep(100) !Задержка 100 мс. loop until(ClearCommBreak(CommPort)). !Сброс TxD — запрет передачи. loop until(EscapeCommFunction(CommPort,SETDTR)). !Запуск микроконтроллера Sleep(100) loop until(PurgeComm(CommPort,PURGE_RXCLEAR)). !Очистка входного буфера. ! ! Конец инициализации !
140
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine ! loop until(SetCommBreak(CommPort)). !Установка TxD — разрешение передачи. loop until WaitCommEvent(CommPort,EvtStatus,0). !Ожидание прихода байта !(EvtStatus=EV_RXCHAR). loop until(ClearCommBreak(CommPort)). !Сброс TxD — запрет передачи. 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])). !Вывод байта. loop until WaitCommEvent(CommPort,EvtStatus,NULL). !Оже концa вывода байта !(EvtStatus=EV_TXEMPTY). !! DEL25 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC then break. ! DC(=25 мкс.) . ! !========================================================================== DELAY35 routine loop 21000 times. !
Файлпроект Hello.prj Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off)
141
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
#pragma optimize(cpu=>386) #pragma optimize(speed=>on) #pragma define(NULL=>off) #compile "hello.clw" #pragma link("hello.lib") #pragma link("WindowsShell.Manifest") #link "hello.exe"
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
При запуске программы в Win'XP на экране монитора появляется окно (рис. 2.5.3.3), а после выбора необходимой скорости обмена, № COMпорта и нажатия кнопки «Запуск» — следующее окно (рис. 2.5.3.4). Рис. 2.5.3.3. Окно выбора параметров порта (Win'XP)
Программа работает в ОС Win'98(SE2) и Win'XP(SP2). При запуске в Win'98 на экране монитора появляется окно (рис. 2.5.3.1). Необходимо выбрать № COMпорта, к которому подключено соответствующее устройство (или одна из макет ных плат, описанных ранее). Соответствующая скорость обмена должна быть запрограммирова на в микроконтроллер. Питание устройства (или макетной платы) должно быть включено. При выборе 1го COMпорта и скорости обмена в 115 200 бод (как на рис. 2.5.3.1) и нажатии кнопки «Запуск» на экран выводится окно (рис. 2.5.3.2). Нажатие кнопки «Продолжить» приведет к повторному запуску программы передачи и приема строки. При этом количество перезапусков отражается переменной k, показанной в верхнем левом углу окна (k = 179, т. к. при большем ко личестве нажатий на кнопку «Продолжить» указательный палец начинает неметь :) ). Если срав нить окна, показанные на рис. 2.5.3.2 и 2.4.3.7, то можно заметить их логическую (но не внеш нюю) идентичность. Это не удивительно, поскольку программы выполняют одну и ту же функцию, но в разных ОС (DOS и Win'98).
Рис. 2.5.3.4. Основное окно работы программы (Win'XP)
Рис. 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
Вторая проблема касается разрешения применения команд прямого ввода/вывода (in( ) и out( ) ) в порт. В ОС Win'98 эта проблема не стоит, поскольку в этой ОС прямые команды вво да/вывода в порт разрешены. В ОС Win'XP команды прямого ввода/вывода (in( ) и out( ) ) в порт запрещены (по крайней мере в официальной документации). Третья проблема также касается только ОС Win'XP и состоит в том, что если даже какимлибо способом обойти запрещение на применение прямых команд ввода/вывода в порт, то для того чтобы они работали с портом (в данном случае с COMпортом), этот порт необходимо открыть. Смысл слова «открыть» состоит в том, чтобы разрешить работу самого COMпорта (в т. ч. и для пря мого ввода/вывода туда/оттуда информации). В Win'98 этого «открытия» делать не требуется, поскольку там прямые команды ввода/вывода в порт разрешены и этот вопрос не стоит. Забегая вперед, сразу заметим, что все эти три проблемы решаемы (и каждая из них мо жет быть решена несколькими способами).
2.5.4.2. Применение команд ввода/вывода в порт в Clarion 6.0 для Win 98/XP Задача использования отсутствующих команд ввода/вывода в порт в Clarion 6.0 может быть решена по крайней мере 2 способами. Первый способ (назовем его способом А) заключается в том, что существует специально написанная и бесплатно распространяемая библиотека (inpout32.dll), которая решает сразу 2 задачи — дает в распоряжение пользователя 2 внешних библиотечных функции: INP(Адрес порта) и OUTP (Адрес порта, Данные) и разрешает их применение в Win'XP (напомню, этого разрешения в Win'98 не требуется). Применение этих функций и позволяет производить ввод/вывод в порт, а заодно и разрешает этот ввод/вывод в Win'XP. Адрес порта должен быть переменной типа USHORT, а данные — типа BYTE. Для того чтобы вывести в порт информацию, достаточно применить функцию OUTP(USHORT,BYTE). Предположим, требуется вывести в порт данных (3f8h) порта COM 1 сим вол 'A', имеющий код ASCII — 41h. Для этого достаточно написать: OUTP(3f8h,41h) Чтобы ввести данные из порта, достаточно применить функцию INP(USHORT). Предположим, требуется ввести данные из порта состояния COM1 (3feh). Для этого достаточно написать: B=INP(3feh) где переменная B должна быть типа BYTE. Чтобы воспользоваться в программе вышеуказанными функциями, требуется сделать две вещи: 1) преобразовать библиотеку inpout32.dll в inpout32.lib с помощью программы libmaker.exe, входящей в комплект поставки Clarion6.0 (о том, как это сделать, написано в руково дстве пользователя по языку Clarion 6.0), и уже библиотеку inpout32.lib вставить в проект своей программы; 2) в тексте программы необходимо указать прототипы использования команд INP(USHORT) и OUTP(USHORT,BYTE). Прототипирование осуществляется стандартным образом, как это обычно делается в Кларионе:
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
INP(USHORT),BYTE,PASCAL,NAME('Inp32') OUTP(USHORT,BYTE),PASCAL,NAME('Out32') END !
После этого можно использовать 2 вышеуказанные функции. Использование библиотеки inpout32.dll для прямого ввода/вывода в порт имеет свои преимущества и недостатки. Преимущества заключаются в достаточной простоте применения функций INP( ) и OUTP( ), а также в том, что применение этих функций автоматически разрешает их использование в Win'XP (другими словами, применение этих функций автоматически снимает запрет на прямой ввод/вывод в порт в Win'XP). Недостатки использования функций INP( ) и OUT( ) состоят в том, что: а) требуется привле кать дополнительную библиотеку (inpout32.dll), что сопряжено с дополнительными «манипуля циями» в программе и необходимостью иметь эту библиотеку, и б) эти функции выполняются не очень быстро (но, конечно, на порядок быстрее, чем функции API). Правда, быстродействия их хватает, чтобы отследить самые быстротекущие процессы в интерфейсе RS232. Второй способ (Б) применения прямых команд ввода/вывода в порт заключается в сле дующем. Хотя в самом языке Clarion 6.0 и отсутствуют команды прямого вывода в порт (in и out), эти команды присутствуют в языке Си (C++), который встроен в Clarion 6.0. Написав на этом язы ке две внешних подпрограммы ввода и вывода в порт и обратившись к ним из программы на Clarion6.0 как к внешней функции, можно решить поставленную задачу. Ниже приведен текст 2 внешних подпрограмм In.cpp и Out.cpp, написанных автором на встроенном C++, для прямо го ввода и вывода в порт. // //Подпрограмма In.cpp // #pragma save #pragma call(inline => on, reg_param => (dx), reg_return => (ax)) static unsigned char inportb(unsigned int Port_number)= { 0xEC, // in al,dx }; #pragma restore extern "C" unsigned char INP(unsigned { unsigned char byte; byte=inportb(Port_number); return byte; } //
int Port_number)
// ! MODULE('INPOUT32')
144
// Подпрограмма Out.cpp //
145
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
#pragma save #pragma call(inline => on, reg_param => (dx,ax)) static void outportb(unsigned int port, unsigned char byt)= { 0xEE, // out dx,al }; #pragma restore extern "C" void OUTP(unsigned int Port_Number, unsigned char byte) { outportb(Port_Number,byte); } //
Основная идея этих 2 подпрограмм заключается в следующем. Вначале рассмотрим подпрограмму In.cpp. Во встроенном в Clarion6.0 языке C++ есть возможность использования «inline» проце дур, чтобы в текст программы (на C++) можно было вставлять машинные коды команд процес сора. Эти inlineпроцедуры возможно применять только в том случае, если функция, в которой они используются, имеет атрибут «static». Но атрибут «static» не позволяет вызвать эту функцию из программы пользователя, другими словами, — из языка Кларион (но позволяет осущест вить ее вызов из программы на C++ из того же модуля). С другой стороны, программа, кото рая может быть вызвана из языка Кларион, должна быть «внешней» по отношению к нему; в этом случае внешняя подпрограмма (или функция) должна иметь атрибут «extern», т. е. «внеш ний». Поэтому подпрограмма in.cpp состоит из 2 программ. Первая — подпрограмма, имеющая атрибут «static», осуществляет непосредственное ис пользование inlineкоманды процессорa (in al,dx), машинный код которой 0xEC. Эта ко манда процессора осуществляет ввод данных (команда in), расположенных по адресу, нахо дящемуся в регистре dx процессора, в младший байт аккумулятора (al). Для осуществления такого действия необходимо, вопервых, запомнить текущее состояние процессора (что вы полняет команда #pragma save), вовторых, включить опцию «inline», передать адрес порта (RS232) в регистр dx и получить результат ввода в регистре ax (что выполняет инструкция #pragma call(inline on, reg_param (dx), reg_return (ax))). Далее следует процессорная команда непосредственного ввода из порта, имеющая шестнад цатеричный код 0xEC, что означает ввод из порта, адрес которого находится в регистре dx, а результат этого ввода помещается в регистр al. Последней инструкцией подпрограммы яв ляется инструкция #pragma restore, что означает восстановление первоначального состояния процессора. Вторая — это подпрограмма, к которой уже можно обратиться из программы на Кларио не и которая в связи с этим уже имеет атрибут extern. Она является как бы связующим зве ном между первой подпрограммой (к которой она и обращается) и программой на Кларионе, откуда и идет обращение к ней. Действие этой подпрограммы заключается в следующем. Когда в Кларионе осуществля ется обращение ко второй подпрограмме командой B=INP (адрес порта ввода), где B — пере менная типа BYTE, а адрес порта типа USHORT (например 3f8h), т. е. пишется: B=INP(3f8h),
146
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
то вторая подпрограмма помещает значение адреса 3f8h в переменную Port_number, обра щается к первой подпрограмме с помощью инструкции byte=inportb(Port_number); и, получив значение введенного байта в переменной byte, возвращает это значение в Клари он с помощью инструкции return byte. Столь подробное описание подпрограммы In.cpp приводится здесь потому, что, хотя внеш не эта подпрограмма выглядит достаточно простой, она является ключевым решением пробле мы прямого ввода из порта, который (ввод) в Кларионе для Windows (Clarion6.0) отсутствует. Аналогично работает и подпрограмма Out.cpp. Разница состоит в том, что в подпрограмме In.cpp передается один параметр (адрес порта) и возвращается значение, прочитанное из это го порта, а в подпрограмме Out.cpp передаются два параметра (адрес порта — в регистр dx и значение, которое требуется вывести в этот порт — в регистр ax). Поэтому такое подробное описание подпрограммы in.cpp приводится еще и для того, чтобы читатель смог проследить эту аналогию в подпрограмме Out.cpp. Но это еще не все. Чтобы эти подпрограммы работали, необходимо: а) написать в языке Кларион для них про тотипы, и 2) включить их в проект программы на Кларионе. Прототипирование подпрограмм должно осуществляться в программе на Кларионе следу ющими инструкциями: MODULE('IN.CPP') INP(USHORT),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(USHORT,BYTE),NAME('_OUTP') END
Здесь также есть одна тонкость. Символ подчеркивания ( «_» ) перед названиями INP и OUTP отражает тот факт, что эти подпрограммы написаны именно на языке Си. Если посмот реть на подпрограммы In.cpp и Out.cpp, то можно заметить, что в них используется инструкция extern «C». Символ «C» и есть причина символа подчеркивания. Без символа подчеркивания в прототипе и символа «С» в подпрограмме вся конструкция работать не будет. Для того чтобы вставить подпрограммы In.cpp и Out.cpp в проект, необходимо открыть в проекте папку «External source files» (Внешние файлы), выбрать опцию «Add» (Добавить) и ука зать подпрограмму, например, «In.cpp». Забегая немного вперед, отметим, что для нижеприве денной тестовой программы «Hello.clw», использующей прямые команды ввода/вывода в пор ты, будет приведен и текст файлапроекта («Hello.prj»), где все это уже сделано. А сейчас возвратимся ко второй проблеме использования команд прямого ввода/вывода через порты в Win'XP, а именно к тому, как обойти запрещение применения таких команд.
2.5.4.3. Снятие запрета на применение команд ввода/вывода в порт для Win'XP Как уже было упомянуто, одним из способов, разрешающих применение прямых команд ввода/вывода в порт, является использование библиотеки inpout32.dll. Но в этой библиотеке уже приведены подпрограммы ввода/вывода в порты (INP( ) и OUTP( ) ), поэтому надобность в подпрограммах In.cpp и Out.cpp отпадает. В связи с этим использование библиотеки inpout32.dll становится бессмысленным, если предполагается работа с подпрограммами In.cpp и Out.cpp.
147
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
Рис. 2.5.4.3.1. Исходный вид окна программы Portmon после запуска
«Покопавшись» в Интернете, можно обнаружить сразу несколько программ, целью кото рых является разрешить использование прямых команд ввода/вывода в порты в 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портом компьютера является условием необходимым, но недостаточным. Как было упомянуто ра нее, требуется еще «открыть» COMпорт. О способах открытия COMпорта будет изложено несколько позже. Здесь же пока возвратимся к программам, разрешающим использова ние прямых команд ввода/вывода в порты в Win'XP. Вторая программа, которую хотелось бы представить, — программа Portmon (Портмони тор). Она предназначена для решения более широкого круга задач, чем просто разрешение на ввод/вывод в порты. Она, например, позволяет «отслеживать» обращение к портам из той или иной программы (при выборе опции «Capture» — захват) и выполнять некоторые другие функ ции. Применительно к использованию подпрограмм In.cpp и Out.cpp для ввода/вывода в пор ты из языка Clarion6.0 программа Portmon выполняет сразу две задачи: 1) разрешает приме нять прямой ввод/вывод в порты, и 2) открывает порт (в нашем случае COMпорт) для работы. Для использования этой программы в нашем случае, необходимо выполнить следующее. После инсталляции и запуска программы на экран выведется окно (рис. 2.5.4.3.1). Необхо димо отключить опцию Capture (захват), иначе каждая попытка ввода или вывода в порт (COM
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
порт) будет «перехвачена» и выведена на экран, что резко «затормозит» такой ввод/вывод (рис. 2.5.4.3.2). Далее установить («открыть») порты, к которым будет осуществляться обраще ние. В нашем случае это COM 1 (и, например, COM 2). Для этого необходимо выбрать опцию Capture, в открывшемся подменю выбрать опцию Ports (порты) и в еще одном открывшемся подменю отметить порты COM 1: Serial0 и COM 2:Serial1 (см. рис. 2.5.4.3.3). Далее необходимо выйти из программы Portmon. После таких манипуляций можно уже производить прямой ввод/вывод в порты COM 1 и COM 2 не только из программы на Clarion6.0 (т. е. использовать подпрограммы In.cpp и Out.cpp), но и вообще использовать прямые команды ввода/вывода в порты COM 1 и COM 2 в любой другой программе (в частности, даже в DOSпрограммах, напри мер, в турбобэйсике tb.exe, Clarion v3.100 и.т.п). Можно, например, запустить программу Hello.exe, написанную на языке Кларион для DOS — Clаrion v.3.100 (Hello.cla) и приведенную в 2.4.3.7. Правда, чтобы в DOSпрограммах правильно отражались символы русского языка на экра не, в конец файла AUTOEXEC.NT необходимо вставить какойлибо DOSдрайвер монитора, например: 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
Рис. 2.5.4.3.2. Выключение опции Capture (захват)
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА 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функций требуется определить несколько переменных:
Рис. 2.5.4.3.3. Открытие портов COM 1 и COM 2 для работы
Это может легко сделать программист, но ни в коем случае не пользователь програм мы, «заставлять» которого производить подобные манипуляции просто недопустимо. Пользователь должен запустить программу, написанную для его целей, и программа должна работать с портами ввода/вывода. Другими словами, работа с портами вво да/вывода должна быть осуществлена автоматически после запуска программы пользователя. Как было упомянуто ранее, программа UserPort (а точнее — драйвер UserPort.sys, установленный в папку C:\WINDOWS\SYSTEM32\DRIVERS\) «автоматически» разреша ет использование прямых команд ввода/вывода в порт после запуска Win'XP. Програм ма же Portmon.exe не обладает такой возможностью. Другими словами, «заставить» программу Portmon автоматически произвести манипуляции, показанные на рис. 2.5.4.3.1–2.5.4.3.3 нельзя. Поэтому для написания пользовательской программы, в ко торой предполагается применение прямых команд ввода/вывода в порт, допустимо только применение драйвера UserPort.sys, который требуется установть только один раз. Напомним еще раз, что установка драйвера UserPort.sys является необходимым услови ем работы с портами ввода/вывода, но недостаточным. Требуется еще «открыть» COMпорт для работы. Каким образом это сделать? Об этом будет рассказано далее.
2.5.4.4. Открытие COM-порта для использования прямых команд ввода/вывода в Win'XP Расскажем о двух способах «открытия» COMпорта. Первый способ, которым возможно «открыть» COMпорт, — уже небезызвестные API функции (которые, по мнению автора, только на это и годятся). Прототипы APIфункций, использующихся для работы с COMпортом, были уже приведены в 2.5.3 (в рассмотрен ной там же программе Hello.clw). Из всех APIфункций нам потребуются только 2: для «открытия» COMпорта и его «закрытия». Первый прототип — (CreateFileA()) предназ начен для открытия порта, второй (CloseHandle()) — для его закрытия. Ниже приведены эти два прототипа.
150
! !Переменные для APICOM — 1й способ открытия порта. ! CommPort UNSIGNED !(handle). PortCString CSTRING(10) !'COM1/COM2' OPEN_EXISTING ULONG(3) !
Открыть COMпорт можно следующими командами: PortCString='COM1' CommPort=CreateFileA(PortCString,0,0,0,OPEN_EXISTING,0,0)
Как можно увидеть по этим командам, переменной PortCString присваивается значение 'COM1', a APIфункция CreateFileA() используется с нулевыми параметрами. Другими словами, парамет ры COMпорта (скорость обмена, бит паритета, количество бит данных и количество стопбит) не опре делены. Это определение можно будет сделать позже уже прямыми командами ввода/вывода в COMпорт. Для закрытия COMпорта должна использоваться APIфункция CloseHandle(): loop until(CloseHandle(CommPort)).
!Закрытие CommPort'a.
Вторым способом, которым можно осуществить открытие COMпорта, является использо вание бесплатно распространяемой библиотеки clacom32.dll, с помощью которой приводятся примеры применения программ работы с COMпортом в Windows, разработанных компанией Gap Development Company (www.gapdev.com) под общим названием ClaCom (и распространя емых уже небесплатно). Чтобы использовать библиотеку clacom32.dll для открытия COMпорта, требуется осущест вить следующие действия: а) необходимо преобразовать библиотеку clacom32.dll в clacom32.lib с помощью входящей в состав Crarion 6.0 программы libmaker.exe и включить ее в проект програм мы на Clarion 6.0; б) определить прототипы использования команд открытия и закрытия COM порта: MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END
151
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
и переменную для номера COMпорта: ComNum
short
Для открытия COMпорта требуется использовать следующие команды: ComNum=0 ! 0COM1,1COM2 SetPort(ComNum) ResetPort(ComNum)
Как видно из последних команд, для открытия порта COM 1, переменной ComNum необходи мо присвоить нулевое значение, для открытия COM2 — единичное. Открытие порта осу ществляется командой SetPort(ComNum), приведение его в рабочее состояние — коман дой ResetPort(ComNum). Эти две команды необходимо использовать в программе на Clarion6.0 только один раз — в начале программы.
2.5.4.5. Тестовая программа, использующая прямые команды ввода/вывода в COM-порт в ОС Win'98/XP Итак, подытожим все выше изложенное в п. 2.5.4.2–2.5.4.4. Для использования в Clarion 6.0 прямых команд ввода/вывода в порт в ОС Win'98/XP необходимо осуществить следующие 3 действия. 1. Включает в себя два варианта: а) написать программы для прямого ввода/вывода в порт на встроенном в Clarion6.0 языке C++ (In.cpp и Out.cpp), прототипы для них и включить их в файлпроект (*.prj); б) не писать никаких программ ввода/вывода, a использовать готовую библиотеку inpout32.dll, преобразовать ее в библиотеку inpout32.lib с помощью программы lib maker.exe и включить ее в файлпроект (*.prj). Кроме того, написать прототипы для ис пользования команд INP( ) и OUTP( ). 2. Разрешить использование прямых команд ввода/вывода в порт, установив драйвер UserPort.sys в папку C:\WINDOWS\SYSTEM32\DRIVERS\. При исполь зовании библиотеки inpout32.dll в применении драйвера UserPort.sys нет необ ходимости. 3. «Открыть» COMпорт для работы с помощью: а) APIфункций или б) библиотеки cla com32.dll. Ниже приведен текст тестовой программы Hello.clw, в котором показаны все вариан ты. Неиспользуемые варианты закомментированы (перед ними установлен восклица тельный знак). В файлпроект, который приведен вслед за текстом программы Hello.clw, включены все варианты. В самой же программе используются подпрограммы In.cpp и Out.cpp и драйвер UserPort.sys; открытие COMпорта сделано с помощью библиотеки clacom32.dll. Отметим, что для того, чтобы получить «картинку» окна, вид «кнопок» и другие атрибуты ОС Win'XP, в файлпроект необходимо дополнительно включить файл «WindowsShell.Manifest». В программе установлены следующие параметры COMпорта: COM 1: N,8,1, 115 200. Програм ма использует алгоритм аппаратной синхронизации, о котором уже не раз говорилось.
152
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
Программа Hello.clw ! ! Программа передачи и приема строки из 75 символов по RS232 ! PROGRAM INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW') ! ! Определение переменных ! C byte A byte B byte S string(80) BT byte M byte,dim(80),over(S) S1 string(80) M1 byte,dim(80),over(S1) i ushort j ushort k ushort CH byte N1 long STR string(5) p byte ! ! Переменные для QueryPerformanceCounter ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC long DELTAC long !
! !Переменные для APICOM — 1й способ открытия порта. ! CommPort UNSIGNED !(handle). PortCString CSTRING(10) !'COM1/COM2' OPEN_EXISTING ULONG(3) !
153
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! !Переменная для CLACOM — 2й способ открытия порта. ! ComNum short ! ! ! Переменные (совмещения) для частоты и счетчика ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . !
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА 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 ! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END !=================================================== MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END ! !#######################
MAP END !######################## ! ! Способ а) прямого ввода/вывода в порт ! с использованием драйвера USERPORT, но без ! использования библиотеки inpout32.dll. ! MODULE('IN.CPP') INP(ULONG),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(unsigned long,BYTE),NAME('_OUTP') END ! ! ! Способ б) прямого ввода/вывода в порт без ! использования дравера USERPORT, но с ! использованием библиoтеки inpout32.dll. ! ! MODULE('INPOUT32') ! INP(USHORT),BYTE,PASCAL,NAME('Inp32') ! OUTP(USHORT,BYTE),PASCAL,NAME('Out32') ! END !
! от MAP
Window WINDOW('Тест RS232 (COM1:115200,N,8,2). Пр<255>мой ввод/вывод в порт.'),| AT(,,365,172),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),| COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX BUTTON('Выход'),AT(36,132,52,21),USE(?Cancel),| FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC) BUTTON('Продолжить'),AT(244,132,73,21),USE(?Ok),| FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC),DEFAULT END ! CODE ! !Открытие COMпорта(API) — 1й способ открытия для WIN'XP. !Этот способ требует закрытия COMпорта, но не требует !дополнительной библиотеки. ! ! PortCString='COM1' ! CommPort=CreateFileA(PortCString,0,0,0,OPEN_EXISTING,0,0) ! Sleep(100) !
!=================================================== !Прототипы APIфункций — для WIN'XP. !
154
155
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! ! Открытие COMпорта (CLACOM) — 2й способ открытия для WIN'XP. ! Этот способ не требует закрытия порта, но требует ! дополнительную библиотеку clacom32.dll. ! ComNum=0 ! 0COM1,1COM2 SetPort(ComNum) ResetPort(ComNum) !
! ! Вычисление временной задержки в 25 мкс. ! !Определение частоты работы счетчика. ! loop until QueryPerformanceFrequency(FREQUENCY). ! !Вычисление времени счета в 20 мкс. ! DC=int(20*FRE:FREQL/1000000) !
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
M[1]=C loop i=1 to 75 do OUTBYTE . show(5,50,'Конец передачи из PC') show(5,60,'________________________________________________________') ! ! В этом месте идет переключение с вывода на ввод. ! B=INP(3f8h) !Холостой ввод — ОБЯЗАТЕЛЬНО!(Для сброса бита DRdata ready). loop while band(INP(3fdh),1). !Ожидание сброса бита "DR"data ready. A=INP(3feh) !Очистка 3feh для правильного ожя стартбита. ! ! ! Sleep(5) ! show(5,80,'Начало передачи из микроконтроллера')
do INIT
!Инициализация RS232
k=0 OPEN(Window) START blank disable(?Ok) disable(?Cancel)
k=k+1 S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdifjhigklmnopqrstuvwxyzАБВГДЕЖЗИКЛМНОПРСТУФХЦЧ' show(5,40,S) ! Ч75й символ show(5,30,'Начало передачи из PC') show(5,10,'k=') type(k) i=1 C=M[1] M[1]=75 do OUTBYTE !Передача мл. байта длины (75) M[1]=0 do OUTBYTE !Передача ст. байта длины (0)
156
loop i=1 to 75 do INBYTE . show(5,90,S1) show(5,100,'Конец передачи из микроконтроллера') show(5,110,'_______________________________________________________') p=0 enable(?Ok) enable(?Cancel) accept ! case accepted() of ?Ok p=1 break of ?Cancel p=0 break .! ot case ! .! от accept if p=0 then goto E. i=1
157
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
M[1]=40h do OUTBYTE goto START E
OUTP(3fch,00h) !Сброс микроконтроллера OUTP(3fbh,7h)
! ! Закрытие COMпорта (API) — 1й способ. Для WIN'XP ! ! loop until(CloseHandle(CommPort)). !Закрытие CommPort'a. ! return ! ! Подпрограммы ! ! П/п инициализации RS232 и микроконтроллера. ! INIT routine ! ! Инициализация СОМпорта. ! ! Установка скорости обмена. ! OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,1) ! Установить мл.б. скор.:1115200 бод,129600 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. ! ! Установка режима. ! OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. ! ! Установка запрета прерываний по СОМпорту. ! OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! OUTP(3fch,00h) ! Сброс линии DTR (Reset микроконтроллера). Sleep(100) ! Задержка 0,1 с. OUTP(3fch,01h) ! Установка линии DTR (Запуск микроконтроллера). Sleep(100) ! Задержка 0,1 с. B=INP(3f8h) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). Sleep(20) ! ! П/п ввода байта (байт в M1[i])
158
ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА RS232 В ОС WINDOWS98/XP
! INBYTE routine OUTP(3fbh,47h) !Установка TxD(в +9 В) (разрешение передачи). loop until band(INP(3feh),2). !Ожидание стартбита (изменения состояния DSR). do DEL20 !Задержка 25 мкс. OUTP(3fbh,07h) !Сброс линии TxD(в 9 В) (запрет передачи). A=INP(3feh) !Очистка 3feh для правильного ожидания стартбита. loop until band(INP(3fdh),1).!Ожидание прихода байта(устки бита "DR"data ready). M1[i]=INP(3f8h) !Чтение байта данных. A=INP(3feh) !Очистка 3feh для правильного ожидания стартбита. ! ! П/п вывода байта (байт в M[i]) ! OUTBYTE routine loop until band(INP(3fdh),20h). !Ожидание готовности передатчика (transmitter empty). loop until band(INP(3feh),20h). !Ожидание разрешения передачи(установки DSR). OUTP(3f8h,M[i]) !Вывод байта. !B=INP(3feh) loop until band(INP(3feh),2h). !Ожидание сброса разрешения !(изменения состояния DSR). loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС (OK to send). B=INP(3feh) !Очистка 3feh для правильного !ожидания стартбита. ! ! DEL20 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC then break. ! DC(=25 мкс) . ! !
Текст файлапроекта hello.prj приведен ниже Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off) #pragma optimize(cpu=>386)
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"
Рис. 2.5.4.5.1. Общий вид окна программы Hello.exe в ОС Win'98
Сравнив подпрограммы инициализации COMпорта, микроконтроллера, ввода и вывода байта приведенной выше программы с программой Hello.cla, написанной на языке Кларион для DOS (Clarion v.3100) и приведенной в п. 2.4.3.7, можно отметить практичеки полную их идентичность. Если же сравнить текст приведенной программы с текстом программы, исполь зующей APIфункции и приведенной в п. 2.5.3, то можно увидеть насколько неуклюжи и гро моздки APIфункции. Кроме того, сравнив подпрограммы для ввода и вывода байта этих двух программ, можно заметить, что подпрограммы ввода и вывода байта в программе, использу ющей APIфункции, выполняют не все действия, которые выполняют эти же подпрограммы в программе, использующей прямой ввод/вывод в порты. Причиной этому является «непово ротливость» APIфункций, не позволяющая отслеживать быстротекущие процессы в интерфей се RS232. Программу следует запускать совместно с подключенной к COMпорту какойлибо из ма кетных плат с микроконтроллером, описанных в главе по аппаратным средствам. Перед за пуском программы Hello.exe кабель от макетной платы должен быть соединен с портом COM1, а питание макетной платы включено. После запуска программы Hello.exe в ОС Win'98 на экране монитора появится окно (рис. 2.5.4.5.1). Нажатие кнопки «Продолжить» приведет к повторному запуску программы (количество нажатий на кнопку, или количество запусков, k равно 176), нажатие кнопки «Выход» — к выходу из программы в Windows. При запуске программы в ОС Win’ XP появится окно (рис. 2.5.4.5.2), где k = 239.
160
Рис. 2.5.4.5.2. Общий вид окна программы Hello.exe в ОС Win'XP
2.6. Применение интерфейса RS232 для программирования микроконтроллеров в системе (In_System_Programming) 2.6.1. Общие положения Как уже упоминалось ранее, когда речь шла об аппаратных средствах сопряжения микро контроллеров с компьютером по интерфейсу RS232, эти аппаратные средства работают как в штатном режиме, так и в режиме программирования. Программное обеспечение режима ISP для микроконтроллеров MSC12XX, ADUC8XX и P89LPC9XX, разработанное ф. Texas Instru 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), имеет настолько высо кое качество, что не только не вызывает у автора (книги) никаких претензий, но и наоборот
161
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
— вызывает чувство восхищения его прекрасной работой. Программа FLIP v.2.4.4 иде ально работает на скорости 115 200 бод и имеет массу интересных возможностей. Авто ру остается только поблагодарить эту фирму за такую прекрасную программу и поже лать, чтобы и другие фирмы разработали для своих микроконтроллеров подобную про грамму. Для работы этой программы со схемой сопряжения с компьютером, приведен ной на рис. 1.3.7.1, требуется только некоторые настройки этой программы, о которых будет рассказано несколько позже. Что касается программирования микроконтроллеров C8051F067 и C8051F330D от ф. Silicon Laboratories в режиме ISP: по интерфейсу JTAG и C2 (с помощью USB DEBUGАдаптера), схема сопряжения которых приведена на рис. 1.3.9.1, то здесь авто ру тоже остается только привести некоторые уточнения, касающиеся настройки програ ммного обеспечения IDE v.2.5.2. Поэтому дальнейшее изложение будет построено следующим образом. Вначале будут приведены программы для программирования микроконтроллеров в режиме ISP: — по интерфейсу RS232 (MSC1210XX, ADUC8XX и P89LPС93X), — по интерфейсу C2 (P89LPС9XX); далее — некоторые рекомендации по настройке параметров программ для программирования микроконтроллеров в режиме ISP: — FLIP v.4.4 от ф. AMTEL (FN89C51TD2(RD2) по интерфейсу RS 232, — IDE v.2.5.2 от ф. Silicon Laboratories (C8051F067 по интерфейсу JTAG и C8051F330D) по интерфейсу C2 с помощью USBDEBURGадаптера.
2.6.2. Программирование микроконтроллеров MSC12XX в режиме ISP по интерфейсу RS232 Для программирования микроконтроллеров MSC12XX в режиме ISP по интерфейсу RS232 должна использоваться схема сопряжения этого семейства микроконтроллеров с компьютером (рис. 1.3.5.1). Далее приведены тексты двух программ для программирования микроконтроллера MSC121X в режиме ISP по интерфейсу RS232. Первая программа downti.cla написана на языке Кларион для DOS (Clarion v.3.100) и ра ботает либо в ОС DOS, либо в режиме эмуляции DOS — в Win'98 и Win'XP. Текст файлпроек та ее (downti.pr) приведен вслед за текстом самой программы. Вторая программа написана на языке Кларион для Windows (Clarion6.0). Она работает в ОС Win'98 и Win'XP. Название программы — Ispmsc.clw, а ее файлпроекта — Ispmsc.prj Обе программы работают с портом COM 1 на скорости 115 200 бод. Они используют для программирования одно и то же имя файла: file.hex. Длина файла file.hex составляет чуть бо лее 92 кБ, что в формате исполняемой программы (*.binформат) составляет ровно 32 кБ (максимальный размер памяти микроконтроллера MSC1210Y5). Программа downti.cla ! ! Программа программирования файла file.hex в msc1210. !
162
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
PROGRAM ! ! Определение переменных ! M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для вывода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. ! ! Строка и массив со значением регистра USEC. ! Для 11.059 МГц => 10=0Ah => 30h,41h. ! Для 22.118 МГц => 20=14h => 31h,34h. SUSEC string('<52h,57h,46h,42h,30h,41h>') !MUSEC byte,dim(6),over(SUSEC) ! ! Строка и массив со значением регистра MSECL. ! Для 11058 => 32h => 33h,32h. ! Для 22117 => 65h => 36h,35h. SMSECL string('<52h,57h,46h,43h,33h,32h>') !MMSECL byte,dim(6),over(SMSECL) ! ! Строка и массив со значением регистра MSECH. ! Для 11058 => 2Bh => 32h,42h. ! Для 22117 => 56h => 35h,36h. SMSECH string('<52h,57h,46h,44h,32h,42h>') !MMSECH byte,dim(6),over(SMSECH) ! ! Строка и массив стирания памяти программ M0000. SM0000 string('<4dh,30h,30h,30h,30h>') !MM0000 byte,dim(5),over(SM0000) ! ! Строка и массив стирания памяти данных M8000. SM8000 string('<4dh,38h,30h,30h,30h>') !MM8000 byte,dim(5),over(SM8000) ! L ulong ! Длина файла в байтах. N ushort NSTROK ushort(0) ! Количество строк в *.hexфайле NOST ushort ! Остаток NSYMB ushort ! Количество символов . NP ushort(0) ! Количество точек в символе . NP1 ushort k ushort k1 ushort KL ushort B byte i ushort j ushort i1 ulong T1 long
163
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
KINI
ushort !Количество попыток запуска MSC1210.
Y00h Y01h Y02h Y03h Y04h Y06h Y07h Y12 Y47h Y80h Y0fh
byte(00h) byte(01h) byte(02h) byte(03h) byte(04h) byte(06h) byte(07h) byte(12) byte(47h) byte(80h) byte(0fh)
N=i loop i=3 to N17 type(chr(M1[i])) . else KINI=KINI+1 if KINI<10 goto INIT else setcursor(17,10) type('Вставьте микросхему !!!') setcursor(18,10) type('Включите питание<0dh,0ah>') setcursor(19,10) goto WYKL . . ! ! Рисование рамки ! setcursor(4,13) type('г===========') setcursor(5,13) type('¦') setcursor(5,25) type('¦') setcursor(6,13) type('L===========') ! ! Загрузка в MSC1210 временн'ых ! характеристик: USEC,MSECL и MSECH. ! S=SUSEC;loop k=1 to 6;do OUTBYTE. beep(0,10) S=SMSECL;loop k=1 to 6;do OUTBYTE. beep(0,10) S=SMSECH;loop k=1 to 6;do OUTBYTE. beep(0,10) ! show(2,5,' show(2,5,'Подготовка к программированию.') ! ! Стирание памяти данных ! ! show(11,3,'Стирание памяти данных') setcursor(2,35) S=SM8000;loop k=1 to 5;do OUTBYTE. ! loop i=1 to 50 do INBYTE
!BINARY !BINARY
FILE,PRE(BIN),DRIVER('DOS'),NAME('12kb.hex') FILE,PRE(BIN),DRIVER('DOS'),NAME('printf65.hex')
BINARY RECORD STR MSTR
FILE,PRE(BIN),DRIVER('DOS'),NAME('file.hex') RECORD string(65500) !Строка с прочитанным файлом byte,dim(65500),over(STR) !Массив для передачи.
.. ! CODE blank KINI=1 show(2,5,'Инициализация микроконтроллера') setcursor(2,35) ! ! Инициализaция MSC1210 ! do INITRS ! Инициализация RS232. INIT
do INITMSC
in(3f8h,B) type ('.') k=1 M[k]=0dh do OUTBYTE
! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0").
! "CR"
loop i=1 to 60 do INBYTE if M1[i]=val('>') then break. . if i<60 setcursor(5,16)
164
')
165
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if M1[i]=val('>') then break. . if i<50 type('.') else goto INIT . ! ! !Стирание памяти программ. ! setcursor(2,37) S=SM0000;loop k=1 to 5;do OUTBYTE. ! loop i=1 to 50 do INBYTE if M1[i]=val('>') then break. !3eh . if i<50 N=i !N5 loop i=N4 to N2 type(chr(M1[i])) !ok . else goto INIT . do DEL200MS ! ! Открываем файл '*.hex' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. setcursor(8,7) type('Чтение файла file.hex ok<0dh,0ah>') setcursor(11,10) type('Программирование<0dh,0ah>') setcursor(12,6) type(' ') ! ! Подсчитываем количество строк в файле (по 0dh). ! NSTROK=0 loop i1=1 to L if i1<=65500 if BIN:MSTR[i1]=0dh then NSTROK=NSTROK+1. !Количество строк(.)
166
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
else if i1=65501 next(BINARY) . if BIN:MSTR[i165500]=0dh then NSTROK=NSTROK+1. !Количество строк(.) . . close(BINARY) ! NP=int(NSTROK/16) !Целое количество точек в символе . NOST=NSTROKNP*16 !Остаток if NP<=1 then NP=1. ! ! Команда 'E' (Echo off) ! k=1 M[k]=val('E') do OUTBYTE ! do DEL200MS ! ! Команда 'L' (Load) ! k=1 M[k]=val('L') do OUTBYTE ! loop i=1 to 10 beep(0,1) do INBYTE if M1[i]=val('>') then break. . if i<10 ! type('.') else goto INIT . in(3f8h,B) !Холостой ввод ! Open(BINARY,00H) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) empty(BINARY) ! На всякий случай. set(BINARY) next(BINARY) ! ! Включение таймера времени программирования. !
167
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
T1=clock() ! ! ! Закраска "змеи" серым цветом ! setcursor(13,10) type('<176>{16}') setcursor(13,10) ! k1=0 !Количество точек NP1=NP NSYMB=0 !Количество напечатанных символов . !============================================== ! Загрузка программы !============================================== loop i1=1 to L !Начало цикла IF i1<=65500 if BIN:MSTR[i1]=0dh k1=k1+1 loop i=1 to 10 do INBYTE if M1[i]=val('.') or M1[i]=val('T') then break. . if k1=NP1 type('<178>') NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else NP1=NP1+NP+NOST . . . k=1 M[k]=BIN:MSTR[i1] do OUTBYTE ELSE if i1=65501 next(BINARY) . if BIN:MSTR[i165500]=0dh k1=k1+1 loop i=1 to 10 do INBYTE if M1[i]=val('.') or M1[i]=val('T') then break. . if k1=NP1 then type('<178>'); NP1=NP1+NP;NSYMB=NSYMB+1.
168
. k=1 M[k]=BIN:MSTR[i165500] do OUTBYTE . ! ot IF .!ot loop Конец цикла. !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком размере файла. ! if NSYMB<16 loop (16NSYMB) times type('<178>') . . ! M
type(' ok') type('<0dh,0ah>') type(' ') T1=clock()T1 !Расчет времени программирования type('<0dh,0ah>') type(' Время программирования = ') type(T1/100) type(' с ') goto E
WYKL show(23,26,'Для выхода нажмите ЕSC') loop until keyboard() ask if keycode()=256 then break. . ! E out(3fch,Y00h) !Сброс микроконтроллера return
!esc
!############### Подпрограммы ############# ! ! П/п инициализации RS232 и микроконтроллера. ! ! Инициализация СОМпорта. ! INITRS routine out(3fch,Y00h) !Контрольный сброс микроконтроллера. out(3fbh,Y80h) ! DLAB=1 для установки делителя.
169
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
out(3f8h,Y01h) ! Установка мл.б. скор.:Y01h115200 бод, Y129600 бод. out(3f9h,Y00h) ! Установка ст.б. скор.=0. out(3fbh,Y07h) ! DLAB=0,Режим: 8 байт данных,2 стоп, нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h. ! ! Инициализация микроконтроллера. !
DEL3S routine T#=CLOCK();loop while CLOCK()T#<300. !Задержка 3 с. DEL10MS routine !Задержка 10 мс. beep(0,5) DEL2MS routine !Задержка 2 мс. beep(0,1) !################ конец подпрограмм #################
INITMSC routine out(3fch,Y01h) ! RTS=0,DTR=1: PSEN=1,RST=1. do DEL50MS out(3fch,Y00h) ! RTS=0,DTR=0: PSEN=0,RST=1 — сброс. do DEL50MS out(3fch,Y02h) ! RTS=1,DTR=0: PSEN=0,RST=0. do DEL100MS out(3fch,Y03h) ! RTS=1,DTR=1: PSEN=0,RST=0 — загрузкa. do DEL200MS ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine j=0 INS1 in(3fdh,B) if band(B,1)<>0 then in(3f8h,M1[i]); goto RET0. j=j+1 if j<>10000 then goto INS1. RET0 ! ! П/п вывода байта (байт в M[k] ) ! OUTBYTE routine loop;in(3fdh,B);if band(B,20h)<>0;break.. !Ожид. готовности передатчика (transmitter empty). out(3f8h,M[k]) !Вывод байта loop;in(3fdh,B);if band(B,40h)<>0;break.. !Ожe выхода байта !из РС(trasmitter holding register empty.OK to send). ! ! П/п временных задержек ! DEL50MS routine T#=CLOCK();loop while CLOCK()T#<5. !Задержка 0,05 с. DEL100MS routine T#=CLOCK();loop while CLOCK()T#<10. !Задержка 0,1 с. DEL150MS routine T#=CLOCK();loop while CLOCK()T#<15. !Задержка 0,15 с. DEL200MS routine T#=CLOCK();loop while CLOCK()T#<20. !Задержка 0,2 с. DEL1S routine T#=CLOCK();loop while CLOCK()T#<100. !Задержка 1 с.
#system auto exe #model xlarge
Файл проект downti.pr
170
#pragma data(stack_size=>24576,threshold=>4096) #pragma optimize(cpu=>286) #pragma check(stack=>on,index=>on) #pragma link_option(map=>off,case=>on) #compile downti.cla /check(stack=>off,nil_ptr=>off,index=>off) ! /debug(vid=>off,line_num=>off) #pragma link(%clapfx%dos.lib) #set exports='downti' #link downti
Программа Ispmsc.clw ! ! Программа ISP микроконтроллера MSC1210 ! PROGRAM INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW') ! ! Определение переменных ! p byte L ulong !Длина файла в байтах. !LARR byte,dim(2),over(L) !2 байта (мл. и ст. L) M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для вывода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. ! N ushort NSTROK ushort(0) ! Количество строк в *.hexфайле NOST ushort ! Остаток
171
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
NSYMB ushort ! Количество символов . NP ushort(0) ! Количество точек в символе . NP1 ushort k ushort k1 ushort KL ushort B byte i ushort j ushort i1 ulong T1 long KINI ushort !Количество попыток запуска MSC1210. NAMEMIC string(7) MNAMEMIC byte,dim(7),over(NAMEMIC) j1 byte SNAKE byte TIND real !
!SMSECH string('<52h,57h,46h,44h,35h,36h>')!Для 22117. !MMSECH byte,dim(6),over(SMSECH) ! ! Строка со значением регистра CKCON. ! Адрес CKCON=8eh(38h,45h), значение CKCON=00h(30h,30h). SCKCON string('<52h,57h,38h,45h,30h,30h>') ! ! Строка и массив стирания памяти программ M0000. SM0000 string('<4dh,30h,30h,30h,30h>') !MM0000 byte,dim(5),over(SM0000) ! ! Строка и массив стирания памяти данных M8000. SM8000 string('<4dh,38h,30h,30h,30h>') !MM8000 byte,dim(5),over(SM8000) !
! ! Строка и массив со значением регистра USEC. ! Для 3.686 МГц => 3=03h => 30h,33h. ( 31=02) !только на Vобм.<=57600!!! ! Для 7.373 Мгц => 5=05h => 30h,35h. ( 72=05) ! Для 11.059 МГц => 10=0Ah => 30h,41h. (111=10) ! Для 22.118 МГц => 21=15h => 31h,35h. (221=21) !SUSEC string('<52h,57h,46h,42h,30h,32h>')!Для 3,686 !SUSEC string('<52h,57h,46h,42h,30h,35h>')!Для 7,373 SUSEC string('<52h,57h,46h,42h,30h,41h>')!Для 11,059 !SUSEC string('<52h,57h,46h,42h,31h,35h>')!Для 22,118 !MUSEC byte,dim(6),over(SUSEC) ! ! Строка и массив со значением регистра MSECL. ! Для 3686 => мл.б.= CCh => 36h,36h. (36861=3686=0E66h) ! Для 7372 => мл.б.= CCh => 43h,43h. (73731=7372=1CCCh) ! Для 11058 => мл.б.= 32h => 33h,32h. (110591=11058=2B32h) ! Для 22117 => мл.б.= 65h => 36h,35h. (221181=22117=5665h) !SMSECL string('<52h,57h,46h,43h,36h,36h>')!Для 3686. !SMSECL string('<52h,57h,46h,43h,43h,43h>')!Для 7373. SMSECL string('<52h,57h,46h,43h,33h,32h>')!Для 11058. !SMSECL string('<52h,57h,46h,43h,36h,35h>')!Для 22117. !MMSECL byte,dim(6),over(SMSECL) ! ! Строка и массив со значением регистра MSECH. ! Для 3686 => ст.б.= 0Eh => 30h,45h. ! Для 7373 => ст.б.= 1Ch => 31h,43h. ! Для 11058 => ст.б.= 2Bh => 32h,42h. ! Для 22117 => ст.б.= 56h => 35h,36h. !SMSECH string('<52h,57h,46h,44h,30h,45h>')!Для 3686. !SMSECH string('<52h,57h,46h,44h,31h,43h>')!Для 7372. SMSECH string('<52h,57h,46h,44h,32h,42h>')!Для 11058.
172
! ! Переменная для CLACOM ! ComNum short ! ! ! Переменные для частоты и счетчика ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC long DELTAC long ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . ! MAP !######################## ! MODULE('IN.CPP') INP(ULONG),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(unsigned long,BYTE),NAME('_OUTP') END
173
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END ! MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END ! !#################### END ! от MAP
FONT('Tahoma',10,,FONT:regular,CHARSET:CYRILLIC),DEFAULT CHECK,AT(0,4,21,20),SKIP,TRN,FLAT,ICON(ICON:Hand) END ! BINARY FILE,DRIVER('DOS'),PRE(BIN),NAME('file.hex') RECORD RECORD STR string(65500) !Строка с прочитанным файлом. MSTR byte,dim(65500),over(STR) !Массив для передачи. ..
Window WINDOW('ISP микроконтроллерра MSC121X'),AT(,,216,182),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),| COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX ENTRY(@s10),AT(84,40,37,9),USE(NAMEMIC),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black, !COLOR:White) ENTRY(@n_5b),AT(96,60,25,9),USE(L),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR: !Black,COLOR:White) PROGRESS,USE(SNAKE),AT(32,92,132,12),RANGE(0,16) ENTRY(@n_5.2b),AT(120,120,20,9),USE(TIND),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR: !Black,0C1FFC1H) BUTTON('Выход'),AT(64,148,44,16),USE(?Cancel),| FONT('Times New Roman',10,COLOR:Black,FONT: !bold,CHARSET:CYRILLIC), | TIP('Out from programm to Windows'),DEFAULT END WinErr WINDOW('П Р Е Д У П Р Е Ж Д Е Н И Е ! ! !'),AT(,,168,77),| FONT('Times New Roman',10,COLOR:Black,FONT: !regular,CHARSET:CYRILLIC), | COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX PROMPT('Компьютер не реагирует на плату ISP'), !AT(20,12,145,11),USE(?Prompt1),| FONT('Times New Roman',11,COLOR:Red,FONT: !bold,CHARSET:CYRILLIC) STRING('Проверьте кабель, включите питание,'), !AT(8,28,160,10),USE(?String1),| FONT('Times New Roman',12,,FONT:bold+FONT: !italic,CHARSET:CYRILLIC) STRING('вставьте микроконтроллер в панельку.'), !AT(8,40,160,11),| FONT('Times New Roman',12,,FONT:bold+FONT: !italic,CHARSET:CYRILLIC) BUTTON('Выход'),AT(64,56,42,13),USE(?EX),|
174
CODE ! ! Открытие COMпорта(CLACOM) — Для WIN'XP. ! ComNum=0 ! 0COM1,1COM2 SetPort(ComNum) ResetPort(ComNum) ! ! Вычисление временной задержки в 25 мкс. ! loop until QueryPerformanceFrequency(FREQUENCY). !Определение частоты работы счетчика. DC=int(25*FRE:FREQL/1000000) !Вычисление времени счета в 25 мкс. ! !############################################################### ! ! Инициализaция MSC1210 ! do INITRS ! Инициализация RS232. OPEN(Window) display blank
KINI=1 STAR disable(?Cancel)
show(20,20,'Инициализация микроконтроллера: INIT
')
do INITMSC display B=INP(3f8h) ! Холостой ввод — для сброса бита 0(DR) !в 3fdh (в "0"). loop while band(INP(3fdh),1).
!Ожидание сброса бита
175
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
!"DR"data ready. !Очистка 3feh для правильного !ожидания стартбита.
B=INP(3feh)
type ('|') display k=1 M[k]=0dh do OUTBYTE
! "CR"
loop i=1 to 60 do INBYTE if M1[i]=val('>') then break. . if i<60 type(' Ok') show(20,40,'Микроконтроллер ') N=i j1=1 loop i=3 to N17!12 MNAMEMIC[j1]=M1[i] j1=j1+1 . display else KINI=KINI+1 if KINI<10 goto INIT else goto WYKL . . display ! ! Загрузка в MSC1210 временных ! характеристик: USEC,MSECL и MSECH. ! S=SUSEC;loop k=1 to 6;do OUTBYTE. Sleep(50) S=SMSECL;loop k=1 to 6;do OUTBYTE. Sleep(50) S=SMSECH;loop k=1 to 6;do OUTBYTE. Sleep(50) ! S=SCKCON;loop k=1 to 6;do OUTBYTE. !Загрузка CKCON. Sleep(50) ! !
176
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! Стирание памяти данных ! S=SM8000;loop k=1 to 5;do OUTBYTE. ! loop i=1 to 50 do INBYTE if M1[i]=val('>') then break. . if i<50 ! type('.') ! display else goto INIT . ! ! !Стирание памяти программ. ! S=SM0000;loop k=1 to 5;do OUTBYTE. ! loop i=1 to 50 do INBYTE if M1[i]=val('>') then break. !3eh . if i<50 N=i !N5 loop i=N4 to N2 . else goto INIT . Sleep(200) display ! ! Открываем файл '*.hex' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. show(20,60,'Длина файла file.hex show(20,80,'Программирование') display ! ! Подсчитываем количество строк в файле (по 0dh). ! NSTROK=0 loop i1=1 to L if i1<=65500
байт')
177
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if BIN:MSTR[i1]=0dh then NSTROK=NSTROK+1. !Количество строк(.) else if i1=65501 next(BINARY) . if BIN:MSTR[i165500]=0dh then NSTROK=NSTROK+1. !Количество строк(.) . . close(BINARY) ! NP=int(NSTROK/16) !Целое количество точек в символе . NOST=NSTROKNP*16 !Остаток if NP<=1 then NP=1. ! ! Команда 'E' (Echo off) ! k=1 M[k]=val('E') do OUTBYTE ! Sleep(200) ! ! Команда 'L' (Load) ! k=1 M[k]=val('L') do OUTBYTE ! loop i=1 to 10 beep(0,1) do INBYTE if M1[i]=val('>') then break. . if i<10 else goto INIT . B=INP(3f8h) !Холостой ввод ! Open(BINARY,00H) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) empty(BINARY) ! На всякий случай. set(BINARY) next(BINARY) ! ! Включение таймера времени программирования. !
178
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
T1=clock() ! ! ! Закраска "змеи" ! display ! k1=0 !Количество точек NP1=NP NSYMB=0 !Количество напечатанных символов . !============================================== ! Загрузка программы !============================================== show(20,120,'') loop i1=1 to L !Начало цикла IF i1<=65500 if BIN:MSTR[i1]=0dh k1=k1+1 loop i=1 to 20 do INBYTE if M1[i]=val('.') or M1[i]=val('T') then break. . if k1=NP1 SNAKE=SNAKE+1 ! type('#') display NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else NP1=NP1+NP+NOST . . . k=1 M[k]=BIN:MSTR[i1] do OUTBYTE ELSE if i1=65501 next(BINARY) . if BIN:MSTR[i165500]=0dh k1=k1+1 loop i=1 to 10 do INBYTE if M1[i]=val('.') or M1[i]=val('T') then break. . !type('#') if k1=NP1 then SNAKE=SNAKE+1;display;
179
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! case accepted() of ?EX p=0 break .! oт case ! .! от accept if p=0 then goto E. !###############################################
! NP1=NP1+NP;NSYMB=NSYMB+1. . k=1 M[k]=BIN:MSTR[i165500] do OUTBYTE . ! от IF .!от loop Конец цикла. !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком размере файла. ! if NSYMB<16 loop (16NSYMB) times SNAKE=SNAKE+1!type('#') . . display ! M
!OKNO ! ! enable(?Ok) enable(?Cancel) accept ! case accepted() of ?Cancel p=0 break .! oт case ! .! от accept if p=0 then goto E. !
180
close(Window) OUTP(3fch,00h) !Сброс микроконтроллера OUTP(3fbh,7h) return ! RE return
show(155,95,'Ok')
T1=clock()T1 !Расчет времени программирования show(20,120,'Время программирования T= TIND=T1/100 ! type(T1/100) ! type(' с ') !
WYKL
E
close(WINDOW) open (WinErr) accept
с')
! ! Подпрограммы ! ! П/п инициализации RS232 и микроконтроллера. ! ! ! Инициализация СОМпорта. ! INITRS routine ! OUTP(3fch,00h) !Контрольный сброс микроконтроллера. OUTP(3fbh,80h) OUTP(3f8h,1)
! DLAB=1 для установки делителя. ! Установить мл.б. скор.:1115200,257600, !129600 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa, !нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! INITMSC routine OUTP(3fch,02h) ! RTS=1,DTR=0: PSEN=0,RST=1. Sleep(50) OUTP(3fch,00h) ! RTS=0,DTR=0: PSEN=1,RST=1 — сброс. Sleep(50) OUTP(3fch,02h) ! RTS=1,DTR=0: PSEN=0,RST=1.
181
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Sleep(250) OUTP(3fch,03h) ! RTS=1,DTR=1: PSEN=0,RST=0 — загрузкa. Sleep(100) !
Файлпроект ispmsc.prj
! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine ! loop 60000 times if (band(INP(3fdh),1)) !Ожидание конца прихода байта(установки !бита "DR"data ready). M1[i]=INP(3f8h) break . . ! ! П/п вывода байта (байт в M[i]) ! OUTBYTE routine loop until band(INP(3fdh),20h). !Ожидание готовности передатчика !(transmitter empty). OUTP(3f8h,M[k]) !Вывод байта. loop until band(INP(3fdh),40h).!Ожидание выхода байта из РС !trasmitter holding register !empty(OK to send). ! ! DEL1400 routine loop j=1 to 1400 . ! DEL25 routine loop until QueryPerformanceCounter(COUNTER). !Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC then break. !DC(=25 мкс.) . ! !
Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off) #pragma optimize(cpu=>386) #pragma define(NULL=>on) #compile "ispmsc.clw" #compile "in.cpp" #compile "out.cpp" #pragma link("C%V%DOS%X%%L%.LIB") #pragma link("ispmsc.lib") #pragma link("clacom32.lib") #pragma link("WindowsShell.Manifest") #link "ispmsc.exe"
Программа downti.cla выводит на экран информацию в процессе програмирования и после его окончания (рис. 2.6.2.1, а – б). Общий вид окна программы Ispmsc.clw после окончания программирования микроконт роллера MSC1210 приведен на рис. 2.6.2.2. Рис. 2.6.2.1. Вид экрана при программировании микроконтроллера MSC1210
а)
б)
182
183
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Программа down834c.cla
Рис. 2.6.2.2. Общий вид окна при программирова! нии микроконтролле! ра MSC1210 програм! мой Ispmsc.clw
Как видно из сравнения времени программирования одного и того же файла — file.hex, длина которого в исполняемом формате составляет ровно 32 кБ, обе программы показывают примерно одно и то же время (чуть менее 11 с), причем программа в Win'XP ничуть не уступает по быстродействию программе в DOS. Это вполне объяснимо, посколь ку программа на Win'XP использует прямые команды ввода/вывода в порт. Разделив 32 кБ на 11 с, получим 2,9 кБ/с — с такой скоростью идет программирование микроконт роллера MSC1210 в режиме ISP.
2.6.3.Программирование микроконтроллеров ADUC8XX в режиме ISP по интерфейсу RS232 Для программирования микроконтроллеров ADUC8XX в режиме ISP по интерфейсу RS232 должна использоваться схема сопряжения этого семейства микроконтроллеров с компьюте ром (рис. 1.3.6.1). Ниже приведены тексты двух программ для программирования микроконтроллеров ADUC8XX в режиме ISP по интерфейсу RS232. Первая программа aduc834c.cla написана на языке Кларион для DOS (Clarion v.3.100) и работает либо в ОС DOS, либо в режиме эмуляции DOS — в Win'98 и Win'XP. Файлпроект — aduc834c.pr. Вторая программа ispaduc.clw написана на языке Кларион для Windows (Clarion6.0). Она работает в ОС Win'98 и Win'XP. Файлпроект — ispaduc.prj. Обе программы работают с портом COM 1 на скорости 115 200 бод. Они использу ют для программирования одно и то же имя файла: file.tsk. Поскольку ISP микроконт роллеров ADUC8XX (загрузчик программы, расположенный в памяти микроконтролле ра) поддерживает загрузку файла в исполняемом формате, то длина файла file.tsk сос тавляет ровно 63 488 байт (62 кБ) — максимальный размер памяти микроконтроллера ADUC847BS625.
! ! Программа программирования файла file.tsk в ADUC8XX. !_ PROGRAM ! ! Определение переменных ! CER string('<07h,0eh,01h,41h,beh>') !Строка с командой ERASE. MER byte,dim(5),over(CER) !Массив для передачи ERASE. C115 string('<07h,0eh,03h,42h,81h,2dh,0dh>') !Строка с командой 115 кбод. M115 byte,dim(7),over(C115) !Массив для передачи 115 кбод. M1 byte,dim(25) !Массив принимаемых байт. S1 string(14),over(M1) !Строка идентификации ADUC. SN string(3) LEND byte !Длина строки данных. NB byte !Количество байт в массиве вывода. L ushort !Длина файла в байтах. LOST byte !Длина остатка L%16 в байтах. D byte,dim(16) !Массив данных для программирования. S0 string(16),over(D) !Строка данных для программирования. SD ushort !Сумма данных. ADR ushort !Двуxбайтный адрес. ADRMAX ushort !Максимальный адрес. M byte,dim(25) !Массив для вывода OUTBYTE. MKS byte,dim(21) !Массив для расчета контрольной суммы. SUM ushort !Сумма байт данных. KSUM byte !Контрольная сумма. N ushort k ushort B byte i ushort Y00h byte(00h) Y01h byte(01h) Y02h byte(02h) Y03h byte(03h) Y04h byte(04h) Y06h byte(06h) Y07h byte(07h) Y12 byte(12) Y47h byte(07h) Y80h byte(80h) Y0fh byte(0fh) BINARY RECORD STR
FILE,PRE(BIN),DRIVER('DOS'),NAME('file.tsk') RECORD string(65500) !Строка с прочитанным файлом
.. !
184
185
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
CODE blank show(20,10,'Вставьте микросхему !!!') show(21,10,'Для выхода нажмиte Ctrl+Break') ! ! Прием информации из ADUC ! do INIT !Инициализация RS232 и микроконтроллера. loop i=1 to 25 do INBYTE . out(3fch,Y01h) blank ! show(2,1,S1) !Вывод на экран принятой информации. SN=sub(S1,5,3) ! ! ! blank if (SN='832') or (SN='834') or (SN='836') | or (SN='845') or (SN='847') or (SN='848') then goto V115KB. if (SN='816') or (SN='824') then goto SH. goto M
V115KB ! ! Установка скорости 115 кбод. ! loop i=1 to 7 M[i]=M115[i] do OUTBYTE !Вывод 7 Б команды 115 кбот. . i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) type('Ошибка...');goto M . ! ! ! Инициализация СОМпорта на 115 кбод. ! out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y01h) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод. out(3f9h,Y00h) ! Установить ст.б. скор.=0. out(3fbh,Y03h) ! DLAB=0,Режим: 8 бит данных,1 стоп,нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h.
186
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ! setcursor (4,1) ! type('Установка 115 кбод..<176> Ok<0dh,0ah>') !220 ! SH
show(4,1,' г==============') show(5,1,' ¦ ADUC '&SN&' ¦')!<0dh,0ah>') show(6,1,' L==============') ! type('<0dh,0ah>') ! ! Стирание памяти микроконтроллера ! loop i=1 to 5 M[i]=MER[i] do OUTBYTE !Вывод 5 Б команды ERASE . i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) type('Ошибка...');goto M . ! type('Стирание памяти..<176> Ok<0dh,0ah>') !220 ! ! ! Открываем файл 'file.tsk' для программирования. ! open(BINARY,00h) L=bytes(BINARY) set(BINARY) next(BINARY) !
!Длина файла в байтах. !Читаем файл !файл BINARY.
type('Чтение файла file.tsk..<178> Ok<0dh,0ah>') T#=clock() setcursor(8,5) type('Программирование файла file.tsk <0dh,0ah>') type(' <0dh,0ah>')
L=L1 ! Т.к. max длина файла = 63488,а ADRMAX=63487(f7ffh). ! ADR=063487(0f7ffh), т.е. всего 63488 байт ! L=163488(1f800h), адрес f800h — это уже адрес ! недоступной памяти с загрузчиком. ! ADRMAX=16*int(L/16) !Целое количество строк по 16 символов в файле. LOST=L%16 !Длина остатка в байтах. LEND=16 !Длина стандартного куска программирования. if L<=16 then LEND=L. ! N=1+int(L/256)
187
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
k=1 setcursor(10,10) type('<176>{16}') setcursor(10,10) ! ! Готовим строку для программирования. !===================================================== loop ADR=0 to ADRMAX by 16 !Начало цикла. !===================================================== if ADR=ADRMAX then LEND=LOST. S0='' S0=sub(BIN:STR,ADR+1,LEND) !Выделяем строку данных — 16 символов. ! NB=LEND+4 !NB=20для целых, NB=LOST+4 для остатка. SD=0 !Вычисляем loop i=1 to LEND !сумму SD=SD+D[i] !данных. . ! START NB 'W' ADRU ADRM ADRL M[1]=07h;M[2]=0eh;M[3]=NB;M[4]=57h;M[5]=0;M[6]=int(ADR/256);M[7]=ADR%256 SUM=M[3]+M[4]+M[6]+M[7]+SD !Сумма байт для расчета контрольной суммы. KSUM=256*(1+int(SUM/256))SUM !Вычисляем контрольную сумму. ! ! Полный массив для вывода ! ! 2b + 1b + 1b+ 1b + 2b + X + 1b =24(при 16) ! START NB 'W' ADRU ADR DATA KS ! 07h 0еh NB 57h 0 Ст.б.Адр. Мл.б.Адр. D[i] Контр.с ! loop i=1+7 to (LEND+7) !Загрузка массива данных для вывода. M[i]=D[i7] . M[LEND+8]=KSUM !Загрузка контрольной суммы для вывода. ! loop i=1 to LEND+8 !Вывод массива do OUTBYTE !в ADUC. ! type (M[i]) ! type(' ') . ! i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) type(' Ошибка...');goto M1 . !type('<177>')
188
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
!============================================== if ADR=N*k*16 then type('<178>');k=k+1. . !Конец цикла. !============================================== loop i=1 to 17k ! type('<178>{5}') type('<178>') . M M1
type(' Ok') type('<0dh,0ah>') type(' ') type('<0dh,0ah>') type('<0dh,0ah>') T#=clock()T# type(' Время программирования = ') type(T#/100) type(' с ') !
beep(0,1500)
goto E WYKL show(23,26,'Для выхода нажми ЕSC') loop until keyboard() ask if keycode()=256 then break. . ! E out(3fch,Y00h) !Сброс микроконтроллера return !############################################# !
!esc
Подпрограммы
! ! П/п инициализации RS232 и микроконтроллера. ! INIT routine ! ! ! Инициализация СОМпорта. ! out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y12) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод. out(3f9h,Y00h) ! Установить ст.б. скор.=0. out(3fbh,Y03h) ! DLAB=0,Режим: 8 бит данных,1 стоп,нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h.
189
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ! ! Инициализация микроконтроллера. ! out(3fch,Y00h) ! RTS=DTR=0: PSEN=1,RST=1 — сброс микроконтроллера. beep (0,30) ! Задержка 0,2 с. in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). out(3fch,Y02h) ! RTS=1,DTR=0: PSEN=0,RST=1 — условия для загрузки. beep (0,30) ! Задержка 0,2 с. in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). out(3fch,Y03h) ! RTS=DTR=1: PSEN=0,RST=0 — загрузкa микроконтроллера. ! ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine loop;in(3fdh,B);if band(B,1)<>0;break.. in(3f8h,M1[i])
!Оже конца прихода байта !(бит "DR"data ready) !Чтение байта данных
! ! П/п вывода байта (байт в M[i] ) ! OUTBYTE routine loop;in(3fdh,B);if band(B,20h)<>0;break.. !Оже готовности передатчика !(transmitter empty). out(3f8h,M[i]) !Вывод байта loop;in(3fdh,B);if band(B,40h)<>0;break.. !Ожe выхода байта из РС(trasmitter !holding register empty.OK to send). !
Файлпроект aduc834c.pr #system auto exe #model xlarge #pragma data(stack_size=>24576,threshold=>4096) #pragma optimize(cpu=>286) #pragma check(stack=>on,index=>on) #pragma link_option(map=>off,case=>on) #compile down834c.cla /check(stack=>off,nil_ptr=>off,index=>off) /debug(vid=>off,line_num=>off) #pragma link(%clapfx%dos.lib) #set exports='down834c' #link down834c
190
Программа ispaduc.clw ! ! Программа программирования микроконтроллера ADUC847/834. ! PROGRAM INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW') ! ! Определение переменных ! p byte T1 long KINI ushort !Количество попыток запуска MSC1210. NAMEMIC string(7) MNAMEMIC byte,dim(7),over(NAMEMIC) SNAKE byte TIND real ! CER string('<07h,0eh,01h,41h,beh>') !Строка с командой ERASE. MER byte,dim(5),over(CER) !Массив для передачи ERASE. C115 string('<07h,0eh,03h,42h,81h,2dh,0dh>') !Строка с командой 115 кбод. M115 byte,dim(7),over(C115) !Массив для передачи 115 кбод. M1 byte,dim(25) !Массив принимаемых байт. S1 string(14),over(M1) !Строка идентификации ADUC. SN string(3) LEND byte !Длина строки данных. NB byte !Количество байт в массиве вывода. L ushort !Длина файла в байтах. LOST byte !Длина остатка L%16 в байтах. D byte,dim(16) !Массив данных для программирования. S0 string(16),over(D) !Строка данных для программирования. SD ushort !Сумма данных. ADR ushort !Двуxбайтный адрес. ADRMAX ushort !Максимальный адрес. M byte,dim(25) !Массив для вывода OUTBYTE. MKS byte,dim(21) !Массив для расчета контрольной суммы. SUM ushort !Сумма байт данных. KSUM byte !Контрольная сумма. N ushort k ushort B byte i ushort !
191
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! ! Переменная для CLACOM ! ComNum short ! ! ! Переменные для частоты и счетчика ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC long DELTAC long ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . ! MAP !######################## ! MODULE('IN.CPP') INP(ULONG),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(unsigned long,BYTE),NAME('_OUTP') END ! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END ! MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END ! !#################### END ! от MAP
192
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Window WINDOW('ISP микроконтроллерра ADUC8XX'),AT(,,176,182),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),| COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX ENTRY(@s7),AT(84,40,38,9),USE(NAMEMIC),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) ENTRY(@n_5b),AT(92,60,25,9),USE(L),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) PROGRESS,USE(SNAKE),AT(20,92,132,12),RANGE(0,16) ENTRY(@n_5.2b),AT(120,120,20,9),USE(TIND),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,0C1FFC1H) BUTTON('Выход'),AT(68,148,40,16),USE(?Cancel),| FONT('Times New Roman',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC), | TIP('Out from programm to Windows'),KEY(EnterKey),DEFAULT STRING('(Enter)'),AT(112,152,18,10),USE(?String7),| FONT(,,COLOR:Black,FONT:regular,CHARSET:ANSI) END WinErr WINDOW('П Р Е Д У П Р Е Ж Д Е Н И Е ! ! !'),AT(,,168,77),| FONT('Times New Roman',10,COLOR:Black,FONT:regular,CHARSET:CYRILLIC), | COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX PROMPT('Компьютер не реагирует на плату !ISP'),AT(20,12,145,11),USE(?Prompt1),| FONT('Times New Roman',11,COLOR:Red,FONT:bold,CHARSET:CYRILLIC) STRING('Проверьте кабель, включите питание,'), !AT(8,28,160,10),USE(?String1),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) STRING('вставьте микроконтроллер в панельку.'),AT(8,40,160,11),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) BUTTON('Выход'),AT(64,60,41,12),USE(?EX),FONT('Tahoma',10,,| FONT:regular,CHARSET:CYRILLIC),KEY(EnterKey), | DEFAULT STRING('(Enter)'),AT(108,64,24,8),USE(?String3) CHECK,AT(0,4,21,20),SKIP,TRN,FLAT,ICON(ICON:Hand) END ! BINARY FILE,DRIVER('DOS'),PRE(BIN),NAME('file.tsk') RECORD RECORD STR string(65500) !Строка с прочитанным файлом. MSTR byte,dim(65500),over(STR) !Массив для передачи. .. CODE
! ! Открытие COMпорта(CLACOM) — Для WIN'XP.
193
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ComNum=0 ! 0COM1,1COM2 SetPort(ComNum) ResetPort(ComNum) ! ! Вычисление временной задержки в 25 мкс. ! loop until QueryPerformanceFrequency(FREQUENCY). !Определение частоты работы счетчика. DC=int(25*FRE:FREQL/1000000) !Вычисление вре мени счета в 25 мкс. ! !######################################################################### ! ! Инициализaция ISP ADUC8XX ! do INITRS ! Инициализация RS232. OPEN(Window) display blank
KINI=1 STAR disable(?Cancel)
show(20,20,'Инициализация микроконтроллера: ! show(145,20,'')
')
INIT do INITADUC ! ! Прием информации из ADUC ! loop i=1 to 25 do INBYTE . ! OUTP(3fch,01h) display B=INP(3f8h)
194
SN=sub(S1,5,3) ! if (SN='832') or (SN='834') or (SN='836') | or (SN='845') or (SN='847') or (SN='848') then goto V115KB. if (SN='816') or (SN='824') then goto SH. goto NINI
V115KB ! ! Установка скорости 115 кбод. ! loop i=1 to 7 M[i]=M115[i] do OUTBYTE !Вывод 7 байт команды 115 кбот. . i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) goto NINI . ! ! ! Инициализация СОМпорта на 115 кбод. ! OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,01h) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,03h) ! DLAB=0,Режим: 8 бит данных,1 стоп,нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! SH NAMEMIC='ADUC' & SN type(' Ok')
! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0").
loop while band(INP(3fdh),1). B=INP(3feh)
type ('|')
display k=1
!Ожидание сброса бита "DR"data ready. !Очистка 3feh для правильного !ожидания стартбита.
!&''
show(20,40,'Микроконтроллер ') display goto PODGOT NINI KINI=KINI+1 if KINI<10
195
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
goto INIT else goto WYKL . !=============================== ! Конец инициализации ISP !===================================
!================================ ! Подготовка к программированию !================================ PODGOT ! ! Стирание памяти микроконтроллера ! loop i=1 to 5 M[i]=MER[i] do OUTBYTE !Вывод 5 байт команды ERASE . i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) goto INIT . !
Sleep(200) display !================================================ ! Конец подготовки !===================== !================================= ! Программирование !================================= ! ! Открываем файл '*.tsk' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. show(20,60,'Длина файла file.tsk show(20,80,'Программирование') display ! ! Включение таймера времени программирования.
196
! T1=clock() ! ADRMAX=16*int(L/16) !Целое количество строк по 16 символов в файле. LOST=L%16 !Длина остатка в байтах. LEND=16 !Длина стандартного куска программирования. if L<=16 then LEND=L. ! N=1+int(L/256) k=1 ! ! ! Этот блок нужен для программирования ! ровно 63488 байт (62 кБ). ! if ADRMAX=63488 ADRMAX=6348816 LOST=16 . !
! ! Готовим строку для программирования. !===================================================== loop ADR=0 to ADRMAX by 16 !Начало цикла. !===================================================== if ADR=ADRMAX then LEND=LOST. ! S0='' ! S0=sub(BIN:STR,ADR+1,LEND) !Оператор sub() не работает при ADR>32768. loop i=1 to LEND !Выделяем строку данных — 16 символов. D[i]=BIN:MSTR[ADR+i] . ! NB=LEND+4 !NB=20для целых, NB=LOST+4 для остатка. SD=0 !Вычисляем loop i=1 to LEND !сумму SD=SD+D[i] !данных. . ! START NB 'W' ADRU ADRM ADRL
байт') M[1]=07h;M[2]=0eh;M[3]=NB;M[4]=57h;M[5]=0;M[6]=int(ADR/256);M[7]=ADR%256 SUM=M[3]+M[4]+M[6]+M[7]+SD !Сумма байт для расчета контрольной суммы. KSUM=256*(1+int(SUM/256))SUM !Вычисляем контрольную сумму.
197
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ! Полный массив для вывода ! ! 2b + 1b + 1b+ 1b + 2b + X + 1b = 24(при 16) ! START NB 'W' ADRU ADR DATA KS ! 07h 0еh NB 57h 0 Ст.б.Адр. Мл.б.Адр. D[i] Контр.с ! loop i=1+7 to (LEND+7) !Загрузка массива данных для вывода. M[i]=D[i7] . M[LEND+8]=KSUM !Загрузка контрольной суммы для вывода. ! loop i=1 to LEND+8 !Вывод массива do OUTBYTE !в ADUC. . ! i=1 do INBYTE !Прием ответа ACK или NAC от ADUC. if (M1[1]=7) OR (M1[1]<>6) goto WYKL . !============================================== if ADR=N*k*16 then SNAKE=SNAKE+1;k=k+1;display. . !Конец цикла. !============================================== loop i=1 to 17k SNAKE=SNAKE+1 . ! display ! M show(155,95,'Ok') T1=clock()T1 !Расчет времени программирования show(20,120,'Время программирования T= TIND=T1/100 ! type(T1/100) ! type(' сек.') ! !============================= ! Конец программирования !============================= !=========================== ! Окончание программирования !===========================
198
с ')
! enable(?Cancel) accept ! case accepted() of ?Cancel p=0 break .! oт case ! .! от accept if p=0 then goto E. !
!============================== ! Ошибочная ситуация !============================== WYKL
close(WINDOW) open (WinErr) accept ! case accepted() of ?EX p=0 break .! oт case ! .! от accept if p=0 then goto E. !=========================== ! Конец ошибочной ситуации !========================== !======================== ! Окончание программы !======================== E close(Window) OUTP(3fch,00h) !Сброс микроконтроллера OUTP(3fbh,7h) ! return !==========================
199
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! ! Подпрограммы ! ! П/п инициализации RS232 и микроконтроллера. ! ! ! Инициализация СОМпорта. ! INITRS routine ! OUTP(3fch,00h) !Контрольный сброс микроконтроллера. OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,12) ! Установить мл.б. скор.:1115200,257600,129600 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! INITADUC routine OUTP(3fch,00h) !Контрольный сброс микроконтроллера. Sleep(200) !Задержка 0,2 с. B=INP(3f8h) !Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). OUTP(3fch,02h) !RTS=1,DTR=0: PSEN=0,RST=1 — условия для загрузки. Sleep(200) !Задержка 0,2 с. B=INP(3f8h) !Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). B=INP(3f8h) !Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). OUTP(3fch,03h) ! RTS=1,DTR=1: PSEN=0,RST=0 — загрузкa. ! ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine ! loop 60000 times if (band(INP(3fdh),1)) !Ожидание конца прихода байта(бит "DR"data ready). M1[i]=INP(3f8h) !Чтение байта данных. break . . ! ! ! П/п вывода байта (байт в M[i]) ! OUTBYTE routine loop until band(INP(3fdh),20h).
200
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
!Ожидание готовности передатчика (transmitter empty). OUTP(3f8h,M[i]) !Вывод байта. loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС !trasmitter holding register empty(OK to send). !
! DEL25 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC then break. ! DC(=25 мкс.) . ! !
Файлпроект ispaduc.prj Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off) #pragma optimize(cpu=>386) #pragma define(NULL=>on) #compile "ISPADUC.clw" #compile "in.cpp" #compile "out.cpp" #pragma link("C%V%DOS%X%%L%.LIB") #pragma link("ISPADUC.lib") #pragma link("clacom32.lib") #pragma link("WindowsShell.Manifest") #link "ISPADUC.exe"
Программа aduc834c.cla выводит информацию на экран в процессе программирования микроконтроллера ADUC847(рис. 2.6.3.1,а) и после его окончания (рис. 2.6.3.1,б) . Также приведен вид окна программы Ispaduc.clw в процессе программирования микро контроллера ADUC847 (рис. 2.6.3.2,а) и после его окончания (рис. 2.6.3.2,б).
201
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.3.1. Вид экранов при программировании микроконтроллера ADUC847
Рис. 2.6.3.2. Окончание
а)
б)
2.6.4.
2.6.4.1. Предварительные замечания
б)
Как видно из сравнения времени программирования одного и того же файла — file.tsk, длина которого составляет ровно 63 488 байт (62 кБ), обе программы показывают примерно одно и то же время (около 22 с), причем программа в Win'XP ничуть не уступает по быстродействию програм ме DOS, а даже опережает ее на 1 с. Скорость программирования микроконтроллера ADUC847 можно подсчитать, разделив 63 488 байт на 22 с. Она составит около 2,83 кБ/с. Рис. 2.6.3.2. Общий вид окон при программировании микроконтроллера ADUC847 программой Ispaduc.clw в процессе (а) и при окончании (б) программирования
а)
202
Программирование микроконтроллеров P89LPC9XX в режиме ISP по интерфейсу RS232 и в режиме ICP по интерфейсу C2
Микроконтроллеры P89LPC9XX допускают два режима программирования в системе. Пер вый режим, который осуществляется по интерфейсу RS232, уже defacto называют InSystem Programming (ISP), т. е. «программирование в системе». Второй режим, который осуществляется по интерфейсу C2, также является режимом программирования в системе, но только по друго му интерфейсу. Для того чтобы не путать эти два режима между собой, разработчики микроко нтроллеров P89LPC9XX назвали этот режим InCircuitProgramming (ICP), т. е. программирова ние в схеме. Режим программирования по интерфейсу C2 имеют некоторые микроконтроллеры ф. Silicon Laboratories (например C8051F330D). Режим программирования ICP допускают практически все микроконтроллеры P89LPC9XX (исключение — микроконтроллер P89LPC932), а вот режим программирования ISP — только часть их. Причем микроконтроллеры, допускающие режим ISP, имеют также и режим ICP. Это относится к микроконтроллерам P89LPC92X и P89LPC93X — наиболее сложным и «крупнога баритным» микроконтроллерам из всего семейства микроконтроллеров P89LPC9XX. Микро контроллеры P89LPC90X называют «маленькими» (у них всего 8 выводов). Эти микроконтрол леры допускают только режим программирования ICP. В настоящий момент (на конец 2005 г.) наиболее новыми являются: микроконтрол лер P89LPC938 из микроконтроллеров P89LPC93X и микроконтроллер P89LPC904 из микроконтроллеров P89LPC90X. В связи с этим именно эти 2 микроконтроллера (P89LPC938 и P89LPC904) были выбраны в качестве «подопытных кроликов», для того чтобы проверить на них режимы программирования ISP и ICP. Микроконтроллер P89LPC938 допускает два режима программирования: ISP и ICP, a микроконтроллер P89LPC904 — только режим ICP.
203
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
По своим скоростным характеристикам 2тактные микроконтроллеры P89LPC9XX (при ис пользовании внутреннего тактового генератора в 7 372 800 Гц) ближе всего стоят к 4такт ным микроконтроллерам MSC12XX, если последние работают от внешнего кварцевого резо натора в 11 059 200 Гц. В книге будут приведены программы для программирования микроконтроллеров P89LPC9XX как в режиме ISP, так и в режиме ICP.
2.6.4.2. Применение промежуточного микроконтроллера для осуществления режима ICP Как уже было упомянуто, микроконтроллер P89LPC938 допускает два режима програм мирования: ISP и ICP. Режим ISP наиболее удобный режим для компьютера, поскольку осу ществляется по интерфейсу RS232. Режим ICP не допускает прямого интерфейса с компью тером, поэтому для того, чтобы обеспечить режим ICP, между компьютером и микроконтрол лером, для которого необходим режим ICP, требуется установить еще один микроконтрол лер, который должен быть сопряжен с компьютером по интерфейсу RS232, а с микроконт роллером с режимом ICP — по интерфейсу C2. Таким «промежуточным» микроконтроллером может быть, например, микроконтроллер P89LPC938, поскольку он имеет режим ISP по RS232. Но это необязательно. В качестве промежуточного микроконтроллера может ис пользоваться, например, микроконтроллер MSC1210, поскольку он также имеет режим ISP по интерфейсу RS232 и, кроме того, как уже упоминалось, по скоростным характеристикам приближается к микроконтроллерам P89LPC9XX. Для использования такого промежуточно го микроконтроллера (назовем его ведущим) в качестве «программатора» другого микро контроллера (назовем его ведомым) в режиме ICP ведущий микроконтроллер должен быть запрограммирован таким образом (или, другими словами, содержать такую программу), чтобы принять по интерфейсу RS232 файл с программой для ведомого микроконтроллера и запрограммировать этот файл в ведомый микроконтроллер. При этом программа ведущего микроконтроллера должна обеспечить программирование файла в ведомый микроконтрол лер по интерфейсу C2 в соответствии со спецификацией программирования ведомого мик роконтроллера в режиме ICP. Кроме того, для передачи самого файла программы для ведо мого микроконтроллера в ведущий (и для некоторых других целей) в компьютере должна быть установлена программа (написанная для него), которая осуществляет связь компьюте ра с ведущим микроконтроллером по интерфейсу RS232. При программировании ведомого микроконтроллера ведущим последний должен еще передать в компьютер некоторые пара метры ведомого микроконтроллера (в частности, например, его марку, значение некоторых его регистров и т. п.). Поэтому программа для компьютера должна принять эту информацию и отразить, например, на мониторе. Кроме того, программа для компьютера должна быть составлена таким образом, чтобы она «не знала», какой микроконтроллер используется в качестве ведомого (в данном случае — P89LPC938 или MSC1210). Для этого схема иници ализации (логическая) у этих микроконтроллеров должна быть идентичной. Это означает, что принципиальные схемы сопряжения этих двух микроконтроллеров с компьютером по интерфейсу RS232 должны быть составлены так, чтобы обеспечить эту логическую идентич ность. Этот факт уже учтен при составлении принципиальных схем сопряжения микроконт роллеров MSC12XX (рис. 1.3.5.1) и P89LPC9XX (рис. 1.3.8.1 – 1.3.8.3) с компьютером по ин терфейсу RS232. Таким образом, дальнейшее изложение материала по программированию микроконтрол леров P89LPC9XX в режиме ISP и ICP будет построено следующим образом.
204
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Вначале будет приведены две программы для компьютера (для DOS и Windows), которые осуществляют программирование микроконтроллера P89LPC938 в режиме ISP, далее — две программы, написанные на Си, для ведущих микроконтроллеров, осуществляющих програм мирование ведомых микроконтроллеров (P89LPC938 и P89LPC904). Первая программа будет предназначена для микроконтроллера MSC1210, вторая — для микроконтроллера P89LPC938. И, наконец, будут приведены две программы для компьютера (для DOS и Windows), осущес твляющие связь и обслуживание ведущего микроконтроллера (MSC1210 или P89LPC938), ко торый, в свою очередь, программирует ведомые микроконтроллеры (P89LPC938 или P89LPC904) в режиме ICP. Другими словами, эти две программы для компьютера предназначе ны для программирования микроконтроллеров P89LPC938 и P89LPC904 в режиме ICP.
2.6.4.3. Программирование микроконтроллеров P89LPC93X в режиме ISP Для программирования микроконтроллеров P89LPC93X в режиме ISP по интерфейсу RS232 должна использоваться схема сопряжения этого семейства микроконтроллеров с компьютером, (рис. 1.3.8.1). Далее приведены тексты двух программ для программирования микроконтроллера P89LPC93X в режиме ISP по интерфейсу RS232. Первая программа LPC932A1.CLA написана на языке Кларион для DOS (Clarion v.3.100) и работает либо в DOS, либо в режиме эмуляции DOS — в Win'98 и Win'XP. Файлпроект — LPC932A1.PR. Программа использует графический интерфейс пользователя (Graphic User Interface — GUI–3), благодаря чему на экране появляется (цветное) окно (как и в любой про грамме на Windows), a также поддерживается работа с мышью. Вторая программа isp938.clw написана на языке Кларион для Windows (Clarion6.0). Она работает в ОС Win'98 и Win'XP. Файлпроект — isp938.prj. Обе программы работают с портом COM1 на скорости 115 200 бод. Они используют для программирования одно и то же имя файла: file.hex. Программа LPC932A1.CLA ! ! Программа программирования файла file.hex в P89LPC938 ! PROGRAM MAP INCLUDE('GUI.INC') . UCFG1OUT NAME NAMEO NAMEOUT ELEMENT TIME FNAME
string(3) string(5) string('P89LPC') string(11) STRING('<176>'),DIM(40) real!(1000) string('file.hex')
205
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
SINIT SOUT NSTROK SCREEN
206
string(12)!Строка инициализации P89LPC938. string(15) ushort(0) ! Количество строк в *.hexфайле SCREEN(18,45),PRE(SCR),CENTER,GRAPHIC,CUA,COLOR(53) ROW(1,1) PAINT(2,45),COLOR(55) ROW(1,2) PAINT(1,43),COLOR(112) ROW(2,2) PAINT(1,43),COLOR(48) ROW(3,1) PAINT(16,1),COLOR(55) ROW(3,2) PAINT(15,4),COLOR(48) ROW(3,39) PAINT(4,6),COLOR(48) ROW(3,45) PAINT(16,1),COLOR(55) ROW(4,6) PAINT(11,18),COLOR(48) ROW(4,35) PAINT(4,4),COLOR(48) ROW(6,33) PAINT(1,2),COLOR(48) ROW(7,27) PAINT(1,6),COLOR(48) ROW(7,39) PAINT(1,5),COLOR(48) ROW(8,40) PAINT(10,5),COLOR(48) ROW(10,24) PAINT(5,7),COLOR(48) ROW(10,36) PAINT(2,4),COLOR(48) ROW(12,31) PAINT(6,6),COLOR(48) ROW(14,37) PAINT(4,3),COLOR(48) ROW(15,6) PAINT(3,14),COLOR(48) ROW(15,26) PAINT(3,5),COLOR(48) ROW(16,35) PAINT(1,1),COLOR(49) ROW(17,20) PAINT(1,6),COLOR(48) ROW(18,2) PAINT(1,43),COLOR(55) ROW(1,7) STRING('ISP микроконтроллера P89LPC93X'), COLOR(112) ROW(3,6) STRING('Инициализация:'),COLOR(48) ROW(5,6) STRING('Микроконтроллер:'),COLOR(48) ROW(7,6) STRING('Длина файла'),COLOR(48) COL(33) STRING('строк'),COLOR(48) ROW(9,6) STRING('Загрузка файла:'),COLOR(48) ROW(11,6) STRING('Время программирования Т='), COLOR(48) COL(37) STRING('сек.'),COLOR(48) ROW(13,6) STRING('Конфигурационный регистр UCFG1='), COLOR(48) ROW(16,28) STRING('(Enter)'),COLOR(49) ROW(7,29) ENTRY(@n_3b),USE(NSTROK),COLOR(112,112,120) ROW(3,24) ENTRY(@s8),USE(SOUT),COLOR(112,112,120) ROW(13,37) ENTRY(@s3),USE(UCFG1OUT),COLOR(112,112,120) ROW(11,31) ENTRY(@n_5.2b),USE(TIME),COLOR(112,112,120) ROW(7,19) ENTRY(@s8),USE(FNAME),SKIP,COLOR(48,48,120) ROW(5,24) ENTRY(@s11),USE(NAMEOUT),COLOR(112,7,120) ROW(16,20) BUTTON(' Ok '),KEY(257),| USE(?Cancel),REQ,COLOR(112,112,135,112,112) ROW(9,24) ENTRY(@s1),USE(ELEMENT[1]),COLOR(244,7,120) COL(25) ENTRY(@s1),USE(ELEMENT[2]),COLOR(244,7,120) COL(26) ENTRY(@s1),USE(ELEMENT[3]),COLOR(244,7,120)
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
COL(27) COL(28) COL(29) COL(30) COL(31) COL(32) COL(33) COL(34) COL(35) COL(36) COL(37) COL(38) COL(39)
ENTRY(@s1),USE(ELEMENT[4]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[5]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[6]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[7]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[8]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[9]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[10]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[11]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[12]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[13]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[14]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[15]),COLOR(244,7,120) ENTRY(@s1),USE(ELEMENT[16]),COLOR(244,7,120)
. SCREEN1
SCREEN(14,45),PRE(SCR1),CENTER,GRAPHIC,CUA,COLOR(53) ROW(1,1) PAINT(14,45),COLOR(116) ROW(1,2) PAINT(1,43),COLOR(78) ROW(2,2) PAINT(12,43),COLOR(112) ROW(3,4) PAINT(1,7),COLOR(126) ROW(3,11) PAINT(1,33),COLOR(117) ROW(4,43) PAINT(3,1),COLOR(113) ROW(6,4) PAINT(1,39),COLOR(113) ROW(1,7) STRING('П р е д у п р е ж д е н и е !!!'),COLOR(78) ROW(4,4) STRING('Компьютер не получает информации с'),COLOR(113) ROW(5,4) STRING('платы ISP, либо эта информация ошибочна.'),COLOR(113) ROW(7,4) STRING('Проверьте, вставлен ли микроконтроллер,'),COLOR(112) ROW(8,4) STRING('подключен ли кабель связи с компьютером,'),COLOR(112) ROW(9,14) STRING('включено ли питание.'),COLOR(112) ROW(12,20) BUTTON(' Ok '),KEY(257),USE(?Ok),COLOR(30,30,24,30,30) . ! ! Определение переменных ! M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для вывода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. ! ! CDEVID string(':0100000311EB<0dh,0Ah>') ! Строка с командой Device ID. MDEVID byte,dim(15),over(CDEVID) !Массив для передачи Device ID. CDERID string(':0100000312EA<0dh,0Ah>') ! Строка с командой Derivative ID. MDERID byte,dim(15),over(CDERID) !Массив для передачи Derivative ID. CMANID string(':0100000310EC<0dh,0Ah>') ! Строка с командой Manufacturer ID. MMANID byte,dim(15),over(CMANID) !Массив для передачи Manufacturer ID.
207
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
CVERID string(':00000001FF<0dh,0Ah>') ! Строка с командой Manufacturer ID. MVERID byte,dim(13),over(CVERID) !Массив для передачи Manufacturer ID. ! ! Строки и массивы для стирания секторов 00000006 ! CER0 string(':03000004010000F8<0Dh,0Ah>') !Строка с комй ERASE sector 0000 MER0 byte,dim(19),over(CER0) !Массив // CER1 string(':03000004010001F7<0Dh,0Ah>') !Строка с комй ERASE sector 0001 MER1 byte,dim(19),over(CER1) !Массив // CER2 string(':03000004010002F6<0Dh,0Ah>') !Строка с комй ERASE sector 0002 MER2 byte,dim(19),over(CER2) !Массив // CER3 string(':03000004010003F5<0Dh,0Ah>') !Строка с комй ERASE sector 0003 MER3 byte,dim(19),over(CER3) !Массив // CER4 string(':03000004010004F4<0Dh,0Ah>') !Строка с комй ERASE sector 0004 MER4 byte,dim(19),over(CER4) !Массив // CER5 string(':03000004010005F3<0Dh,0Ah>') !Строка с комй ERASE sector 0005 MER5 byte,dim(19),over(CER5) !Массив // CER6 string(':03000004010006F2<0Dh,0Ah>') !Строка с комй ERASE sector 0006 MER6 byte,dim(19),over(CER6) !Массив // ! ! Строка и массив с НУЛЕВЫМ statusbate'ом ! CSB0 string(':020000020300F9<0Dh,0Ah>') !Строка с комй 0й statusbyte. MSB0 byte,dim(17),over(CSB0) !Массив //. ! ! Строка и массив с UCFG1=63h ! CSUCFG1 string(':02000002006399<0Dh,0Ah>') !Строка с UCFG1=63h. !CSUCFG1 string(':020000020023D9<0Dh,0Ah>') !Строка с UCFG1=23h. !CSUCFG1 string(':020000020043B9<0Dh,0Ah>') !Строка с UCFG1=43h. MSUCFG1 byte,dim(17),over(CSUCFG1) !Массив //. ! ! Строка и массив с Direct Load of Baud Rate(DLBR). ! Для скорости 115200BRGR1=00h,BRGR0=30h, ! // 57600BRGR1=00h,BRGR0=70h, ! // 38400BRGR1=00h,BRGR0=B0h, ! // 19200BRGR1=01h,BRGR0=70h, ! // 9600BRGR1=02h,BRGR0=F0h, ! Вначале принимается BRGR1, затем BRGR0, ! после этого НА СТАРОЙ СКОРОСТИ выводится символ '.', ! затем скорость переключается на новую. ! CSBRG string(':020000070030C7<0Dh,0Ah>') !Строка с комй DLBR=115200. !CSBRG string(':0200000702F005<0Dh,0Ah>') !Строка с комй DLBR=9600. MSBRG byte,dim(17),over(CSBRG) !Массив //. !
208
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
L N NS NOST NSYMB NP NP1 k k1 KL B i j i1 T1 KINI
ulong ! Длина файла в байтах. ushort ushort(0) ushort ! Остаток ushort ! Количество символов . ushort(0) ! Количество точек в символе . ushort ushort ushort ushort byte ushort ulong ulong ulong ushort !Количество попыток запуска P89LPC938.
Y00h Y01h Y02h Y03h Y04h Y06h Y07h Y12 Y24 Y48 Y47h Y80h Y0fh
byte(00h) byte(01h) byte(02h) byte(03h) byte(04h) byte(06h) byte(07h) byte(12) byte(24) byte(48) byte(47h) byte(80h) byte(0fh)
BINARY RECORD !STR MSTR
FILE,PRE(BIN),DRIVER('DOS'),NAME('file.hex') RECORD string(65500) !Строка с прочитанным файлом byte,dim(65500)!,over(STR) !Массив для передачи.
.. ! CODE SINIT='.' SOUT=SINIT KINI=1 setgraphic(89) !87 LOADGUI setcolor(17) blank setcolor loadsymbols setmouse(10,15) open(SCREEN)
209
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
DISPLAY DISABLE(?Cancel) ! do INITRS !Инициализация RS232 компьютера. INIT do INITLPC display SINIT=SINIT & '.' SOUT='Ждите...' display i=1 M[i]=55h do OUTBYTE do INBYTE do DEL10MS M[i]=55h do OUTBYTE do INBYTE if M1[i]<>55h KINI=KINI+1 if KINI<11 do DEL10MS goto INIT else goto WYK . . ! do DEL10MS S1='' S=CMANID loop i=1 to 15 do OUTBYTE . loop i=1 to 2 do INBYTE .
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
do OUTBYTE . loop i=1 to 2 do INBYTE . if S1<>'DD' then goto WYK. do DEL20MS S1='' S=CDERID loop i=1 to 15 do OUTBYTE . loop i=1 to 2 do INBYTE . setcursor(16,1) if S1='09' NAME='931' goto SNAME . if S1='0A' NAME='933' goto SNAME . if S1='1D' NAME='934' goto SNAME . if S1='1E' NAME='935' goto SNAME . if S1='1F' NAME='932A1' goto SNAME . if S1='25' NAME='938' goto SNAME .
if S1<>'15' then goto WYK. goto WYK do DEL20MS SNAME S1='' S=CDEVID loop i=1 to 15
210
SOUT= ' Ok' NAMEOUT=NAMEO & NAME
211
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
do DEL20MS
S1='' S=CVERID loop i=1 to 13 do OUTBYTE . loop i=1 to 4!5 do INBYTE . STIR ! ! Стирание секторов 00000006 ! do DEL20MS
!
setcursor(9,5) type('Стирание секторов 06')
S1='' S=CER0 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! do DEL20MS S1='' S=CER1 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! S1='' S=CER2 loop i=1 to 19 do OUTBYTE . loop i=1 to 5
212
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
do INBYTE . i=2 ! S1='' S=CER3 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! S1='' S=CER4 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! S1='' S=CER5 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! ! 7й сектор стирать нельзя!!! ! Там программа ISP!!! S1='' S=CER6 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 ! MOK !
213
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! Программирование скорости 115200 бод ! в микроконтроллере. ! S1='' S=CSBRG loop i=1 to 17 do OUTBYTE . ! setcursor(10,5) ! type('Скорость обмена 115200 бод ') i=1 do INBYTE do DEL20MS ! ! Программирование скорости 115200 бод ! в компьютере. ! out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y01h) ! Установить мл.б. скор.:Y01h115200 бод,Y129600 бод. out(3f9h,Y00h) ! Установить ст.б. скор.=0. out(3fbh,Y07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h. ! do DEL20MS ! type('Ok') ! do DEL1S ! ! Открываем файл '*.hex' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. setcursor(12,5) ! ! Подсчитываем количество строк в файле (по 0dh). ! NSTROK=0 loop i1=1 to L if BIN:MSTR[i1]=0dh then NSTROK=NSTROK+1. !Количество строк(.) . close(BINARY) ! NP=int(NSTROK/16) !Целое количество точек в символое . NOST=NSTROKNP*16 !Остаток if NP<=1 then NP=1.
214
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! in(3f8h,B) !Холостой ввод ! Open(BINARY,00H) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) empty(BINARY) ! На всякий случай. set(BINARY) next(BINARY) ! ! Включение таймера времени программирования. ! T1=clock() ! ! ! Закраска «змеи» серым цветом ! ! setcursor(14,10) ! type('<176>{16}') ! setcursor(14,10) ! k1=0 !Количество точек NP1=NP NSYMB=0 !Количество напечатанных символов . !============================================== ! Загрузка программы !============================================== loop i1=1 to L !Начало цикла i=1 M[i]=BIN:MSTR[i1] do OUTBYTE
WWW
if BIN:MSTR[i1]=0dh NS=NS+1 do INBYTE do INBYTE if NS=NSTROK and M1[i]=30h then goto WWW. if M1[i]<>2eh then goto WYKL. k1=k1+1 if k1=NP1 DISPLAY!(ELEMENT[NSYMB+1]) ELEMENT[NSYMB+1]='<219>' DISPLAY!(ELEMENT[NSYMB+1]) NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else
215
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
NP1=NP1+NP+NOST . . . .!ot loop
Конец цикла. ELEMENT[NSYMB+1]='<219>' display !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком размере файла. ! if NSYMB<16 I#=NSYMB+1 loop (16NSYMB) times ! I#=I# DISPLAY!(ELEMENT[I#]) ELEMENT[I#]='<219>' DISPLAY!(ELEMENT[I#]) I#=I#+1
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
loop i=1 to 2 do INBYTE . i=2 display ! ENABLE(?Cancel) loop accept case field() of ?Cancel DISPLAY close(SCREEN) goto E .!case .!loop
! . . ELEMENT[I#+1]='<219>' display ! M
WYK close(SCREEN) blank open(SCREEN1) DISPLAY
! T1=clock()T1 !Расчет времени программирования TIME=T1/100.0
! S1='' S=CSB0 loop i=1 to 17 do OUTBYTE . loop i=1 to 2 do INBYTE . i=2 ! S1='' S=CSUCFG1 loop i=1 to 17 do OUTBYTE . UCFG1OUT='63h'
216
ENABLE(?Ok) loop accept case field() of ?Ok DISPLAY close(SCREEN1) goto E .!case .!loop goto E WYKL show(23,26,'Для выхода нажмите ЕSC') loop until keyboard() ask if keycode()=256 then break. .
!esc
!
217
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
E out(3fch,Y02h) do DEL100 out(3fch,Y00h)
!###############
!DTR=0,RTS=1(RST=0,Vdd=3)Остановка микроконтроллера. !Выключение питания. return Подпрограммы
#############
! ! П/п инициализации RS232 ! ! ! Инициализация СОМпорта компьютера. ! INITRS routine ! out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y12) ! Установить мл.б. скор.:Y01h115200;Y129600;Y244800 бод. out(3f9h,Y00h) ! Установить ст.б. скор.=0. out(3fbh,Y07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! INITLPC routine ! !###################################### out(3fch,Y02h) !DTR=0,RTS=1(RST=0,Vdd=0)нормальный Reset микроконтроллера. do DEL100MS in(3f8h,B)
! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0").
out(3fch,Y00h) do DEL100
!DTR=0,RTS=0(RST=0,Vdd=3)Включение питания.
out(3fch,Y01h) do DEL15 out(3fch,Y00h) do DEL15
!DTR=1,RTS=0(RST=1,Vdd=3)1й импульс
out(3fch,Y01h) do DEL15 out(3fch,Y00h) do DEL15
!DTR=1,RTS=0(RST=1,Vdd=3)2й импульс
out(3fch,Y01h)
!DTR=1,RTS=0(RST=1,Vdd=3)3й импульс
218
!DTR=0,RTS=0(RST=0,Vdd=3)RST
!DTR=0,RTS=0(RST=0,Vdd=3)RST
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
do DEL15 out(3fch,Y00h) do DEL15
!DTR=0,RTS=0(RST=0,Vdd=3)RST
out(3fch,Y01h) !DTR=1,RTS=0(RST=1,Vdd=3)Запуск do DEL100 !###################################### ! ! П/п вывода байта (байт в M[i] ) ! OUTBYTE routine loop;in(3fdh,B);if band(B,20h)<>0;break.. !Оже готовности передатчика (transmitter empty). out(3f8h,M[i]) !Вывод байта loop;in(3fdh,B);if band(B,40h)<>0;break.. !Ожe выхода байта из РС(trasmitter holding register empty.OK to send). !
! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine j=0 INS1 in(3fdh,B) if band(B,1)<>0 then in(3f8h,M1[i]); goto RET0. j=j+1 if j<>100000 then goto INS1. RET0 ! ! П/п временных задержек ! DEL100MS routine T#=CLOCK();loop while CLOCK()T#<10. !Задержка 0.1 сек. DEL20MS routine T#=CLOCK();loop while CLOCK()T#<2.!Задержка 20 мс. DEL1400 routine loop 1400 times . DEL10 routine loop 10000 times !10 мкс . DEL15 routine loop 15000 times !15 мкс . DEL50 routine loop 54000 times !50 мкс . DEL100 routine
219
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
loop 2 times do DEL50 . ! DEL50MS routine T#=CLOCK();loop while CLOCK()T#<5. DEL150MS routine T#=CLOCK();loop while CLOCK()T#<15. DEL200MS routine T#=CLOCK();loop while CLOCK()T#<20. DEL1S routine T#=CLOCK();loop while CLOCK()T#<100. DEL3S routine T#=CLOCK();loop while CLOCK()T#<300. DEL10MS routine beep(0,5) DEL2MS routine beep(0,1) !################
конец подпрограмм
!Задержка 0,05 с. !Задержка 0,15 с. !Задержка 0,2 с. !Задержка 1 с. !Задержка 3 с. !Задержка 10 мс. !Задержка 2 мс.
#################
Файлпроект LPC932A1.PR #system auto exe #model extended #pragma data(stack_size=>24576,threshold=>4096) #pragma check(stack=>on,index=>on) #pragma link_option(map=>off,case=>on) #compile lpc932a1.cla /check(stack=>off,nil_ptr=>off,index=>off) !/debug(vid=>off,line_num=>off) #pragma link(%clapfx%dos.lib) #pragma link(%clapfx%xgui.obj) #set exports='lpc932a1' #link lpc932a1
Программа isp938.clw ! ! ISP микроконтроллера P89LPC93X. ! PROGRAM INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW')
220
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ! Определение переменных ! p byte L ulong !Длина файла в байтах. !LARR byte,dim(2),over(L) !2 байта (мл. и ст. L) M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для выода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. ! N ushort NSTROK ushort(0) ! Количество строк в *.hexфайле NS ushort(0) ! Переменная для NSTROK. NOST ushort ! Остаток NSYMB ushort ! Количество символов . NP ushort(0) ! Количество точек в символе . NP1 ushort k ushort k1 ushort KL ushort B byte i ushort j ushort i1 ulong T1 long KINI ushort !Количество попыток запуска LPC938. NAMEMIC string(9) NAME string(5) j1 byte SNAKE byte TIND real q ulong !
! CDEVID string(':0100000311EB<0dh,0Ah>') ! Строка с командой Device ID. MDEVID byte,dim(15),over(CDEVID) !Массив для передачи Device ID. CDERID string(':0100000312EA<0dh,0Ah>') ! Строка с командой Derivative ID. MDERID byte,dim(15),over(CDERID) !Массив для передачи Derivative ID. CMANID string(':0100000310EC<0dh,0Ah>') ! Строка с командой Manufacturer ID. MMANID byte,dim(15),over(CMANID) !Массив для передачи Manufacturer ID. CVERID string(':00000001FF<0dh,0Ah>') ! Строка с командой Manufacturer ID. MVERID byte,dim(13),over(CVERID) !Массив для передачи Manufacturer ID. ! ! Строки и массивы для стирания секторов 00000006
221
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! CER0 string(':03000004010000F8<0Dh,0Ah>') !Строка с комй ERASE sector 0000 MER0 byte,dim(19),over(CER0) !Массив // CER1 string(':03000004010001F7<0Dh,0Ah>') !Строка с комй ERASE sector 0001 MER1 byte,dim(19),over(CER1) !Массив // CER2 string(':03000004010002F6<0Dh,0Ah>') !Строка с комй ERASE sector 0002 MER2 byte,dim(19),over(CER2) !Массив // CER3 string(':03000004010003F5<0Dh,0Ah>') !Строка с комй ERASE sector 0003 MER3 byte,dim(19),over(CER3) !Массив // CER4 string(':03000004010004F4<0Dh,0Ah>') !Строка с комй ERASE sector 0004 MER4 byte,dim(19),over(CER4) !Массив // CER5 string(':03000004010005F3<0Dh,0Ah>') !Строка с комй ERASE sector 0005 MER5 byte,dim(19),over(CER5) !Массив // CER6 string(':03000004010006F2<0Dh,0Ah>') !Строка с комй ERASE sector 0006 MER6 byte,dim(19),over(CER6) !Массив // ! ! Строка и массив с НУЛЕВЫМ statusbyte'ом ! CSB0 string(':020000020300F9<0Dh,0Ah>') !Строка с комй 0й statusbyte. MSB0 byte,dim(17),over(CSB0) !Массив //. ! ! Строка и массив с UCFG1=63h ! CSUCFG1 string(':02000002006399<0Dh,0Ah>') !Строка с UCFG1=63h. !CSUCFG1 string(':020000020023D9<0Dh,0Ah>') !Строка с UCFG1=23h. !CSUCFG1 string(':020000020043B9<0Dh,0Ah>') !Строка с UCFG1=43h. MSUCFG1 byte,dim(17),over(CSUCFG1) !Массив //. UCFG1 string('63h') ! ! Строка и массив с Direct Load of Baud Rate(DLBR). ! Для скорости 115200BRGR1=00h,BRGR0=30h, ! // 57600BRGR1=00h,BRGR0=70h, ! // 38400BRGR1=00h,BRGR0=B0h, ! // 19200BRGR1=01h,BRGR0=70h, ! // 9600BRGR1=02h,BRGR0=F0h, ! Вначале принимается BRGR1, затем BRGR0, ! после этого НА СТАРОЙ СКОРОСТИ выводится символ '.', ! затем скорость переключается на новую. ! CSBRG string(':020000070030C7<0Dh,0Ah>') !Строка с комй DLBR=115200. !CSBRG string(':0200000702F005<0Dh,0Ah>') !Строка с комй DLBR=9600. MSBRG byte,dim(17),over(CSBRG) !Массив //. ! ! ! Переменная для CLACOM ! ComNum short !
222
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! ! Переменные для частоты и счетчика ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC15 long DC100 long DELTAC long ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG . ! MAP !######################## ! MODULE('IN.CPP') INP(ULONG),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(unsigned long,BYTE),NAME('_OUTP') END ! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END ! MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END ! !#################### END ! от MAP
Window WINDOW('ISP микроконтроллерра P89LPC93X'),AT(,,232,189),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC), |
223
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX ENTRY(@s10),AT(84,40,62,9),USE(NAMEMIC),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) ENTRY(@n_5b),AT(92,60,25,9),USE(L),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) PROGRESS,USE(SNAKE),AT(20,92,132,12),RANGE(0,16) ENTRY(@n_5.2b),AT(120,120,20,9),USE(TIND),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,0C1FFC1H) STRING('UCFG1='),AT(60,136,28,9),USE(?String2) ENTRY(@s3),AT(88,136,19,9),USE(UCFG1),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,0C1FFC1H) BUTTON('Выход'),AT(64,160,44,16),USE(?Cancel),| FONT('Times New Roman',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC), | TIP('Out from programm to Windows'),KEY(EnterKey),DEFAULT STRING('(Enter)'),AT(115,163,29,12),USE(?String3) END WinErr WINDOW('П Р Е Д У П Р Е Ж Д Е Н И Е ! ! !'),AT(,,168,77),| FONT('Times New Roman',10,COLOR:Black,FONT:regular,CHARSET:CYRILLIC), | COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX PROMPT('Компьютер не реагирует на плату ISP'), !AT(20,12,145,11),USE(?Prompt1),| FONT('Times New Roman',11,COLOR:Red,FONT:bold,CHARSET:CYRILLIC) STRING('Проверьте кабель, включите питание,'), !AT(8,28,160,10),USE(?String1),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) STRING('вставьте микроконтроллер в панельку.'),AT(8,40,160,11),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) BUTTON('Выход'),AT(64,56,42,13),USE(?EX),| FONT('Tahoma',10,,FONT:regular,CHARSET:CYRILLIC),DEFAULT CHECK,AT(0,4,21,20),SKIP,TRN,FLAT,ICON(ICON:Hand) END ! BINARY FILE,DRIVER('DOS'),PRE(BIN),NAME('file.hex') RECORD RECORD !STR string(65500) !Строка с прочитанным файлом. MSTR byte,dim(65500)!,over(STR) !Массив для передачи. .. !
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
SetPort(ComNum) ResetPort(ComNum) ! ! Вычисление временных задержек. ! loop until QueryPerformanceFrequency(FREQUENCY). !Опре частоты счетчика. DC15=int(15*FRE:FREQL/1000000) !Выче времени счета в 15 мкс. DC100=int(100*FRE:FREQL/1000000) !Выче времени счета в 100 мкс. ! ! Инициализaция P89LPC93X ! do INITRS ! Инициализация RS232. OPEN(Window) display blank KINI=1 STAR disable(?Cancel) show(20,20,'Инициализация микроконтроллера: ') ! show(145,20,'') INIT do INITLPC display B=INP(3f8h) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). loop while band(INP(3fdh),1). !Ожидание сброса бита "DR"data ready. B=INP(3feh) !Очистка 3feh для правильного ожидания стартбита. type ('|') display k=1 i=1 M[i]=55h do OUTBYTE do INBYTE sleep(10) M[i]=55h do OUTBYTE do INBYTE
CODE ! ! Открытие COMпорта(CLACOM) — Для WIN'XP. ! ComNum=0 ! 0COM1,1COM2
224
if M1[i]<>55h KINI=KINI+1 if KINI<11 Sleep(10) goto INIT
225
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
else goto WYKL . . type('Ok') ! ! Определение марки микроконтроллера ! Sleep(10) S1='' S=CMANID loop i=1 to 15 do OUTBYTE . loop i=1 to 2 do INBYTE . if S1<>'15' then goto WYKL. Sleep(20) S1='' S=CDEVID loop i=1 to 15 do OUTBYTE . loop i=1 to 2 do INBYTE . if S1<>'DD' then goto WYKL. Sleep(20) S1='' S=CDERID loop i=1 to 15 do OUTBYTE . loop i=1 to 2 do INBYTE . if S1='09' NAME='931' goto SNAME . if S1='0A' NAME='933' goto SNAME . if S1='1D' NAME='934'
226
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
goto SNAME . if S1='1E' NAME='935' goto SNAME . if S1='1F' NAME='932A1' goto SNAME . if S1='25' NAME='938' goto SNAME . goto WYKL SNAME show(20,40,'Микроконтроллер ') NAMEMIC='P89LPC'&NAME display ! ! Подготовка к программированию ! ! ! Стирание секторов 00000005 ! Sleep(20) S1='' S=CER0 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto WYKL. ! Sleep(20) S1='' S=CER1 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2
227
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if chr(M1[i])<>'.' then goto ! S1='' S=CER2 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto ! S1='' S=CER3 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto ! S1='' S=CER4 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto ! S1='' S=CER5 loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto ! ! 7й сектор стирать нельзя!!! ! Там программа ISP!!! S1='' S=CER6
228
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
WYKL.
loop i=1 to 19 do OUTBYTE . loop i=1 to 5 do INBYTE . ! i=2 ! type (chr(M1[i])) ! ! type('Ok')
WYKL.
MOK
WYKL.
WYKL.
WYKL.
! ! Программирование скорости 115200 бод ! в микроконтроллере. ! S1='' S=CSBRG loop i=1 to 17 do OUTBYTE . i=1 do INBYTE if chr(M1[i])<>'.' then goto WYKL. Sleep(20) ! ! Программирование скорости 115200 бод ! в компьютере. ! OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,1) ! Установить мл.б. скорости:1115200, 129600, 244800 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! Sleep(20) display
PROG ! ! Открываем файл '*.hex' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. show(20,60,'Длина файла file.hex
байт')
229
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
show(20,80,'Программирование') display ! ! Подсчитываем количество строк в файле (по 0dh). ! NSTROK=0 loop i1=1 to L if BIN:MSTR[i1]=0dh then NSTROK=NSTROK+1. !Количество строк(.) . close(BINARY) ! NP=int(NSTROK/16) !Целое количество точек в символое . NOST=NSTROKNP*16 !Остаток if NP<=1 then NP=1. ! B=INP(3f8h) !Холостой ввод ! Open(BINARY,00H) L=bytes(BINARY) ! Длина файла в байтах. set(BINARY) empty(BINARY) ! На всякий случай. set(BINARY) next(BINARY) ! !PROG ! ! Включение таймера времени программирования. ! T1=clock() ! ! ! Закраска «змеи» ! display ! k1=0 !Количество точек NP1=NP NSYMB=0 !Количество напечатанных символов . ! !============================================== ! Загрузка программы !============================================== loop i1=1 to L !Начало цикла i=1 M[i]=BIN:MSTR[i1] do OUTBYTE if BIN:MSTR[i1]=0dh !loop j=1 to 20 !do INBYTE
230
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
!if M1[i]=2eh then break. do INBYTE do INBYTE NS=NS+1 if NS=NSTROK and M1[i]=30h then goto WWW. if M1[i]<>2eh then NS=0; | show(20,107,'Ошибка! Повтор программирования. Ждите...');goto PROG.!WYKL. ! if j=20 then goto PROG. WWW k1=k1+1 if k1=NP1 SNAKE=SNAKE+1 ! type('#') display NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else NP1=NP1+NP+NOST . . .! от if BIN:.... .!от loop Конец цикла. !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком размере файла. ! if NSYMB<16 loop (16NSYMB) times SNAKE=SNAKE+1!type('#') . . display ! M
show(155,95,'Ok')
T1=clock()T1 !Расчет времени программирования show(20,120,'Время программирования T= TIND=T1/100 ! ! Запись 0го statusbyte. ! S1='' S=CSB0 loop i=1 to 17 do OUTBYTE . loop i=1 to 5 do INBYTE
с ')
231
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
. i=2 if chr(M1[i])<>'.' then goto WYKL. ! if (M1[i])<> val('.') then goto WYKL. ! !Запись конфигурационного !регистра UCFG1=63h. ! S1='' S=CSUCFG1 loop i=1 to 17 do OUTBYTE . loop i=1 to 5 do INBYTE . i=2 if chr(M1[i])<>'.' then goto WYKL. ! !OKNO ! ! enable(?Ok) enable(?Cancel) p=1 accept ! case accepted() of ?Cancel p=0 break .! oт case ! .! от accept if p=0 then goto E. ! WYKL
close(WINDOW) open (WinErr) accept ! case accepted() of ?EX p=0 break .! oт case ! .! от accept if p=0 then goto E. !################################################
232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
E
close(Window) OUTP(3fch,00h) !Сброс микроконтроллера OUTP(3fbh,7h) return ! RE return
! ! Подпрограммы ! ! П/п инициализации RS232 и микроконтроллера. ! ! ! Инициализация СОМпорта. ! INITRS routine ! OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,24) ! Установить мл.б. скорости: 129600, 244800 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! INITLPC routine OUTP(3fch,02h) !DTR=0,RTS=1(RST=0,Vdd=0)нормальный Reset микроконтроллера. Sleep(100) !Задержка 100 мсек. B=INP(3f8h) !Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). OUTP(3fch,00h) do DEL100
!DTR=0,RTS=0(RST=0,Vdd=3)Включение питания.
OUTP(3fch,01h) do DEL15 OUTP(3fch,00h) do DEL15
!DTR=1,RTS=0(RST=1,Vdd=3)1й импульс
OUTP(3fch,01h) do DEL15 OUTP(3fch,00h) do DEL15
!DTR=1,RTS=0(RST=1,Vdd=3)2й импульс
OUTP(3fch,01h)
!DTR=1,RTS=0(RST=1,Vdd=3)3й импульс
!DTR=0,RTS=0(RST=0,Vdd=3)RST
!DTR=0,RTS=0(RST=0,Vdd=3)RST
233
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
do DEL15 OUTP(3fch,00h) do DEL15 OUTP(3fch,01h) do DEL100
!DTR=0,RTS=0(RST=0,Vdd=3)RST
!DTR=0,RTS=0(RST=1,Vdd=3)Запуск
! ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine loop 400000 times if band(INP(3fdh),1) then M1[i]=INP(3f8h);break. !Ожидание конца прихода байта(установки бита "DR"data ready). . ! ! ! П/п вывода байта (байт в M[i]) ! OUTBYTE routine loop until band(INP(3fdh),20h). !Оже гти передатчика (transmitter empty). OUTP(3f8h,M[i]) !Вывод байта. loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС !trasmitter holding register empty(OK to send). ! ! DEL15 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC15 then break. ! DC(=15 мкс) . ! ! DEL100 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop !
234
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
loop until QueryPerformanceCounter(COUNTER). ! Ожидание if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия else ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1 ! времени . ! if DELTAC>DC100 then break. ! DC(=100 мкс) . ! !
Файлпроект isp938.prj Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off) #pragma optimize(cpu=>386) #pragma define(NULL=>on) #compile "isp938.clw" #compile "in.cpp" #compile "out.cpp" #pragma link("C%V%DOS%X%%L%.LIB") #pragma link("isp938.lib") #pragma link("clacom32.lib") #pragma link("WindowsShell.Manifest") #link "isp938.exe"
На рис. 2.6.4.3.1 показан общий вид окна, которое выводит на экран программа LPC932A1.CLA при программировании микроконтроллера P89LPC938. Окно показано после окончания программирования. На рис. 2.6.4.3.2 показан результат работы программы isp938.clw. Рис. 2.6.4.3.1. Общий вид окна программы LPC932A1.CLA (DOS)
235
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
4) программа ICPlpcTI.clw для компьютера, написанная на Кларионе для Windows (Clarion v.6.0) и работающая в Win'98/XP, и ее файлпроект ICPlpcTI.prj. Рис. 2.6.4.3.2. Общий вид окна программы isp938.clw (Win'XP)
Все 4 программы используют новый алгоритм обмена компьютера с микроконтроллером, раз работанный автором и приведенный в 2.4. Приведены также общие виды окон, на которые выводится информация, отражающая ре зультаты работы программ для компьютера.
Программа B938_9XX.C
Как видно из сравнения времен программирования одного и того же файла (file.hex), программы имеют примерно одну и ту же скорость работы и программируют этот файл за время чуть более 2,6 с. Необходимо отметить, что если перевести этот файл в *.binформат (например программой hex2bin), то он будет иметь размер 5917 байт (т. е.около 6 кБ). Разделив 5917 байт на 2,64 с, получим 2,24 кБ/с — с такой скоростью идет программи рование микроконтроллера P89LPC938 в режиме ISP. Сравнив эту скорость программиро вания со скоростью программирования микроконтроллера MSC1210 (2,9 кБ/с — рис. 2.6.2.2) и микроконтроллера ADUC847 (2,83 кБ/с — рис. 2.6.3.2), можно заметить, что скорость программирования микроконтроллера P89LPC938 немного меньше соответствующих ско ростей программирования микроконтролеров MSC1210 и ADUC847.
2.6.4.4. Программирование микроконтроллеров P89LPC9XX в режиме ICP Для программирования микроконтроллеров P89LPC938 и P89LPC904 используются схе мы, показанные на рис. 1.3.8.1–1.3.8.3, а также 1.3.5.1. Далее приведены следующие прог раммы, предназначенные для программирования микроконтроллеров P89LPC938 и P89LPC904 в режиме ICP и программы для компьютеров: 1) программа B938_9XX.C, написанная на Си, для микроконтроллера P89LPC938, рабо тающего в качестве ведущего микроконтроллера; 2) программа BMSC_9XX.C, написанная на Си, для микроконтроллера MSC1210, работа ющего в качестве ведущего микроконтроллера; 3) программа PROGLPC.CLA для компьютера, написанная на Кларионе для DOS (Clarion v.3.100) и работающая в DOS или в Win'98/XP в режиме эмуляции DOS, и ее файл проект proglpc.pr;
236
// // Программа на P89LPC938 для программирования P89LPC938/904(ICP). // скорость обмена 115200 бод, генератор внутренний 7372800 Гц. // #include "stdarg.h" #include "stdio.h" #include "stdlib.h" #include "intrins.h" //#include "reg1210.h" #include "reg935.h" // // Определение переменных // // // Для MSC1210 // // sbit VDD = P1^0; // sbit RST = P1^1; // sbit PDA = P1^2; // sbit PCL = P1^3; // // //Для P89LPC938 // sbit VDD = P0^3; sbit RSTLPC = P0^2;// RST у LPC904 уже есть. sbit PDA = P0^4; sbit PCL = P0^5; // bdata unsigned char BYTEIO; sbit BITIO=BYTEIO^0; // // Совмещение "u.adr" с "u.bt.adrl" и "u.bt.adrh". // Переменные u.adr (размерностью ushort) и // u.bt.adrl и u.bt.adrh (обе размерностью byte(unsigned char))
237
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
// перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных adrh(первая) и adrl(вторая) // в структуре (struct) строго определен, и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short adr; // Длина строки("u.adr"). struct{ unsigned char adrh; // Ст.байт длины строки("u.bt.adrh"). unsigned char adrl; // Мл.байт длины строки("u.bt.adrl"). }bt; }u; // unsigned char c,program_byte,i,imax,ost,ID,NPAGE,B_V,err; unsigned short j,temp_L; // // Команды ICP // #define WR_FMDATA_I 0x04 #define RD_FMDATA_I 0x05 #define WR_FMADRL 0x08 #define RD_FMADRL 0x09 #define WR_FMADRH 0x0a #define RD_FMADRH 0x0b #define WR_FMDATA 0x0c #define RD_FMDATA 0x0d #define WR_FMCON 0x0e #define RD_FMCON 0x0f #define WR_FMDATA_PG 0x14 #define RD_FMDATA_PG 0x15 #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define
238
LOAD 0x00 PROG 0x48 ERS_G 0x72 ERS_S 0x71 ERS_P 0x70 CONF 0x6c CRC_G 0x1a CRC_S 0x19 EP 0x68 UCFG1 0x00 UCFG2 0x01 BOOT_VECTOR 0x02 STATUS_BYTE 0x03 SEC0 0x08 SEC1 0x09 SEC2 0x0a SEC3 0x0b SEC4 0x0c SEC5 0x0d
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
#define SEC6 0x0e #define SEC7 0x0f #define MFGID 0x10 #define ID1 0x11 #define ID2 0x12 // // П/п задержек. // void DEL10(void) { unsigned char i; for (i=0;i<10;i++); //20P89LPC938,10MSC1210. } void DEL50(void) { unsigned char i; for (i=0;i<100;i++); //100LPC938,50MSC1210. } void DEL1MS(void) { unsigned int j; for (j=0;j<6000;j++); //6000LPC938,3000MSC1210. } // // П/п работы RS232 // // // Для MSC1210 // //void initrs(void) { // SCON=0xec; // T2CON=0x34; // RCAP2=3; //Vобм.=115200 бод. // THL2=3; // // RCAP2=36; //Vобм.=9600 бод. // // THL2=36; // } // // // Для P89LPC938 // void initrs(void) { SSTAT=0x00; P1M1=0x02; P1M2=0x01; SCON=0x40; BRGCON=0x00; BRGR0=0x30; BRGR1=0x00; BRGCON=0x03;
//Стандартный 51совместимый RS232. //¦Вместе это означает: ¦ //¦TxDpush/pull_output, RxDinput.¦ //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный бит=1. // Обязательно обнулить BRGCON!!! //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]= //7372800/[(0*256+48)+16]=7372800/64=115200. //Разрешение SBRGS и BRGEN.
239
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
} // void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения (от компьютера). SBUF=byte; // Вывод байта. while (!RXD);// Ожидание запрета (байт принят компьютером). while (!TI); // Ожидание окончания передачи микроконтроллером. TI = 0; // Сброс флага передачи TI. } // unsigned char inbyte() { unsigned char byte; TXD=0; // Установка разрешения компьютеру передавать байт. while (RXD); // Ожидание стартбита. DEL10(); // Задержка длительностью полбайта (115200 бод). TXD=1; // Запрет компьютеру передавать байт. while(!RI); // Ожидание окончания прихода байта в микроконтроллeр. byte=SBUF; // Ввод байта в микроконтроллер. RI = 0; // Сброс флага приема байта (RI). return(byte); } // // П/п ввода/вывода байта в P89LPC9XX // void OUTBLPC(unsigned char OUTB) { unsigned char j; BYTEIO=OUTB; for (j=0;j<8;j++){ PDA=BITIO; PCL=0; DEL50();//Не менее 50(MSC1210)!!! PCL=1; DEL10(); BYTEIO=_cror_(BYTEIO,1); } } // unsigned char INBLPC(){ unsigned char j; for (j=0;j<8;j++){ PCL=0; DEL10(); BITIO=PDA; BYTEIO=_cror_(BYTEIO,1); PCL=1; DEL10(); } return(BYTEIO); } //
240
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
// П/п полной загрузки pageрегистра принимаемыми // 16(904) или 64(938) байтами. // void load_page(void) { unsigned char i0; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(LOAD); OUTBLPC(WR_FMADRL); OUTBLPC(0x00); OUTBLPC(WR_FMDATA_PG); for(i0=0;i0
//16904,64938.
} // // П/п частичной загрузки pageрегистра // принимаемыми (ost) байтами. // void load_page_ost(void) { unsigned char i1; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210 //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(LOAD); OUTBLPC(WR_FMADRL); OUTBLPC(0x00); //Стартовый адрес в странице. OUTBLPC(WR_FMDATA_PG); for(i1=0;i1
241
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
//P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMADRL); OUTBLPC(u.bt.adrl); //Мл.б. адреса начала страницы(page). OUTBLPC(WR_FMADRH); OUTBLPC(u.bt.adrh); //Ст.б. адреса начала страницы(page). OUTBLPC(WR_FMCON); OUTBLPC(PROG); do { //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // Стирание сектора. // void erase_sector(unsigned char SECTOR) { unsigned char read_data = 0; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMADRH); OUTBLPC(SECTOR); //0000h03ffhНулевой сектор. //00hст.б.начала сектора, //03ffhст.б.конца сектора. OUTBLPC(WR_FMCON); OUTBLPC(ERS_S); do { //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(RD_FMCON);
242
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
//P1DDRL=0x75; P0M1=0xd3; P0M2=0x2c;
//На ввод MSC1210. //На ввод //P89LPC938.
read_data=INBLPC(); } while(read_data & 0x80); } // // Глобальное стирание всей памяти // void erase_global(void) { unsigned char read_data = 0; char index,dummy; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(ERS_G); // for (index=0;index<50;index++) //Чтение около 5 мс. { //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(RD_FMDATA_I); //P1DDRL=0x75; P0M1=0xd3; P0M2=0x2c;
//На ввод MSC1210. //На ввод //P89LPC938.
dummy=INBLPC(); } // do { //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//Холостое //чтение. //Завершение //На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(RD_FMCON); //P1DDRL=0x75; P0M1=0xd3; P0M2=0x2c;
//глобального
//На ввод MSC1210. //На ввод //P89LPC938.
243
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
read_data=INBLPC(); } while(read_data & 0x80); // стирания. } //Конец п/п стирания. // // Запись конфигурации в микроконтроллер: // UCFG1,BOOT_VECTOR и STATUS_BYTE. // // // Запись UCFG1 // void write_UCFG1(void) { unsigned char read_data = 0; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(UCFG1); OUTBLPC(WR_FMDATA); OUTBLPC(0x63); //UCFG1=63h. do { //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // // Запись BOOT_VECTOR // void write_BOOT_VECTOR(void) { unsigned char read_data = 0; //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF);
244
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
OUTBLPC(WR_FMADRL); OUTBLPC(BOOT_VECTOR); OUTBLPC(WR_FMDATA); OUTBLPC(B_V); //BOOT_VECTOR=0x1f938(8k),0x03904(1k),0x0f(4k). do { //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // // Запись STATUS_BYTE // void write_STATUS_BYTE(void) { unsigned char read_data = 0; //P1DDRL=0x55; P0M1=0xc3; P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(STATUS_BYTE); OUTBLPC(WR_FMDATA); OUTBLPC(0x00); //Статусбайт=0, чтобы программа пошла //сразу после запуска (RST=1). do { //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // Ввод P89LPC904/938 в ICPрежим //
245
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
void initlpc(void){ unsigned char j; PDA=PCL=RSTLPC=0; VDD=1; DEL1MS(); VDD=0; //Включение питания. DEL1MS(); for (j=0;j<7;j++) //Подача { RSTLPC=1; DEL10(); //7 импульсов RSTLPC=0; DEL10(); } //на RESET. RSTLPC=1; DEL10(); } // /**************************************************/ void main(void) { initrs(); // err=1; // // Инициализация MSC1210. // // P3DDRL=0x07; // P1DDRL=0x55; // CKCON = 0x03; // MOVX=12 cycle stretch(1 мкс). // // // Инициализация P89LPC938. // RST(P0.2),Vdd(P0.3),PCL(P0.5)push/pull, // PDA(P0.4)input. // P0M1=0xd3; P0M2=0x2c; // REN=0; // Запрет приема байта. initlpc();// Ввод P89LPC9xx в ICPрежим. // // Вывод в компьютер 4 байтов конфигурации: // ID2,UCFG1,BOOT_VECTOR и STATUS_BYTE. // //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON);
246
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(ID2); OUTBLPC(RD_FMDATA); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер ID2. DEL10(); ID=c; //Запоминание ID2 в ID. // //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(UCFG1); OUTBLPC(RD_FMDATA); //P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер UCFG1. DEL10(); // //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(BOOT_VECTOR); OUTBLPC(RD_FMDATA); //P1DDRL=0x75; //На ввод. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер BOOT_VECTOR. DEL10(); // //P1DDRL=0x55; //На вывод MSC1210. P0M1=0xc3; //На вывод P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(STATUS_BYTE); OUTBLPC(RD_FMDATA);
247
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
//P1DDRL=0x75; //На ввод MSC1210. P0M1=0xd3; //На ввод P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер STATUS_BYTE. DEL10(); // if (ID==0x21 || ID==0x0D || ID==0x0f || ID==0x10) { //904,901,902,903 // // Глобальное стирание // erase_global(); NPAGE=16; //Количество байт в странице=16. B_V=0x03; //BOOT_VECTOR=03h err=0; } if (ID==0x25 || ID==0x1f || ID==0x0a || ID==0x1d || ID==0x1e) { //938,932,933,934,935 // erase_sector(0x00); //Стирание 0го сектора. erase_sector(0x04); //Стирание 1го сектора. erase_sector(0x08); //Стирание 2го сектора. erase_sector(0x0c); //Стирание 3го сектора. erase_sector(0x10); //Стирание 4го сектора. erase_sector(0x14); //Стирание 5го сектора. erase_sector(0x18); //Стирание 6го сектора. // erase sector(0x1c); //Если стереть 7й сектор, //то сотрется программа ISP !!! // NPAGE=64; // Количество байт в странице=64. B_V=0x1f; //BOOT_VECTOR=1eh err=0; } if (err==1) { goto E; } // // Прием всех байт программы и программирование // микроконтроллера // REN=1; //Разрешение приема байта. u.bt.adrl=inbyte(); u.bt.adrh=inbyte(); temp_L=u.adr;
248
//Прием мл.байта длины программы. //Прием ст.байта длины программы. //Запоминание длины программы //в переменной temp_L. //Переменная u.adrдлина программы(ushort)
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
//заполняется автоматически после //заполнения переменных //u.bt.adrl и u.bt.adrh. // ost=temp_L%NPAGE;//64; //16904,64938 temp_L=u.adrost; if(temp_L){ for(u.adr=0;u.adr
Программа BMSC_9XX.C // // Программа на MSC1210 для программирования P89LPC938/904(ICP). // скорость обмена 115200 бод, генератор внешний 11059200 Гц. // #include "stdarg.h" #include "stdio.h" #include "stdlib.h" #include "intrins.h" #include "reg1210.h" //#include "reg935.h" // // Определение переменных
249
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
// // // Для MSC1210 // sbit VDD = P1^0; sbit RST = P1^1; sbit PDA = P1^2; sbit PCL = P1^3; // // //Для P89LPC938 // // sbit VDD = P0^3; // sbit RSTLPC = P0^2;// RST у LPC904 уже есть. // sbit PDA = P0^4; // sbit PCL = P0^5; // bdata unsigned char BYTEIO; sbit BITIO=BYTEIO^0; // // Совмещение "u.adr" с "u.bt.adrl" и "u.bt.adrh". // Переменные u.adr (размерностью ushort) и // u.bt.adrl и u.bt.adrh (обе размерностью byte(unsigned char)) // перераспределяют одно и то же место в памяти микроконтроллера. // Порядок расположения переменных adrh(первая) и adrl(вторая) // в структуре (struct) строго определен, и при его нарушении // вся конструкция совмещения не работает !!! // union{ unsigned short adr; // Длина строки("u.adr"). struct{ unsigned char adrh; // Ст.байт длины строки("u.bt.adrh"). unsigned char adrl; // Мл.байт длины строки("u.bt.adrl"). }bt; }u; // unsigned char c,program_byte,i,imax,ost,ID,NPAGE,B_V,err; unsigned short j,temp_L; // // Команды ICP // #define WR_FMDATA_I 0x04 #define RD_FMDATA_I 0x05 #define WR_FMADRL 0x08 #define RD_FMADRL 0x09 #define WR_FMADRH 0x0a
250
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
#define #define #define #define #define #define #define
RD_FMADRH 0x0b WR_FMDATA 0x0c RD_FMDATA 0x0d WR_FMCON 0x0e RD_FMCON 0x0f WR_FMDATA_PG 0x14 RD_FMDATA_PG 0x15
#define LOAD 0x00 #define PROG 0x48 #define ERS_G 0x72 #define ERS_S 0x71 #define ERS_P 0x70 #define CONF 0x6c #define CRC_G 0x1a #define CRC_S 0x19 #define EP 0x68 #define UCFG1 0x00 #define UCFG2 0x01 #define BOOT_VECTOR 0x02 #define STATUS_BYTE 0x03 #define SEC0 0x08 #define SEC1 0x09 #define SEC2 0x0a #define SEC3 0x0b #define SEC4 0x0c #define SEC5 0x0d #define SEC6 0x0e #define SEC7 0x0f #define MFGID 0x10 #define ID1 0x11 #define ID2 0x12 // // П/п задержек. // void DEL10(void) { unsigned char i; for (i=0;i<10;i++); //20P89LPC938,10MSC1210. } void DEL50(void) { unsigned char i; for (i=0;i<50;i++); //100LPC938,50MSC1210. } void DEL1MS(void) { unsigned int j; for (j=0;j<3000;j++); //6000LPC938,3000MSC1210. } // // П/п работы RS232 //
251
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
// // Для MSC1210 // void initrs(void) { SCON=0xec; T2CON=0x34; RCAP2=3; //Vобм.=115200 бод. THL2=3; // RCAP2=36; //Vобм.=9600 бод. // THL2=36; } // // // Для P89LPC938 // //void initrs(void) { // SSTAT=0x00; //Стандартный 51совместимый RS232. // P1M1=0x02; //¦Вместе это означает: ¦ // P1M2=0x01; //¦TxDpush/pull_output, RxDinput.¦ // SCON=0x40; //RI=TI=RB8=TB8=REN=SM2=SM0/FE=0, SM1=1:единственный бит=1. // BRGCON=0x00; // Обязательно обнулить BRGCON!!! // BRGR0=0x30; //0x30=48. Vobm=CCLK/[(BRG1*256+BRG0)+16]= // BRGR1=0x00; //7372800/[(0*256+48)+16]=7372800/64=115200. // BRGCON=0x03; //Разрешение SBRGS и BRGEN. // } // void outbyte(unsigned char byte) { while (RXD); // Ожидание разрешения (от компьютера). SBUF=byte; // Вывод байта. while (!RXD);// Ожидание запрета (байт принят компьютером). while (!TI); // Ожидание окончания передачи микроконтроллером. TI = 0; // Сброс флага передачи TI. } // unsigned char inbyte() { unsigned char byte; TXD=0; // Установка разрешения компьютеру передавать байт. while (RXD); // Ожидание стартбита. DEL10(); // Задержка длительностью полбайта (115200 бод). TXD=1; // Запрет компьютеру передавать байт. while(!RI); // Ожидание окончания прихода байта в микроконтроллeр. byte=SBUF; // Ввод байта в микроконтроллер. RI = 0; // Сброс флага приема байта (RI). return(byte); } // // П/п ввода/вывода байта в P89LPC9XX //
252
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
void OUTBLPC(unsigned char OUTB) { unsigned char j; BYTEIO=OUTB; for (j=0;j<8;j++){ PDA=BITIO; PCL=0; DEL50();//Не менее 50(MSC1210)!!! PCL=1; DEL10(); BYTEIO=_cror_(BYTEIO,1); } } // unsigned char INBLPC(){ unsigned char j; for (j=0;j<8;j++){ PCL=0; DEL10(); BITIO=PDA; BYTEIO=_cror_(BYTEIO,1); PCL=1; DEL10(); } return(BYTEIO); } // // П/п полной загрузки pageрегистра принимаемыми // 16 (904) или 64 (938) байтами. // void load_page(void) { unsigned char i0; P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(LOAD); OUTBLPC(WR_FMADRL); OUTBLPC(0x00); OUTBLPC(WR_FMDATA_PG); for(i0=0;i0
253
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
unsigned char i1; P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//На вывод MSC1210 //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(LOAD); OUTBLPC(WR_FMADRL); OUTBLPC(0x00); //Стартовый адрес в странице. OUTBLPC(WR_FMDATA_PG); for(i1=0;i1
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMADRL); OUTBLPC(u.bt.adrl); //Мл.б. адреса начала страницы(page). OUTBLPC(WR_FMADRH); OUTBLPC(u.bt.adrh); //Ст.б. адреса начала страницы(page). OUTBLPC(WR_FMCON); OUTBLPC(PROG); do { P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
read_data=INBLPC(); }
254
while(read_data & 0x80); } // // Стирание сектора. // void erase_sector(unsigned char SECTOR) { unsigned char read_data = 0; P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//На ввод MSC1210. //На ввод //P89LPC938.
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMADRH); OUTBLPC(SECTOR); //0000h03ffhНулевой сектор. //00hст.б.начала сектора, //03ffhст.б.конца сектора. OUTBLPC(WR_FMCON); OUTBLPC(ERS_S); do { P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(RD_FMCON); P1DDRL=0x75; //P0M1=0xd3; //P0M2=0x2c;
//На ввод MSC1210. //На ввод //P89LPC938.
read_data=INBLPC(); } while(read_data & 0x80); } // // Глобальное стирание всей памяти // void erase_global(void) { unsigned char read_data = 0; char index,dummy; P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
OUTBLPC(RD_FMCON); P1DDRL=0x75; //P0M1=0xd3; //P0M2=0x2c;
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(ERS_G); // for (index=0;index<50;index++) //Чтение около 5 мс. {
255
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//На вывод MSC1210. //На вывод //P89LPC938.
OUTBLPC(RD_FMDATA_I); P1DDRL=0x75; //P0M1=0xd3; //P0M2=0x2c;
//На ввод MSC1210. //На ввод //P89LPC938.
dummy=INBLPC(); } // do { P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c;
//Холостое //чтение.
//На вывод MSC1210. //На вывод //P89LPC938. //глобального //На ввод MSC1210. //На ввод //P89LPC938.
read_data=INBLPC(); } while(read_data & 0x80); // стирания. } //Конец п/п стирания. // // Запись конфигурации в микроконтроллер: // UCFG1,BOOT_VECTOR и STATUS_BYTE. // // // Запись UCFG1 // void write_UCFG1(void) { unsigned char read_data = 0; P1DDRL=0x55; //P0M1=0xc3; //P0M2=0x3c; OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(UCFG1); OUTBLPC(WR_FMDATA);
256
OUTBLPC(0x63); //UCFG1=63h. do { P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } //
//Завершение
OUTBLPC(RD_FMCON); P1DDRL=0x75; //P0M1=0xd3; //P0M2=0x2c;
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
//На вывод MSC1210. //На вывод //P89LPC938.
// // Запись BOOT_VECTOR // void write_BOOT_VECTOR(void) { unsigned char read_data = 0; P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(BOOT_VECTOR); OUTBLPC(WR_FMDATA); OUTBLPC(B_V); //BOOT_VECTOR=0x1f938(8k),0x03904(1k),0x0f(4k). do { P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // // Запись STATUS_BYTE // void write_STATUS_BYTE(void) { unsigned char read_data = 0; P1DDRL=0x55;
//На вывод MSC1210.
257
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
//P0M1=0xc3; //P0M2=0x3c;
//На вывод //P89LPC938.
OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(STATUS_BYTE); OUTBLPC(WR_FMDATA); OUTBLPC(0x00); //Статусбайт=0, чтобы программа пошла //сразу после запуска (RST=1). do { P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(RD_FMCON); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. read_data=INBLPC(); } while(read_data & 0x80); } // // Ввод P89LPC904/938 в ICPрежим // void initlpc(void){ unsigned char j; PDA=PCL=RST=0; //RSTLPCдля 938 VDD=1; DEL1MS(); VDD=0; //Включение питания. DEL1MS(); for (j=0;j<7;j++) //Подача { RST=1; //RSTLPCдля 938 DEL10(); //7 импульсов RST=0; //RSTLPCдля 938 DEL10(); } //на RESET. RST=1; //RSTLPCдля 938 DEL10(); } // /**************************************************/ void main(void) { initrs(); // err=1; // // Инициализация MSC1210.
258
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
// P3DDRL=0x07; P1DDRL=0x55; CKCON = 0x03; // MOVX=12 cycle stretch(1 мкс). // // // Инициализация P89LPC938. // RST(P0.2),Vdd(P0.3),PCL(P0.5)push/pull, // PDA(P0.4)input. // // P0M1=0xd3; // P0M2=0x2c; // REN=0; // Запрет приема байта. initlpc();// Ввод P89LPC9xx в ICPрежим. // // Вывод в компьютер 4 байтов конфигурации: // ID2,UCFG1,BOOT_VECTOR и STATUS_BYTE. // P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(ID2); OUTBLPC(RD_FMDATA); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер ID2. DEL10(); ID=c; //Запоминание ID2 в ID. // P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(UCFG1); OUTBLPC(RD_FMDATA); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер UCFG1.
259
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
DEL10(); // P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(BOOT_VECTOR); OUTBLPC(RD_FMDATA); P1DDRL=0x75; //На ввод. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер BOOT_VECTOR. DEL10(); // P1DDRL=0x55; //На вывод MSC1210. //P0M1=0xc3; //На вывод //P0M2=0x3c; //P89LPC938. OUTBLPC(WR_FMCON); OUTBLPC(CONF); OUTBLPC(WR_FMADRL); OUTBLPC(STATUS_BYTE); OUTBLPC(RD_FMDATA); P1DDRL=0x75; //На ввод MSC1210. //P0M1=0xd3; //На ввод //P0M2=0x2c; //P89LPC938. c=INBLPC(); outbyte(c); //Вывод в компьютер STATUS_BYTE. DEL10(); // if (ID==0x21 || ID==0x0D || ID==0x0f || ID==0x10) { //904,901,902,903 // // Глобальное стирание // erase_global(); NPAGE=16; //Количество байт в странице=16. B_V=0x03; //BOOT_VECTOR=03h err=0; } if (ID==0x25 || ID==0x1f || ID==0x0a || ID==0x1d || ID==0x1e) { //938,932,933,934,935 // erase_sector(0x00); //Стирание 0го сектора. erase_sector(0x04); //Стирание 1го сектора. erase_sector(0x08); //Стирание 2го сектора. erase_sector(0x0c); //Стирание 3го сектора. erase_sector(0x10); //Стирание 4го сектора.
260
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
erase_sector(0x14); erase_sector(0x18); // erase sector(0x1c);
//Стирание 5го сектора. //Стирание 6го сектора. //Если стереть 7й сектор, //то сотрется программа ISP !!! // NPAGE=64; // Количество байт в странице=64. B_V=0x1f; //BOOT_VECTOR=1eh err=0; } if (err==1) { goto E; } // // Прием всех байт программы и программирование // микроконтроллера // REN=1; //Разрешение приема байта. u.bt.adrl=inbyte(); u.bt.adrh=inbyte(); temp_L=u.adr;
//Прием мл.байта длины программы. //Прием ст.байта длины программы. //Запоминание длины программы //в переменной temp_L. //Переменная u.adrдлина программы(ushort) //заполняется автоматически после //заполнения переменных //u.bt.adrl и u.bt.adrh. // ost=temp_L%NPAGE;//64; //16904,64938 temp_L=u.adrost; if(temp_L){ for(u.adr=0;u.adr
261
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
// окончания программирования ("@"). // REN=0; outbyte(0x40); // E: goto E;
Программа PROGLPC.CLA ! ! Программа программирования (ICP) файла file.tsk в ! P89LPC938/904 с помощью микроконтроллера MSC1210 и P89LPC938. ! PROGRAM ! ! Определение переменных ! M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для вывода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. ! ! Переменные для П/п ByteToHex. ! INB byte !Входной байт (byte). OUT string(2) !Выходная строка (hex). MOUT string(1),dim(2),over(OUT) HEX STRING(16) MHEX string(1),dim(16),over(HEX) HexDigitsLow STRING('0123456789abcdef') HexDigitsHi STRING('0123456789ABCDEF') ! ! Переменные конфигурации ! UCFG1 string(3) BOOT_VECTOR string(3) STATUS_BYTE string(3) ID2 string(3) SNAME string(3) NAME string(9) ! L ushort ! Длина файла в байтах. LBT byte,dim(2),over(L) !LBT[1]мл.б.,LBT[2]ст.б. N ushort NSTROK ushort(0) ! Количество строк в *.hexфайле NOST ushort ! Остаток
262
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
NSYMB NP NP1 k k1 KL B i j i1 T1
ushort ! Количество символов . ushort(0) ! Количество точек в символе . ushort ushort ushort ushort byte ushort ushort ulong long
Y00h Y01h Y02h Y03h Y04h Y06h Y07h Y12 Y47h Y80h Y0fh
byte(00h) byte(01h) byte(02h) byte(03h) byte(04h) byte(06h) byte(07h) byte(12) byte(47h) byte(80h) byte(0fh)
BINARY RECORD STR MSTR
FILE,PRE(BIN),DRIVER('DOS'),NAME('file.tsk') RECORD string(65500) !Строка с прочитанным файлом byte,dim(65500),over(STR) !Массив для передачи.
.. ! CODE blank show(2,5,'Инициализация микроконтроллера') setcursor(2,35) ! ! Инициализaция MSC1210 ! do INITRS ! Инициализация RS232. do INITMSC in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). ! ! Прием 4 байтов конфигурации: ! ID2,UCFG1,BOOT_VECTOR,STATUS_BYTE. ! loop i=1 to 4 do INBYTE . INB=M1[1]
263
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if INB=0 then goto WYKL. do ByteToHex ID2=out&'h' INB=M1[2] do ByteToHex UCFG1=out&'h' INB=M1[3] do ByteToHex BOOT_VECTOR=out&'h' INB=M1[4] do ByteToHex STATUS_BYTE=out&'h' ! ! Определение марки микроконтроллера. ! if ID2='21h' then SNAME='904'. if ID2='25h' then SNAME='938'. ! NAME='P89LPC'&SNAME ! ! Рисование рамок и вывод на ! экран конфигурации микроконтроллера. ! show(3,13,'г===========') show(4,13,'¦ ¦') show(5,13,'L===========') setcursor(4,15) type(NAME) show(6,5,'TT') show(7,5,'¦UCFG1¦BOOT_VECTOR¦STATUS_BYTE¦') show(8,5,'++++') show(9,5,'¦ ¦ ¦ ¦') show(10,5,'L++') show(9,7,UCFG1) show(9,16,BOOT_VECTOR) show(9,28,STATUS_BYTE) ! show(2,5,'Подготовка к программированию.') ! ! Открываем файл '*.tsk' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY.
264
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
setcursor(12,7) type('Длина файла file.tsk ') type(L) type(' байт') setcursor(14,10) type('Программирование<0dh,0ah>') setcursor(15,6) type(' ') ! NP=int(L/16) !Целое количество байт в символе . NOST=LNP*16 !Остаток if NP<=1 then NP=1. ! in(3f8h,B) !Холостой ввод ! Open(BINARY,00H) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) empty(BINARY) ! На всякий случай. set(BINARY) next(BINARY) ! ! Включение таймера времени программирования. ! T1=clock() ! ! ! Закраска «змеи» серым цветом ! setcursor(16,10) type('<176>{16}') setcursor(16,10) ! k1=0 !Количество точек NP1=NP !NPцелое количество байт в символе. NSYMB=0 !Количество напечатанных символов . !============================================== ! Загрузка программы !============================================== ! Передача в микроконтроллер 2 байтов длины ! программы: LBT[1]мл.б., LBT[2]ст.б. ! k=1 M[k]=LBT[1] !Передача мл.б. do OUTBYTE M[k]=LBT[2] !Передача ст.б. do OUTBYTE !
265
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! Загрузка самой программы ! loop i1=1 to L !Начало цикла if i1=NP1 type('<178>') NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else NP1=NP1+NP+NOST . . k=1 M[k]=BIN:MSTR[i1] do OUTBYTE do DEL1400 .!ot loop Конец цикла. !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком файле. ! if NSYMB<16 loop (16NSYMB) times type('<178>') . . !
M
type(' ok') type('<0dh,0ah>') type(' ') T1=clock()T1 !Расчет времени программирования type('<0dh,0ah>') type(' Время программирования = ') type(T1/100) type(' сек.')
in(3f8h,B) !Холостой ввод — делать ОБЯЗАТЕЛЬНО ! !!(Для сброса бита DRdata ready). ! ! loop;in(3fdh,B);if band(1,B)=0 then break.. !Оже конца прихода байта(бит "DR"data ready) ! do DEL50MS i=1
266
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
do INBYTE setcursor(20,7) if M1[i]=40h then type('Ok. Конец программирования.') else goto E . WYKL show(22,10,'Для выхода нажмите ЕSC') loop until keyboard() ask if keycode()=256 then break. . ! E out(3fch,Y00h) !Сброс микроконтроллера return
!esc
!############### Подпрограммы ############# ! ! П/п инициализации RS232 и микроконтроллера. ! ! Инициализация СОМпорта. ! INITRS routine out(3fch,Y00h) !Контрольный сброс микроконтроллера. out(3fbh,Y80h) ! DLAB=1 для установки делителя. out(3f8h,Y01h) ! Установка мл.б. скор.:Y01h115200 бод,Y129600 бод. out(3f9h,Y00h) ! Установка ст.б. скор.=0. out(3fbh,Y07h) ! DLAB=0,Режим: 8 бит данных,2 стоп,нет пар.,сброс TxD. out(3f9h,Y00h) ! Запрет всех прерываний по порту 3f8h. ! ! Инициализация микроконтроллера. ! INITMSC routine out(3fch,Y00h) ! Сброс линии DTR (Reset микроконтроллера). do DEL100MS out(3fch,Y01h) ! Установка линии DTR (Запуск MSC1210). do DEL100MS do DEL100MS in(3f8h,B) ! Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). do DEL100MS ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine out(3fbh,Y47h) !Установка TxD (разрешение передачи) loop; in(3feh,B); if band(B,20h) then break..!Ожидание стартбита (устки DSR) do DEL20 !Задержка 20 мкс out(3fbh,Y07h) !Сброс линии TxD (запрет передачи)
267
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
in(3feh,B) !Очистка регистра 3feh чтением loop;in(3fdh,B);if band(B,1) then break.. !Оже конца прихода байта(бит "DR") in(3f8h,M1[i]) !Чтение байта данных ! ! П/п вывода байта (байт в M[k] ) ! OUTBYTE routine loop;in(3fdh,B);if band(B,20h);break.. !Оже гти передатчика (transm.empty). loop;in(3feh,B);if band(B,20h);break.. !Оже разреш.передачи(установки DSR) out(3f8h,M[k]) !Вывод байта 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 чтением ! ! ! П/п временных задержек ! DEL50MS routine T#=CLOCK();loop while CLOCK()T#<5. !Задержка 0,05 с. DEL100MS routine T#=CLOCK();loop while CLOCK()T#<10. !Задержка 0,1 с. DEL150MS routine T#=CLOCK();loop while CLOCK()T#<15. !Задержка 0,15 с. DEL200MS routine T#=CLOCK();loop while CLOCK()T#<20. !Задержка 0,2 с. DEL250MS routine T#=CLOCK();loop while CLOCK()T#<25. !Задержка 0,25 с. DEL1S routine T#=CLOCK();loop while CLOCK()T#<100. !Задержка 1 с. DEL3S routine T#=CLOCK();loop while CLOCK()T#<300. !Задержка 3 с. DEL10MS routine !Задержка 10 мс. beep(0,5) DEL2MS routine !Задержка 2 мс. beep(0,1) DEL1400 routine loop j=1 to 50000 . DEL20 routine loop 40000 times . ! ByteToHex routine HEX=HexDigitsLow MOut[1]=MHEX[BSHIFT(INB,4)+1] MOut[2]=MHEX[BAND(INB,0FH)+1] !################ конец подпрограмм #################
268
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Файлпроект proglpc.pr #system auto exe #model xlarge #pragma data(stack_size=>24576,threshold=>4096) #pragma optimize(cpu=>286) #pragma check(stack=>on,index=>on) #pragma link_option(map=>off,case=>on) #compile proglpc.cla /check(stack=>off,nil_ptr=>off,index=>off) /debug(vid=>off,line_num=>off) #pragma link(%clapfx%dos.lib) #set exports='proglpc' #link proglpc
Программа ICPlpcTI.clw ! ! Программа ICP микроконтроллера P89LPC9XX. ! Работает под управлением P89LPC938 при ! загрузке в него программы b938_9xx.hex и ! под управлением MSC1210 при загрузке ! в него программы bmsc_9xx.hex. ! PROGRAM INCLUDE('Equates.CLW') INCLUDE('TplEqu.CLW') INCLUDE('Keycodes.CLW') INCLUDE('Errors.CLW') ! ! Определение переменных ! p byte T1 long NAMEMIC string(9) SNAKE byte TIND real ! M byte,dim(100) !Массив для вывода OUTBYTE. S string(100),over(M) !Строка для вывода OUTBYTE. M1 byte,dim(100) !Массив принимаемых байт INBYTE. S1 string(100),over(M1) !Строка принимаемых байт. L ushort !Длина файла в байтах. LBT byte,dim(2),over(L) !LBT[1]мл.б.,LBT[2]ст.б. N ushort NSTROK ushort(0) ! Количество строк в *.hexфайле NOST ushort ! Остаток NSYMB ushort ! Количество символов .
269
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
NP ushort(0) ! Количество точек в символе . NP1 ushort k ushort k1 ushort KL ushort B byte i ushort j ushort i1 ulong ! ! Переменные для п/п ByteToHex ! INB byte !Входной байт (byte). Out STRING(2),AUTO !Выходная строка (hex). HEX &STRING,AUTO HexDigitsLow STRING('0123456789abcdef') ! ! Переменные конфигурации ! UCFG1 string(3) BOOT_VECTOR string(3) STATUS_BYTE string(3) ID2 string(3) !
! ! Переменная для CLACOM ! ComNum short ! ! ! Переменные для частоты и счетчика ! CSTARTL ulong CSTARTH long CSTOPL ulong CSTOPH long DC long DELTAC long ! FREQUENCY GROUP,PRE(FRE) FREQL ULONG FREQH LONG . COUNTER GROUP,PRE(CNT) COUNTL ULONG COUNTH LONG .
270
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! MAP !######################## ! MODULE('IN.CPP') INP(ULONG),BYTE,NAME('_INP') END MODULE('OUT.CPP') OUTP(unsigned long,BYTE),NAME('_OUTP') END ! MODULE('DELAY') QueryPerformanceCounter(*STRING),BOOL,RAW,PASCAL QueryPerformanceFrequency(*STRING),BOOL,RAW,PASCAL Sleep(ULONG),PASCAL END ! MODULE('CLACOM') SetPort(SHORT),PASCAL,NAME('_SetPort@8') ResetPort(SHORT),PASCAL,NAME('_ResetPort@8') END ! !#################### END ! от MAP
Window WINDOW('ICP P89LPC9XX'),AT(,,185,177),| FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),| COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX STRING('Микроконтроллер'),AT(4,12,64,10),USE(?String5) ENTRY(@s9),AT(68,12,44,9),USE(NAMEMIC),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) STRING('ID2'),AT(120,12,12,8),USE(?String7:2),HIDE ENTRY(@s3),AT(132,12,16,9),USE(ID2),SKIP,HIDE,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,0C1FFC1H) GROUP('Конфигураци<255> пам<255>ти микроконтроллера'), !AT(4,28,177,25),| USE(?Group1),BOXED,FONT('Times New Roman',10,COLOR:Blue,| FONT:bold,CHARSET:CYRILLIC) END ENTRY(@n_5b),AT(92,64,24,9),USE(L),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,COLOR:White) PROGRESS,USE(SNAKE),AT(20,92,132,12),RANGE(0,16) ENTRY(@n_5.2b),AT(120,120,20,9),USE(TIND),SKIP,|
271
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(0C1FFC1H,COLOR:Black,0C1FFC1H) STRING('UCFG1'),AT(8,40,24,10),USE(?String2) ENTRY(@s3),AT(32,40,18,9),USE(UCFG1),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(COLOR:White,COLOR:Black,COLOR:White) STRING('BootVector'),AT(60,40,41,9),USE(?String3) ENTRY(@s3),AT(100,40,17,9),USE(BOOT_VECTOR),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(COLOR:White,COLOR:Black,COLOR:White) STRING('StatusByte'),AT(120,40,39,9),USE(?String4) ENTRY(@s3),AT(160,40,17,9),USE(STATUS_BYTE),SKIP,| FONT(,,COLOR:Black,,CHARSET:ANSI),COLOR(COLOR:White,COLOR:Black,COLOR:White) BUTTON('Выход'),AT(68,148,40,16),USE(?Cancel),| FONT('Times New Roman',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC), | TIP('Out from programm to Windows'),KEY(EnterKey),DEFAULT STRING('(Enter)'),AT(116,152,18,10),USE(?String7),| FONT(,,COLOR:Black,FONT:regular,CHARSET:ANSI) END WinErr WINDOW('П Р Е Д У П Р Е Ж Д Е Н И Е ! ! !'),AT(,,168,77),| FONT('Times New Roman',10,COLOR:Black,FONT:regular,CHARSET:CYRILLIC), | COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX PROMPT('ICPмикроконтроллер не отвечает'), AT(24,12,131,11),USE(?Prompt1),| FONT('Times New Roman',11,COLOR:Red,FONT:bold,CHARSET:CYRILLIC) STRING('Проверьте кабель, включите питание,'), AT(8,28,160,10),USE(?String1),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) STRING('вставьте микроконтроллер в панельку.'),AT(8,40,160,11),| FONT('Times New Roman',12,,FONT:bold+FONT:italic,CHARSET:CYRILLIC) BUTTON('Выход'),AT(64,60,41,12),USE(?EX),| FONT('Tahoma',10,,FONT:regular,CHARSET:CYRILLIC),KEY(EnterKey), | DEFAULT STRING('(Enter)'),AT(108,64,24,8),USE(?String6) CHECK,AT(0,4,21,20),SKIP,TRN,FLAT,ICON(ICON:Hand) END ! BINARY FILE,DRIVER('DOS'),PRE(BIN),NAME('file.tsk') RECORD RECORD STR string(65500) !Строка с прочитанным файлом. MSTR byte,dim(65500),over(STR) !Массив для передачи. .. !
CODE
!
272
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
! Открытие COMпорта(CLACOM) — Для WIN'XP. ! ComNum=0 ! 0COM1,1COM2 SetPort(ComNum) ResetPort(ComNum) ! ! Вычисление временной задержки в 25 мкс. ! !Определение частоты работы счетчика. loop until QueryPerformanceFrequency(FREQUENCY). !Вычисление времени счета в 25 мкс. DC=int(25*FRE:FREQL/1000000) ! !############################################################# ! ! Инициализaция RS232 и микроконтроллера. ! do INITRS !Инициализация RS232. do INITMC !Инициализация микроконтроллера. ! ! Прием и вывод на экран 4 байтов конфигурации: ! ID2,UCFG1,BOOT_VECTOR,STATUS_BYTE. ! loop i=1 to 4 do INBYTE . INB=M1[1] if INB=0 then goto WYKL. do ByteToHex ID2=out&'h' INB=M1[2] do ByteToHex UCFG1=out&'h' INB=M1[3] do ByteToHex BOOT_VECTOR=out&'h' INB=M1[4] do ByteToHex STATUS_BYTE=out&'h'
if if if if
ID2='0dh' ID2='0fh' ID2='10h' ID2='21h'
then then then then
NAMEMIC='P89LPC901'. NAMEMIC='P89LPC902'. NAMEMIC='P89LPC903'. NAMEMIC='P89LPC904'.
if ID2='17h' then NAMEMIC='P89LPC915'.
! Объем памяти: ! ! 1 кБ ! ! !
273
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
if ID2='18h' then NAMEMIC='P89LPC916'. if ID2='20h' then NAMEMIC='P89LPC917'.
! 2 кБ !
if if if if if
! ! ! 8 кБ ! !
ID2='1fh' ID2='0ah' ID2='1dh' ID2='1eh' ID2='25h'
then then then then then
NAMEMIC='P89LPC932A1'. NAMEMIC='P89LPC933'. NAMEMIC='P89LPC934'. NAMEMIC='P89LPC935'. NAMEMIC='P89LPC938'.
! OPEN(Window) display blank !================================= ! Программирование !================================= ! ! Открываем файл '*.tsk' для программирования. ! open(BINARY,00h) L=bytes(BINARY) !Длина файла в байтах. set(BINARY) !Читаем файл next(BINARY) !BINARY. show(20,65,'Длина файла file.tsk show(20,80,'Программирование') display ! NP=int(L/16) !Целое количество байт в символе . NOST=LNP*16 !Остаток if NP<=1 then NP=1. ! k1=0 !Количество точек NP1=NP !NPцелое количество байт в символе. NSYMB=0 !Количество напечатанных символов . ! ! Включение таймера времени программирования. ! T1=clock() ! !============================================== ! Загрузка программы !============================================== ! Передача в микроконтроллер 2 байтов длины ! программы: LBT[1]мл.б., LBT[2]ст.б. ! i=1
274
байт')
M[i]=LBT[1] !Передача мл.б. do OUTBYTE M[i]=LBT[2] !Передача ст.б. do OUTBYTE ! ! Загрузка самой программы ! loop i1=1 to L !Начало цикла if i1=NP1 SNAKE=SNAKE+1;display!type('<178>') NSYMB=NSYMB+1 if NP1<>NP*16 NP1=NP1+NP else NP1=NP1+NP+NOST . . i=1 M[i]=BIN:MSTR[i1] do OUTBYTE do DEL25 .!oт loop Конец цикла. !============================================== ! Допечатывание недостающих до конца строки символов ! при маленьком файле. ! if NSYMB<16 loop (16NSYMB) times SNAKE=SNAKE+1;display! type('<178>') . . !
display ! M show(155,95,'Ok') T1=clock()T1 !Расчет времени программирования show(20,120,'Время программирования T= TIND=T1/100 !============================= ! Конец программирования !============================= B=INP(3f8h)!Холостой ввод. ! B=INP(3f8h)!Холостой ввод. Sleep(200)
с ')
i=1 do INBYTE
275
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
if chr(M1[i])<>'@' then goto WYKL. !=========================== ! Окончание программирования !=========================== ! ! enable(?Ok) enable(?Cancel) accept ! case accepted() of ?Cancel p=0 break .! oт case ! .! от accept if p=0 then goto E. !
!============================== ! Ошибочная ситуация !============================== WYKL
close(WINDOW) open (WinErr) accept ! case accepted() of ?EX p=0 break .! oт case ! .! от accept if p=0 then goto E. !=========================== ! Конец ошибочной ситуации !==========================
!======================== ! Окончание программы !======================== E close(Window)
276
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
OUTP(3fch,00h) !Сброс микроконтроллера OUTP(3fbh,7h) ! return !==========================
! ! Подпрограммы ! ! П/п инициализации RS232 и микроконтроллера. ! ! ! Инициализация СОМпорта. ! INITRS routine ! OUTP(3fch,00h) !Контрольный сброс микроконтроллера. OUTP(3fbh,80h) ! DLAB=1 для установки делителя. OUTP(3f8h,1) ! Установить мл.б. скор.:1115200,257600,129600 бод. OUTP(3f9h,00h) ! Установить ст.б. скор.=0. OUTP(3fbh,07h) ! DLAB=0,Режим: 8 бит данных,2 стопa,нет пар.,сброс TxD. OUTP(3f9h,00h) ! Запрет всех прерываний по порту 3f8h. ! ! ! Инициализация микроконтроллера. ! INITMC routine !Инициализация MSC1210/P89LPC938. OUTP(3fch,00h) !RTS=0,DTR=0. (MSC1210:RST=1,P89LPC938:RST=0,Vdd=+3V). Sleep(100) !Задержка 0.1 сек. OUTP(3fch,01h) !RTS=0,DTR=1. Запуск МК !(MSC1210:RST=0,LPC938:RST=1,Vdd=+3V). Sleep(200) !Задержка 0.2 сек. B=INP(3f8h) !Холостой ввод — для сброса бита 0(DR) в 3fdh (в "0"). Sleep(100) !Задержка 0.1 сек. ! ! ! П/п ввода байта (байт в M1[i] ) ! INBYTE routine OUTP(3fbh,47h) !Установка TxD (разрешение передачи). loop until band(INP(3feh),2). !Ожидание стартбита (изменения состояния DSR). do DEL25 !Задержка 25 мкс. OUTP(3fbh,07h) !Сброс TxD (запрет передачи). loop until band(INP(3fdh),1). !Оже конца прихода байта(бита "DR"data ready). M1[i]=INP(3f8h) !Чтение байта данных. B=INP(3feh) !Очистка 3feh для правильного ожя стартбита.
277
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! ! П/п вывода байта (байт в M[i]) ! OUTBYTE routine loop until band(INP(3fdh),20h). !Ожидание гти передатчика(transmitter empty). loop until band(INP(3feh),20h). !Ожидание разрешения передачи(установки DSR). OUTP(3f8h,M[i]) !Вывод байта. !B=INP(3feh) loop until band(INP(3feh),2h). !Оже сброса разрешя (изменения состя DSR). loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС (OK to send). B=INP(3feh) !Очистка 3feh для его правильного чтения. ! DEL25 routine loop until QueryPerformanceCounter(COUNTER).!Чтение счетчика. CSTARTL=CNT:COUNTL !Занесение начального значения в CSTARTH=CNT:COUNTH !две стартовых longпеременных. loop ! loop until QueryPerformanceCounter(COUNTER). ! Ожидание ! if CNT:COUNTH=CSTARTH ! DELTAC=CNT:COUNTLCSTARTL ! прошествия ! else ! ! DELTAC=0ffffffffffffffffhCSTARTL+CNT:COUNTL+1! времени ! . ! if DELTAC>DC then break. ! DC(=25 мкс). . ! ! ByteToHex routine HEX &= HexDigitsLow Out[1] = HEX [BSHIFT(INB, 4) + 1] Out[2] = HEX [BAND(INB, 0FH) + 1] !
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Проанализируем полученную информацию о результатах работы программ по программиро ванию микроконтроллеров P89LPC938 и P89LPC904 в режиме ICP, показанных на рис. 2.6.4.4.1 и 2.6.4.4.2).
а)
Рис. 2.6.4.4.1. Общий вид экранных форм программ для программи! рования микроконтроллера P89LPC938 в режиме ICP: а — результат вывода на экран информации програм! мой PROGLPC.CLA (DOS), работающей с ведущим мик! роконтроллером P89LPC938 по программе B938_9XX.C после окончания программирования микроконтролле! ра P89LPC938 в режиме ICP; б — общий вид окна программы ICPlpcTI.clw (Win'XP), ра! ботающей с ведущим микроконтроллером P89LPC938 по программе B938_9XX.C после окончания программи! рования микроконтроллера P89LPC938 в режиме ICP; в — общий вид окна программы ICPlpcTI.clw (Win'XP), работающей с ведущим микроконтроллером MSC1210 по программе BMSC_9XX. C после окончания програм! мирования микроконтроллера P89LPC938 в режиме ICP
б)
Файлпроект ICPlpcTI.prj Project File Title #noedit #system win32 #model clarion lib #set RELEASE = on #pragma debug(vid=>off) #pragma optimize(cpu=>386) #pragma define(NULL=>on) #compile "ICPlpcTI.clw" #compile "in.cpp" #compile "out.cpp" #pragma link("C%V%DOS%X%%L%.LIB") #pragma link("ICPlpcTI.lib") #pragma link("clacom32.lib") #pragma link("WindowsShell.Manifest") #link "ICPlpcTI.exe"
278
в)
279
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
2.6.5. Программирование микроконтроллеров AT89C51ED2(RD2) в режиме ISP по интерфейсу RS232
Рис. 2.6.4.4.2. Общий вид окон программы ICPlpcTI.clw(Win'XP), работающей с ведущим микроконтроллером P89LPC938 по программе B938_9XX.C при программировании в режиме ICP микроконтроллеров P89LPC938 (a) и P89LPC904 (б) а)
Для программирования микроконтроллера AT89C51ED2 используется схема сопряжения этого микроконтроллера с компьютером (рис. 1.3.7.1) и бесплатно распространяемая прог рамма FLIP v.2.4.4 от ф. ATMEL. Далее приведены некоторые рекомендации по настройке этой программы для работы со схемой сопряжения (рис. 1.3.7.1). Перед запуском программы необходимо подключить плату со схемой (рис. 1.7.7.1) к порту COM1 компьютера и включить питание платы. После запуска программы FLIP v.2.4.4 на экра не появляется окно (рис. 2.6.5.1,а). Необходимо выбрать опцию «Setting» («Установки») и далее опцию «Preferences» («Предварительные»). В появившемся окне (рис. 2.6.5.1,б) установить галоч ку в поле «AutoISP» («АвтоISP») и нажать кнопку «More» («Далее»); в появившемся новом окне «Advanced RESET» («Расширенная опция RESET») (рис. 2.6.5.1,в) установить поля радиокнопок «RST(DTR)» и «PSEN(RTS)» в состояние «low» ( «низкий») и нажать кнопку «OK». Этим обеспечивается согласование программы FLIP со схемой сопряжения (рис. 1.3.7.1). Далее необходимо выбрать интерфейс сопряжения «RS232» (рис. 2.6.5.1,г); в появившем ся окне (рис. 2.6.5.1,д) установить порт COM 1, скорость обмена 115 200 и нажать кнопку «Connect» («Связь»). Если все проделано правильно, на экран выведется окно (рис. 2.6.5.1,е), свидетельствующее о том, что с микроконтроллером установлена связь. Далее необходимо выбрать программируемый файл в *.hex формате (рис. 2.6.5.1,ж, з, например «inrsed2c.hex»).
Рис. 2.6.5.1. Настройка и последова! тельность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (см. также б–к на с. 282—286) б)
Из анализа результатов (рис. 2.6.4.4.1) можно сделать выводы о том, что программы PROGLPC.CLA (DOS) и ICPlpcTI.clw (Win'XP), работающие с одним и тем же ведущим микроконтрол лером P89LPC938 по программированию микроконтроллера P89LPC938 в режиме ICP, имеют практически идентичные скоростные характеристики (времена программирования (6,42 и 6,41 с) файла file.tsk размером около 6 кБ практически совпадают) и что ведущий микроконтроллер P89LPC938 работает несколько быстрее ведущего микроконтроллера MSC1210 (времена рабо ты соответственно составляют 6,41 и 8,22 с) при прочих равных условиях. Это, повидимому, объ ясняется разными скоростями работы этих микроконтроллеров. Из анализа рис. 2.6.4.4.2 можно сделать вывод, что программирование файла одного и то го же размера (1 кБ) в микроконтроллер P89LPC938 производится быстрее (1,09 с), чем в мик роконтроллер P89LPC904 (1,71 с). Это, повидимому, объясняется различнным размером стра ниц программной памяти у этих микроконтроллеров (16 байт у P89LPC904 и 64 байт у P89LPC938), поскольку программирование одной страницы размером в 64 байта производит ся быстрее, чем программирование 4 страниц по 16 байт (см. описание ICP 9XX).
280
а)
281
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.5.1. Настройка и последо! вательность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (продолжение)
Рис. 2.6.5.1. Настройка и последо! вательность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (продолжение)
б)
г)
в)
д)
282
283
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.5.1. Настройка и последо! вательность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (продолжение)
Рис. 2.6.5.1. Настройка и последо! вательность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (продолжение)
е)
з)
ж)
и)
284
285
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Прежде чем работать с программой IDE, необходимо подключить плату, схема которой по казана на рис. 1.3.9.1, к порту RS232 (COM 1) компьютера и к USBDEBUGадаптеру, который также необходимо подключить к USBпорту компьютера.
2.6.6.1. Программирование и штатный режим работы микроконтроллера C8051F067
Рис. 2.6.5.1. Настройка и последо! вательность работы с программой FLIP при программировании микроконтроллера AT89C51ED2 (Окончание)
к)
Для ускорения загрузки файла опции «Erase» («Стирание») и «Blank Chek» («Проверка на чистоту») можно отключить, сняв галочки в полях соответствующих радиокнопок (но оставив галочки в полях «Program» («Программирование») и «Verify» («Верификация»); после этого для загрузки файла необходимо нажать кнопку «RUN» («Запуск») (рис. 2.6.5.1,и). После успешной загрузки файла с программой в микроконтроллер появится окно (рис. 2.6.5.1,к). Далее из программы FLIP можно выйти (рис. 2.6.5.1,к) и запустить уже собственную программу на компь ютере (например «Hello.clw»). Как уже указывалось ранее, программа FLIP — исключительно надежная и универсаль ная программа, которая зарекомендовала себя с наилучшей сторны. Она одинаково хорошо работает в ОС Win'98 и Win'XP (в т. ч. на скорости обмена в 115 200 бод). Автор (книги) убеди тельно рекомендует ее для широкого использования.
2.6.6. Программирование микроконтроллеров C8051F067 и C8051F330D в режиме ISP по интерфейсам C2 и JTAG и штатный режим работы по интерфейсу RS232 Для программирования и штатного режима работы микроконтроллеров C8051F067 и C8051F330D должна использоваться схема их сопряжения с компьютером (рис. 1.3.9.1). Для программирования микроконтроллеров используется бесплатно расп ространяемая ф. Silicon Laboratories программа IDE v.2.5.2 и USBDEBUGадаптер стои мостью около 60 долл. Далее приведены рекомендации автора по настройке программы IDE для работы с микроконтроллерами C8051F067 и C8051F330D, а также по работе в штатном режиме этих микроконтроллеров совместно с платой по схеме рис. 1.3.9.1.
286
Перед программированием микроконтроллер C8051F067 неоходимо распаять на плате переходнике TQFP64PGA64 (см. рис. 1.3.9.3) и вставить его в предназначенную для него па нельку на плате по схеме (рис. 1.3.9.1). Джамперы перемычек P1–P3 установить в положение, соответствующее микроконтроллеру C8051F067 (замкнуть контакты 2–3 всех 3 перемычек). Джампер перемычки P4 установить в положение, соответствующее программированию мик роконтроллера (замкнуть контакты 2–3). После этого необходимо включить питание платы и запустить программу IDE. После запуска программы на экране отобразится окно, показанное на (рис. 2.6.6.1.1,а). Из подпункта «Options» («Опции») необходимо выбрать «Connection options…» («Опции свя зи») (рис. 2.6.6.1.1,б) и в открывшемся окне выбрать радиокнопки «USB Debug Adapter», «JTAG» и нажать кнопку «OK» (рис. 2.6.6.1.1,в). Далее, выйдя в основное меню, необходимо нажать кнопку «Connect» («Установить связь») (рис. 2.6.6.1.1,г), после чего в левом ниж нем углу окна появится надпись «Ready» («Готово»), а в правом нижнем углу — надпись «Target: C8051F067», означающие, что с микроконтроллером C8051F067 установлена связь (рис. 2.6.6.1.1,д). Далее необходимо выбрать подлежащий программированию файл в *.hex формате. Для этого в основном меню надо выбрать опцию «DEBUG» и в открывшемся подменю выб рать опцию «Download Object File» («Загрузка объектного файла») (рис. 2.6.1.1,е). После это го выбрать название файла (например, inrsf067.hex), который необходимо запрограммиро вать (рис. 2.6.1.1,ж, з) и нажать кнопку «Download» («Загрузка») (рис. 2.6.1.1,и). После этого последует загрузка файла inrsf067.hex, и при успешной загрузке в нижнем ок не появится надпись: Downloadinng: D:\.\inrsf067.hex Download sucsessful. Checksum: 0x9204
Это будет означать, что файл inrsf067.hex успешно загрузился в микроконтроллер (рис. 2.6.1.1,к). После этого необходимо нажать кнопку «Disconnect» («Разрыв связи»), чтобы программно отключить DEBUGAdapter от микроконтроллера (рис. 2.6.1.1,л); после отключения связи в пра вом нижнем углу окна вместо надписи «Target: C8051F067» появится надпись: «Target: C8051FXXXX»; (рис. 2.6.1.1,м); кроме того, светодиоды на корпусе USBDEBUGадаптетре по гаснут. Это будет означать, что связь USBDEBUGадаптера с микроконтроллером отключена. Для перевода платы в штатный режим работы необходимо отключить питание платы и пе реставить перемычку P4 в положение, соответствующее штатному режиму работы микроконт роллера с интерфейсом RS232 (замкнуть джампером контакты 1–2). После этого необходимо вновь включить питание и запустить пользовательскую програм му для компьютера, например Hello.clw.
287
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067 (продолжение)
а)
в)
б)
г)
288
289
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067 (продолжение)
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067 (продолжение)
д)
ж)
е)
з)
290
291
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067 (окончание)
Рис. 2.6.6.1.1. Последовательность операций по програмированию микроконтроллера С8051F067 (продолжение)
и)
л)
к)
м)
292
293
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
2.6.6.2. Программирование и штатный режим работы микроконтроллера C8051F330D Для программирования микроконтроллера C8051F330D необходимо выполнить следую щие действия. При выключенном питании платы сопряжения (рис. 1.3.9.1) вытащить микроконтрол лер C8051F067 из панельки (если он там находится), вставить микроконтроллер C8051F330D (C8051F330P) в панельку DIP20 (DIP24), установить джамперы перемычек P1–P3 в положение, соответствующее микроконтроллеру C8051F330D (т. е. замкнуть кон такты 1–2 всех трех перемычек). Перемычку P4 установить в положение, соответствующее программированию (замкнуть контакты 2–3). После этого подключить к плате USBDEBUGадаптер, который также неоходимо подключить к интерфейсу USB компьютерa. Подключить к плате кабель с интерфейсом RS232 и соединить его с портом COM 1 компьютера. Включить питание платы и запустить программу IDE. Все дальнейшие действия выполнять в соответствии с п. 2.6.6.1 за следующими исключениями: 1. Интерфейс связи с микроконтроллером. Вместо интерфейса «JTAG» необходимо выб рать интерфейс C2 (рис. 2.6.6.2.1,a). После нажатия кнопки «Connect» (рис. 2.6.6.2.1,б) в правом нижнем углу появится надпись «Target: C8051F330» (рис. 2.6.6.2.1, в). 2. Название файла, подлежащего программированию в микроконтроллер, другое: inrsf330.hex (рис. 2.6.6.2.1,г, д). После того как файл запрограммирован в микроконтроллер, необходимо отключить связь микроконтроллера с компьютером, т. е. выбрать опцию «Disconnect». После отключения связи в правом нижнем углу вместо надписи «C8051F330» появится надпись «C8051FXXXX», означаю щая, что связи компьютера с платой нет. При этом светодиоды на корпусе USBDEBUGадаптера погаснут (рис. 2.6.6.2.1,e). Далее необходимо отключить питание платы, переставить джампер перемычки P4 в положе ние, соответствующее штатному режиму работы (замкнуть контакты 1–2). После этого необходи мо вновь включить питание платы и запустить программу пользователя (например Hello.clw).
Рис. 2.6.6.2.1. Последователь! ность операций по программированию микроконтроллера C8051F330D (продолжение)
б)
Рис. 2.6.6.2.1. Последователь! ность операций по программированию микроконтроллера C8051F330D
в)
294
295
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
ПРИМЕНЕНИЕ ИНТЕРФЕЙСА RS232 ДЛЯ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ В СИСТЕМЕ (ISP)
Рис. 2.6.6.2.1. Последователь! ность операций по программированию микроконтроллера C8051F330D (продолжение)
Рис. 2.6.6.2.1. Последователь! ность операций по программированию микроконтроллера C8051F330D (окончание)
г)
д)
296
е)
Список использованной литературы
Заключение Приведенные в книге примеры показывают, что интерфейс RS232 неплохо справляется с программированием микроконтроллеров в системе (ISP, ICP). Является ли это его преде лом? И вообще, каков предел применения интерфейса RS232 в системах, которые использу ют микроконтроллеры, в качестве удаленных от компьютера устройств, обменивающихся с компьютером информацией? Опыт конструирования подобного типа систем показывает, что интерфейс RS232 целесообразно использовать в таких системах сбора и обработки инфор мации, в которых количество датчиков не превышает 20÷30, а частота обновления инфор мации, получаемой с них, — 20 Гц, т. е. дискретность по времени (∆t) не менее 0,05 с. На практике встречается масса задач, где требуется достаточно прецизионные измерения низкочастотных сигналов, а дискретность обновления данных намного больше, чем 0,05 с (1 с и более). В качестве примеров можно привести системы, применяющиеся как автомати зированные средства поверки и градуировки счетчиков объема газа или воды, о которых бо лее подробно можно прочитать в приложении П.2. Целесообразность применения интерфейса RS232 в таких устройствах доказана много летним «стажем» их работы (все подобные системы сбора, сконструированные автором и за пущенные в эксплуатацию, работают до сих пор и некоторые из них — более 10 лет). Косвен ным подтверждением этой целесообразности может служить еще и тот факт, что такие веду щие фирмыпроизводители аналоговых микросхем АЦП и ЦАП, как Analog Devices, Texas Instruments, Philips, Atmel, Silicon Laboratories, с недавнего времени стали выпускать микро контроллеры «системы на кристалле», которые используют интерфейс RS232 не только в каче стве обычной связи с компьютером. Эти микроконтроллеры (как уже обсуждалось ранее) име ют возможность «программирования в системе» и именно по интерфейсу RS232 (это, к сожа лению, не касается микроконтроллеров ф. Silicon Laboratories). Применяя новый алгоритм обмена по RS232 (см. 2.4), можно получить высокие скорост ные и надежностные характеристики связи компьютера с микроконтроллером уже в Win'98/XP. Это позволяет поднять качество программ для компьютерных систем сбора и об работки информации на новый современный уровень.
298
Печатные издания 1. Баррингтон Брюс Б. Как создавался Кларион. // Мир ПК.– 1993.– № 2 – С. 5664. 2. Бирюков С.А. Цифровые устройства на МОПинтегральных микросхемах. – М.: Радио и связь,1996. 3. Интегральные микросхемы: Микросхемы для линейных источников питания и их применение. – М.: ДОДЭКА, 1988. 4. Кузьминов А.Ю. Интерфейс RS232: Связь между компьютером и микроконтроллером.– М.: Радио и связь, 2004. 5. Кузьминов А.Ю. Универсальная система сбора и обработки данных АСИР–3. // Мир ПК. – 1996. – № 6. – С. 4041. 6. Кузьминов А.Ю. Удаленные системы сбора информации с датчиков на базе однокристальных микроЭВМ. // Автоматизация и производство. – 1996 – № 3. – C. 79. 7. Кузьминов А.Ю. Однокристальные микроЭВМ – основа удаленных систем сбора и обработки сигналов, поступающих с датчиков. // Электроника и компоненты. – 1998. – № 2. – C. 1819. 8. Кузьминов А.Ю. Новые MCS51 – совместимые микроконтроллеры и их применение в системах сбора информации с датчиков. // Контрольно – измерительные приборы и системы. – 1997. – № 6. –C. 32–35; 1998. – № 7. – C. 34–36. 9. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: ДИАЛОГМИФИ, 1993. 10. Хоровиц П., Хилл У. Искусство схемотехники: В 3 т. / Пер. с англ. – М.: Мир,1993. 11. Шило В.Л. Популярные микросхемы КМОП: Справ. – М.: ЯГУАР, 1988.
Интернет 12. 13. 14. 15. 16. 17. 18. 19.
www.analog.com www.atmel.com www.maximic.com www.semiconductorphilips.com www.silabs.com www.ti.com www.msdn.microsoft.com/library www.gapdev.com
299
ПРИЛОЖЕНИЯ Приложение 1
Справочные данные по интерфейсу RS232 П.1.1. Контакты разъема интерфейса RS232 компьютера Таблица 1. Контакты разъемов RS232 № к–та DB25
В компьютере могут присутствовать как 25штырьковый (DB25), так и 9штырьковый (DB9) разъемы RS232. Названия сигналов и соответствующие им номера контактов приведены для обоих типов разъемов (табл. 1). № к–та DB9
Название сигнала
Расшифровка
Выход
2
3
TxD
3
2
RxD
Recеivеr Data (приемник данных)
Вход
4
7
RTS
Request To Send (запрос передачи)
Выход
5
8
CTS
Clear To Send (сброс передачи)
Вход
6
6
DSR
Data Set Ready (готовность данных)
Вход
7
5
SG
Signal Ground (сигнальная земля)
–
8
1
DCD
20
4
DTR
9
RI
Data Carrier Detect (обнаружение несущей) Data Terminal Ready (готовность терминала) Ring Indicator (индикатор звонка)
Вход Выход
Скорость обмена по интерфейсу устанавливается следующим образом. Вначале в порт с адресом 3fbh (см. далее) необходимо записать байт равный 80h. Далее в порт с адресом 3f8h необходимо записать младший байт делителя максимальной скорости обмена в 115 200 бод, затем в порт 3f9h — старший байт делителя. Как правило, старший байт делителя использу ется достаточно редко (для очень медленных скоростей обмена), поэтому он должен быть ра вен нулю. Регистр разрешения прерываний (interrupt enable register). Адрес — 3f9h. Доступен только для записи. Для того, чтобы разрешить перечисленные ниже прерыва ния, необходимо записать в этот регистр байт, содержимое которого приводится в следую щей табличке. 7 6 5 4 3 2 1 0 0 0 0 0 Бит № : 0: 1–Разрешение прерывания, когда принятые данные готовы. 1: 1–Разрешение прерывания, когда буфер передатчика пуст. 2: 1–Разрешение прерывания по битам ERROR или BREAK. 3: 1–Разрешение прерывания по состоянию CTS, DSR, RI, DCD.
Необходимо отметить, что для того, чтобы задействовать этот регистр как регистр разре шения прерываний (а не как старший байт делителя для установки скорости обмена, имеющий тот же адрес 3f9h), нужно вначале обнулить 7й бит в порту с адресом 3fbh (см. далее). Регистр идентификации прерывания (interrupt identification register). Адрес — 3fah. Доступен только для чтения. Читая содержимое трех младших бит этого регистра, можно по лучить источник прерывания:
7 6 5 4 3 2 1 0 0 0 0 0 0 Бит №
Вход
П.1.2. Значения регистров состояния и управления в интерфейсе RS232 компьютера Базовые адреса COMпортов компьютера следующие: COM 1 — 3f8h, COM 2 — 2f8h, COM 3 — 3e8h и COM 4 — 2e8h. Для порта COM 1 адреса регистров состояния и управления и значения этих регистров приведены ниже.
300
Порт COM 1 Регистр данных (data register). Адрес — 3f8h. Доступен по записи и по чтению. Регистр данных используется для двоякой цели. 1) для ввода из порта и вывода в порт байта данных, 2) для установки скорости обмена по RS232.
Вход/выход
Transmitter Data (передатчик данных)
22
ПРИЛОЖЕНИЕ 1. СПРАВОЧНЫЕ ДАННЫЕ ПО ИНТЕРФЕЙСУ RS232
0: 1– прерываний нет. 1: 00: Прерывание по состоянию линий модема. 2: Устанавливается при изменении состояния линий CTS, DSR, RI или DCD. Сбрасывается при чтении регистра состояния модема (адрес 3feh – см. далее) 01: Регистр передатчика пустой. Сбрасывается после записи новых данных в регистр данных (3f8h). 10: Принятые данные готовы для чтения. Сбрасывается после чтения данных из регистра данных (3f8h).
301
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
11: Прерывания по значению регистра состояния линий приемника (адрес 3fdh). Возникают при переполнении (ОЕ), ошибке паритета (PE), ошибке формата (FE) или сигналу BREAK (BI). Сбрасывается при чтении регистра состояния линий приемника (3fdh).
ПРИЛОЖЕНИЕ 1. СПРАВОЧНЫЕ ДАННЫЕ ПО ИНТЕРФЕЙСУ RS232
7 6 5 4 3 2 1 0 Бит № : 0: 1– Данные готовы для чтения. Сбрасывается после чтения регистра данных (3f8h). 1: 1– Ошибка переполнения. Предыдущий байт потерян. 2: 1– Ошибка паритета. Сбрасывается после чтения регистра состояния линии (т. е. настоящего регистра – 3fdh). 3: 1– Ошибка формата. Отсутствие стопбит в посылке. 4: 1– Обнаружен сигнал BREAK на линии. 5: 1– Регистр передатчика пустой и готов принять новый байт. 6: 1– Сдвиговый регистр передатчика пустой. Этот регистр получает байт из регистра передатчика (предыдущий регистр) и с помощью сдвигов бит за битом передает байт. Если этот бит равен 1, это значит, что передан последний бит байта. 7: 1 – Таймаут устройства.
Регистр управления линиями (line control register) . Адрес — 3fbh. Доступен по записи и чтению. Этот регистр определяет формат передаваемых данных, контроль паритета, количество стопбит, управляет линией TxD при отсутствии передачи и устанавливает скорость обмена. 7 6 5 4 3 2 1 0 Бит № : 0: Длина слова в битах: 1: 00 – 5, 01 – 6, 10 – 7, 11 – 8. 2: Количество стопбит: 0 – 1 бит, 1 – 2 бита. 3: Контроль паритета (четности): 4: X0–нет, 01–нечетность, 11–четность. 5: Установка паритета: 1 – бит четности = 0, если биты 3 и 4 равны 11; бит четности = 1, если биты 3 и 4 равны 01. 6: Разрешение выдачи сигнала BREAK в отсутствие передачи. 1 Перевод линии TxD в состояние 0 (–10 В) – сигнал BREAK. 0–Перевод линии TxD в состояние 1 (+10 В). 7: Бит установки скорости обмена. 1 – Установка скорости обмена в регистрах 3f8h и 3f9h. 0 – Регистры 3f8h и 3f9h используются в обычном режиме.
Регистр управления модемом (modem control register). Адрес — 3fch. Доступен по записи. Этот регистр управляет линиями DTR и RTS и диагностикой RS232. 7 6 5 4 3 2 1 0 0 0 0 Бит № : 0: 1–установить сигнал DTR в лог. 1(+10В), 0 – в лог. 0 (–10В). 1: 1–установить сигнал RTS в лог. 1(+10В), 0 – в лог. 0(–10В). 2: 1–установить запасную линию OUT1 (не используется). 3: 1–установить запасную линию OUT2 (не используется). 4: 1–замкнуть линию TxD на RxD для диагностики порта.
Регистр состояния линии (line status register). Адрес — 3fdh. Доступен по чтению. Регистр контролирует правильность обмена по RS232.
302
Регистр состояния модема (modem status register). Адрес — 3feh. Доступен по чтению. Регистр состояния модема определяет состояние линий квитирова ния RS232. 7 6 5 4 3 2 1 0 Бит № : 0: 1– Линия CTS изменила свое состояние. 1: 1– Линия DSR изменила свое состояние. 2: 1– Линия RI изменила свое состояние. 3: 1– Линия DCD изменила свое состояние. 4: 1– Линия CTS активна (лог. 1). 5: 1– Линия DSR активна (лог. 1). 6: 1– Линия RI активна (лог. 1). 7: 1– Линия DCD активна (лог. 1).
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ
Приложение 2 Удаленные компьютерные системы сбора и обработки информации, поступающей с датчиков аналоговых, частотных и дискретных сигналов на базе 51совместимых однокристальных микроконтроллеров П. 2.1.Удаленные компьютерные системы сбора и обработки информации, поступающей с датчиков аналоговых, частотных и дискретных сигналов на базе микроконтроллеров P80C552 и AT89C51 П. 2.1.1. Краткое описание Система предназначена для предварительной обработки и ввода в компьютер сигналов с датчиков аналоговых (ток или напряжение), частотных (частота, количество импульсов) и диск ретных (включено или выключено) сигналов. Рис. П2.1.1. Блок!схема системы сбора
женными с ним 8канальным коммутатором каналов ф. Analog Devices и одноканальным 24разрядным (используется 16 разрядов) сигмадельтаAЦП ADS1210 ф. BurrBrown(TI) (2й вариант). Прибор имеет встроенную (постоянную и оперативную) память, которая позво ляет запоминать входную информацию, предварительно ее обрабатывать и передавать в компьютер в сжатом виде. Наличие встроенной оперативной памяти программ позволяет отказаться от дорогостоящих эмуляторов и программаторов для микроконтроллеров и ПЗУ. Все программы (в т. ч. и для микроконтроллера) пишутся на компьютере и (при необходимос ти) переносятся в оперативную память программ через тот же интерфейс RS232. Микроконтроллер позволяет предварительно обрабатывать входную информацию и пере давать ее в компьютер, где производится окончательная обработка и распечатка измеренных данных на экране или принтере. Программное обеспечение и конфигурация системы согласуются с заказчиком. Програм мы работают в оконном режиме (меню), поддерживается «мышь». Операционные системы, в которых работает устройство: MSDOS или WINDOWS'98/XP.
П. 2.1.2. Назначение и область использования Система сбора и обработки может найти применение в самых разнообразных отраслях на уки, техники и производства при следующих процессах: 1) автоматизированной градуировке, калибровке и поверке расходомеров и счетчиков объема жидкостей и газов, а также теплосчетчиков, 2) автоматизированном вводе в компьютер показаний датчиков температуры и давления, 3) автоматизированном вводе в компьютер показаний датчиков (микровертушек, тензо и термодатчиков и т. д.), измеряющих гидродинамические параметры турбулентных потоков (скорость, давление, силу и т. п.), используемых в научных исследованиях, 4) вибродиагностике, 5) автоматизированном вводе в компьютер показаний с датчиков, измеряющих меди кобиологические параметры человека: частоту дыхания и сердечных сокращений, кровяное давление, биотоки мозга и т. п.
П.2.1.3. Технические характеристики
Система состоит из компьютера, устройства сбора, предварительной обработки и ввода в компьютер показаний датчиков – устройства сопряжения с объектом (УСО) и программного обеспечения. УСО – прибор в корпусе, который подключается к компьютеру через стандартный интерфейс RS232 (последовательный порт COM 1 или COM 2). Прибор гальванически развязан от компьюте ра с помощью оптронных развязок на пробивное напряжение до 1500 В. Удаление прибора от компьютера может достигать нескольких десятков метров и более в зависимости от скорости об мена информацией. Прибор оснащен 16 (24) разъемами, к которым подключаются кабели от 8 аналоговых и от 8 (16) частотных датчиков, а также разъемом, к которому подключаются диск ретные сигналы. Прибор является специализированным микрокомпьютером на базе микро контроллера P80C552 (ф. Philips) со встроенным 10разрядным 8канальным аналогоцифро вым преобразователем (1й вариант) или микроконтроллера АТ89S8252 (ф. ATMEL) с сопря
304
3.1 — — —
Диапазон аналоговых сигналов: напряжение ...........................................................................................................0÷+5 В, ток ................................................................................................0÷20 мА или 4÷20 мА, погрешность измерения аналогового сигнала .........................±0,005 В (10разр. АЦП) ................................................................................................или ± 0,0005 В (16разр. АЦП).
3.2. Количество аналоговых сигналов ..................................................................................8. 3.3. Диапазон частотных сигналов: — частота ........................................................................................................0,1÷10000 Гц, — количество импульсов ......................................................................................1÷65536. — интервал времени измерения ..................................................................0,05÷3000 с. Количество частотных каналов: ..........................................................8 (с 16разр. АЦП) ................................................................................................или 8 и 15 (с 10разр. АЦП). 3.4. Количество дискретных сигналов: вывода....................................................................1, ввода.......................................................................1.
305
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
Дискретные сигналы совместимы со стандартными TTLуровнями. Возможна поставка системы с гальванической развязкой дискретных сигналов. 3.5. Скорость обмена информацией с компьютером: .......................9600 и 115 200 бод. 3.6. Габариты системы, см: 30х20х8 (корпус от выносного привода CD к компьютeру note book, 40x60x9,5 (компьютерный корпус Slim), 40x60x8 (корпус Super Slim), 40x60x7,5 (корпус Work Station) . 3.7. Питание системы: ...........................................................................................220 в 15 Вт. 3.8. Удаление от компьютера: .........................................................десятки и более метров.
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ Рис. П. 2.1.7.1. Некоторые окна, открывающиеся в программе поверки счетчиков объема газа (OС DOS) (продолжение): б — выбор типа поверяемого прибора; в — ввод электрических параметров датчиков; г — выбор необходимого сопла для поверки
П. 2.1.4. Технико-экономическая эффективность Система сбора и обработки на несколько порядков увеличивает точность измерений, сокраща ет время обработки информации по сравнению как с ручной обработкой, так и с ручным вводом в компьютер и компьютерной обработкой, т. к. в состав системы входит микроконтроллер, произво дящий предварительную обработку. В ряде случаев система сбора является единственно возмож ным средством измерений и обработки их результатов и не имеет альтернативы.
б)
П. 2.1.5. Сведения о документации Документация поставляется с системой сбора на дискете или компакт диске.
П. 2.1.6. Сведения о внедрении Системы сбора и обработки (в различных модификациях) работают на московском за воде «Водоприбор» (водяная система), в А/О «Моспромгаз» (газовая система), ООО «НПП КИПконтроль», Москва (газовая система), Белгородском заводе расходомеров (2 газовых системы), в г. Салавате (водяная система), Уфе (водяная система), Туле (газовая система), Рязани (водяная система), Брянске (газовая система) и др.
П. 2.1.7. Внешний вид окон, открывающихся в процессе работы программы поверки счетчиков объема газа (ОС DOS)
в)
На рис. П. 2.1.7, а–к показан общий вид окон, при использовании программы поверки счетчи ков объема газа. Эта программа написана на Clarion v.3.100 с использованием графического ин терфейса пользователя (Graphic User Interface — GUI3) и работает в ОС DOS. Из рисунка можно уви деть окно, на которое выводится информация при работе тестовой программы, применяемой для поверки самой системы РосТестом рис. П.2.1.7.1,з. Аналогичное окно выводится на экран при пос тавке базового варианта программного обеспечения системы сбора. Рис. П. 2.1.7. Некоторые окна, открывающиеся в программе поверки счетчиков объема газа (OС DOS): а — общий вид меню программы
г)
а)
306
307
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ Рис. П. 2.1.7.1. Некоторые окна, открывающиеся в программе поверки счетчиков объема газа (OС DOS) (продолжение): д — выбор режимов измерения; е — настройка расхода (экран видно издалека); ж — процесс измерений
308
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ Рис. П. 2.1.7.1. Некоторые окна, открывающиеся в программе поверки счетчиков объема газа (OС DOS) (окончание): з — тест системы сбора; и — «прибор годен» (погрешность в заданных границах); к — распечатка графика на бумаге
д)
з)
е)
и)
ж)
к)
309
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ
П. 2.1.8. Примеры работы базового комплекта программ систем сбора на базе микроконтроллера АТ89C51 и АЦП ADS1210 в ОС Windows98/XP
Рис. П. 2.1.8.2. Среда работы — WINDOWS'XP, язык программирования — Clarion v.6.0: a — окно ввода параметров порта связи (порт — COM 2, скорость обмена информацией с компьютером — 115 200 бод) и времени измерения (10 с) перед нажатием кнопки «Запуск»; б — окно вывода результатов измерений показано после окончания измерений, (кнопки «Выход» и «Продолжить» доступны)
На рис. П. 2.1.8.1, а, б показан общий вид окон при работе базового комплекта программ (в тес товом режиме), в ОС Windows98, а на рис. П. 2.1.8.2, а, б — при работе в ОС WindowsXP. Рис. П. 2.1.8.1. Общий вид окон при работе базового комплекта программ: а — окно ввода параметров порта связи (порт — COM 1, скорость обмена информацией с компьютером — 9600 бод) и времени измерения (10 с); показано перед нажатием кнопки «Запуск»; б — окно вывода результатов измерений (в процессе измере! ний). Кнопки «Выход» и «Продол! жить» заблокированы до окон! чания измерений)
а)
а)
б)
б)
П. 2.1.9.Фотографии систем сбора На рис. П. 2.1.9.1 а) — д) показана система сбора для поверки газовых счетчиков в ООО «НПП КИПконтроль» (Москва). Стрелками показано УСО в компьютерном корпусе ти па Slim. Система сбора эксплуатируется с 2000 г. по настоящее время и до сих пор показы вает отличную и надежную работу в составе установки по поверке и градуировке счетчиков объема газа.
310
311
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ
Рис. П. 2.1.9.1. Система сбора для поверки газовых счетчиков в ООО «КИП!контроль» (Москва). (Стрелками показано УСО в компьютерном корпусе типа Slim.) Эксплуатируется с 2000 г.
Рис. П. 2.1.9.1. Система сбора для поверки газовых счетчиков в ООО «КИП!контроль» (Москва). (Стрелками показано УСО в компьютерном корпусе типа Slim.) Эксплуатируется с 2000 г. (продолжение)
312
а)
в)
б)
г)
313
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ
Рис. П. 2.1.9.1. Система сбора для поверки газовых счетчиков в ООО «КИП!контроль» (Москва). (Стрелками показано УСО в компьютерном корпусе типа Slim.) Эксплуатируется с 2000 г. (окончание)
Рис. П. 2.1.9.2. Система сбора для поверки газовых счетчиков в организации Моспромгаз (Москва). (Стрелками показано УСО в корпусе от выносного привода CD.) Эксплуатируется с 1995 г. (продолжение)
д)
б)
На рис. П. 2.1.9.2, а–г показана система сбора для поверки газовых счетчиков в органи зации Моспромгаз (Москва). Стрелками показано УСО в корпусе от выносного привода CD. Эксплуатируется с 1995 г. и до сих пор идеально работает. Рис. П. 2.1.9.2. Система сбора для поверки газовых счетчиков в организации Моспромгаз (Москва). (Стрелками показано УСО в корпусе от выносного привода CD.) Эксплуатируется с 1995 г.
а)
314
в)
315
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ Рис. П. 2.1.9.2. Система сбора для поверки газовых счетчиков в организации Моспромгаз (Москва). (Стрелками показано УСО в корпусе от выносного привода CD.) Эксплуатируется с 1995 г. (окончание)
ПРИЛОЖЕНИЕ 2. УДАЛЕННЫЕ КОМПЬЮТЕРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ИНФОРМАЦИИ
темы сбора с разрешением не хуже 0,001 с (реальное разрешение по времени —не более нескольких микросекунд!). • новая микросхема источника опорного напряжения ADR293 производства ф. Analog Devices Inc., обладающая пониженным уровнем шума, повышенной точ ностью и значительно меньшей зависимостью опорного напряжения от температуры, • новая микросхема защиты входов АЦП от перенапряжений MAX4507 производства ф. MAXIM, защищающая входы от перенапряжений до ±36 В при включенной системе и до ±40 В — при выключенной; применение MAX4507 защищает тракт АЦП от непра вильного подключения датчиков (напряжение питания которых достигает +24 В), т. е. не дает АЦП выйти из строя, • новая микросхема высокоскоростной, высоковольтной (скорость передачи — нес колько Мбод, пробивное напряжение — до 2,5 кВт) гальванической развязки нового типа (без использования оптронов) iCoupler — ADuM1201 производства ф. Analog Devises Inc., сочетающей в одном корпусе сразу два преобразователя — на прием и на передачу; применение таких гальванических развязок позволило резко увеличить надежность работы интерфейса связи системы сбора с компьютером (RS232), особен но на высокой скорости 115 200 бод, значительно снизить электромагнитный шум компьютера, проникающий в тракт АЦП и влияющий на его точность (практически пол ностью его исключить).
г)
П. 2.1.10. Новая система сбора (2005 г.) В феврале 2005 г. закончена разработка новой системы сбора, сконструированной на базе выпуска новейших микросхем от мировых лидеров по производству электронных компо нент (таких как Analog Devices Inc., Texas Instruments, MAXIM и др.). Программное обеспечение системы сбора написано для работы в операционных системах MSDOS(V7.X), Windows98(SE2) и WindowsXP(SP2). Особенностями новой системы являются аппаратные средства и программное обеспечение. Аппаратные средства Аппаратные средства касаются модернизации УСО. Новое УСО отличается от стандартного тем, что в нем применены новейшие микросхемы современной элементной базы, среди которых: • новый высокоскоростной (скорость работы повышена в 3 раза по сравнению со стан дартным) 51совместимый микроконтроллер MSC1210Y5 производства ф. Texas Instruments, в состав которого, в частности, входят: — 24разрядный 8канальный Σ∆АЦП, обладающий возможностью автоматической калибровки нуля и полной шкалы и оснащенный низкочастотными фильтрами, подав ляющими помехи (шум) до 120 дБ; благодаря применению такого АЦП удалось достичь разрешения аналогоцифрового преобразования системы сбора лучше ±0,001 В (ре альное разрешение — не более ±0,0003 В), — сверхпрецизионный системный таймер; использование такого системного тайме ра, совместно с прецизионными кварцевым резонатором и подстроечным конденса тором позволило достичь точности измерения и задания временных интервалов сис
316
Программное обеспечение Программное обеспечение новой системы сбора состоит из 2 программ: 1) для микроко нтроллера (MSC1210) и 2) для компьютера. Программа для микроконтроллера написана на современном языке Cи, обладающем высокими оптимизирующими свойствами по памяти и быстродействию (используется компи лятор C51 V6.14 производства ф. Keil Software). Программа для компьютера поставляется как базовое программное обеспечение для но вой системы: программы, работающей в операционных системах Windows98 (SE2) и WindowsXP(SP2) (язык программирования Clarion V6.0). Программы отличают высокая скорость и надежность работы благодаря использованию в них нового алгоритма обмена по интерфейсу RS232, а также применению прямых процессор ных команд ввода/вывода в порт RS232 (in и out). Необходимо отметить, что если в операци онных системах MSDOS и Windows98 эти команды разрешены, то в WindowsXP они запреще ны (в стандартном режиме работы). Для применения таких команд в WindowsXP в програм мном обеспечении используются недокументируемые команды WindowsXP, работающие в привилегированном режиме. В тестовом режиме работы представленной программы на все частотные входы парал лельно подается один и тот же сигнал с генератора — меандр определенной частоты с ампли тудой 12 В, а на все аналоговые входы — параллельно фиксированное напряжение около 3 В с прецизионного источника питания. Системы сбора могут поставляться в различной комплектации: от полной (рис. П. 2.1.9.1.) — стойка, укомплектованная компьютером с принтером и УСО, укомплектованное датчиками с кабелями связи с УСО, до самой простейшей — только одно УСО. Вариант комплектации вы бирает заказчик. Программное обеспечение систем сбора поставляется с базовым комплектом программ. Это универсальные измерительные тестовые программы (результаты работы программ анало
317
ИНТЕРФЕЙС RS232: СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ
гичны приведенным на рис. П. 2.1.9.1 и П. 2.1.9.2 окнам). Помимо базового комплекта постав ляются программы на заказ (по ТЗ заказчика). Имеются уже готовые разработки программ по поверке и градуировке газовых счетчиков и водосчетчиков, предназначенные для работы сис тем сбора в составе соответствующих установок. Среды работы программ: MSDOS и WIN DOWS'98/XP.
П. 2.1.11. Новая разработка многоканальной системы сбора В настоящее время (конец 2005 г.) ведется новая разработка системы сбора для поверки и градуировки счетчиков объема и расхода воды в московской организации «Водоприбор». Система сбора сконструирована на базе микроконтроллера AT89C51ED2 от ф. ATMEL, сопря женного с ней Σ∆АЦП Burr Brown (Ti), 16канального коммутатора аналоговых каналов и 16 счетчиков импульсов, часть из которых организована на внутренних счетчиках/таймерах микроконтроллера, а остальные используют счетчики/таймеры 82C54, сопряженные с микро контроллером по шине адрес/данные. Все счетчики считают поступающие импульсы одновре менно. Интерфейс системы сбора оборудован развязками ADUM1201; для защиты входов АЦП от перенапряжения используется новая микросхема MAX4507 производства фирмы MAXIM.
Сведение об авторе Алексей Юрьевич Кузьминов родился 7 декабря 1952 г., кандидат технических наук (1982 г.), окончил факультет автоматики и вычислительной техники Московского энергетического инсти тута в 1975 г. по специальности «Автоматизированные системы управления». Сферы деятельности — разработка и ввод в эксплуатацию: • компьютерных удаленных (телеметрических) и автономных (бескомпьютерных) систем сбора и обработки информации, полученной с датчиков аналоговых, частотных и дискретных сигналов на базе 51совместимых микроконтроллеров. email: [email protected] http://www.compmicrosys.ownsite.ru
319
Книги Издательского дома «ДМКпресс» можно заказать в Торговоиздательском холдинге «АЛЬЯНС КНИГА» наложенным платежом, выслав открытку или письмо по почтовому адресу: 123242, Москва, а/я 20 или по электронному адресу: [email protected]. При оформлении заказа следует указать адрес (полностью), по которому должны быть высланы книги; фамилию, имя и отчество получателя. Желательно также указать свой телефон и электронный адрес. Эти книги вы можете заказать и в Internetмагазине: www.abook.ru. Оптовые покупки: тел. (495) 2589194, 2589195; электронный адрес [email protected].
Алексей Юрьевич Кузьминов
ИНТЕРФЕЙС RS232 Связь между компьютером и микроконтроллером От DOS к Windows98/XP
Издательский дом «ДМКпресс», г. Москва (495) 505!10!80 www.dmk!press.ru e!mail: books@dmk!press.ru Подписано в печать 21.02.2006. Печать офсетная. Усл. печ. л. 12. Тираж 3000 экз. Дизайн и верстка издания: ИПЦ «ДМКПресс» (495) 540!04!18, e!mail: ipc@dmk!press.ru http://ipc.dmk!press.ru Дизайн Верстка Корректор
М. М. Селеменив В. М. Серебряков, Е. П. Морозова Л. К. Мусатова Отпечатано в типографии ООО «Финтрекс», г. Москва, ул. Кантемировская, д. 60