А. Ю. КУЗЬМИНОВ
И
Н
Т
Е
Р
Ф
Е
Й
С
RS232 СВЯЗЬ МЕЖДУ КОМПЬЮТЕРОМ И МИКРОКОНТРОЛЛЕРОМ ОТ DOS К WINDOWS98/XP
МОС...
12 downloads
1497 Views
23MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
А. Ю. КУЗЬМИНОВ
И
Н
Т
Е
Р
Ф
Е
Й
С
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–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;jDC 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). Прмой ввод/вывод в порт.'),| 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('') !MUSEC byte,dim(6),over(SUSEC) ! ! Строка и массив со значением регистра MSECL. ! Для 11058 => 32h => 33h,32h. ! Для 22117 => 65h => 36h,35h. SMSECL string('') !MMSECL byte,dim(6),over(SMSECL) ! ! Строка и массив со значением регистра MSECH. ! Для 11058 => 2Bh => 32h,42h. ! Для 22117 => 56h => 35h,36h. SMSECH string('') !MMSECH byte,dim(6),over(SMSECH) ! ! Строка и массив стирания памяти программ M0000. SM0000 string('') !MM0000 byte,dim(5),over(SM0000) ! ! Строка и массив стирания памяти данных M8000. SM8000 string('') !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') then break. . if ion) #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('')!Для 22117. !MMSECH byte,dim(6),over(SMSECH) ! ! Строка со значением регистра CKCON. ! Адрес CKCON=8eh(38h,45h), значение CKCON=00h(30h,30h). SCKCON string('') ! ! Строка и массив стирания памяти программ M0000. SM0000 string('') !MM0000 byte,dim(5),over(SM0000) ! ! Строка и массив стирания памяти данных M8000. SM8000 string('') !MM8000 byte,dim(5),over(SM8000) !
! ! Строка и массив со значением регистра USEC. ! Для 3.686 МГц => 3=03h => 30h,33h. ( 31=02) !только на Vобм. 5=05h => 30h,35h. ( 72=05) ! Для 11.059 МГц => 10=0Ah => 30h,41h. (111=10) ! Для 22.118 МГц => 21=15h => 31h,35h. (221=21) !SUSEC string('')!Для 3,686 !SUSEC string('')!Для 7,373 SUSEC string('')!Для 11,059 !SUSEC string('')!Для 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('')!Для 3686. !SMSECL string('')!Для 7373. SMSECL string('')!Для 11058. !SMSECL string('')!Для 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('')!Для 3686. !SMSECH string('')!Для 7372. SMSECH string('')!Для 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 iDC 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('') !Строка с командой ERASE. MER byte,dim(5),over(CER) !Массив для передачи ERASE. C115 string('') !Строка с командой 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 кбод.. Ok') !220 ! SH
show(4,1,' г==============') show(5,1,' ¦ ADUC '&SN&' ¦')!') show(6,1,' L==============') ! type('') ! ! Стирание памяти микроконтроллера ! 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('Стирание памяти.. Ok') !220 ! ! ! Открываем файл 'file.tsk' для программирования. ! open(BINARY,00h) L=bytes(BINARY) set(BINARY) next(BINARY) !
!Длина файла в байтах. !Читаем файл !файл BINARY.
type('Чтение файла file.tsk.. Ok') T#=clock() setcursor(8,5) type('Программирование файла file.tsk ') type(' ')
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 L24576,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('') !Строка с командой ERASE. MER byte,dim(5),over(CER) !Массив для передачи ERASE. C115 string('') !Строка с командой 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 KINIDC 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(''),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') ! Строка с командой Device ID. MDEVID byte,dim(15),over(CDEVID) !Массив для передачи Device ID. CDERID string(':0100000312EA') ! Строка с командой Derivative ID. MDERID byte,dim(15),over(CDERID) !Массив для передачи Derivative ID. CMANID string(':0100000310EC') ! Строка с командой Manufacturer ID. MMANID byte,dim(15),over(CMANID) !Массив для передачи Manufacturer ID.
207
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
CVERID string(':00000001FF') ! Строка с командой Manufacturer ID. MVERID byte,dim(13),over(CVERID) !Массив для передачи Manufacturer ID. ! ! Строки и массивы для стирания секторов 00000006 ! CER0 string(':03000004010000F8') !Строка с комй ERASE sector 0000 MER0 byte,dim(19),over(CER0) !Массив // CER1 string(':03000004010001F7') !Строка с комй ERASE sector 0001 MER1 byte,dim(19),over(CER1) !Массив // CER2 string(':03000004010002F6') !Строка с комй ERASE sector 0002 MER2 byte,dim(19),over(CER2) !Массив // CER3 string(':03000004010003F5') !Строка с комй ERASE sector 0003 MER3 byte,dim(19),over(CER3) !Массив // CER4 string(':03000004010004F4') !Строка с комй ERASE sector 0004 MER4 byte,dim(19),over(CER4) !Массив // CER5 string(':03000004010005F3') !Строка с комй ERASE sector 0005 MER5 byte,dim(19),over(CER5) !Массив // CER6 string(':03000004010006F2') !Строка с комй ERASE sector 0006 MER6 byte,dim(19),over(CER6) !Массив // ! ! Строка и массив с НУЛЕВЫМ statusbate'ом ! CSB0 string(':020000020300F9') !Строка с комй 0й statusbyte. MSB0 byte,dim(17),over(CSB0) !Массив //. ! ! Строка и массив с UCFG1=63h ! CSUCFG1 string(':02000002006399') !Строка с UCFG1=63h. !CSUCFG1 string(':020000020023D9') !Строка с UCFG1=23h. !CSUCFG1 string(':020000020043B9') !Строка с 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') !Строка с комй DLBR=115200. !CSBRG string(':0200000702F005') !Строка с комй 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 KINIoff,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') ! Строка с командой Device ID. MDEVID byte,dim(15),over(CDEVID) !Массив для передачи Device ID. CDERID string(':0100000312EA') ! Строка с командой Derivative ID. MDERID byte,dim(15),over(CDERID) !Массив для передачи Derivative ID. CMANID string(':0100000310EC') ! Строка с командой Manufacturer ID. MMANID byte,dim(15),over(CMANID) !Массив для передачи Manufacturer ID. CVERID string(':00000001FF') ! Строка с командой Manufacturer ID. MVERID byte,dim(13),over(CVERID) !Массив для передачи Manufacturer ID. ! ! Строки и массивы для стирания секторов 00000006
221
ПРОГРАММНЫЕ СРЕДСТВА ИНТЕРФЕЙСА RS232
! CER0 string(':03000004010000F8') !Строка с комй ERASE sector 0000 MER0 byte,dim(19),over(CER0) !Массив // CER1 string(':03000004010001F7') !Строка с комй ERASE sector 0001 MER1 byte,dim(19),over(CER1) !Массив // CER2 string(':03000004010002F6') !Строка с комй ERASE sector 0002 MER2 byte,dim(19),over(CER2) !Массив // CER3 string(':03000004010003F5') !Строка с комй ERASE sector 0003 MER3 byte,dim(19),over(CER3) !Массив // CER4 string(':03000004010004F4') !Строка с комй ERASE sector 0004 MER4 byte,dim(19),over(CER4) !Массив // CER5 string(':03000004010005F3') !Строка с комй ERASE sector 0005 MER5 byte,dim(19),over(CER5) !Массив // CER6 string(':03000004010006F2') !Строка с комй ERASE sector 0006 MER6 byte,dim(19),over(CER6) !Массив // ! ! Строка и массив с НУЛЕВЫМ statusbyte'ом ! CSB0 string(':020000020300F9') !Строка с комй 0й statusbyte. MSB0 byte,dim(17),over(CSB0) !Массив //. ! ! Строка и массив с UCFG1=63h ! CSUCFG1 string(':02000002006399') !Строка с UCFG1=63h. !CSUCFG1 string(':020000020023D9') !Строка с UCFG1=23h. !CSUCFG1 string(':020000020043B9') !Строка с 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') !Строка с комй DLBR=115200. !CSBRG string(':0200000702F005') !Строка с комй 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 KINIDC15 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;ioff,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('Конфигураци памти микроконтроллера'), !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