Текст
                    Серия «Программируемые системы»
О. Д. ВАЛЬПА
ПОЛЕЗНЫЕ СХЕМЫ
С ПРИМЕНЕНИЕМ
МИКРОКОНТРОЛЛЕРОВ
И ПЛИС
Москва
Издательский дом «Додэка-ХХ1»
2006


УДК 621.382: 004 ББК 32.85 В71 Вальпа О. Д. В71 Полезные схемы с применением микроконтроллеров и ПЛИС (+CD). — М: Издательский дом «Додэка-ХХ1», 2006.—416 с: ил. — (Серия «Программируемые системы»). ISBN 5-94120-129-Х Книга является практическим руководством по самостоятельному изучению и применению на практике различных микроконтроллеров, цифровых адаптеров для ПК типа IBM PC и других полезных в практике разработчика устройств. Она содержит описание различных цифровых электронных устройств и программ, разработанных и испытанных автором этой книги в течение нескольких лет. Множество устройств разработано с применением программируемых логических интегральных схем (ПЛИС). В книге даны советы по программированию и отладке описываемых устройств. Книга включает в себя, кроме электрических принципиальных схем, прошивки и исходные тексты программ, а также описывает технологию программирования. Материал книги послужит хорошим наглядным пособием для изучения некоторых типов микроконтроллеров, адаптеров различного назначения и рабочих программ для их функционирования. На диске записаны прошивки и исходные тексты некоторых программ, приведенных в книге, и исполняемые файлы тестовых и инструментальных программ автора, а также файлы с топологией печатных плат для их изготовления. Книга будет полезна как начинающим разработчикам, так и специалистам в области разработки цифровой электронной аппаратуры. Кроме того, она будет полезна школьникам, студентам технических вузов, инженерам и программистам. УДК 621.382: 004 ББК 32.85 Вальпа Олег Дмитриевич Полезные схемы с применением микроконтроллеров и ПЛИС Издательский дом «Додэка-ХХ1» ОКП 95 300 105318 Москва, а/я 70 Тел./факс: D95) 366-24-29, 366-81-45 E-mail: books@dodeca.ru; red@dodeca/ru Подписано в печать 18.08.2006 г. Формат 60x90/16. Бумага типографская № 2. Гарнитура «Thames». Печать офсетная. Объем 26,0 п. л. Усл. печ. л. 26,0. Тираж 3 000 экз. Изд. № 138. Заказ №2190. Отпечатано с готовых диапозитивов в ОАО «Типография «Новости». 105005 Москва, ул. Ф. Энгельса, 4о ISBN 5-94120-129-Х © Вальпа О. Д. © Наука и Техника, оригинал-макет, 2006 © Издательский дом «Додэка-ХХ1», 2006 ® Серия «Программируемые системы»
Содержание Глава 1 Адаптеры для персонального компьютера IBM PC 1. Адаптер ввода-вывода 3 2. Адаптер сети ETHERNET 20 3. Интерфейс шины ISA на ПЛИС 35 4. Адаптер СОМ-порта на ПЛИС 43 5. Адаптер LPT-порта на ПЛИС 62 6. Адаптер FLASH-диска DOC2000 76 7. Адаптер USB-COM 84 8. Адаптер USB-AVR 103 9. Адаптер USB-HUB 117 10. Адаптер USB-Serial 127 11. Адаптер для связи компьютеров через интерфейс USB 145 12. Адаптер FLASH-памяти 160 Глава 2 Устройства на контроллерах 13. Контроллер 8088 168 14. Минитерминал MCS 207 15. Контроллер с дистанционной модификацией программ 249 16. Универсальные цифровые часы на контроллере AVR 281 17. Музыкальная клавиатура 309 18. Автоматический корректор часов 327 19. PIC-контроллер в автомобильных часах 346
Глава 3 Тестовые устройства и программы 20. Плата диагностики POST 353 21. Эмулятор интерфейса ISA 372 22. Эмулятор ПЗУ 375 23. Тестирование LPT-порта 386 24. Тестирование СОМ-порта 399 25. Автоматизированный фильтр-удлинитель сетевого питания 404 Приложения 409 Приложение 1 Система команд микроконтроллеров MCS-51 409 Приложение 2 Система команд микроконтроллеров AVR 411 Приложение 3 Система команд РЮ микроконтроллеров семейства PIC16F84 414 Приложение 4 Описание компакт-диска к книге 415
Глава 1 Адаптеры для персонального компьютера IBM PC 1. Адаптер ввода-вывода В этом разделе вниманию читателей предлагается устройство под названием «Адаптер ввода-вывода», который подключается к компьютеру через интерфейс ISA и имеет в своем составе регистры ввода и вывода, предназначенные для работы с различными периферийными устройствами (датчиками контроля, кнопками, индикаторами, исполнительными устройствами и т. п.). Данный адаптер позволит познакомиться с принципами построения устройств расширения персонального компьютера через интерфейс ISA и повторить, при желании, эту конструкцию для расширения возможностей компьютера. Адаптер позволяет подключить до 32-х устройств ввода и до 24-х устройств вывода. Например, при решении задачи охраны помещения, данный адаптер позволяет контролировать до 32-х устройств контроля (датчики открытия окон и дверей, кнопки пульта управления и т.д.) и управлять 24-я исполнительными устройствами (сиреной, аварийной лампой, электрозамком и пр.). Несмотря на то что шина ISA постепенно вытесняется в современных компьютерах более производительной шиной PCI, она по-прежнему является шиной промышленного стандарта и зарекомендовала себя как надежная и недорогая шина. Большинство промышленных компьютеров имеет в своем составе шину ISA или ее аналог — РС104. Существуют также устройства расширения шины ISA, позволяющие совместно работать системам, включающим в себя от двух до двадцати устройств с шиной ISA. Рассмотрим структурную схему адаптера, приведенную на Рис. 1.1.
6 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 1.1. Структурная схема адаптера В состав адаптера входят следующие узлы: И — интерфейс; СР — схема разрешения; БД — буфер данных; РК1.. .4 — регистры контроля; П — поле перемычек; ру 1...3 — регистры управления; И1 — индикатор питания; ТР1...3 — твердотельные реле. И2 — индикатор обращения; При включении адаптера схема разрешения (СР) по сигналу сброса от шины ISA принудительно переходит в состояние запрета выходов регистров управления (РУ), и последние переводят выходы управления в третье состояние, что обеспечивает выключение всех исполнительных устройств в начальный момент. Индикатор (И1) индицирует подачу питания на адаптер.
1. Адаптер ввода-вывода 7 Поле перемычек «П» определяет базовый адрес модуля, при обращении к которому адаптер будет отзываться. При совпадении адреса устройства ввода-вывода на шине ISA с базовым адресом модуля интерфейс И зажигает индикатор И2 и вырабатывает один из синхросигналов О—С8, которые управляют чтением и записью регистров контроля (РК) и регистров управления (РУ). Схема разрешения СР активизирует выходы регистров управления (РУ) и включает устройства управления, в управляющие разряды которых были записаны логические нули. Твердотельные реле (ТР) обеспечивают согласование логических выходов регистров управления (РУ) с исполнительными устройствами. Принципиальная электрическая схема адаптера приведена на Рис. 1.2. Интерфейс И выполнен на микросхемах D2, D3, D4 , D5.4 и наборе резисторов RN12. В качестве буфера данных используется микросхема D1 типа КР1533АП6 и набор резисторов RN11. Поле перемычек выполнено на элементе Л. Индикаторы построены на базе элементов HL1, HL2 и R1, R2. Схема разрешения (СР) выполнена на элементах D5.1—D5.3. Функции регистров контроля выполняют микросхемы D9—D12 и наборы резисторов RN1—RN4. Функции регистров управления выполняют микросхемы D6—D8 и наборы резисторов RN5—RN10. В качестве твердотельных реле применены элементы Ul—U12. В адаптеры были использованы следующие элементы: С1 — электролитический конденсатор типа К50-35-47 мкФ-6,3 В, С2—С25 — керамические конденсаторы типа К10-17Б-Н90-0Д мкФ, микросхемы D1 —типа КР1533АП6, D2— SN74HC688, D3 — КР1533АП5, D4— КР1533ИД4, D5 — КР1533ЛАЗ, D6—D8— КР1533ИР23, D9—D12— КР1533ИР22, HL1, HL2 — светодиоды типа АЛС307АМ, Л — любые перемычки или DIP-переключатель, наборы резисторов RN1—RN4, RN11, RN12 — типа НР1-4-9М-0,125-10кОм, a RN5—RN10— типа НР1-4-9М-0Д25-510 Ом, Rl, R2— резисторы типа С2-23-0Д25-1 кОм, твердотельные реле Ul—U12 — типа 5П14.3Б, Х2—Х8 — соединители типа ВН-16. Вместо микросхем серии КР1533 можно применить микросхемы серии К555 или их зарубежные аналоги. Допускается устанавливать не все регистры контроля и управления и связанные с ними элементы, а только количество, необходимое для решения поставленной задачи. Адрес адаптера определяется с помощью установки перемычек Л. Обозначение контактов Л приведено на Рис. 1.3.
8 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 1.2. Принципиальная электрическая схема адаптера
Рис. 1.2. Принципиальная электрическая схема адаптера (продолжение) 1. Адаптер ввода-вывода 9
10 Глава 1. Адаптеры для персонального компьютера IBM PC Пример установки базового адреса адаптера приведен в Табл. 1.1, программно-логическая модель адаптера в Табл. 1.2. Рис. 13. Обозначение контактов Л Таблица 1.1. Пример установки базового адреса адаптера Примечание. Р — разомкнутые контакты, 3—замкнутые контакты. Таблица 1.2. Программно-логическая модель адаптера Примечание. БА (базовый адрес) адаптера выбирается пользователем из области свободных адресов компьютера и устанавливается перемычками на адаптере. Например, при выборе адреса 2F0h необходимо установить перемычки Л: 1-2,3-4,13-14.
1. Адаптер ввода-вывода 11 Конструктивно адаптер выполнен на одной печатной плате с печатным соединителем XI и шторкой-заглушкой. Внешний вид адаптера приведен на Рис. 1.4. Адаптер подключается к шине ISA через свободный слот и крепится к корпусу компьютера с помощью шторки. Топология печатной платы была получена в конструкторском пакете PCAD 4.5. Файл топологии находится на компакт-диске, прилагаемом к этой книге. Рис. 1.4. Внешний вид адаптера
12 Глава 1. Адаптеры для персонального компьютера IBM PC Для того чтобь.1 не повредить компьютер неисправным адаптером, первоначальную отладку адаптеру можно выполнить с помощью несложного эмулятора интерфейса ISA, описываемого в соответствующем разделе этой книги. После того, как адаптер заработает, его можно подключать к шине компьютера. Для тестирования данного адаптера в составе компьютера автором книги был написан тест «test_aw» на языке программирования Си. Эта тестовая программа позволяет проверить работоспособность адаптера в составе компьютера и, кроме того, протестировать все подключенные к нему устройства. Программа запускается в режиме DOS и отображает на экране монитора состояние всех регистров адаптера. Окно работы программы приведено на Рис. 1.5. Справка по управлению программой выводится на самом экране. Рис. 1.5. Окно работы программы Полный исходный текст программы с комментариями приводится ниже. Он может послужить заготовкой для написания другой программы, работающей с адаптером при решении различных прикладных задач. Исполняемый код программы и текст программы на языке Си также записаны на компакт-диске, прилагаемом к этой книге.
1. Адаптер ввода-вывода 13 Текст программы «test_aw» /* Программа «tect_avv» тестирует адаптер ввода-вывода */ /* Режим работы программы:DOS */ /* Автор: Вальпа Олег */ /* Дата: 25.12.2001 */ /* ==========================================================================*/ #include <stdio.h> #include <dos.h> ttinclude <bios.h> tinclude <conio.h> /* Скан коды клавиш */ #define ESC 0x011b #define ENTER OxlcOd #define UP 0x4800 #define Ю1 0x5000 #define LEFT 0x4B00 #define RIGT 0x4D00 #define TAB 0x0f09 #define SPACE 0x3920 #define Kl 0x0231 #define K2 0x0332 #define КЗ 0x0433 #define K4 0x0534 #define K5 0x0635 #define Кб 0x0736 #define K7 0x0837 tdefine K8 0x0538 #define K9 0x0a39 tdefine КО ОхОЬЗО tdefine KF1 0x3b00 #define KF2 ОхЗсОО #define KF3 0x3d00 #define KF4 ОхЗеОО #define KF5 0x3f00 #define KF6 0x4000 #define KF7 0x4100 tdefine KF8 0x4200 tdefine KF9 0x4300 #define KF10 0x4400 /* Координаты сообщений */ #define X 1 #define Y 1
14 Глава 1. Адаптеры для персонального компьютера IBM PC /* Адреса модуля */ #define BAZADR 0x2F0 #define RKO BAZADR + 0 #define RK1 BAZADR + 1 #define RK2 BAZADR + 2 #define RK3 BAZADR + 3 #define RUO BAZADR + 0 #define RU1 BAZADR + 1 #define RU2 BAZADR + 2 #define RU3 BAZADR + 3 void waitOl ( void ); /* Функция задержки */ void clrscreen( void ); /* Функция очистки экрана */ void clrkursor ( void ); /* Функция скрытия курсора */ void setkursor ( void ); /* Функция восст. курсора */ main () { int i,j,stp; int klav;adr=BAZADR,mode=0/datrg[3] ,data; int xr[8], yr[8], adr_rg; xr[0]= 4; xr[l]=23; xr[2]=42; xr[3]=61; xr[4]= 4; xr[5]=23; xr[6]=42; xr[7]=61; yr[0]= 8; yr[l]= 8; yr[2]= 8; yr[3]= 8; yr[4]=16; yr[5]=16; yr[6]=16; yr[7]=16; gotoxy (X,Y); textbackground(BLACK); /* Смена цвета фона */ textcolor(LIGHTGREEN); /* Смена цвета текста */ /* Очистка экрана перед началом */ clrscreen(); clrkursor (); /* скрыть курсор */ /* Вывод заставки */ textcolor (YELLOW); cprintf (« Тест адаптера ввода вывода [Базов.адр.=%4Хп] «,adr); textcolor (LIGHTGREEN); /* Смена цвета текста */ cprintf (« \r\n»); cprintf (« \r\n»); cprintf (« ЗАПИСЬ \r\n»); cprintf (« Регистр RUO (D6) Регистр RUl (D7) Регистр RU2 (D8) Регистр RU3 (D5) \r\n»); cprintf (« Разряды Разряды Разряды включения выходов \r\n»); cprintf (« 7 6 5 4 3 2 10 7 6 5 4 3 2 10 7 6 5 4 3 2 10 \r\n»); cprintf (« 11111111 11111111 11111111 Выходы выключ. \r\n»); cprintf (« \r\n»); cprintf (« \r\n»);
1. Адаптер ввода-вывода 15 cprintf (« \r\n»); cprintf (« ЧТЕНИЕ \r\n»); cprintf (« Регистр RKO (D9) Регистр RKI(DIO) Регистр RK2(D11) Регистр RK3(D12) \r\n»); cprintf (« Разряды Разряды Разряды Разряды \r\n»); cprintf (« 7 6 5 4 3 2 10 7 6 5 4 3 2 10 7 6 5 4 3 2 10 7 6 5 4 3 2 10 \r\n»); cprintf (« 11111111 11111111 11111111 11111111 \r\n»); cprintf (« \r\n»); cprintf (« \r\n»); cprintf (« \r\n»); cprintf (« \r\n»); textcolor(YELLOW); cprintf (« Помощь: \r\n»); cprintf (« <Esc>:выход <ТАВ>: циклич.переход м/д регистрами <Enter>: включение выходов \г\п»); cprintf (« <Space>:dx=00 <F5>:dx=55h <F6>:dx=AAh <F7>:dx=FFh <1>...<8>:инверсия бит \r\n»); cprintf (« \r\n»); textcolor(WHITE); gotoxy (xr[mode] - 1, yr[mode] - 1); cprintf («76543210 «); gotoxy (xrfmode] - 1, yr[mode]); cprintf (« «); gotoxy (xr[mode] + 15, yr[mode]); cprintf (« «); gotoxy (xr[modeJ - 1, yr[mode]+l); cprintf (« «); /*=============r=== Инициализация портов и счетчиков ================*/ datrg[0] = Oxff; datrg[l] = Oxff; datrg[2] = Oxff; outportb ( RU0 , datrg[0] ); /* Установить регистры в пассивное сост. */ outportb ( RU1 , datrg[l] ); /* Установить регистры в пассивное сост. */ outportb ( RU2 , datrg[2] ); /* Установить регистры в пассивное сост. */ /*================= начало опросов и вывода =========================*/ while A) { if( bioskey(l) != 0 ) klav=bioskey@); else klav=0; if(klav != 0) { if(klav==ESC) { /* putchar ( 0x07); */ setkursor (); break; }
16 Глава 1. Адаптеры для персонального компьютера IBM PC if(klav==ENTER) { textcolor(LIGHTRED); gotoxy (xr[3]; yr[3]); cprintf («Выходы включены»); outportb ( RU3 , 0 ); } if(klav==TAB) { textcolor(LIGHTGREEN); gotoxy (xr[mode] - 1, yr[mode] - 1); cprintf («76543210 «); gotoxy (xr[mode] - 1, yr[mode]); cprintf (« «); gotoxy (xr[mode]+15; yr[mode]); cprintf (« «); gotoxy (xr[mode] - 1, yr[mode]+l); cprintf (« «); switch(mode) { case 0: mode = 1; adr_rg = RUl; break; case 1: mode = 2; adr_rg = RU2; break; case 2: mode = 0; adr_rg = RU3; break; default: break; } textcolor(WHITE); gotoxy (xrfmode] - 1, yr[mode] - 1); cprintf (« 7 6 5 4 3 2 1 0 «); gotoxy (xr[mode] - 1, yr[mode]); cprintf (« «); gotoxy (xr[mode]+15, yr[mode]); cprintf (« «); gotoxy (xr[mode] - 1, yr[mode]+l); cprintf (« «); } if (mode <= 2)
Адаптер ввода-вывода 17 { switch (klav) { case Kl: datrg[mode]= datrg[mode] л 0x80 ; outportb ( adr_rg , datrg[mode] ); break; case K2: datrg[mode]= datrg[mode] л 0x40 ; outportb ( adr_rg , datrgfmode] ); break; case КЗ: datrg[mode]= datrg[mode] л 0x20 ; outportb ( adr_rg , datrg[mode] ); break; case K4: datrg[mode]= datrg[mode] л 0x10 ; outportb ( adr_rg , datrg[mode] ); break; case K5: datrg[mode]= datrg[mode] A 0x08 ; outportb ( adr_rg , datrg[mode] ); break; case Кб: datrg[mode]= datrg[mode] A 0x04 ; outportb ( adr_rg , datrg[mode] ); break; case K7: datrg[mode]= datrg[mode] A 0x02 ; outportb ( adr_rg , datrg[mode] ); break; case K8: datrg[mode]= datrg[mode] л 0x01 ; outportb ( adr_rg , datrg[mode] ); break; case KF5: datrg[mode]= 0x55 ; outportb ( adr_rg , datrg[mode] ); break; case KF6: datrg[mode]= OxAA ; outportb ( adr_rg , datrg[mode] ); break; case KF7: datrg[mode]= OxFF ; outportb ( adr_rg , datrg[mode] ); break; case SPACE: datrg[mode]= 0x00 ; outportb ( adr_rg , datrg[mode] ); break; default:
18 Глава 1. Адаптеры для персонального компьютера IBM PC break; } for (i=0; i<=7; i++) { Stp = 1; for (j=0; j<i; j++) stp = stp * 2; gotoxy (xr[mode] - i*2+14,yr[mode]); if ((datrg[mode] & stp) = = 0) {textcolor(LIGHTRED); cprintf («0»);} else {textcolor(LIGHTBLUE); cprintf («1»);} } } textcolor(YELLOW); textcolor(LIGHTCYAN); continue; } /*========================== чтение регистров RK0-3 =================*/ data = inportb ( RKO ); for (i=0; i<=7; i++) { Stp = 1; for (j=0; j<i; j++) stp = stp * 2; gotoxy (xr[ 4] - i*2+14;yr[ 4]); if ((data & stp) == 0) (textcolor(LIGHTRED); cprintf («0»);} else {textcolor(LIGHTBLUE); cprintf («1»)?} } data = inportb ( RK1 ); for (i=0; i<=7; i++) { Stp = 1; for (j=0; j<i; j++) Stp = Stp * 2; gotoxy (xr[ 5] - i*2+14,yr[ 5]); if ((data & stp) == 0) {text color (LIGHTRED); cprintf («0»);} else {text color (LIGHTBLUE); cprintf («1»);} } data = inportb ( RK2 ); for (i=0; i<=7; i++) { Stp = 1; for (j=0; j<i; j++) stp = stp * 2; gotoxy (xr[ 6] - i*2+14,yr[ 6]); if ((data & stp) == 0) (text color (LIGHTRED); cprintf («0»);} else {textcolor(LIGHTBLUE); cprintf («1»);} } data = inportb ( RK3 ); for (i=0; i<=7; i++) { Stp = 1; for (j=0; ]<i; j++) stp = stp * 2; gotoxy (xr[ 7] - i*2+14,yr[ 7]);
1. Адаптер ввода-вывода 19 if ((data & stp) -= 0) {textcolor(LIGHTRED); cprintf («0»);} else (textcolor(LIGHTBLUE); cprintf («1»);} } } /*========================== конец всех опросов =====================*/ /* Очистка экрана перед выходом */ textbackground(BLACK); /* Смена цвета фона */ textcolor(LIGHTGRAY); /* Смена цвета текста */ cprintf(«\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n»); cprintf(«\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n»); return @); } /*========== функция задержки =======================================*/ void waitOK void ) { gotoxy (X+0,Y+0); cprintf (« \b»); } /* Функция очистки экрана*/ void clrscreen( void ) { cprintf(«\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n»); cprintf(«\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\h»); } /* Функция скрытия курсора */ void clrkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.ex = OxOfOO; int86@xl0, &regs, kregs); } /* Функция восстановления курсора */ void setkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs. x. ex = 0x0708; int86@xl0; &regs, &regs); }
20 Глава 1. Адаптеры для персонального компьютера IBM PC 2. Адаптер сети ETHERNET В настоящее время среди многообразия цифровых интерфейсов широкое распространение получила локальная вычислительная сеть (ЛВС). Одним из основных устройств ЛВС является адаптер сети или сетевая карта. До недавнего времени эти устройства считались очень сложными — тайной за семью печатями. Сегодня, благодаря появлению микросхем-контроллеров сети, такой адаптер значительно упростился. Здесь рассказывается о схемотехнике одного из таких адаптеров собственной разработки и о том, как изготовить такую сетевую карту своими руками. Предлагаемый вашему вниманию адаптер сети разработан на базе микросхемы-контроллера сети CS8900A фирмы Cirrus Logic. Данная микросхема сочетает все необходимые узлы для формирования и поддержания сетевого интерфейса Ethernet (IEEE 803.2) и, кроме того, позволяет подключить ее к интерфейсу ISA без каких либо дополнительных микросхем. Адаптер, построенный на основе данной микросхемы, содержит минимальное количество элементов и не требует настройки. Кроме того, для такого адаптера подходят драйверы некоторых сетевых карт, разработанные для популярных операционных систем типа DOS, Windows, Unix и т. п. Но об этом позже. Итак, рассмотрим все по порядку. Ниже приведена краткая техническая характеристика контроллера CS8900A: • встроенный интерфейс шины ISA; • поддержка сетевого протокола IEEE 803.2 Ethernet; • максимальное потребление тока 55 мА; • индустриальный температурный диапазон работы; • наличие режима прямого доступа к памяти (ПДП); • встроенные буферы приема и передачи данных; • поддержка порта 10BASE-T с автоматическим определением полярности сигнала; • поддержка коаксиальных AUI (Attachment Unit Interface) портов 10BASE2,10BASE5 и 10BASE-F; • поддержка удаленной загрузки через BOOT ROM; • поддержка спящего режима. Сети могут прокладываться толстыми коаксиальными кабелями с волновым сопротивлением 100 Ом (Ethernet AUI) и с разъемами DB-15 на конце, тонкими коаксиальными кабелями с волновым сопротивлением 50 Ом (Ethernet 10BASE2,10BASE5 и 10BASE-F), и с разъемами типа BNC, а так-
2. Адаптер сети ETHERNET 21 же витой парой (Ethernet 10BASE-T, 100BASE-T) с обжимными разъемами типа RJ-45. Последний вид сетей получил наибольшее распространение в настоящее время, поскольку является наиболее скоростным и надежным. Структурная схема чипа приведена на Рис. 2.1. Рис. 2.1. Структурная схема чипа Как следует из рисунка, микросхема содержит встроенный интерфейс шины ISA (ISA Bus Logic). По внутренней шине данных менеджер памяти (Memory Meneger) имеет прямой доступ к блоку оперативной памяти (RAM) размером 4 кБ, к блоку контроля постоянной перезаписываемой памяти (EEPROM Control) и к блоку обработки MAC (Media Access Control) адресов (803.2 MAC Engine). Последний блок обеспечивает обнаружение коллизий (конфликта передатчиков), генерацию и детектирование преамбул (маркеров) пакета, генерацию и тестирование кода контрольной суммы (CRC). Этот же блок формирует сигналы для блока контроля индикаторов (LED Control), который,обеспечивает свечение индикаторов наличия сети LANLED и подключения к ней LINKLED. Кроме того, блок обработки адресов непосредственно связан с блоком кодека (Encoder Decoder & PLL), который осуществляет преобразование кодировки сигналов из кода NRZ в Манчестерский код и обратно.
22 Глава 1. Адаптеры для персонального компьютера IBM PC Этот блок связан непосредственно с блоками приемопередатчиков сигналов и детектора коллизий для коаксиальной линий связи (АШ Receiver, AUI Transmitter, AUI Collision) и приемопередатчиков сигналов, совмещенных с аналоговыми фильтрами для витой пары A0BASE-T Rx Filters & Receiver, 10BASE-T Tx Filters & Transmitter). Блок Encoder Decoder & PLL распознает наличие несущей частоты сигнала в линии связи и осуществляет фазовую автоподстройку частоты приемника сигнала посредством узла PLL (Phase-Lock Loop). Синхронизация данного блока и в целом всей микросхемы производится блоком синхронизации Clock, вырабатывающим тактовые сигналы с частотой 20 МГц с помощью внешнего кварцевого резонатора. Кроме того, микросхема содержит блок управления питанием (Power Manager), который переводит ее в режим низкого потребления при продолжительном отсутствии сеансов связи, и блок тестирования (Boundary Scan Test Logic). Этот блок активизируется с помощью внешних выводов TEST и AEN микросхемы и осуществляет формирование тестовых сигналов на выводах микросхемы по определенному алгоритму. Подробное описание микросхемы контроллера можно найти в [1]. Несколько слов о МАС-адресе. МАС-адрес — это уникальный серийный номер, присваиваемый каждому сетевому устройству для идентификации его в сети. Он необходим для определения точки назначения пакетов (frames) в сети Ethernet. МАС-адрес присваивается адаптеру его производителем и может быть изменен программным образом. Делать это необходимо при изготовлении нового устройства или в случае обнаружения двух устройств в сети с одним МАС-адресом. О том, как это делается, — чуть позже. В процессе работы сетевые адаптеры просматривают весь проходящий сетевой трафик и ищут в каждом пакете свой МАС-адрес. Если таковой находится, устройство (адаптер) декодирует этот пакет. Существуют также специальные способы по рассылке пакетов одновременно всем устройствам сети (broadcasting). Каждый производитель сетевых устройств присваивает адреса из принадлежащего ему диапазона адресов. Идентификатор производителя OUI (Organizationally Unique Identifier) занимает первые 3 байта МАС-адреса. МАС-адрес имеет длину 6 байт D8 бит) и обычно записывается в шестнадцатеричном виде, например 00:20:34:78:90: AF. Регистр символов роли не играет. Разделительные знаки («:», «-» и пр.) могут отсутствовать, но их наличие делает число более читаемым. Для сетевых устройств первый байт всегда равен 00 (Другие значения используются для broadcast и multicast адресации). Соответствие МАС- адреса компании-производителю можно найти в Интернете на сайте
2. Адаптер сети ETHERNET 23 http://void.ru. Узнать МАС-адрес устройства, установленного в компьютер, можно программным способом. Для этого следует выполнить следующую последовательность действий: Пуск -> Выполнить ¦> Winipcfg. Структурная схема адаптера приведена на Рис. 2.2. С целью упрощения из нее исключены коаксиальные сетевые окончания AUI, как морально устаревшие, и не задействован механизм удаленной загрузки из внешнего ПЗУ (BOOT ROM) по причине его редкого применения на практике. При необходимости данные узлы легко могут быть добавлены в схему, поскольку микросхема имеет все необходимые выводы для такого подключения. Как видно из схемы, контроллер сети подключен с одной стороны непосредственно к интерфейсной шине ISA персонального компьютера, а с другой стороны — к развязывающему и согласующему трансформатору, после которого включен стандартный соединитель RJ-45 для подключения витой пары. К соответствующим выводам контроллера подключен кварцевый резонатор на 20 МГц и внешнее постоянное перезаписываемое устройство EEPROM для записи и хранения сетевого адреса и других служебных установок адаптера. Рис. 22. Структурная схема адаптера Принципиальная схема адаптера приведена на Рис. 2.3. На ней представлены все электрические связи между компонентами адаптера, названия цепей и позиционные обозначения компонентов. CS8900A
24 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 23. Принципиальная схема адаптера
2. Адаптер сети ETHERNET 25 Как и во всех цифровых схемах, функцию фильтрующих элементов по цепи питания выполняют конденсаторы. В нашем случае это элементы С4—ОЗ. В схеме имеется еще один фильтрующий узел R8 С15, обеспечивающий фильтрацию ложных импульсов по цепи сброса на шине ISA, возникающих в результате наведения сигналов с параллельных линий и имеющих малую длительность — доли микросекунды. Индикаторы состояния адаптера и режима его работы HL1 и HL2 подключены к контроллеру через токоо- граничивающие резисторы R6 и R7. Резисторы Rl—R3 и конденсаторы С1—СЗ совместно с трансформатором Т1 обеспечивают гальваническую развязку и согласование с сетевой линией связи. Опять же с целью упрощения схемотехники адаптера и сокращения его стоимости из схемы удален дешифратор адресов старше SA19. Это не сказывается негативно на работе адаптера, поскольку в контроллере предусмотрен альтернативный способ обращения к внутренним его ресурсам как к устройствам ввода-вывода. Поэтому вывод CHSEL контроллера подтянут к шине питания через резистор R10, запрещая, тем самым, обращения через окно памяти. Аналогично притянуты к пассивным уровням управления выводы TEST и RES, поскольку режим тестирования не используется в данном адаптере. Перечень элементов адаптера приведен в Табл. 2.1. Таблица 2.1. Перечень элементов адаптера Позиционное обозначение BQ1 С4 Наименование Кварцевый резонатор 20 МГц Конденсатор электролитический SR-10-47 Количество 1 1 Примечание 10 В 47 мкФ ЧИП-конденсаторы 0805 С1, СЗ, С5-С13 С2 0,1 мкФ 68 пФ 11 1 Микросхемы D1 D2 CS8900A-CQ AT93C46-10SC(I) 1 1 TQFP-100 SOIC-8 Светодиоды HL1,HL2 I L934GC 1 2 1 Зеленый ЧИП-резисторы 0805 A206) R1 R2,R3 R4,R5 R6,R7 R8 Tl 100 24 4,7 кОм 680 1кОм Трансформатор 25T-1751F3 AT0049S, 1T0016S) 1 2 2 2 1 1 SOIC-16 Соединители X2 Розетка TJ4-8P8C Шторка 1 1 RJ-45
26 Глава 1. Адаптеры для персонального компьютера IBM PC Контроллер CS8900A имеет варианты исполнения. Соответствие названий контроллера этим вариантам приведено в Табл. 2.2. Таблица 2.2. Соответствие названий контроллера вариантности исполнения Сборочный чертеж печатной платы со стороны компонентов и со стороны пайки приведен на Рис. 2.4 и Рис. 2.5. Габаритные размеры платы составляют 70,6x158,5 мм. Топология печатной платы для этих же сторон приведена на Рис. 2.6 и Рис. 2.7. Файлы принципиальной электрической схемы и топологии печатной платы находятся на компакт-диске, прилагаемом к этой книге. После монтажа адаптера необходимо убедиться в правильности установки всех элементов и отсутствии короткого замыкания между цепями питания и разноименными цепями адаптера. Адаптер не требует предварительной настройки и после проверки устанавливается непосредственно в свободный слот выключенного персонального компьютера. Теперь пора поговорить о конфигурировании и инсталляции адаптера. Конфигурирование адаптера осуществляется программой setup.exe из пакета драйверов [2] для сетевых адаптеров на базе контроллера CS8900F, свободно распространяемых на сайте компании Cirrus Logic http://www. cirrus.com. Если после запуска этой программы появится сообщение, приведенное на Рис. 2.8, это означает, что адаптер не определяется компьютером из-за ошибок монтажа, неисправности контроллера или по причине конфликта адресов ввода-вывода. В этом случае необходимо устранить причину и повторить процедуру. CS8900A-CQ CS8900A-IQ CS8900A-CQ3 CS8900A-IQ3 TQFP-100 TQFP-100 TQFP-100 TQFP-100
2. Адаптер сети ETHERNET 27 Рис. 2.4. Сборочный чертеж печатной платы со стороны компонентов Рис. 2.5. Сборочный чертеж печатной платы со стороны пайки
28 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 2.6. Топология печатной платы со стороны компонентов Рис. 2.7. Топология печатной платы со стороны пайки
2. Адаптер сети ETHERNET 29 Рис. 2.8. Сообщение программы setup.exe при неудачном определении адаптера При успешном определении адаптера программа setup.exe выведет на экран сообщение, пример которого приведен на Рис. 2.9. Данное сообщение содержит: идентификационный номер (ID) продукта, серийный номер сетевого адаптера, его сетевой адрес (включая МАС-адрес), размер памяти конфигурационной памяти EEPROM, базовый адрес ввода-вывода, номер используемого прерывания, режим доступа к памяти, наличие BOOT ROM, тип используемой операционной системы, режим управления передачей данных и тип соединения. Рис. 2.9. Сообщение программы setup.exe при успешном определении адаптера
30 Глава 1. Адаптеры для персонального компьютера IBM PC После нажатия клавиши Enter программа переходит в режим конфигурирования адаптера с помощью меню, приведенного на Рис. 2.10. Рис. 2.10. Меню программы в режиме конфигурирования адаптера Активизация и выбор элементов меню производится клавишами Alt, стрелками и Enter. Элемент меню Quit позволяет узнать информацию о программе setup с помощью подменю About и выйти из программы с помощью подменю Exit. С помощью элемента меню Adapter можно посмотреть информацию об адаптере (Adapter Info.) или изменить некоторые ее значения (Manual Configure). Изменению могут быть подвергнуты: базовый адрес ввода-вывода (от 200h до 360h), номер используемого прерывания (IRQ5,10,11 или 12), режим обращения к памяти (в нашем случае должен быть установлен disabled), наличие BOOT ROM (в нашем случае также должен быть установлен disabled), тип внешней линии связи A0Base-T или автоопределение), тип используемой операционной системы (Server, DOS или Windows) и режим управления передачей данных (полу- или полнодуплексный). Следующий пункт меню Driver Install позволяет распаковать драйверы для различных операционных систем из каталога с инсталляционными файлами (в нашем случае в этом нет необходимости). И, наконец, последний элемент меню Diagnostics позволяет выполнить автономное самотестирование Self Test или тестирование в сети Network Test. Результат тестирования отображается на экране монитора, что позволяет легко определить неисправность адаптера, если таковая имеется. Генерация и запись МАС-адреса в ПЗУ конфигурации адаптера производиться с помощью двух программ из специального пакета программ
2. Адаптер сети ETHERNET 31 MFG, который свободно распространяется вместе с исходными текстами на сайте фирмы Cirrus Logic [2]. Первая их этих программ, iagen.exe, позволяет сгенерировать множество адресов для последующей поочередной записи их в ПЗУ EEPROM адаптера. После запуска данной программы она запрашивает начальный 12-разрядный МАС-адрес, сколько необходимо сгенерировать адресов и стартовый адрес для первого адаптера. В качестве начального МАС-адре- са можно задать число 002420100001, приведенное в качестве примера в файле описания программ readme.txt данного пакета. Количество адресов может быть произвольным и определяется числом изготавливаемых адаптеров, поскольку каждый из них должен иметь уникальный адрес. Стартовый адрес может начинаться, например, с единицы. После введения этих данных программа сформирует файл ia.dat. Пример работы программы (жирный шрифт) и ввод данных (курсив) приведен ниже. IEEE Ethernet Address / Serial Number Generation Utility Ver. 1.00 11/3/95 Copyright (c) 1995 Crystal Semiconductor Corp. Starting Individual Address A2 hex digits): 002420100001 Number of addresses to generate (decimal): 5 Starting Serial Number (8 hex digits - most signflcant = 0): 1 Created IA.DAT file. Содержимое файла ia.dat, созданного данной программой, приведено ниже. Содержимое файла ia.dat 002420100001 00000001 002420100002 00000002 002420100003 00000003 002420100004 00000004 002420100005 00000005 При необходимости можно дополнить количество генерируемых адресов, задав в качестве стартового адреса последний адрес, увеличенный на единицу.
32 Глава 1. Адаптеры для персонального компьютера IBM PC Вторая программа, eeprom.exe, собственно осуществляет программирование ПЗУ EEPROM сетевого адаптера, используя файл ia.dat как базу адресов. После запуска этой программы она выдаст сообщение вида CS89X0 EEPROM Programming Utility Ver. 1.04 10/21/96 Copyright (с) 1995,1996 Crystal Semiconductor Corp. ERROR! Usage: C:\MFG\EEPROM.EXE script_file (IA/SNJile | /K | /P [ia sn]) /K = Keep the current IA and SN programmed in the EEPROM /P ia sn = Get IA and SN from command line /P = Prompt user for IA and SN Из данного сообщения следует, что необходимо записать в строку вызова этой программы ключевой файл со служебной информацией и какие ключи необходимо применять при ее запуске. В нашем случае необходимо использовать ключевой файл cdb8900.dat, который прилагается к пакету используемых программ, и путь, в котором находится файл ia.dat. Если файл ia.dat находится в одном каталоге с программой eeprom.exe, вместо полного пути к этому файлу надо вписать только имя файла ia.dat. Каждый раз при чтении очередного номера для сетевой карты из файла ia.dat программа будет помечать эту запись звездочкой и добавлять текущую дату. При следующем чтении этого файла прочитанный номер не будет использоваться для программирования. Таким образом, при изготовлении нескольких адаптеров программа автоматически извлекает из файла-базы данных новый адрес и не допускает повторения одного и того же адреса в разных адаптерах. Можно не генерировать файл ia.dat, а указать индивидуальный адрес (IA) и серийный номер (SN) явным образом в строке вызова программы после ключа /Р. Этот вариант можно использовать, когда необходимо запрограммировать один-единственный адаптер, не опасаясь за пересечение адресов. Кроме того, можно оставить без изменения индивидуальный адрес (IA) и серийный номер (SN), записав лишь служебную информацию из ключевого файла cdb8900.dat, используя ключ /К. Строка запуска программы в этом случае будет иметь вид eeprom.exe cdb8900.dat /к. Замечу, что ПЗУ EEPROM адаптера позволяет перезаписывать данные не менее 10000 раз. Это более чем достаточно для изменения номера или проведения экспериментов с адаптером. После успешного конфигурирования и тестирования адаптера можно приступить к инсталляции программного обеспечения на персональный компьютер для полноценной работы в сети. Данный адаптер поддержи-
2. Адаптер сети ETHERNET 33 вается драйверами, входящими в стандартный пакет инсталляционных программ операционных систем Windows 9X/ME/NT и др. Рассмотрим данную процедуру на примере одной из самых распространенных операционных систем Windows 98. После установки адаптера в компьютер необходимо выполнить выполнить следующую последовательнось действий: Пуск -> Настройка -> Панель управления -> Установка оборудования. В появившемся окне программы УСТАНОВКА ОБОРУДОВАНИЯ нажать кнопку ДАЛЕЕ. На предложение программы о поиске устройства Plug and Play — отметить пункт ВЫБРАТЬ ИЗ СПИСКА. Далее в списке оборудования выбрать СЕТЕВЫЕ КАРТЫ. В списке изготовителей необходимо найти группу продуктов компании «Crystal Semiconductor», в которой выделить адаптер Crystal LAN(tm) CS8900 Ehternet. После окончания установки адаптера и перезагрузки компьютера в свойствах последнего должна появиться запись, пример которой приведен на Рис. 2.11. Рис. 2.11. Пример записи в свойствах компьютера после окончания установки адаптера
34 Глава 1. Адаптеры для персонального компьютера IBM PC Дальнейшая настройка параметров сетевого окружения ничем не отличается от стандартной процедуры настройки сети. Адаптер работает на скорости 10 Мбит/с по витой паре и вполне подходит для построения любой ЛВС. В заключении хочется отметить, что описанный контроллер можно применять для организации сети и в других цифровых устройствах. Однако при этом необходимо будет написать собственные драйверы для поддержания протокола сети. Литература 1. http://www.cirrus.com/en/products/pro/areas/PA27.html 2. http://www.cirrus.com/en/support/drivers/ethernet/OS21.html
3. Интерфейс шины ISA на ПЛИС 35 3. Интерфейс шины ISA на ПЛИС При разработке устройств, подключаемых к компьютеру IBM PC через внутреннюю шину, необходимо каждый раз разрабатывать интерфейс шины. Причем каждое новое устройство требует повторной разработки такого интерфейса. Представленный ниже интерфейс, выполненный всего лишь на одной программируемой логической интегральной схеме (ПЛИС) и одном буфере шины, является универсальным и путем простого перепрограммирования может быть превращен в требуемый интерфейс. Интерфейс предназначен для сопряжения элементов разрабатываемого устройства с внутренней шиной ISA персонального компьютера IBM PC. Интерфейсы подобного типа обеспечивают дешифрацию адресного пространства для подключения микросхем памяти в область расширенной памяти компьютера или для подключения микросхем регистров в область портов ввода-вывода компьютера. Кроме того, они формируют сигналы управления для этих микросхем устройства. Поскольку разрабатываемые устройства, как правило, требуют для своей работы выделение области памяти или ввода-вывода и должны формировать разные сигналы управления, приходится каждый раз перерабатывать интерфейс шины для каждого нового устройства. Но если подключить все необходимые сигналы шины к одной перепрограммируемой микросхеме и реализовывать интерфейс шины внутри нее, мы получим практически универсальный интерфейс. Именно эта идея заложена в предлагаемом ниже интерфейсе. Для лучшего понимания схемотехники построения интерфейса шины ISA в Табл. 3.1 приведено описание сигналов шины ISA, а на Рис. 3.1 и Рис. 3.2 приведены диаграммы работы этой шины в режимах чтения и записи данных. Таблица 3.1. Описание сигналов шины ISA Сигнал юснк SDO—SD15 IOCHRDY AEN SAO—SA19 -SBHE LA17—LA23 -MEMR Направление I I/O I О о о о о Описание Контроль канала. Низкий уровень вызывает немаскируемое прерывание NMI Шина данных Готовность устройства Разрешение адресации прямого доступа к памяти Шина адреса Признак наличия данных на старших линиях шины данных SD8—SD15 Опережающие сигналы адреса, требующие записи по спаду сигнала BALE Сигнал чтения памяти
36 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 3.1. (Продолжение) Сигнал -MEMW RESDRV IRQ2—IRQ15 DRQO—DRQ7 -SMEMW -SMEMR -IOW -IOR DACK0-DACK7 -MREF CLC ТС BALE OSC -МЕМ16 -1016 -MASTER ov +5V,-5V,+12V, -12V Направление 0 О I I О о 0 о о 0 о о о о I I I - - Описание Сигнал записи памяти Сигнал сброса Запрос аппаратных прерываний Запрос каналов прямого доступа к памяти Запись в память ниже 1 Мбайт Чтение памяти ниже 1 Мбайт Сигнал записи в порт ввода-вывода Сигнал чтения из порта ввода-вывода Подтверждение запроса каналов прямого доступа к памяти Сигнал регенерации динамической памяти Частота шины Признак завершения счетчика циклов прямого доступа к памяти Разрешение защелки адреса Несинхронизированная с шиной частота Адресуемое устройство поддерживает 16-битные обращения к памяти Адресуемое устройство поддерживает 16-битные обращения к портам Шина захвачена мастером Общая цепь питания Цепи питания Условные обозначения. I — вход, 0 — выход, J/0 — вход/выход. Из временных диаграмм видно, что в режиме чтения данных, в первую очередь на шине, устанавливается адрес выбираемого устройства. Затем, через некоторое время, необходимое для дешифрации адреса, устанавливается сигнал чтения с активным низким уровнем. По заднему нарастающему фронту данного сигнала происходит чтение данных на шине. В режиме записи данных в устройство данные выставляются на шине, и их запись в устройство гарантированно производится также нарастающим задним фронтом сигнала записи. В зависимости от типа обращения со стороны шины к внешнему устройству как к памяти или устройству ввода-вывода сигналами чтения и записи являются-SMEMR и -SMEMWmm -КЖи -IOW соответственно. Более подробную информацию по интерфейсной шине ISA можно найти в [1]. Принципиальная электрическая схема интерфейса представлена на Рис. 33. Интерфейс реализован на недорогой программируемой логической интегральной схеме D1 типа XC9536-15VQ44C фирмы XILINX и буферном элементе D2 типа SN74ALS25. Программирование микросхемы D1
3. Интерфейс шины ISA на ПЛИС 37 осуществляется через внутрисхемный соединитель-вилку Л типа PLS-6. Фильтрующая RC-цепь, состоящая из резистора R1 и конденсатора С5, обеспечивает фильтрацию импульсных помех, присутствующих на сигнале сброса RESDRV. С выхода этой цепи отфильтрованный сигнал R может использоваться для приведения элементов проектируемого устройства в исходное состояние. Используемая в данной схеме ПЛИС имеет 34 перепрограммируемых вывода, 36 ячеек памяти, 180 логических элементов и позволяет осуществлять до 10 тысяч циклов перезаписи. Причем стирание и запись микросхемы могут производиться внутрисхемно, т.е. без выпаивания микросхемы из платы. Это дает еще одно преимущество данному интерфейсу — возможность отладки и изменения схемы интерфейса без переработки печатной платы. Рис. 3.2. Диаграммы работы шины в режиме записи данных Внутренняя схемотехника ПЛИС приведена на Рис. 3.4. На этой схеме все элементы изображены в американском стандарте, поскольку программный пакет, с помощью которого осуществляется проектирование схемы, создан за рубежом. Однако эти обозначения довольно простые, и к ним легко привыкнуть. Из схемы видно, что дешифраторы адреса выполнены на простых логических вентилях типа И-НЕ. Дешифратор портов реализован на элементах NAND8, OR3 и Х74_139, а дешифратор памяти на элементах NAND5 и OR2. Перед этими элементами включены инверторы INV и входные буферы IBUF. Элементы IPAD и OPAD обозначают входы и выходы микросхемы, соответственно. Для изменения дешифрации адресов необходимо лишь удалить или добавить инверторы в определенные адресные линии и перепрограммировать микросхему D1. Для облегчения этой задачи необходимо воспользоваться Табл. 3.2 и Табл. 33, в которых показано, какие
38 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 3.3. Принципиальная электрическая схема интерфейса
3. Интерфейс шины ISA на ПЛИС 39 именно адресные линии должны содержать инвертор для соответствующих дешифратора адреса портов ввода-вывода и дешифратора адреса памяти. Рис 3.4. Внутренняя схемотехника ПЛИС Способ и средства программирования данной микросхемы подробно изложены в разделе этой книги, описывающем плату диагностики POST. Файл isa-xil.jed с прошивкой для программирования микросхемы D1 записан на компакт-диске, который прилагается к этой книге. Предложенный вариант интерфейса позволяет осуществлять обращение к внешнему устройству со стороны шины ISA по адресам устройств ввода- вывода 0x300—0x302, отведенным в персональных компьютерах семейства IBM PC для плат прототипов, т. е. для различных устройств, разрабатываемых с целью сопряжения с компьютером. Кроме того, этот интерфейс позволяет выполнять обращение к внешней памяти по адресам D000:0000—D000:FFFF. Естественно, указанные адреса можно легко изменить описанным выше способом. На Рис. 3.5 приведен пример схемы с применением описанного выше интерфейса шины ISA. Это схема небольшого адаптера расширения, имеющего в своем составе один восьмиразрядный регистр вывода, один восьмиразрядный регистр ввода и статическую память объемом 32 Кбайт.
40 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 3.2. Пример установки инверторов для дешифратора адреса портов ввода-вывода | Адресные линии адаптера SA9 1 1 0 SA8 1 0 1 SA7 0 0 1 SA6 0 1 0 SA5 0 1 0 SA4 0 1 0 SA3 0 1 0 SA2 0 0 0 SA1 X X X SA0 X X X Диапазон адресов 0x300—0x303* 0x278—0x27В 0x180—0x183 | * Данный адрес запрограммирован в схеме. Условные обозначения. 0 — инвертор необходим; 1, X — инвертор не требуется. Таблица 33. Пример установки инверторов для дешифратора адреса памяти 1 Адресные линии адаптера SA19 1 1 SA18 1 1 SA17 0 0 SA16 0 1 SA14—SA0 X X Диапазон адресов на активном выводе ~SM1 (SA15=1) С000:8000—C000:FFFF D000:8000—D000:FFFF* -SM0{SA15=0) СОООЮООО—C000:7FFF D000:0000—D000:7FFF* * Данный адрес запрограммирован в схеме. Условные обозначения. 0 — наличие инвертора необходимо; 1, X — наличие инвертора не требуется. Как следует из схемы, к регистру вывода D3 подключено восемь индикаторов HL0—HL7. Регистр ввода D4 используется для чтения состояния кнопок SB0—SB7. Резисторная сборка RN1 обеспечивает номинальный ток свечения индикаторов, а сборка RN2 подтягивает входные линии регистра ввода D4 к высокому уровню. Статическая память организована на микросхеме D5. Выходные сигналы интерфейса управляют непосредственно записью и чтением в микросхемы регистров и памяти адаптера. Часть сигналов интерфейса не используется, поэтому остается неподключенной. Типы микросхем и номиналы используемых в адаптере элементов приведены на самой схеме. Конденсаторы могут быть любые керамические. Данный адаптер можно использовать в качестве лабораторного адаптера для обучения программированию, в качестве устройства контроля и управления или как блок дополнительной памяти в некоторых системах, построенных на базе одноплатных компьютеров с шиной ISA. Адаптер можно изготовить на специальной макетной плате с печатным разъемом шины ISA и посадочными местами для планарных компонентов. Отладку данного адаптера в статическом режиме можно легко осуществить с помощью эмулятора интерфейса ISA, описанного в соответствующем разделе данной книги. Убедиться в работоспособности
Рис. 3.5. Пример схемы с применением интерфейса шины ISA 3. Интерфейс шины ISA на ПЛИС 41
42 Глава 1. Адаптеры для персонального компьютера IBM PC адаптера, установленного в компьютере, можно с помощью программы debug.exe, входящей в состав операционных систем DOS и Windows. Для этого необходимо выключить компьютер и установить адаптер в свободный слот ISA компьютера. До установки платы в компьютер следует убедиться, что адреса 0x300—0x303 и D000:0000-D000:FFFF не используются другими устройствами. Это легко проверяется в операционной системе Windows через свойства компьютера. После включения компьютера надо запустить программу debug.exe выполнив следующую последовательность действий: Пуск->Выполнить-> debug-»Ok. После ее запуска введите команду О 300,55. В результате индикаторы на адаптере должны светиться через один, отображая число 55h в 16-ричном формате. Если отображенное значение отличается от 55h, это означает, что адаптер неисправен или данный адрес используется другим устройством ввода-вывода, в результате чего возникает конфликтная ситуация при чтении данных от нескольких устройств на одну шину. Для устранения этой ситуации необходимо либо отключить мешающее устройство, либо сменить адрес на адаптере расширения. Проверка регистра чтения кнопок выполняется командой 1300, которая осуществляет чтение данных по адресу 300h из порта ввода-вывода. Перед выполнением данной команды необходимо предварительно нажать одну из кнопок на адаптере, а после выполнения команды убедиться в правильности прочитанных данных. Проверка микросхемы памяти осуществляется записью и чтением произвольных данных в эту микросхему по нескольким адресам и последующим их сравнением. Запись данных в память производится командой Е D:0000, а чтение — командой D D:0000. Для выхода из программы debug.exe введите команду Q. Представленный интерфейс позволяет работать с восьмиразрядной шиной данных. При необходимости он может быть расширен для обеспечения возможности работы с шестнадцатиразрядной шиной данных или с большим количеством устройств ввода-вывода и памяти. Для этого следует лишь применить программируемую микросхему с большим числом выводов. Естественно, что цена такой микросхемы будет выше. Однако в большинстве случаев восьмиразрядный интерфейс вполне подходит для построения большинства систем автоматизации. Даже такая солидная фирма, как OCTAGON SYSTEMS, выпускает всю электронную продукцию и одноплатные компьютеры марки «MicroPC» с 8-разрядной шиной данных. Литература 1. Гук М. Аппаратные средства IBM PC. Энциклопедия. — СПб.: ПитерКом, 1998 —816 с.
4. Адаптер СОМ-порта на ПЛИС 43 4. Адаптер СОМ-порта на ПЛИС Потребность в последовательных портах компьютера была всегда. Остается она и в настоящее время, поскольку множество электронных приборов и устройств подключаются к компьютеру именно через последовательный СОМ-порт. В данном разделе рассказано о том, как дополнить компьютер еще одним или несколькими СОМ-портами с помощью разработанного автором книги адаптера. Последовательные СОМ-порты компьютеров, в основном, выполняют коммуникационные функции. Но, кроме того, они часто применяются для управления различными устройствами, такими как принтеры, сканеры, плоттеры, а также для связи с промышленными объектами в системах автоматизации управления. Через последовательный порт также осуществляется связь с удаленными объектами через модем, включая и выход в глобальную сеть Интернет. Компьютеры типа IBM PC имеют возможность аппаратного увеличения количества последовательных СОМ-портов до четырех. Для этого в служебной области данных BIOS (базовой системы ввода вывода) компьютера зарезервированы служебные ячейки памяти 0000:0400,0000:0402,0000:0404 и 0000:0406, в которых хранятся адреса портов и СОМ1, COM2, COM3 и COM4 соответственно. Если какой-либо из портов не подключен или заблокирован, в соответствующей ячейке будет храниться ноль, что будет означать отсутствие такого порта в компьютере. Стандартными базовыми адресами портов СОМ1—COM4 являются 3F8h, 2F8h, 3E8h и 2E8h. Допускается использование и некоторых других свободных адресов в области портов ввода-вывода компьютера. Ячейки памяти BIOS с адресами 0000Ю47С, 0000:047D, 0000:047E и 0000:047F содержат величину тайм-аута соответствующего порта, т.е. максимальное время ожидания отклика от порта в тиках. Один тик равен 18 мс. Карта адресов СОМ-портов приведена в Табл. 4.1. Таблица 4.1. Карта адресов СОМ-портов Адрес памяти (hex-формат) 0000:0400 0000:0402 0000:0404 0000:0406 0000Ю47С 0000:047D 0000:047Е 0000:047F Содержимое Адрес СОМ 1 Адрес COM2 Адрес COM3 Адрес COM4 Тайм-аут СОМ1 Тайм-аут COM2 Тайм-аут COM3 Тайм-аут COM4 Значение по умолчанию (hex-формат) | 3F8 2F8 ЗЕ8 2Е8 1 1 1 1
44 Глава 1. Адаптеры для персонального компьютера IBM PC Любой из СОМ-портов может быть назначен на обработчик прерывания IRQ3 или IRQ4 с помощью программы SETUP компьютера. Перечисленные выше ресурсы компьютера, как правило, не используются полностью и позволяют внедрить в компьютер дополнительные СОМ-порты, назначив их на зарезервированные места. Для лучшего понимания схемы адаптера СОМ-порта, описываемой ниже, вспомним устройство последовательных портов. Вначале рассмотрим сигналы, выводимые на разъем СОМ-порта. Компьютеры могут иметь девяти- или двадцатипятиконтактные разъемы для СОМ-портов. Назначение сигналов и соответствие их контактам этих разъемов стандартизовано. Описание сигналов СОМ-порта и соответствие этих сигналов контактам разъема порта приведено в Табл. 4.2. Таблица 42. Описание сигналов разъемов DB-9M и DB-25M последовательного СОМ-порта Вывод DB-9M - 5 3 2 7 8 4 6 1 9 ! Q 9 S т 1 7 2 3 4 5 20 6 8 22 Направление О I О I О I I I Название PG (Protected Ground) SG (Signal Ground) TxD (Transmit Data) RxD (Receive Data) RTS (Request To Send) CTS (Clear To Send) DTR (Data Terminal Ready) DSR (Data Set Ready) DCD (Data Carrier Detected) RI (Ring Indicator) Назначение Защитная земля, которая соединяется с корпусом устройства и экраном кабеля Сигнальная земля, относительно которой действуют линии сигналов Выход передатчика Вход приемника Выход запроса передачи данных Вход разрешения передачи данных Выход сигнала готовности терминала к обмену данными Вход сигнала готовности от аппаратуры передачи данных Вход сигнала обнаружения несущей частоты удаленного модема Вход индикатора вызова (звонка) Условные обозначения. О — выход; I — вход.
4. Адаптер СОМ-порта на ПЛИС 45 Из таблицы следует, что СОМ-порт имеет три выходных и пять входных сигналов. При двустороннем обмене между компьютером и устройством по СОМ-порту достаточно использовать всего лишь две сигнальные линии связи: TxD и RxD. Именно эти сигнальные линии переносят информацию между двумя устройствами посредством последовательной передачи и приема бит. Остальные сигналы могут служить для установления протокола связи, поддержки протоколов старт-стопного режима, синхронной передачи данных и т. п. Как правило, СОМ-порт используется для асинхронной последовательной передачи данных. Передача производиться с помощью отправки слов длиной от пяти до восьми бит. Для синхронизации информации каждое передаваемое слово снабжается стартовым и стоповым битом. Кроме того, слова могут дополняться битом контроля четности или нечетности. Формат этих слов представлен на Рис. 4.1. Рис. 4.1. Формат слов СОМ-порта Данный формат слов поддерживается в компьютерах и устройствах, имеющих последовательные порты, с помощью микросхем универсальных асинхронных приемопередатчиков UART (Universal Asynchronous Receiver And Transmitter) типа 16550А. Эти микросхемы являются более развитыми моделями своих предшественников 18052 фирмы Intel, применявшихся в самых первых компьютерах типа IBM PC. Для справки в Табл. 4.3 приведены сравнительные характеристики микросхем данного типа. В современных компьютерах подобные микросхемы могут не присутствовать в явном виде на материнской плате. В таких случаях, как правило, один из чипов компьютера выполняет функции UART. Микросхемы UART имеют в своем составе регистры, с помощью которых и поддерживается программное формирование различных длин слов, скоростей обмена данными и др. параметров СОМ-порта. В Табл. 4.4 дано описание этих регистров и их адресация, а в Табл. 4.5 приведено назначение бит этих регистров.
46 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 43. Сравнительные характеристики микросхем семейства UART | Тип UART 8250 8250А 8250В 16450 16550 16550А Характеристика 1 Базовая модель. Имеет ошибки, приводящие к возможности появления ложных прерываний и учтенные в XT BIOS Модернизированная модель 8050. Ошибки устранены, но потеряна совместимость с XT BIOS. Микросхема не пригодна для применения в AT на скорости 9600 бит/с Исправлены ошибки 8050 и 8050А, восстановлена ошибка в прерываниях, совместима с XT BIOS. Скорость 9600 бит/с также не поддерживает Быстродействующая версия 8250 для AT. Соответствует минимуму для работы с OS/2. Не имеет ошибок, присущих 8250 Развитие 16450. Имеет буфер FIFO с ошибками, не позволяющими его корректно использовать. Может использовать канал DMA для обмена Исправленная версия 16550. Имеет нормально работающий 16-байтный буфер FIFO и канал DMA, которые должны применяться для работы на скоростях 9600 бит/с и выше без потери данных Таблица 4.4. Карта адресов регистров UART Смещение относительно 1 базового адреса 1 Основные регистры 0* 1* 2 3 4 5 6 7 Режим обращения Чтение Регистр приемника RHR (Receive Holding Register) Регистр состояния прерываний ISR (Interrupt Status Register) Регистр состояния линии LSR (Line Status Register) Запись | Регистр передатчика THR (Transmit Holding Register) Регистр разрешения прерываний IER (Interrupt Enable Register) Регистр управления FIFO FCR (FIFO Control Register) Регистр управления линией LCR (Line Control Register) Регистр управления модемом MCR (Modem Status Register) Регистр состояния модема MSR (Modem Status Register) Оперативный регистр SPR (Scratchpad Register) | Регистры установки скорости 0** 1 ** Регистр младшего байта делителя частоты DLL (Divisor Latch Low) Регистр старшего байта делителя частоты DLH (Divisor Latch High) * Регистры доступны, только когда бит 7 регистра LCR, установлен в ноль. ** Регистры доступны, только когда бит 7 регистра LCR, установлен в единицу.
4. Адаптер СОМ-порта на ПЛИС 47 Таблица 4.5. Назначение бит регистров UART Бит Назначение Регистр приемника RHR 7—0 Принимаемые биты данных Регистр передатчика THR 7-0 Передаваемые биты данных Регистр разрешения прерываний IER 7—4 3 2 1 0 Не используются, всегда равны 0 Разрешить прерывание по изменению состояния модема (любой из сигналов линий CTS, DSR, RI, DCD) Разрешить прерывание по ошибке или обрыву линии Разрешить прерывание при завершении передачи Разрешить прерывание по приему слова (в режиме FIFO — прерывание по таймеру) | Регистр состояния прерываний ISR 7.6 5,4 3 2,1 0 00 — обычный режим FIFO, 10 — режим FIFO 16550,11 — режим FIFO 16550A Не используются, всегда равны 0 Прерывание по тайм-ауту приема в режиме FIFO Причина прерывания: И— ошибка или обрыв линии, 10— принят символ, 01 — передан символ, 00 — изменение состояния модема Признак необслуженного запроса прерывания: 0 — есть запрос, 1 — нет запроса Регистр управления FIFO FCR 7,6 5,4 3 2 1 0 Уровень заполнения FIFO, при котором вырабатывается прерывание: 00 — 1 байт (по умолчанию), 01 — 4 байта, 10 — 8 байт, И — 14 байт Не используются, всегда равны 0 Разрешение операций DMA Сброс счетчика FIFO передатчика Сброс счетчика FIFO приемника Разрешение режима FIFO для приемника и передатчика Регистр управления линией LCR 7 6 5 4 3 2 1,0 Управление доступом к делителю частоты Формирование обрыва линии путем посылки нулей Управление паритетом: 0 — вычисляется автоматически, 1 — всегда равен биту 4 Выбор типа контроля четности: 0 — нечетность, 1 — четность Разрешение бита контроля: 0 — запрещен, 1 — разрешен Длина стопового бита: 0 — 1 бит, 1 — 2 бита Длина слова: 00 — 5 бит, 01 — 6 бит, 10 — 7 бит, 11 — 8 бит Регистр управления модемом MCR 7—5 4 2 1 Не используются, всегда равны 0 Разрешение режима диагностики: 0 — запрещен, 1 — разрешен Управление выходным сигналом ОР2 инверсное Управление выходным сигналом ОР1 инверсное
48 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 4.5. (Продолжение) Бит 2 0 Назначение Управление выходным сигналом RTS инверсное Управление выходным сигналом DTR инверсное Регистр состояния линии LSR 7 6 5 4 3 2 1 0 Ошибка принятых данных в режиме FIFO Буфер передатчика пуст Буфер передатчика готов принять слово для передачи | Обрыв линии связи 1 Ошибка стопового бита | Ошибка бита контроля | Переполнение приемника (потеря слова) | Данные приемника готовы Регистр состояния модемом MSR 7 6 5 4 3 2 1 0 Состояние сигнала DCD: 0 — активен, 1 — пассивен Состояние сигнала RI: 0 — активен, 1 — пассивен | Состояние сигнала DSR: 0 — активен, 1 — пассивен | Состояние сигнала CTS: 0 — активен, 1 — пассивен | Изменение состояния сигнала DCD | Изменение состояния сигнала RI | Изменение состояния сигнала DSR | Изменение состояния сигнала CTS | Оперативный регистр SPR | 7—0 Биты временного хранения данных с произвольным доступом | Обратите внимание на то, что при чтении по адресу 0 данные читаются из регистра приемника, а при записи в регистр по адресу 0 данные записываются в регистр передатчика. Кроме того, регистры по адресу 0 и 1 мультиплексируются битом 7 регистра управления LCR. Когда седьмой бит этого регистра равен 0, по адресу 0 будут доступны регистры приемника RHR и передатчика THR, а по адресу 1 — регистр разрешения прерываний IER. Когда же этот бит регистра управления равен 1, регистры по адресу 0 и 1 применяются для чтения и записи регистров старшего DLL и младшего DLH байтов делителя тактовой частоты, определяющих скорость приема и передачи слов в бодах (бит в секунду). Обычно в компьютерах UART синхронизируется частотой 1,8432 МГц. Значение делителя D в этом случае определяется по формуле D=115200/V, где V — скорость передачи в бодах. Для удобства определения значений делителя для всех стандартных скоростей UART можно воспользоваться Табл. 4.6.
4. Адаптер СОМ-порта на ПЛИС 49 Таблица 4.6. Значения делителей для различных скоростей UART Скорость 8 бодах 50 75 150 300 600 1200 2400 4800 7200 9600 19200 38400 57600 115200 Значение делителя (десятичное значение) 2304 1536 768 384 192 96 48 24 16 12 6 3 2 1 Значение делителя A6-ричное значение) 900 600 300 180 СО 60 30 18 10 ОС 6 3 2 1 Значение регистра старшего делителя (HEX) 09 06 03 01 00 00 00 00 00 00 00 00 00 00 Значение регистра младшего делителя (HEX) 00 00 00 80 СО 60 30 18 10 ОС 06 03 02 01 Используя приведенную выше информацию, мною был разработан адаптер СОМ-порта, принципиальная схема которого приведена на Рис. 4.2. Этот адаптер подключается к свободному слоту ISA компьютера. Адаптер состоит из трех микросхем и нескольких пассивных элементов. Основным узлом адаптера является микросхема UART D2. Кроме того, в схеме используется программируемая логическая интегральная схема D1 типа XC9536-15VQ44C фирмы XILINX. На нее возложены функции интерфейса с шиной ISA и управление микросхемой UART D2. Микросхема D3 осуществляет преобразование сигналов микросхемы UART TTL-уровня в стандартные уровни сигналов интерфейса RS-232C. Именно такой стандарт используется для всех выходных и входных сигналов СОМ-портов компьютера. Сигналы нового дополнительного СОМ-порта выведены на разъем — вилку Х2 типа DB-9M — и полностью соответствуют стандартному назначению контактов. Через соединитель Л осуществляется программирование микросхемы D1. Принципиальная схема интерфейса, помещаемого внутрь ПЛИС D1, приведена на Рис. 4.3. Схема состоит из дешифратора адреса, логики управления и буферных формирователей шины данных. Дешифратор адреса выполнен на элементах INV и NAND8. Логика управления собрана на элементах OR2. Роль буферных формирователей выполняют элементы IBUF8 и OBUFT8. Входные и выходные сигналы связаны с контактными площадками IPAD и OPAD микросхемы через буферные элементы IBUF и OBUF соответственно. Двунаправленные сигналы SD0—SD7 и DO—D7 подключены к контактным площадкам IOPAD. Нумерация всех контактных площадок приведена на
Рис. 42. Принципиальная схема адаптера СОМ-порта 50 Глава 1. Адаптеры для персонального компьютера IBM PC
4. Адаптер СОМ-порта на ПЛИС 51 схеме в виде обозначений, начинающихся с английской буквы Р. Сигнал прерывания INT транслируется через элемент OBUDT на вывод IRQ4. Рис. 43. Принципиальная схема интерфейса ПЛИС Если потребуется, сигнал INT можно транслировать на сигнал IRQ3. Для этого в схеме предусмотрен второй такой же элемент. Сигнал IRQ4 — для устранения конфликта, при этом необходимо будет блокировать так же, как это сделано с сигналом IRQ3 в приведенной схеме. Способ и средства программирования микросхемы ХС9536-15 VQ44C подробно рассмотрены в разделе этой книги, описывающем плату диагностики POST. На схеме адаптера конденсаторы СР1 и О—С5 фильтруют напряжение питания по низким и высоким частотам соответственно. Цепочка элементов Rl C6 обеспечивает фильтрацию сигнала сброса, который, как правило, содержит импульсные помехи, способные произвести сброс внутренних регистров адаптера в произвольный момент времени и нарушить, тем самым, его нормальное функционирование. Конденсаторы С7—СЮ работают в схеме умножителя
Глава 1. Адаптеры для персонального компьютера IBM PC напряжения, встроенного в микросхему D3. Благодаря этому умножителю схема адаптера не требует, кроме +5 В, дополнительных питающих напряжений для формирования уровней сигналов RS-232C с амплитудой напряжения плюс 12 В и минус 12 В. Элементы адаптера распаиваются на печатной плате с краевым интерфейсным печатным разъемом XI. Чертеж печатной платы, специально разработанной мною для адаптера СОМ-порта с изображением топологии проводников верхней и нижней сторон, приведен на Рис 4.4 и Рис 4.5 соответственно. Рис. 4.4. Топология проводников адаптера СОМ-порта верхней стороны Рис. 4.5. Топология проводников адаптера СОМ-порта нижней стороны
4. Адаптер СОМ-порта на ПЛИС 53 На Рис. 4.6 и Рис. 4.7 приведены изображения этих же сторон печатной платы с расположением элементов адаптера и шторки адаптера, на которой закрепляется разъем СОМ-порта. Рис. 4.6. Расположение элементов адаптера СОМ-порта с верхней стороны Рис. 4.7. Расположение элементов адаптера СОМ-порта с нижней стороны На компакт-диске, подготовленном для этой книги, находятся файлы со схемой и топологией печатной платы адаптера, разработанные в системе PCAD. Перед первым включением адаптера необходимо убедиться в правильности монтажа всех элементов и отсутствии замыканий на адаптере. Отладку адаптера в статическом режиме можно выполнить на эмуляторе шины ISA, описанном в разд. 21 этой книги. После подачи питания на адаптер необходимо запрограммировать микросхему D1. Файл прошивки для ее программирования под названием isa-com.jed также находится на компакт-диске.
54 Глава 1. Адаптеры для персонального компьютера IBM PC Перед подключением адаптера к компьютеру следует убедиться, что адресное пространство, используемое адаптером, не занято никаким другим устройством в компьютере, и таким образом избежать конфликтной ситуации, способной привести к зависанию компьютера. Если необходимые адреса все же заняты, надо либо перепрограммировать адаптер на новый адрес, либо освободить эти адреса в самом компьютере переносом на свободные. Для изменения базового адреса в адаптере необходимо лишь перепрограммировать микросхему D1, изменив предварительно схему дешифратора адресов. Эти изменения очень простые и сводятся к удалению или установке инверторов в адресные линии дешифратора. Для облегчения этой задачи необходимо воспользоваться Табл. 4.7, в которой показано, какие именно адресные линии должны содержать инвертор для соответствующего базового адреса адаптера. В соответствии с приведенной выше схемой программируемой логики D1 в адаптере будет запрограммирован базовый адрес 3E8h. Таблица 4.7. Пример установки инверторов для дешифратора адреса Адресные линии адаптера А9 А8 1 0 1 1 0 0 А7 1 1 1 0 1 0 А6 1 1 1 0 1 0 А5 А4 0 0 0 1 0 1 A3 1 1 0 1 0 1 А2 X X X X X X А1 X X X X X X АО X X X X X X Базовый адрес адаптера 3E8h* 2E8h* 3E0h 338h 2E0h 238h * Адрес, запрограммированный в схеме. Условные обозначения. 0— наличие инвертора необходимо; 1, X— наличие инвертора не требуется. После выполнения перечисленных выше операций можно подключить адаптер к предварительно отключенному компьютеру и затем включить компьютер. Через несколько секунд после включения компьютера на экране монитора появится таблица устройств, обнаруженных BIOS. Для остановки компьютера в этом месте необходимо нажать клавишу Pause. Обратите внимание на строку с описанием последовательных портов. Эта строка обычно содержит лишь один или два адреса порта. При подключенном к компьютеру адаптере эта строка должна иметь запись примерно следующего вида: Serial Port(s): 3F8, 2F8, ЗЕ8. Это будет означать, что адаптер обнаружен программой BIOS и компьютер имеет
4. Адаптер СОМ-порта на ПЛИС 55 теперь три СОМ-порта. После нажатия любой клавиши компьютер продолжит загрузку операционной системы. При работе в операционной системе DOS убедиться в наличии нового СОМ-порта можно с помощью стандартной утилиты диагностики msd. ехе. После запуска этой утилиты на экране монитора должно появиться изображение, подобное приведенному на Рис. 4.8. Рис. 4.8. Работа утилиты диагностики msd.exe Щелкнув в этой программе мышью по кнопке COM Ports или просто нажав клавишу С, на экране должно появиться окно, изображенное на Рис. 4.9. В нем дается подробная информация о количестве обнаруженных в компьютере СОМ-портов и их настройках. Рис. 4.9. Информация о количестве обнаруженных в компьютере СОМ-портов
56 Глава 1. Адаптеры для персонального компьютера IBM PC При работе в,операционной системе Windows98 и более поздних ее версиях адаптер СОМ-порта обнаруживается, как правило, автоматически. Если этого не произошло, необходимо один раз выполнить процедуру поиска и установки СОМ-порта. Для этого надо выполнить следующую последовательность действий: Пуск->Настройка-»Панель управления->Установка оборудования. После чего разрешить Windows автоматически произвести поиск новых устройств, обнаружить новый адаптер СОМ-порта и установить для него драйверы. Поскольку наш адаптер СОМ-порта будет обнаружен как стандартное устройство, драйверы для него будут установлены из инсталляционного пакета Windows. В дальнейшем операционная система Windows будет осуществлять поддержку нового СОМ-порта в полном объеме. В списке оборудования компьютера теперь будет присутствовать еще один СОМ-порт. Для того чтобы убедиться в этом, необходимо посмотреть свойства компьютера. На Рис. 4.10 показана копия экрана компьютера с операционной системой Windows98 и установленным адаптером СОМ-порта. Рис. 4.10. Копия экрана компьютера с операционной системой Windows98 и установленным адаптером СОМ-порта Для настройки параметров СОМ-порта в операционной системе Windows необходимо выполнить следующую последовательность действий: Пуск-^Настройка-^Панельуправления->Система->Устройства^Порты
4. Адаптер СОМ-порта на ПЛИС 57 СОМ и ЬРТ-»Последовательный порт СОМЗ->Настройка порта. При этом на экране мониторе появится изображение, подобное приведеному на Рис. 4.11. С помощью раскрывающихся меню устанавливаются все необходимые параметры работы СОМ-порта. Рис. 4.11. Окно параметров СОМ-порта Тестирование нового адаптера в составе компьютера можно выполнить с помощью тестовой программы Checkit или Norton Diagnostic. Заглушку для СОМ-порта при использовании этих тестовых программ можно изготовить, воспользовавшись Табл. 4.8. Таблица 4.8. Назначение цепей заглушки, Вывод 1 2 3 4 5 Сигнал DCD RxD TxD DTR SG Направление Вход Вход Выход Выход Вход для тестирования СОМ-порта Вывод 6 7 8 9 Сигнал DSR RTS CTS RI Направление Вход Выход Вход Вход
58 Глава 1. Адаптеры для персонального компьютера IBM PC Заглушка изготавливается из разъема-розетки DB-9F путем распайки перемычек между контактами 3-2, 4-6-1-9 и 7-8. Кроме того, для проверки адаптера СОМ-порта и отладки устройств, подключаемых к нему, можно воспользоваться моей универсальной программой testrs.exe, описанной в разд. 24 «Тестирование СОМ-порта» данной книги. Эта программа записана на компакт-диске, прилагаемом к данной книге. Для программной поддержки СОМ-портов в BIOS компьютера имеется специальное программное прерывание INT14h. Ниже дается описание основных функций этого программного прерывания. Выбор номера функции этого прерывания задается в регистре процессора АН. Функция: 0 — инициализация порта Вход:АН=0 ОХ=номер порта @=СОМ1, 1=С0М2, 2=СОМЗ, 3=СОМ4) АЬ=параметры инициализации порта (битовые разряды): 1,0 - Длина слова: 00 = 5 бит, 01=6 бит, 10=7 бит, 11=8 бит 2 - Длина стоп бита: 0=1 бит, 1=2 бита 4,3 - Контроль четности: 00=нет, 01=нечетность, 11=четность 7...5 - Скорость (бод): 000=110, 001=150, 010=300, 011=600, 100=1200, 101=2400, 110=4800, 111=9600 Выход: AL=состояние модема (битовые разряды): 0 - изменение сигнала CTS 1 - изменение сигнала DSR 2 - изменение сигнала RI 3 - изменение сигнала RxD 4 - готовность приемника 5 - данные к передаче готовы 6 - обнаружен вызов 7 - обнаружен сигнал приемной линии АН=состояние линий (битовые разряды): 0 - готовность данных 1 - ошибка скорости 2 - ошибка четности 3 - ошибка кадрирования 4 - обнаружен перерыв 5 - регистр буфера передатчика пуст 6 - регистр сдвига передатчика пуст 7 - тайм-аут Функция: 1 — передать слово Вход : АН=1 DX=номер порта @=СОМ1, 1=СОМ2, 2=COM3, 3=СОМ4) AL=передаваемое слово Выход: АН, AL=состояние линий и модема (см. функцию 0)
4. Адаптер СОМ-порта на ПЛИС 59 Функция: 2 *— принять слово Вход : АН=2 DX=HOMep порта @=СОМ1, 1=С0М2, 2=СОМЗ, 3=СОМ4) АЬ=не используется Выход: AL=принятое слово АН=состояние линий (см. функцию 0) Функция: 3 — чтение состояния порта Вход:АН=3 БХ=номер порта @=СОМ1, 1=СОМ2, 2=СОМЗ, 3=СОМ4) АЬ=не используется Выход: АН, АЬ=состояние линий и модема (см. функцию 0) Для примера, вызов функции 0 данного прерывания на языке Ассемблер выглядит следующим образом: MOVAH,0 ; функция 0 MOV AL, 11111011В ; 9600 бод, четность, 1 стоп бит, длина слова = 8 бит MOV DX,2 ; номер порта 2-COM3 INT 14 ; вызов прерывания 14h Теперь СОМ-порт будет настроен для работы на скорости 9600 бод, с контролем по четности, одним стоповым битом и длиной слова 8 бит, а регистры АН и AL будут хранить коды состояния СОМ-порта. Ниже приведены примеры программ для работы с последовательным портом на языке Ассемблер. В первом примере производиться инициализация СОМ-порта. Сначала в программе определяется базовый адрес порта, затем производится установка параметров СОМ-порта для работы на скорости 4800 бод, с одним стоп-битом, контролем на четность и восьемью битами в слове» Затем маскируются прерывания» Запишем адрес порта С0М1 в регистр ES = 0040h Запишем в регистр DX = базовый адрес порта С0М1 Запомним адрес порта С0М1 в переменной DX = адресу регистра управления Установим в 1 старший бит регистра управления Установим скорость = 4800 бод DX = адресу старшего байта делителя скорости Установка старшего байта делителя DX = адресу младшего байта делителя скорости Установка младшего байта делителя DX = адресу регистра управления 4800 бод, четность, 1 стоп бит, длина слова = 8 бит ; Инициализация M0V АХ, MOV ES, MOV DX, 40 AX ES:[00] MOV C0M1_ADR, DX ADD DX, MOV AL, OUT DX, DEC DX DEC DX MOV AL, OUT DX, DEC DX MOV AL, OUT DX, ADD DX, MOV AL, OUT DX, 3 80H AL 0 AL 18H AL 3 ПОПОИВ AL СОМ-порта ; 4800 бОД,
60 Глава 1. Адаптеры для персонального компьютера IBM PC DEC DX DEC DX ; DX = адресу регистра разрешения прерываний MOV AL, ООН ; Прерывания запрещены OUT DX, AL Следующие два примера демонстрируют способ чтения и передачи слова через СОМ-порт с ожиданием готовности. ; Чтение слова с ожиданием: MOV DX, C0M1.ADR ; DX = базовому адресу С0М1 ADD DX, 5 ; DX = адресу регистра состояния WAIT: IN AL, DX ; Чтение байта состояния TEST AL, 01H ; Если бит 1 = 1 слово принято JZ WAIT ; Если нет - ждем SUB DX, 5 ; DX = адресу регистра приемника IN AL, DX ; Чтение принятого байта ; Передача слова из АН с ожиданием: MOV DX, C0M1_ADR ; DX = базовому адресу С0М1 ADD DX, 5 ; DX = адресу регистра состояния WAIT: IN AL, DX ; Чтение байта состояния TEST AL, 40H ; Бит 6=1 (готов к передаче очередного байта) JZ WAIT ; Если нет - ждем SUB DX, 5 ; DX = адресу регистра передатчика MOV AL, АН OUT DX, AL ; Передача слова Еще один пример программы передачи строки на принтер по последовательному порту с использованием программного прерывания INT 14h. ; Описываем сегмент данных, в котором расположим все данные программы DATA SEGMENT BYTE PUBLIC 'DATA' ; Сегмент данных TEST DB 'Тест принтера.',0 ; Выводимая строка STOP DB 'Принтер не готов. $' ; Сообщение о готовности DATA ENDS ; Конец сегмента данных CODE SEGMENT BYTE PUBLIC 'CODE' ; Сегмент программы ; Зададим соответствие регистров для использования по умолчанию ASSUME CS:C0DE, DS:DATA, ES:DATA START: ; Начало программы MOV AX, DATA ; Установим DS на сегмент данных MOV DS, AX MOV DX, 0 ; Адрес порта СОМ1 MOV AH, 0 ; Функция О для INT 14 (инициализация порта) MOV AL, ПОШИВ ; Скорость = 4800, четность, 1 стоп бит, 8 бит в слове INT 14 ; Вызов программного прерывания TEST AL, 0010000В ; Принтер готов? (контроль линии DSR) JZ ERR_EXIT ; Если нет, то выход с сообщением MOV BX, OFFSET TEST ; Смещение на выводимую строку LOOP1: ; Цикл печати строки
4. Адаптер СОМ-порта на ПЛИС 61 Приведенные примеры программ можно найти на компакт-диске, прилагаемом к этой книге, в соответствующем названию разделе. Как уже было сказано, компьютер можно дополнить несколькими СОМ-портами. Изготовив два адаптера СОМ-порта с разными базовыми адресами и установив их в компьютер, можно дополнить компьютер двумя новыми портами. Возможно также переработать рассмотренный здесь адаптер, превратив его сразу в двухпортовый. Для этого необходимо добавить в схему еще одну микросхему UART и незначительно изменить схему программируемой логики. Возможно также применение двух портовой микросхемы UART. Разъем для второго СОМ-порта также свободно размещается на шторке самого адаптера. MOV AL, DS:[BX] ; Прочитать очередной символ строки CMP AL, 00 ; Конец строки? JE EXIT ; Да - выходим CALL OUT_BYTE ; Нет - печатаем символ INC BX ; Следующий символ JMP LOOP1 ; Повторить ERR_EXIT: ; Выход по ошибке MOV DX, OFFSET STOP ; Вывод строки на экран M0V АН, 9 ; С помощью функции 9 INT 21 ; Программного прерывания 2In MOV AX, 4C01H ; Завершить программу с кодом возврата 1 INT 21 EXIT: ; Нормальное завершение MOV AL, 0AH ; Перевод каретки CALL OUT_BYTE ; Вызов подпрограммы M0V АХ,4С00Н ; Завершить программу с кодом возврата 0 INT 21 ; Подпрограмма вывода символа из AL на принтер с ожиданием 0UT_BYTE: PUSH AX ; Сохранить используемые регистры PUSH DX LOOP2: PUSH AX MOV DX, 0 ; Порт СОМ1 MOV АН, 3 ; Функция получения состояния INT 14 ; Проверить состояние TEST AL, 20H ; Порт готов? (линия DSR) POP AX JZ LOOP2 ; Если нет - повторить опрос ч MOV АН, 1 ; Функция вывода символа INT 14 ; Выводим символ ЮР DX ; Восстановить регистры ЮР АХ RET ; Возврат в основную программу CODE ENDS ; Завершение кодового сегмента END START ; Конец программы
62 Глава 1. Адаптеры для персонального компьютера IBM PC 5. Адаптер LPT-порта на ПЛИС Множество электронных приборов и устройств подключаются к компьютеру через параллельный порт LPT. Однако компьютер IBM PC имеет всего лишь один такой порт, к которому, как правило, уже подключен принтер. Многократно переключать порт LPTмежду принтером и другими устройствами крайне неудобно, да и нежелательно. В этом разделе рассказано о том, как дополнить компьютер еще одним или несколькими портами LPT с помощью разработанного мной адаптера. В персональных компьютерах типа IBM PC предусмотрена возможность аппаратного расширения количества параллельных портов LPT до трех. Для этого в служебной области данных BIOS (базовой системы ввода-вывода) компьютера зарезервированы служебные ячейки памяти 0000:0408,0000:040А и 0000:040С, в которых хранятся адреса портов LPT1, LPT2 и LPT3 соответственно. Если какой-либо из портов не подключен или заблокирован, в соответствующей ячейке будет храниться ноль, что будет означать отсутствие порта. Стандартными базовыми адресами портов LPT1—LPT3 являются 378h, 278h и 3BCh. Кроме того, ячейки памяти BIOS с адресами 0000:0478, 0000:0479 и 0000:047А содержат величину тайм-аута соответствующего порта, т.е. максимальное время ожидания отклика от порта в тиках. Один тик равен 18 мс. Карта адресов LPT-портов приведена в Табл. 5.1. Таблица 5.1. Карта адресов портов LPT Адрес памяти (hex-формат) 0000:0408 0000Ю40А 0000Ю40С 0000:0478 0000:0479 0000Ю47А Содержимое Адрес LPT1 Адрес LPT2 Адрес LPT3 Тайм-аут LPT1 Тайм-аут LPT2 Тайм-аут LPT3 Значение по умолчанию (hex-формат) 378 278 звс 14 14 14 Любой из портов LPT может быть назначен на обработчик прерывания IRQ5 или IRQ7 с помощью программы SETUP компьютера. Перечисленные выше ресурсы компьютера, как правило, не используются на сто процентов и позволяют внедрить в компьютер дополнительные порты LPT, назначив их на зарезервированные места.
5. Адаптер LPT-порта на ПЛИС 63 Для лучшего понимания схемы адаптера LPT-порта, описываемой ниже, вкратце вспомним устройство портов. Вначале рассмотрим сигналы, выводимые на разъем порта LPT. Аббревиатура, назначение и соответствие этих сигналов контактам разъема порта приведены в Табл. 5.2. Таблица 52. Описание сигналов разъема DB-25F параллельного порта LPT Вывод 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18—25 Направление од O(I) 0A) 0A) 0A) 0A) 0A) O(I) 0A) I I I I од I од од Регистр -CRO DRO DR1 DR2 DR3 DR4 DR5 DR6 DR7 SR6 -SR7 SR5 SR4 -CR1 SR3 CR2 -CR3 Название ^Strob DataO Datal Data 2 Data3 Data 4 Data 5 Data 6 Data 7 -Acknowledge Busy Paper end Select -AutoLF -Error -Imt -Select In Ground Назначение Строб данных (активен низкий уровень) 1 Линия данных 0 Линия данных 1 Линия данных 2 | Линия данных 3 | Линия данных 4 | Линия данных 5 | Линия данных 6 Линия данных 7 | Импульс подтверждения приема байта 1 Принтер занят при высоком уровне сигнала | Конец бумаги в принтере | Принтер включен | Автоматический перевод строки после возврата каретки Ошибка: конец бумаги, OFF- режим или др. ошибка Инициализация принтера Выбор принтера Общий провод Условные обозначения. ОД— выходные линии, состояние которых можно считать из соответствующих регистров; O(I)— выходные линии, состояние которых можно считать, задав направление вывода; I — входные линии; признак инверсии; DR — регистр данных (доступны запись и чтение), SR— регистр состояния (доступно только чтение); CR— регистр управления (доступны запись и чтение).
64 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 53. Назначение разрядов регистров LPT Разряд Обозначение Назначение при состоянии разряда | . 1 0 I | Регистр данных DR (доступен по записи и чтению*) 0 1 2 3 4 5 6 7 DO D1 D2 D3 D4 D5 D6 D7 Высокий уровень Высокий уровень Высокий уровень Высокий уровень Высокий уровень Высокий уровень Высокий уровень Высокий уровень Низкий уровень Низкий уровень Низкий уровень Низкий уровень Низкий уровень Низкий уровень Низкий уровень Низкий уровень | Регистр состояния SR (доступен только по чтению) 0 1 2** 3 4 5 6 -7 TIM PIRQ -ERR SLCT РЕ -ACK BUSY Тайм-аут Исходное Норма Подключен Нет бумаги Не готов Свободен Норма Есть прерывание | Ошибка 1 Автономный режим | Есть бумага | Готов к печати следующего символа 1 Принтер занят (автономный режим или ошибка) J Регистр управления CR (доступен по записи и чтению) -0 -1 2 -3 4 5** 6 7 -ST*B -AULF -INIT -SLIN EIRQ DIR Строб активен CR+LF Работа Разрешить Разрешить DR-вход Строб пассивен | CR Сброс принтера | Запретить вывод на печать | Запретить прерывания от принтера DR-выход Не используется * Режим чтения поддерживается не во всех моделях компьютеров. ** Сигналы поддерживаются не во всех моделях компьютеров. Условные обозначения. признак инверсии сигнала или разряда.
5. Адаптер LPT-порта на ПЛИС 65 Из таблицы видно, что порт LPT имеет восьмиразрядную двунаправленную шину данных, четыре выходных сигнала управления и пять входных сигналов контроля. Все эти сигналы доступны через регистры DR, CR и SR. Назначение разрядов этих регистров дано в Табл. 5.3, а в Табл. 5.4 приведена карта адресов этих регистров. Таблица 5.4. Карта адресов регистров LPT Смещение относительно базового адреса LPT 0 0 +1 +1 4-2 +2 Режим обращения Запись Чтение Запись Чтение Запись Чтение Регистр порта LPT DR DR - SR CR CR Используя приведенную выше информацию, мною был разработан адаптер LPT. Принципиальная электрическая схема адаптера приведена на Рис. 5.1. Этот адаптер подключается к свободному слоту ISA компьютера. Адаптер состоит из трех микросхем и нескольких пассивных элементов. Основным узлом адаптера является программируемая логическая интегральная схема (ПЛИС) D1 типа XC9536-15VQ44C фирмы XILINX. На нее возложены функции интерфейса с шиной ISA, реализация функций регистра управления CR, регистра состояния SR и управление микросхемами D2 и D3. Микросхемы D2 и D3 выполняют функции регистра DR в режиме записи и чтения соответственно. Сигналы нового дополнительного порта LPT выведены на разъем-розетку Х2 типа DB-25F и полностью соответствуют стандартному назначению контактов. Через соединитель Л осуществляется программирование микросхемы D1. Принципиальная электрическая схема прошивки для ПЛИС D1 приведена на Рис. 5.2.
Рис. 5.1. Принципиальная электрическая схема адаптера 66 Глава 1. Адаптеры для персонального компьютера IBM PC
5. Адаптер LPT-порта на ПЛИС 67 Рис. 5.2. Принципиальная схема прошивки для ПЛИС Схема состоит из дешифратора адреса, логики управления и регистра управления CR. Дешифратор адреса выполнен на элементах INV, NAND8, OR3 и Х74_139. Функцию регистра управления CR выполняет элемент Х74_174. Часть сигналов после этого регистра инвертируется
68 Глава 1. Адаптеры для персонального компьютера IBM PC элементами INy для обеспечения совместимости со стандартным программным обеспечением компьютера. Регистр состояния SR как таковой отсутствует в схеме, и его функции выполняет мультиплексор, который коммутирует на шину данных входные сигналы, поступающие с разъема Х2 через контактные площадки IPAD. Сигнал BUSY инвертируется перед мультиплексором для совместимости с программным обеспечением, а неиспользуемые разряды регистра состояния SR подключены к нулевому потенциалу схемы. Способ и средства программирования микросхемы XC9536-15VQ44C подробно описаны в разд. 20 «Плата диагностики POST». Конденсаторы СР1 и С1—С5 фильтруют напряжение питания соответственно по низким и высоким частотам. Цепочка элементов Rl C6 обеспечивает фильтрацию сигнала сброса, который, как правило, содержит импульсные помехи, способные произвести сброс внутренних регистров адаптера в произвольный момент времени и нарушить, тем самым, его нормальное функционирование. Резисторы R2—R18 являются одновременно согласующими и защитными сопротивлениями внутренних цепей адаптера. Резисторы R19—R23 подтягивают входные цепи адаптера к высокому потенциалу. Элементы адаптера распаиваются на печатной плате с краевым интерфейсным печатным разъемом XI. Чертеж печатной платы, специально разработанной автором для адаптера LPT с изображением топологии проводников верхней и нижней сторон, приведен на Рис. 5.3 и Рис. 5.4 соответственно. На Рис. 5.5 и рис 5.6 приведены изображения этих же сторон печатной платы адаптера LPT с расположением элементов адаптера. Перед первым включением адаптера необходимо убедиться в правильности монтажа всех элементов и отсутствии замыканий на адаптере. Отладку адаптера в статическом режиме можно выполнить на эмуляторе шины ISA, описываемом в соответствующем разделе этой книги. После подачи питания на адаптер необходимо запрограммировать микросхему D1. Файл прошивки для ее программирования под названием isa-lpt.jed находится на компакт-диске, прилагаемом к этой книге. Перед подключением адаптера к компьютеру необходимо убедиться, что адресное пространство, используемое адаптером, не занято никаким другим устройством в компьютере для избежания конфликтной ситуации, способной привести к зависанию компьютера. Если необходимые адреса все же заняты, надо либо перепрограммировать адаптер на новый адрес, либо освободить эти адреса в самом компьютере переносом на свободные. Для изменения базового адреса в адаптере необходимо лишь перепрограммировать микросхему D1, изменив предварительно схему дешифра-
5. Адаптер LPT-порта на ПЛИС 69 Рис. 53. Топология проводников печатной платы адаптера ЬРТдля верхней стороны Рис. 5.4. Топология проводников печатной платы адаптера ЬРТдля нижней стороны
70 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 5.5. Расположение элементов адаптера ЬРТдля верхней стороны Рис. 5.6. Расположение элементов адаптера ЬРТдля нижней стороны
5. Адаптер LPT-порта на ПЛИС 71 тора адресов. Эти изменения очень простые и сводятся к удалению или установке инверторов в адресные линии дешифратора. Для облегчения этой задачи необходимо воспользоваться Табл. 5.5, в которой показано, какие именно адресные линии должны содержать инвертор для соответствующего базового адреса адаптера. В соответствии с приведенной выше схемой программируемой логики D1 в адаптере будет запрограммирован базовый адрес 278h. Таблица 5.5. Пример установки инверторов для дешифратора адреса После выполнения перечисленных выше операций можно подключить адаптер к отключенному компьютеру и включить компьютер. Через несколько секунд после включения компьютера на экране монитора появится таблица устройств, обнаруженных BIOS. Для остановки компьютера в этом месте необходимо нажать клавишу Pause. Обратите внимание на строку с описанием параллельных портов. Эта строка обычно содержит лишь один адрес порта. При подключенном к компьютеру адаптере эта строка должна иметь запись примерно следующего вида: Parallel Port(s): 378, 278. Это будет означать, что адаптер обнаружен программой BIOS и компьютер имеет теперь два порта LPT. После нажатия любой клавиши компьютер продолжит загрузку операционной системы. При работе в операционной системе DOS убедиться в наличии нового порта LPT можно с помощью стандартной утилиты диагностики msd. ехе. После запуска этой утилиты на экране монитора должно появиться изображение, подобное тому, что приведено на Рис. 5.7. Щелкнув в этой программе мышью на кнопке LPT Parts или просто нажав клавишу L, на экране должно появиться окно, изображенное на Рис. 5.8. В нем дается подробная информация о количестве обнаруженных в компьютере портов LPT и состоянии их сигналов. * Адрес, запрограммированный в схеме. Условные обозначения. О — наличие инвертора необходимо; 1, X — наличие инвертора не требуется.
72 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 5.8. Окно информации о портах LPT При работе в операционной системе Windows98 и более поздних ее версиях адаптер LPT обнаруживается, как правило, автоматически. Если этого не произошло, необходимо один раз выполнить процедуру поиска и установки порта LPT. Для этого надо выполнить следующие действия: Пуск-»Настройка->Панель управления->Установка оборудования. После этого Windows предлагается автоматически произвести поиск новых устройств, обнаружить новый адаптер LPT и установить для него драйверы. Поскольку наш адаптер LPT будет обнаружен как стандартное устройство, драйверы для него будут установлены из инсталляционного пакета Windows. В дальнейшем операционная система Windows будет осуществлять поддержку нового порта в полном объеме. Рис. 5.7. Работа программной утилиты диагностики msd.exe
5. Адаптер LPT-порта на ПЛИС 73 В списке оборудования компьютера теперь будет присутствовать еще один порт LPT. Для того чтобы убедиться в этом, необходимо посмотреть свойства компьютера. На Рис. 5.9 показана копия экрана компьютера с операционной системой Windows98 и установленным адаптером LPT. Рис. 5.9. Копия экрана компьютера с установленным адаптером LPT Тестирование нового адаптера в составе компьютера можно выполнить с помощью тестовой программы Checkit или Norton Diagnostic. Заглушки для этих тестовых программ можно изготовить, воспользовавшись Табл. 5.6 или Табл. 5.7. Таблица 5.6. Таблица цепей заглушки для тестирования LPT-nopma тестовой программой Checkit Сигнал -Strobe DataO -Init -Slct In -Auto LF Направление Выход Выход Выход Выход Выход Вывод 1 2 16 17 14 Вывод 13 15 10 11 12 Направление Вход Вход Вход Вход Вход Сигнал Select -Error -Ack Busy Paper End
74 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 5.7. Таблица цепей заглушки для тестирования LPT-nopma тестовой прогрйммой Norton Diagnostic Заглушка изготавливается из разъема-вилки DB-25M путем распайки на нем перемычек между контактами, указанными в соответствующей таблице. Для проверки адаптера LPT и отладки устройств, подключаемых к нему, можно воспользоваться моей универсальной программой tst-lpt. ехе, описываемой в разд. 23 «Тестирование LPT-порта». Эта программа записана на компакт-диске, прилагаемом к данной книге. Для программной поддержки LPT-портов в BIOS компьютера имеется специальное программное прерывание INT17h. Ниже дается описание функций этого программного прерывания. Выбор номера функции этого прерывания задается в регистре процессора АН. Функция: 0 - печать символа Вход : АН=0, АЬ=символ, БХ=номер порта @=LPT1, l=LPT2 или 2=LPT3) Выход: АН=статус порта Функция: 1 - инициализация порта Вход : АН=1; АЬ=пусто; БХ=номер порта @=LPT1, 1=LPT2 или 2=LPT3) Выход: АН=статус порта Функция: 2 - чтение статуса порта Вход: АН=2, АЬ=пусто, БХ=номер порта @=LPT1, 1=LPT2 или 2=LPT3) Выход: АН=статус порта A в разряде) 0 - тайм-аут 1 - х 2 - х 3 - ошибка 4 - принтер выбран 5 - конец бумаги 6 - подтверждение 7 - принтер не занят В качестве примера ниже приводится фрагмент программы для вызова функции 1 данного прерывания на языке Ассемблер. MOV АН,01 ; функция 1 MOV DX,01 ; номер порта 1=LPT2 INT 17 ; вызов прерывания 17h Теперь в регистре АН хранится статус порта.
5. Адаптер LPT-порта на ПЛИС 75 Ниже приведена последовательность действий для вывода на печать одного символа. • Вывести передаваемый байт в регистр данных. • Проверять в цикле состояние принтера до установки разряда 7 регистра состояния (здесь возможно использование тайм-аута). • Проверить биты 3—5 регистра состояния на наличие ошибки. • Установить и сразу сбросить нулевой бит регистра управления, выполнив следующую последовательность команд: M0V M0V OUT X0R OUT DX, AL, DX, AL, DX, 0x037A 00001101b AL 1 AL ; адрес регистра управления ; установить биты 3,2 и 0 ; установить нулевой бит регистра управления ; сбросить бит 0 ; сбросить нулевой бит регистра управления Далее можно прочитать регистр состояния и перейти к печати следующего символа. Как было уже сказано, компьютер можно дополнить несколькими портами LPT. Изготовив два адаптера LPT с разными базовыми адресами и установив их в компьютер, можно дополнить компьютер двумя новыми портами. Возможно также переработать рассмотренный здесь адаптер, превратив его сразу в двухпортовый. Второй разъем при этом придется устанавливать на дополнительную шторку ввиду ограничения высоты шторки на самом адаптере. Подключение второго разъема к адаптеру можно осуществлять с помощью шлейфа с обжимным соединителем типа IDC- 26, широко распространенным в компьютерной технике. Естественно, на самом адаптере должна быть установлена ответная часть для такого разъема с сигнальными цепями второго порта LPT.
76 Глава 1. Адаптеры для персонального компьютера IBM PC 6. Адаптер FLASH-диска DOC2000 В настоящее время в качестве внешних электронных накопителей информации особую популярность приобретают твердотельные флэш-диски, которые в ряде случаев вытесняют привычные всем жесткие диски HDD (Hard Disk Driver), называемые в обиходе винчестерами. В этом разделе приводится описание некоторых моделей флэш-дисков и говорится о том, как их использовать в готовых системах и разработках. Флэш-диски применяют вместо стандартных жестких дисков в составе компьютерных систем управления там, где требуется высокая надежность работы, скорость загрузки, малогабаритность, экономичность и долговечность. Кроме того, эти диски незаменимы, например, в цифровых фотоаппаратах. Популярность и применение твердотельных дисков обусловлены, в основном, их высокой надежностью и нечувствительностью к вибрациям, однополярным питанием, отсутствием механических движущихся узлов, малыми габаритами и весом, низким потреблением питания, быстрым временем доступа и др. преимуществами. Существуют различные варианты исполнения таких дисков, которые отличаются, в основном, конструкцией, размерами и типом интерфейса. К их числу относятся флэш-диски с интерфейсами SCSI, ISA, PC-104, ATA IDE, USB и др. Рассмотрим из всего многообразия данных устройств флэш-диск DiscOnChip (микросхему) фирмы M-Systems и разработанный автором на его основе адаптер флэш-диска ISA-DOC2000 с интерфейсом ISA. Флэш-диск DiscOnChip (другое название — DOC2000) разработан и производится израильской фирмой M-Systems, имеющей адрес в Интернет http://www.m-sys.com. Он представляет собой 32-выводной чип с назначением контактов, совпадающим с микросхемами постоянных запоминающих устройств (ПЗУ) типа 27С010. Ниже приведены краткие технические характеристики DiscOnChip. • Время доступа — 150 не. • Скорость чтения — 1,1 Мбит/с. • Скорость записи — 250 Кбит/с. • Количество циклов стирания — не менее 1000000. • Питание —5 В± 10%. • Потребляемый ток в режимах: чтение — от 25 до 40 мА; запись — от 30 до 40 мА; ожидание — от 0,06 до ОД мА; габариты — 44x18x6 мм.
6. Адаптер FLASH-диска DOC2000 77 • Рабочий диапазон температур — от 0 до 70°С или от минус 40 до 85°С (индустриальный вариант). Внешний вид и соответствие имен цепей выводам контактов DiscOnChip приведены на Рис. 6.1 и Рис. 6.2. В Табл. 6.1 приведено назначение контактов DiscOnChip и описание их функционального назначения. Рис. 6.1. Внешний вид DiscOnChip Рис. 62. Соответствие имен цепей выводам контактов DiscOnChip Таблица 6.1. Назначение контактов и описание функционального назначения DiscOnChip
78 Глава 1. Адаптеры для персонального компьютера IBM PC Первоначально эти диски-микросхемы имели емкость 1 Мбайт, но в последнее время размер их памяти увеличился до сотен мегабайт. Для адресации такого объема памяти требуется достаточно большое количество адресных выводов. С целью сокращения числа адресных выводов доступ к этой памяти организован через окна размером 8 Кбайт, для чего достаточно всего 13 адресных линий. DiscOnChip содержит внутри себя несколько функциональных блоков, в том числе и блок постоянного запоминающего устройства, в котором хранится расширение BIOS с программой TrueFFS. Данная программа позволяет полностью эмулировать работу жесткого диска, равномерно использует ресурсы внутренней флэш-памяти DiscOnChip, предотвращая тем самым быструю выработку ресурса записи-стирания одних и тех же ячеек памяти. На Рис. 6.3. приведена функциональная схема DiscOnChip. Рис. 63. Функциональная схема DiscOnChip Из этой схемы следует, что в DiscOnChip присутствует встроенный интерфейс System Interface для связи с внешней системой, блок интерфейса с флэш-памятью Flash Interface и собственно флэш-память Flash. Программа TrueFFS расширения BIOS хранится в блоке памяти IPL. После включения компьютера программа BIOS выполняет подпрограмму тестирования и инициализации POST и производит поиск программ расширения BIOS по определенным областям памяти. При обращении к адресному пространству памяти, в которое включен DiscOnChip, происходит загрузка программы TrueFFS из блока памяти IPL. Эта программа производит инициализацию
6. Адаптер FLASH-диска DOC2000 79 блока конечного автомата State Machine и загрузку драйвера в оперативную память компьютера. Дальнейшая работа с DiscOnChip происходит под управлением этого драйвера с участием блока управления флэш-памятью Flash Control и блока обнаружения и коррекции ошибок EDC/ECC, существенно повышающего достоверность хранимых во флэш-диске данных. Множество современных одноплатных компьютеров имеют в своем составе панельку DIP-32 для установки DiscOnChip. При установке DiscOnChip в такой компьютер последний получает возможность полноценной работы со встроенным флэш-диском, который форматируется и инициализируется операционной системой как обычный жесткий диск, с которого можно производить загрузку операционной системы компьютера. Для установки DiscOnChip на обычный персональный компьютер необходимо использовать адаптер, в качестве которого я предлагаю использовать разработанный мною адаптер флэш-диска ISA-DOC2000 с шиной ISA. Данный адаптер состоит всего из трех легкодоступных микросхем, нескольких конденсаторов, перемычек и 32-контактной панельки, в которую вставляется DiscOnChip. Принципиальная электрическая схема адаптера приведена на Рис. 6.4. Перечень элементов схемы приведен в Табл. 6.2. Таблица 6.2. Элементы схемы Позиционное обозначение Наименование Количество Примечание Конденсаторы типа К10-176 С1—СЗ СР1 ОД мкФ Конденсатор электролитический К53-16-68 мкФ-6,3 В 3 1 Микросхемы Dl, D2 D3 D4 74LS155N (К555ИД4) 74ALS138 (КР1533ИД7) MD2200-02@4,08,12,24)MB 2 1 1 DIP-16 DIP-16 DIP-32 Соединители JP1 JP2 PLD-3 PLD-2 Панелька ICSS-32 Джампер MJ 1 1 1 2 DIP-32 Согласно схеме, элементы Dl—D3 осуществляют дешифрацию адресного пространства памяти размером 8 Кбайт. Конденсаторы СР1 и О—СЗ обеспечивают фильтрацию низкочастотных и высокочастотных помех. Сигналы управления, адресной шины и шины данных ISA поступают непосредственно на выводы микросхемы DiscOnChip D4. В зависимости
Рис. 6.4. Принципиальная электрическая схема адаптера 80 Глава 1. Адаптеры для персонального компьютера IBM PC
6. Адаптер FLASH-диска DOC2000 81 от типа установленной микросхемы D4 изменяется объем памяти флэш-диска. При этом не требуется делать никаких дополнительных операций с адаптером. Возможные для установки типы DiscOnChip и соответствующий им размер флэш-памяти приведен в Табл. 6.3. Таблица 63. Типы DiscOnChip и размеры их флэш-памяти Л.'::-- '¦ '-.'ТИП MD2200-02MB MD2200-04MB MD2200-08MB MD2200-12MB MD2200-24MB Форматированная емкость, Мбайт 2 4 8 12 24 Секторов 3904 7888 15920 23952 48032 Адаптер можно изготовить на небольшой макетной плате, к которой прикрепляется фрагмент с печатным разъемом ISA (например, отрезанный от неисправного адаптера), или разработать и изготовить для него двустороннюю печатную плату. С помощью перемычек JP1 и JP2 можно установить адрес сегмента окна доступа к адаптеру в соответствии с Табл. 6.4. Таблица 6.4. Способ определения адреса сегмента окна доступа Так, например, при установке перемычек JPl:l-2 и JP2:3-4 (выделенная строка таблицы) обращение к адаптеру будет возможно по адресу СС00Ю000—CDFF:000F. Поскольку при вычислении полного физического адреса процессор компьютера складывает сегмент и смещение со сдвигом на 12 бит, полный адрес доступа будет иметь диапазон CC000—CDFFF. Перед установкой перемычек и самого адаптера в компьютер необходимо проверить правильность монтажа всех соединений и отсутствие коротких замыканий между разноименными цепями. Предварительно работоспособность адаптера можно проверить в статическом режиме с помощью эмулятора шины ISA, описываемого в
82 Глава 1. Адаптеры для персонального компьютера IBM PC разд. 21 этой книги. Для этого адаптер вставляется в эмулятор шины без установленного в панельку DiscOnChip. На эмуляторе выставляется адрес окна обращения и формируются сигналы записи и чтения. Если адаптер исправен, сигналы выборки и управления будут формироваться на соответствующих выводах панельки DiscOnChip. При выборе и установке рабочего адресного окна адаптера необходимо убедиться в том, что это окно не занято другими устройствами компьютера, или зарезервировать нужную область, воспользовавшись изменением свойств компьютера (Рис. 6.5). Рис 6.5. Окно свойств компьютера После установки адаптера и включения компьютера произойдет обнаружение нового диска в системе, и на экране монитора при загрузке появится надпись примерно следующего содержания: DOC Socet Services-Version 0.2 (С) Copyright 1992-1996, M-Systems Ltd. TrueFFS-BIOS - Version 3.3.9 for DiskOnChip 2000 (V4.2) Copyright (C) M-Systems, 1992-2000
6. Адаптер FLASH-диска DOC2000 83 По окончании загрузки в компьютере появляется новый диск D, ничем не отличающийся от обычного жесткого диска. С ним можно работать как с обычным диском любыми доступными средствами: создавать и удалять файлы, форматировать, делать системным и даже дефрагментировать его. Помимо всего этого, DiscOnChip снабжается специальными утилитами, разработанными фирмой производителем и доступными на сайте компании по адресу http://www.m-sys.com. Эти утилиты позволяют посмотреть характеристики диска, сделать флэш-диск первым загружаемым диском при старте компьютера, выполнить на нем низкоуровневое форматирование и т. п. Перечень некоторых утилит и их назначения приведены ниже: DINFO.EXE — утилита информации; DFORMAT.EXE — утилита форматирования; DUPDATE.EXE — обновление программного обеспечения bootimage; DOC2000.EXB — файл загрузки bootimage; DOCPMAP.EXE — утилита низкоуровнего доступа к диску. Например, выполнив программную утилиту DOCPMAP.EXE с КЛЮЧОМ I — >docpmap.exe /i , получим на экране монитора сообщение типа DOCPMAP Version 3.3.7 for DiskOnChip 2000 (V4.2) Copyright (С) M-Systems, 1992-1999 DiskOnChip MD2200-T16A6) detected on address: dcOO Оно означает, что программа обнаружила в компьютере флэш-диск по адресу DC00:0h. Если необходимо, чтобы флэш-диск обнаруживался компьютером как диск С, следует отключить имеющиеся жесткие диски компьютера или запретить их обнаружение в SETUP. При необходимости использовать флэш-диска как диска С без отключения жестких дисков надо включить флэш-диск как D и выполнить программную утилиту >dformat.exe d:/first /s:doc2000.exb. После перезагрузки компьютера флэш-диск появится на компьютере как диск С, а жесткий диск как D. В заключении заметим, что рассмотренный выше DiskOnChip полностью совместим с операционными системами DOS, Windows, QNX и др., благодаря чему он имеет большое будущее.
84 Глава 1. Адаптеры для персонального компьютера IBM PC 7. Адаптер USB-COM Наверняка многие энтузиасты-разработчики давно хотят прикоснуться к таинственному миру устройств с интерфейсом USB. Здесь рассказывается о том, как осуществить эту мечту в рекордно короткие сроки. Интерфейс USB (Universal Serial Bus — универсальная последовательная шина) появился не так давно. Спецификация версии 1.1 на этот интерфейс была опубликована в 1996 г. Данный интерфейс позволяет подключать самые разнообразные устройства: клавиатуру, мышь, принтер, сканер, джойстик, фото- или видеокамеру, телефонный адаптер ISDN, цифровые звуковые колонки. На этом список не кончается и будет пополняться по мере появления новых устройств. Естественно, данные устройства должны иметь ответный интерфейс USB. USB интерфейс был разработан для решения нескольких задач. Перечислю некоторые, наиболее важные из них: • обеспечение простого подключения периферийных устройств, не выключая компьютер («подключение на лету» или «горячая стыковка»); • автоматическое определение подключаемого устройства (функция Plug and Play — включай и работай); • увеличение числа одновременно подключаемых периферийных устройств; • обеспечение большей скорости обмена данными между компьютером и периферийными устройствами по сравнению со стандартным последовательным СОМ-портом и параллельным LPT-портом. Данные задачи были успешно решены. Периферийные устройства могут подключаться к USB четырехпроводным кабелем без выключения компьютера. По этому кабелю осуществляются двухсторонний скоростной обмен информацией и питание периферийного устройства с защитой по току. Сразу же после подключения устройства к интерфейсу USB компьютер обнаруживает его и происходит автоматическая установка соответствующего программного обеспечения. Количество одновременно подключенных устройств к одному порту USB путем разветвления через концентраторы (хабы) может достигать 127. Первый стандарт USB1.1 обеспечивает скорость интерфейса до 12 Мбит/с. В настоящее время существует новый стандарт USB2.0 для скорости до 480 Мбит/с. Для поддержки низкоскоростных устройств предусмотрен режим передачи со скоростью 1,5 Мбит/с.
7. Адаптер USB-СОМ 85 Сеанс связи по USB организуется в пакетном режиме и может быть инициирован только самим компьютером или управляющим устройством. Объединение всех компонентов USB-архитектуры осуществляется при помощи четырехпроводных кабелей. Два провода (питание +5 В и GND),npeflHa3Ha4eHbi для устройств, не имеющих внешнего источника питания, остальные два провода — для организации последовательной передачи данных D+ и D-, которые являются двунаправленными дифференциальными сигналами. Различают два типа соединителей: тип А, который устанавливается на компьютере, и тип В, устанавливаемый на периферийном устройстве. Конструкция разъемов и гнезд рассчитана на то, чтобы сделать быстрой и удобной процедуру многократного подключения и отключения, что необходимо, например, для работы с цифровой фотокамерой. Более подробно об интерфейсе можно прочитать в [1]. И хотя в настоящее время появился достаточно большой ассортимент периферийных устройств с данным интерфейсом, он до сих пор он не получил должного распространения в практике многочисленной аудитории разработчиков. Это связано, в первую очередь, с тем, что протокол данного интерфейса довольно сложный и требует специфической программной поддержки как со стороны компьютера, так и со стороны периферии. И дело здесь в том, что изначально протокол USB был разработан как интеллектуальный. В первую очередь в него были заложены функции Plug and Play. Кроме того, протокол интерфейса включает в себя множество другой служебной информации, обязательной для установления нормального сеанса связи. Например, каждое устройство, подключаемое к шине, получает свой уникальный идентификационный номер, посредством которого осуществляется дальнейшее конфигурирование, управление и обмен данными с ним. В настоящее время на рынке электронных компонентов появилось несколько типов микросхем, поддерживающих интерфейс USB. Но далеко не все они имеют готовую к применению программную поддержку. Возможно, именно данный факт сдерживает их массовое продвижение на рынок. К счастью, нашлась в мире компания, которая производит микросхемы с интерфейсом USB и, кроме того, обеспечила программную поддержку данных чипов на всех уровнях. Это английская фирма FTDIChip (Future Technology Devices International Ltd.). Официальный сайт этой компании находится на http://www.ftdichip.com. Официальным дистрибьютором данной компании в России является институт радиотехники http://www.irt.ustu.ru.
86 Глава 1. Адаптеры для персонального компьютера IBM PC Выпускаемая линейка продуктов этого производителя включает следующие многофункциональные микросхемы: FT8U232AM, FT8U245AM, FT8U100AX. Ниже приводится краткое описание этих микросхем. FT8U232AM USB UART — микросхема, позволяющая преобразовывать интерфейс UART (универсального асинхронного приемо-передатчика) в USB. Известно, что в настоящее время большинство встраиваемых микросхем контроллеров, как правило, имеет встроенный UART. Поэтому разработанные микропроцессорные устройства имеют внешний интерфейс RS-232, Данная микросхема позволяет модернизировать устройства, имеющие интерфейс RS232, в USB. Микросхема работает на скоростях передачи данных вплоть до 920 Кбит/с (RS232) и 2000 Кбит/с (RS422/485). Она имеет встроенный буфер приемника на 384 байта и буфер передатчика на 128 байт. Микросхема может найти применение в самых разнообразных решениях: USB-модемы, конвертеры-переходники USB-RS232/422/485, сканеры штрих-кода и т.д. Микросхема выполнена в 32-выводном LQPF-корпусе. FT8U245AM USB FIFO — преобразователь интерфейса USB в параллельный байтовый код. Микросхема организована как буфер USB- FIFO (First Input First Output — первый пришел, первый ушел). Она позволяет обеспечить скорость обмена между устройством и компьютером до 8 Мбит/с. Микросхема делает удобным взаимодействие с любым процессором или контроллером, используя каналы прямого доступа к памяти (DMA) или порты ввода-вывода. Для передачи данных от устройства к ПК достаточно записать байт данных в буфер при пассивном бите переполнения. В случае переполнения буфера устройство автоматически перестает подтверждать готовность к записи. Отправка данных приостанавливается до тех пор, пока они не будут пересланы из FIFO no USB. Когда компьютер связывается с периферийным устройством, FT8U245AM подтверждает заполнение приемника выставлением в единицу бита состояния. Чтение информации компьютером из FIFO происходит до тех пор, пока этот бит активен. Данная микросхема может применяться в USB ISDN и ADSL модемах, в цифровых камерах и МРЗ проигрывателях, в измерительной аппаратуре, которой необходима высокая скорость обмена данными. FT8U245 AM выполнена, как и предыдущая микросхема, в 32-выводном LQPF-корпусе. FT8U100AX USB HUB — может выполнять роль USB-концентратора или контроллера для многофункциональных устройств. Микросхема FT8U100AX разработана для использования в сложных USB-устройствах (Compound device) с поддержкой самых разнообразных встроенных функций: инфракрасное Aг) удаленное управление, инфракрасные (IrDA) и беспроводные соединения и т.д.
7. Адаптер USB-СОМ 87 Структура кристалла состоит из нескольких блоков: повторителя (USB repeater) и концентратора, которыми, в свою очередь, управляет встроенный EMCU-микроконтроллер, и множества периферийных блоков, выполняющих встроенные функции. Выполнена поддержка PS/2 клавиатуры и мыши, последовательного и параллельного портов и контроллера работы с мониторами A2С). Программа конфигурации микросхемы, позволяющая выполнить более гибкую настройку для конкретного устройства, может быть записана в любой внешней ПЗУ (ОТР ROM). Микросхема содержит 7 исходящих (downstream) высокоскоростных портов и 1 входящий (upstream). Настройки чипа позволяют выбирать способ питания устройства — либо от шины USB (bus powered), либо от внешнего источника питания (self powered), а также переключать в экономичный режим питания как все, так и каждый порт в отдельности. Возможности FT8U100AX определяют достаточно широкую область использования, что делает ее идеальным выбором в реализации таких решений, как концентратор USB, питающийся от шины, с возможностью добавления специфических функций. Технология изготовления FT8U100AX снижает энергопотребление микросхемы до 3,3 В, что значительно уменьшает электрические шумы. Низкий уровень шумов облегчает выпуск устройств, соответствующих FCC и СЕ требованиям. Кристалл помещен в 100-выводной QFP-корпус. В помощь разработчикам FTDI предлагает удобные для отладки модули USBMOD1 и USBMOD2, основанные на микросхемах FT8U232 и FT8U245 соответственно. Удобство заключается в том, что каждый модуль рассчитан на использование со стандартным 32-контактным IC- разъемом. На панели интегрирован USB-разъем В-типа, задающий кварцевый резонатор и все необходимые пассивные элементы. Модули используют питание от USB-шины, что позволяет обойтись без дополнительного источника питания. Бесплатные драйвера виртуального порта от производителя микросхемы облегчают разработку ПО для работы с проектируемым периферийным устройством. Несмотря на то что работа с виртуальным портом ведется как с обычным портом, команды установления скорости обмена игнорируются, а информация передается на максимально возможной скорости. Увеличивающийся в мире объем обрабатываемой информации и расширение сервисных возможностей ПК требуют увеличения пропускной способности каналов связи с периферийными устройствами. Недалек тот день, когда СОМ и LPT-порты, ставшие столь привычными,
88 Глава 1. Адаптеры для персонального компьютера IBM PC исчезнут с задней панели системного блока. К этому времени большой отряд разработчиков должен быть уже во всеоружии. Для тех же, кто хочет самостоятельно собрать устройство с USB-ин- терфейсом, ниже приводится описание. Адаптер USB-COM может найти широкое применение в повседневной практике разработчика и пользователя компьютера. Он представляет собой преобразователь USB-интерфейса в последовательный СОМ-порт. Несмотря на кажущуюся ненужность такого устройства, на самом деле оно обладает определенными полезными потребительскими свойствами. Во-первых, большое количество разнообразных промышленных и самодельных электронных устройств (мышки, модемы, программаторы, эмуляторы и т. п.) подключается к компьютеру через СОМ-порт. Однако в связи с тем, что персональные компьютеры IBM, как правило, имеют всего два таких последовательных порта, очень быстро возникает их дефицит. В то же время компьютер имеет два, а последние модели компьютеров даже четыре, порта USB, которые пока еще редко используются. Их-то и можно использовать для увеличения числа недостающих СОМ-портов. Причем количество USB-портов у компьютера постоянно увеличивается. Например, в продаже в последнее время довольно популярными стали модели мониторов со встроенным четырехпортовым устройством HUB USB. Таким образом, компьютер может быть оснащен уже семью портами USB. Более того, некоторые промышленные устройства с USB-интерфейсом также могут иметь в своем составе транзитное устройство HUB USB. Одним словом, в отличие от СОМ-портов, USB-порты могут множиться в пределе до 127 штук. Такое количество портов, согласитесь, является более чем достаточным даже для самого изысканного потребителя и пользователя периферийных устройств. При этом, естественно, автоматически снимается вопрос дефицита портов. Во-вторых, не исключено, что в скором времени СОМ-порты вообще исчезнут как морально устаревшие. А что делать со всем огромным многообразием периферийных устройств, накопленных за многие годы пользователями? Не выбрасывать же этот багаж на свалку. До такой роскоши еще далеко не многие из нас дожили. Тогда-то и придет на выручку предлагаемый адаптер. И, в-третьих, схемотехника адаптера, которая будет показана ниже, позволит понять как легко и просто можно внедрить интерфейс USB в новые разработки на базе микроконтроллеров и процессоров с универсальным последовательным приемопередатчиком (UART), который присутствует практически во всех контроллерах. Таким образом, можно
7. Адаптер USB-СОМ 89 будет приступить к созданию самых разнообразных устройств со встроенным USB-портом. Итак, о самом устройстве. Оно построено на базе микросхемы FT8U232AM, которая имеет 32 вывода. Назначение этих выводов становится понятным из их названия, схемы подключения и описания структурной схемы, приведенного ниже. Принципиальная электрическая схема адаптера показана на Рис. 7.1. Перечень элементов, из которых состоит адаптер, содержится в Табл. 7.1. Таблица 7.1. Элементы адаптера Позиционное обозначение BQ1 Наименование Резонатор кварцевый 6 000 кГц Количество 1 Примечание HC-49U Чип-конденсаторы керамические 0805 | CI, C5 С2-С4, С8, СЮ, С11-С15 С6, С7 С9 СР1 0,01 мкФ ОД мкФ 10 пФ 0,033 мкФ Конденсатор электролитический SR-25-10 2 10 2 1 1 10-18 пФ 25мкФ10В Микросхемы 1 D1 D2 D3 L1 FT8U232AM AT93C46A, M93C46SC, 93LC46BC(I)/SN ADM213EARS, МАХ213С(Е)А1, SP213EHC(E)A Чип индуктивность 1812 100 мкГн 1 1 1 1 SOIC-8 28 SSOP Чип-резисторы 0805 или 1206 | Rl, R2 R3 R4, R6, R7, R9 R5 R8 R10 R11 R12 R13,R14 10 Ом 1,5 кОм 100 кОм 470 кОм 470Ом 2,2 кОм ЮкОм 22 0м 220 Ом 2 1 4 1 1 1 1 1 2
90 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 7.1. (Продолжение) Позиционное обозначение Наименование Количество Примечание | Светодиоды HL1 HL2 VT1 L-934HC L-934GD Транзистор КТ3107Б (Г, Е) 1 1 1 Красный Зеленый Соединители XI Х2 Вилка USB B-4 на плату Вилка DRB-9M на плату 1 1 тип В Все функции по работе с USB-портом выполняет микросхема D1. Структурная схема этого чипа приведена на Рис. 7.2. Как видно из этой схемы, в ней заложены все необходимые функциональные блоки для работы с USB-портом. В первую очередь, это блок USB Transceiver, который осуществляет согласование приема и передачи данных по двум дифференциальным двунаправленным линиям связи USB-порта. С ним непосредственно связаны блок последовательного интерфейса SIE, отвечающий за выделение и преобразование данных из потока USB, и блок USB DPLL, который обеспечивает синхронизацию данных в потоке. Блок SIE управляется блоком USB Protokol Engine, отвечающим за поддержание протокола USB. Принимаемые по USB данные из блока SIE поступают в 128-байтовый буфер Dual Port TX Bufer. Передаваемые данные поступают на блок SIE из 384-байтового буфера Dual Port RX Bufer. Оба буфера организованы по принципу FIFO (первый пришел, первый ушел). Это позволяет осуществить мягкую синхронизацию между двумя различными по скорости потоками данных между компьютером и внешним устройством. Непосредственно с данными буферами связан блок UART FIFI Controller, отвечающий за управление последовательными потоками данных через эти буферы. Он так же, как и блок SIE, управляется блоком USB Protokol Engine. Синхронизация блока UART осуществляется от блока генератора скорости Boud Rate Generator. В конце связей находится блок UART, формирующий на выходе все стандартные сигналы интерфейса RS-232, присутствующие в потоке USB. Эти сигналы присутствуют на внешних выводах микросхемы в стандартных логических уровнях ТТЛ. Дополни-
Рис. 7.1. Принципиальная электрическая схема адаптера 7. Адаптер USB-COM 91
92 Глава 1. Адаптеры для персонального компьютера IBM PC тельно в состав чипа включен блок стабилизатора напряжения на 3,3 В 3.3 Volt LDO regulator. Это напряжение используется для подтягивания одной из дифференциальных линий связи USB, чтобы установить скорость передачи данных по интерфейсу USB. Так, при подключении этого напряжения через ограничительный резистор к положительному сигналу DP линии связи, по интерфейсу USB можно будет передавать данные на максимально возможной скорости 12 Мбод. Если вместо сигнала DP подключить источнику 3,3 В отрицательный сигнал DM линии связи, то по интерфейсу USB можно будет передавать данные только на скорости 1,5 Мбод. Эта возможность заложена в спецификации протокола USB с целью совместимости с «медленной» периферией. Рис. 7.2. Структурная схема чипа Роль синхронизации всех процессов чипа отведена блокам задающего генератора 6MHZ Oscillator и умножителя частоты х8 Clok Multiplexor. Последний блок формирует из частоты 6 МГц задающего генератора частоты 12 МГц и 48 МГц, необходимые для синхронизации скоростных процессов внутри самой микросхемы.
7. Адаптер USB-СОМ 93 Блок EEPROM Interface позволяет осуществить запись и чтение специфических данных об устройстве в подключаемую извне микросхему энергонезависимой постоянной памяти. К таким данным относятся: серийный номер изделия, его название, информация о фирме-производителе, поставщике продукции и т.д. Итак, познакомившись с внутренним содержанием чипа FT8U232, становится понятным, почему схема устройства такая простая. Ведь все операции по расшифровке и поддержанию протокола USB и преобразованию данных берет на себя этот чип. Нам остается только согласовать по уровню выходные сигналы данного чипа с подключаемой периферией. Этим и занимается в адаптере микросхема D3. Она содержит в своем составе DC/DC преобразователь и позволяет преобразовывать сигналы ТТЛ-уровней в сигналы стандарта RS-232. Преобразованные данной микросхемой сигналы подключены непосредственно к разъему Х2 «СОМ». В качестве энергонезависимой памяти применяется микросхема D2. Она представляет собой постоянную, электрически перепрограммируемую микросхему памяти EEPROM с последовательным интерфейсом SPI. Объем памяти данного чипа составляет 1 Кбит. Стирание и запись информации в него производится микросхемой D1 уже после распайки на плате, т.е. внутрисхемно. Все элементы схемы устанавливаются и распаиваются на двусторонней печатной плате, чертежи которой для верхней и нижней стороны представлены на Рис. 7.3 и Рис. 7.4 соответственно. На Рис. 7.5 и рис. 7.6 приведены схемы размещения элементов на этих сторонах платы. Эта плата разработана автором под размеры малогабаритного пластикового корпуса типа G404, продаваемого известной фирмой «Платан» www.platan.ru. Разумеется, можно использовать любой другой корпус подходящего размера или произвести трассировку платы с другими размерами и под другие компоненты, поскольку в схеме адаптера допускается замена большинства компонентов на их аналогами. В частности, допустима замена всех резисторов и конденсаторов другими типами с аналогичными характеристиками, поскольку ЧИП- компоненты для поверхностного монтажа могут оказаться недоступными или неудобными при монтаже схемы на макетной плате, что также допускается. Поскольку адаптер питается от USB-порта, ему не требуется дополнительный источник питания. Несколько слов об электронных узлах схемы. Дроссель L1 вместе с элементами CI, R7, С8, R8 и СЮ осуществляет фильтрацию питания адаптера от интерфейса USB. Резисторы R1 и R2 являются согласующими элементами связи. Резистор R3, как было сказано выше, определяет скорость работы по интерфейсу. Транзистор VT1 с резисторами R4—R6
94 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 13. Чертеж верхней стороны платы Рис. 7.4. Чертеж нижней стороны платы и конденсатором С5 осуществляет аппаратный сброс микросхемы D1 при подключении к разъему USB. Конденсаторы СИ—С14 участвуют в формировании положительного и отрицательного напряжений для сигналов интерфейса СОМ-порта. Индикаторы HL1 и HL2 предназначены для контроля процессов обращения компьютера к адаптеру, при передаче и приеме информации и выводятся на поверхность корпуса через просверленные отверстия. Назначение цепей и контактов в разъеме Х2 «СОМ» в точности соответствует стандартному СОМ-порту. Поэтому при подключении периферийного устройства к данному адаптеру не требуется никаких
7. Адаптер USB-СОМ 95 Рис. 7.5. Схема размещения элементов на верхней стороне платы Рис. 7.6. Схема размещения элементов на нижней стороне платы переходников или дополнительных кабелей. Со стороны USB адаптер подключается к компьютеру стандартным кабелем USB длиной от 1,5 до 5 метров. Эти кабели в настоящее время имеются в продаже во многих магазинах и фирмах, торгующих компьютерной техникой. Стоимость такого кабеля небольшая и составляет от 30 до 80 руб. в зависимости от длины. Поэтому нет смысла пытаться изготовить его самостоятельно. Тем более, что технические характеристики такого кабеля (наличие витых пар, согласование волнового сопротивления, механическая прочность, легкость и надежность стыковки, экранировка и пр.) должны удовлетворять скоростным и потребительским требованиям.
96 Глава 1. Адаптеры для персонального компьютера IBM PC После сборки адаптера необходимо его проверить, запрограммировать и протестировать. Причем программирование требуется только в том случае, когда вы захотите подключать к компьютеру несколько таких адаптеров. Дело в том, что при программировании адаптера ему присваивается уникальный серийный номер, и при обнаружении двух или более одинаковых адаптеров компьютер будет различать их по этому номеру. Если же вы будете использовать только один такой адаптер, его можно не программировать. Причем в этом случае нет необходимости устанавливать на плату адаптера микросхему D2 и связанные с ней элементы R9—R11. Однако, на мой взгляд, рано или поздно эта процедура все же будет востребована, поскольку аппетит приходит во время еды. Поэтому рассмотрим ее более детально. Итак, как уже было сказано, фирма FDTI любезно предоставила на своем сайте (ссылка приведена выше) бесплатные драйверы, утилиты и примеры программ для устройств, построенных на чипах FT8U. Причем драйверы обеспечивают поддержку устройств USB для операционных систем от Windows98 до Windows2000 включительно. Поэтому перед первым включением адаптера необходимо скачать с этого сайта драйверы прямого доступа D2XX и утилиты FTDU2XXST, необходимые для программирования и тестирования адаптера. Затем необходимо распаковать эти файлы в отдельные каталоги. Перед первым подключением адаптера к компьютеру следует убедиться в правильности монтажа адаптера и в отсутствии короткого замыкания между любыми контактами разъема XI «USB», а также в отсутствии замыканий между разноименными цепями схемы. Кроме того, надо убедиться в том, что порт USB разрешен в SETUP компьютера. Обычно вход в SETUP происходит после перезапуска компьютера удержанием клавиши DEL или F1 (в зависимости от BIOS компьютера). После разрешения USB-порта в SETUP и перезапуска компьютера произойдет обнаружение этого порта, и компьютер выполнит автоматическую установку всех необходимых драйверов для USB- порта из инсталляционного пакета операционной системы. После этой процедуры, или если порт USB уже был разрешен ранее, в свойствах компьютера должна присутствовать запись о наличии контроллера шины USB, включающего в себя корневой разветвитель для USB и универсальный хост-контроллер. Пример такой записи для операционной системы Windows98 приведен на Рис. 7.7. После выполнения данной процедуры можно подключить адаптер к USB-порту компьютера. При этом компьютер автоматически выведет сообщение о том, что обнаружено новое устройство, и начнет поиск и создание базы драйверов для него.
7. Адаптер USB-СОМ 97 Во время появления запроса со стороны компьютера надо будет указать место размещения каталога с драйверами прямого доступа D2XX, о которых было сказано выше. После завершения данной процедуры в списке контроллера шины USB устройств компьютера должно появиться новое устройство FTDI FT8U2XX Device. Рис. 7.7. Окно свойств компьютера для операционной системы Windows98 Рис. 7.8. Окно утилиты программирования ftdu2xxst.exe
98 Глава 1 Адаптеры для персонального компьютера IBM PC Теперь необходимо запустить утилиту программирования ftdu2xxst. ехе из соответствующего каталога. На экране монитора при этом должно появиться окно с формой, приведенной на Рис. 7.8. Необходимо заполнить поля данной формы точно в соответствии с Табл. 7.2, поскольку они определяют зарегистрированного в соответствующем комитете производителя микросхем, на базе которых построено устройство, и в дальнейшем эти устройства будут безошибочно поддерживаться драйверами данной фирмы. Таблица 72. Образец заполнения полей формы программы ftdu2xxst.exe Поле Manufaktured (производитель) Manufaktured ID ( идентификатор производителя) Vendor ID (идентификатор поставщика) Product ID (идентификатор продукции) Запись FTDI FT 0403 6001 Поле Descripstion (описание) можно заполнять по своему усмотрению, например USB-COM. В дальнейшем эта запись будет использоваться в качестве названия устройства USB. В самом низу формы имеется большое информационное поле. В этом поле будет отображаться различная информация в зависимости от выполняемых операций в программе. Сразу же после заполнения последнего поля формы Descripstion становится доступной функция Advanced SETUP (предустановка) в виде кнопки-значка (рука с вытянутым указательным пальцем). При нажатии этой кнопки или при выборе данной функции в меню диалога, на экране монитора появится новое окно с формой для заполнения, приведенной на Рис. 7.9. Эту форму можно оставить заполненной по умолчанию или изменить некоторые ее поля. Смысл полей понятен из самого названия. В Табл. 7.3. приведено краткое описание назначения этих полей. Таблица 73. Краткое описание назначения этих полей формы Advanced SETUP Поле Plug and Play Fixed Serial Number Self Powered Remote Wakeup Max Power (mA) Описание назначения Разрешить функцию «включай и работай» Ввести вручную фиксированный серийный номер Разрешить сбережение энергии Разрешить дистанционное пробуждение Ограничить максимальное потребление в мА
7. Адаптер USB-СОМ 99 Установленный или снятый флажок в соответствующем поле включает или отключает данную функцию. Поле Max Power по умолчанию заполнено величиной 44 мА. В нашем случае адаптер потребляет не более 30 мА. Учитывая полуторный запас по потреблению тока, это поле можно оставить заполненным цифрой 44. Оставляя и все остальные поля заполненными по умолчанию (Рис. 7.9), надо нажать кнопку ОК. Рис. 7.9. Окно с формой для заполнения Advanced SETUP Теперь в программе становится доступной функция Save. Выполним ее для сохранения заполненных форм. В дальнейшем это позволит повторить процедуру прошивки простым чтением из файла. После этого можно приступать к программированию микросхемы EEPROM (D2) адаптера. В меню Device выберите функцию Program. Произойдет программирование EEPROM адаптера и автоматически сгенерируется серийный номер нашего устройства. В поле сообщений появится надпись, подобная следующей: PROGRAM DEVICE— Serial Number FTB5K5B0. Естественно, номер (подчеркнут) будет уникальным и отличным от приведенного здесь. Если вы ошиблись где-то или захотите что-то поменять, можно стереть записанную в микросхему информацию функцией Erase из меню Device и повторить все операции по программированию заново. Микросхема адаптера допускает гарантированно миллион операций по стиранию и церезаписи информации. Такого числа операций вполне достаточно для проведения множества экспериментов. Можно также прочитать содержимое микросхемы памяти функцией Read или записать информацию для программирования в файл, пользуясь функцией Program to File из того же меню. Помимо перечисленных функций, данная программа позволяет тестировать устройства типа USB-Serial. Наш адаптер идеально подходит для данной функции, поскольку представляет собой стандартный преобра-
100 Глава 1. Адаптеры для персонального компьютера IBM PC зователь USB в СОМ-порт. При тестировании программа использует дополнительно два СОМ-порта компьютера для анализа сигналов на выходе устройства. Фирма-разработчик этой программы предлагает изготовить специальный кабель для тестирования. Чертеж такого кабеля и таблица с перечнем элементов для него приведены на Рис. 7.10 и в Табл. 7.4 соответственно. В Табл. 7.5 приведены цепи соединений для этого кабеля. Рис. 7.10. Чертеж кабеля для тестирования адаптера Таблица 7.4. Элементы кабеля для тестирования Позиционное обозначение COM, COM1, COM2 Наименование Розетка DB-9F Корпус DB-9 Кабель STP4-24R3A Количество 3 3 1700мм Примечание Сетевой кабель 5-й категории с экраном Таблица 7.5. Цепи соединений кабеля для тестирования СОМ-цепь TxD RxD RTS CTS DSR GND DTR DCD RI Розетка DB-9F 3 2 7 8 6 5 4 1 9 Маркировка провода Синий Сине-белый Зеленый Зелено-белый Коричнево-белый Экран Коричневый Оранжевый Оранжево-белый Розетка DB-9F 2 3 8 7 4 5 6 Розетка DB-9F 4 7 Цепь COM2 RxD TxD CTS RTS DTR GND DSR Цепь СОМ1 DTR RTS
7. Адаптер USB-СОМ 101 Разъем СОМ данного кабеля необходимо подключить к разъему XI СОМ нашего адаптера, а кабельные разъемы СОМ1 и COM2 к соответствующим СОМ-портам компьютера. Теперь можно запустить функцию Test из меню Device. При этом автоматически тестируются все выходные сигналы адаптера и в поле сообщений будут выведены результаты тестирования. В случае получения отрицательных результатов необходимо проверить адаптер и тестовый кабель на предмет правильности всех соединений и отсутствия замыканий между цепями. После успешного тестирования адаптером можно смело пользоваться. Как было сказано выше, помимо драйверов на сайте фирмы FTDI имеются свободно распространяемые примеры тестовых программ на четырех языках программирования. А именно на Visual Basic, Delphi, С+ + Builder и Visual C++. Из этих примеров следует, какие функции предоставляются пользователю драйверами прямого доступа D2XX и каким образом их можно использовать. Если же вы не испытываете большого желания писать собственные программы для устройств USB, можно вовсе этого не делать. На том же сайте имеются драйверы виртуального СОМ-порта (VCP). С их помощью в системе компьютера можно организовать виртуальный (фантомный) последовательный порт (в дополнение к существующим аппаратным). Виртуальность порта заключается в переадресации всех обращений к нему в прямые запросы непосредственно оборудованию. Программное обеспечение при этом взаимодействует с USB-устройствами через стандартные вызовы VCOMM API Windows или с помощью любых распространенных коммуникационных компонентов (например TcomPort). Существует две разновидности VCP драйверов для Windows: • драйверы с поддержкой РпР, которые обычно используются для организации универсальных конвертеров USB-RS232, модемов и других применений, отвечающих спецификации Windows RS-232 Plug-and-Play; • драйверы без поддержки РпР, которые применяются во встраиваемых системах и устройствах, в которых периферия, подключенная к FT8U232AM, не задействует интерфейс Windows Plug-and-Play для загрузки своего собственного программного обеспечения. В принципе, оба эти пакета драйверов организуют одинаковый виртуальный порт. Только драйверы РпР после обнаружения подключенного устройства к адаптеру USB производят автоматический поиск других устройств, подключенных к нему. Это удлинит процедуру установки нового оборудования по сравнению с вариантом использования
102 Глава 1. Адаптеры для персонального компьютера IBM PC драйверов без РпР. Какой пакет драйверов использовать, решает сам пользователь" по мере приобретения опыта работы с внешними устройствами. Кроме того, сторонними разработчиками созданы драйверы USB устройств на базе FTDI для операционной системы Linux. Более подробную информацию о них можно получить на приведенном выше сайте фирмы FTDI. Перед установкой любого из перечисленных драйверов необходимо отключить адаптер от компьютера и деинсталлировать ранее установленный драйвер. Это делается путем запуска программы деинсталляции, входящей в состав каждого из перечисленных пакетов драйверов. В нашем случае для деинсталляции драйвера D2XX следует запустить файл ftd2xxun. ехе, который находится в каталоге драйверов D2XX. После чего следует вновь подключить адаптер к компьютеру, и на запрос о месте размещения драйверов указать папку с новыми драйверами. Всякий раз при замене драйверов сначала необходимо деинсталлировать установленные ранее драйверы для исключения конфликта в работе компьютера. Итак, после установки одного из драйверов VCP в компьютере должен появиться виртуальный порт. Проверить его наличие можно через свойства компьютера. При этом в списке устройств компьютера должно появиться устройство с названием USB High Speed Serial Converter, а также в списке портов появится новый виртуальный порт с названием USB Serial Port, которому будет присвоен номер COM3 или другой свободный. Теперь, не прибегая к программированию, можно пользоваться адаптером как обычным СОМ-портом, естественно, за исключением прямых обращений к регистрам порта, как это можно было делать в DOS. Другими словами, к нему можно подключить любое периферийное устройство, которое раньше подключалось к СОМ-порту компьютера. При этом оно также автоматически будет обнаруживаться компьютером как устройство, подключенное через СОМ-порт. Например, через адаптер можно подключить мышь, модем, принтер и т. п. Только теперь дефицита СОМ- портов уже не будет. Литература 1. Гук М. Аппаратные средства IBM PC. Энциклопедия. — СПб.: ПитерКом, 1998. —816 с: ил.
8. Адаптер USB-AVR 103 8. Адаптер USB-AVR Вниманию читателя предлагается очередное устройство с интерфейсом USB — адаптер USB-AVR. Данный адаптер представляет собой устройство, построенное на контроллере AVR с параллельным доступом к контроллеру интерфейса USB. Все функции по работе с интерфейсом USB в адаптере выполняет контроллер интерфейса — микросхема FT8U245AM. Она преобразует последовательный интерфейс USB в параллельный байтовый код. Краткий обзор данной микросхемы приведен в разд. 7. А в этом разделе дается более детальное описание ее внутренней структуры. Функциональная схема чипа FT8U245AM изображена на Рис. 8.1. Рис. 8.1. Функциональная схема чипа FT8U245AM В схеме данного чипа заложены функциональные блоки для автоматической работы с USB-портом. Блок USB Transceiver осуществляет согласование приема и передачи данных по двум дифференциальным двунаправленным линиям связи USB-порта. С блоком USB Transceiver связан блок последовательного интерфейса Serial Interface Engine (SIE), отвечающий за выделение и преобразование данных из потока USB, и блок USB DPLL, обеспечивающий синхронизацию данных в потоке.
104 Глава 1. Адаптеры для персонального компьютера IBM PC Блок SIE управляется блоком USB Protokol Engine, отвечающим за поддержание протокола USB. Принимаемые по USB данные из блока SIE поступают в 128-байтовый буфер Dual Port RX Bufer. Передаваемые данные накапливаются в блоке 384-байтового буфера Dual Port TX Bufer. Оба буфера организованы по принципу FIFO (первый пришел, первый ушел). Это позволяет осуществить мягкую синхронизацию двух различных по скорости потоков данных между компьютером и внешним устройством. Непосредственно с этими буферами связан блок FIFO Controller, в котором происходит прямое и обратное преобразование последовательных данных в параллельный байт данных. Блок FIFO Controller формирует также сигнал наличия данных ТХЕ#, принятых по USB, и сигнал готовности буфера приемника данных RXF#. Чтение и запись данных микросхемы производится посредством сигналов RD и WR# соответственно. Все сигналы присутствуют на внешних выводах микросхемы в стандартных логических уровнях ТТЛ. Символ # означает инверсию активного сигнала. Дополнительно в состав чипа включен блок стабилизатора напряжения на 3,3 вольта, т. е. 3.3 Volt LDO Regulator. Это напряжение используется для подтягивания одной из дифференциальных линий связи USB для установления скорости передачи данных по интерфейсу USB. Так, при подключении этого напряжения через ограничительный резистор к положительному сигналу DP линии связи по интерфейсу USB можно будет передавать данные с максимально возможной скоростью 12 Мбод. Если же вместо сигнала DP к источнику 3,3 В подключить отрицательный сигнал DM линии связи, по интерфейсу USB можно будет передавать данные только скоростью 1,5 Мбод. Данная возможность заложена в спецификации протокола USB с целью совместимости с низкоскоростной периферией. Роль синхронизации всех процессов чипа отведена блокам задающего генератора 6MHZ Oscillator и умножителя частоты х8 Clok Multiplexor. Последний блок формирует из частоты 6 МГц задающего генератора частоты 12 МГц и 48 МГц, необходимые для синхронизации скоростных процессов внутри самой микросхемы. Блок EEPROM Interface позволяет осуществить запись и чтение специфических данных об устройстве в подключаемую извне микросхему энергонезависимой постоянной памяти. К таким данным относятся: серийный номер изделия, его название, информация о фирме-производителе, поставщике продукции и т.д.
8. Адаптер USB-AVR 105 На Рис. 8.2 приведена структурная схема адаптера USB-AVR. Она довольно проста и состоит всего из интерфейса USB с энергонезависимой памятью и контроллера AVR. Принципиальная электрическая схема адаптера приведена на Рис. 8.3. В Табл. 8.1 приведен перечень элементов, из которых состоит адаптер. Таблица 8.1. Перечень элементов схемы адаптера USB-AVR Позиционное обозначение Наименование Количества Примечание Резонаторы кварцевые HC-49SM (HC-49U) BQ1 BQ2 6 МГц 7,3728 МГц 1 1 1 ЧИП конденсаторы керамические 0805 CI, C5 С2 С4, С8, СЮ, С13 С15 С6, С7, СП, С12 С9 0,01 мкФ 0,1 мкФ 30 пФ 0,033 мкФ 2 8 4 1 | Конденсаторы электролитические СР1, СР2 D1 D2 D3 D4 L1 SR-25-10 Микросхемы FT8U245AM 93LC46BC(I)/SN (M93C46-W MN1) AT90S8515-8AC(I) PST529D(KP1171Cn42) ЧИП индуктивность 1812 100 мкГн 2 1 1 1 1 1 10мкФ25В SOIC-8 TQFP-44 4,2 В ЧИП резистор 0805 Rl, R2 R3 R4, R6, R7, R9, R12 R5 R8 R10 R11 VD1, VD2 VT1 10 Ом 1,5 кОм 100 кОм 470 кОм 470 Ом 2,2 кОм ЮкОм Диод КД522Б Транзистор КТ3107Б (Г, Е) 2 1 5 1 1 1 1 2 1 [ Соединители XI Х2 Л J2, J3 J4 Вилка USB В-4 на плату, тип В (USB B-1J) Вилка ВН-26 Вилка PLS-6 Вилка PLS-1 Вилка PLS-2 1 1 1 2 1
106 Глава 1. Адаптеры для персонального компьютера IBM PC Дроссель L1 вместе с элементами CI, R7, С8, R8 и СЮ осуществляет фильтрацию питания адаптера от интерфейса USB. Резисторы R1 и R2 являются согласующими элементами связи по интерфейсу. Резистор R3, как уже было сказано, определяет максимальную скорость работы по интерфейсу. Транзистор VT1 с резисторами R4—R6 и конденсатором С5 осуществляет аппаратный сброс микросхемы D1 при подключении к разъему USB. Конденсаторы СИ, С12 стабилизируют работу кварцевого резонатора BQ2. Конденсаторы С13—С15 и СР2 фильтруют питание по высокой и низкой частоте. Диоды VD1 и VD2 развязывают линию сброса от различных источников данного сигнала. Микросхема D4 контролирует напряжение питания контроллера D3 и формирует сигнал сброса в момент подключения адаптера к внешнему устройству, а также при пониженном напряжении питания +5 В. Все остальные операции в адаптере выполняет контроллер D3 под управлением программы, прошитой во флэш-памяти самого чипа. Программирование данного контроллера производится внутрисхемно через разъем Л. Сигналы контроллера, выведенные на этот разъем, можно использовать после программирования для подключения к адаптеру устройств с интерфейсом SPI. На разъем J4 выведены сигналы последовательного порта контроллера. Рис. 8.2. Структурная схема адаптера USB-AVR Как следует из схемы, адаптер имеет большое количество свободных программируемых выводов, подключенных к разъемам Х2, Л и J4. Эти
Рис. 83. Принципиальная электрическая схема адаптера USB-AVR 8. Адаптер USB-AVR 107
108 Глава 1. Адаптеры для персонального компьютера IBM PC выводы можно использовать произвольно в зависимости от решаемой задачи. Например, можно присоединить к ним кнопки, индикаторы и логические датчики и получить устройство управления и контроля. Можно задействовать эти выводы для формирования сигналов LPT- порта, получить дополнительный параллельный порт для компьютера. Наконец, можно превратить данный адаптер в программатор, эмулятор или другой полезный прибор с интерфейсом USB. Кроме того, можно использовать внутреннюю восьмиразрядную шину данных для внешних связей, поскольку она является двунаправленной и может принимать третье состояние. Все зависит от фантазии разработчика и поставленных задач. Адаптер можно собрать на небольшой макетной плате или развести для него печатную плату, предварительно дооснастив схему необходимы- у ми элементами для решения конкретной задачи. После монтажа схемы необходимо убедиться в правильности монтажа и отсутствии замыканий между разноименными цепями. Адаптер необходимо запрограммировать и протестировать. Для этого надо подключить адаптер к компьютеру с помощью стандартного кабеля USB. Сразу же после подключения адаптера компьютер обнаружит данное устройство и начнет поиск драйверов для него. Вся процедура по установке драйверов и программированию EEPROM адаптера подробно описана в разд. 7. Драйверы для данного адаптера с интерфейсной микросхемой FT8U245AM используются те же, что и для адаптера USB-COM, построенного на микросхеме FT8U232AM. Поэтому после их установки в компьютере появится новый виртуальный СОМ-порт, который, в отличие от обычного СОМ-порта, игнорирует все параметры формата данных и скорости передачи и всегда работает на максимальной скорости 8 Мбит в секунду. Далее необходимо записать в контроллер AVR рабочую программу. В качестве рабочей программыдля этого контроллера мной была написана небольшая тестовая программа. Блок-схема этой программы приведена на Рис. 8.4. Она позволяет управлять контроллером AVR по интерфейсу USB. В исходном тексте программы, приведенном ниже, показано, каким образом контроллер обменивается информацией по USB интерфейсу с помощью микросхемы FT8U245 AM. Данные подпрограммы обмена можно использовать в дальнейшем для написания других рабочих программ для данного адаптера.
8. Адаптер USB-AVR 109 Исходный текст тестовой программы AVR ; Название: USB_AVR ; Версия: 1.0 ; Автор: О.Д. Вальпа ; Описание: Тестовая программа адаптера USB-AVR принимает команды ; от компьютера по интерфейсу USB, транслирует их обратно и выполняет ; следующие действия: ; Команда Выполняемые действия ; 0x55 Порт А+С = 0x5555 ; ОхАА Порт А+С = ОхАААА ; OxFF Порт А+С = OxFFFF ; ОхС Порт А+С = 0x0000 ; 0x10 Читать порт А ; 0x20 Читать порт С Рис. 8.4. Блок-схема тестовой программы для контроллера AVR Начало Инициализация памяти и регистров Прием команды Эхо команды Анализ и выполнение команды
110 Глава 1. Адаптеры для персонального компьютера IBM PC .include «8515def.inc»;Включить файл описания регистров .LIST /Генерировать листинг .LISTMAC /Генерировать листинг макросов ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Константы и определения переменных ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;Выводы порта D .equ INPD_RXF =2 .equ INPDJTXE =3 .equ 0UTD_RDU =4 .equ 0UTD_WRU =5 .equ 0UTD_WR =6 .equ 0UTD_RD =7 /Глобальные регистры переменных /Регистры не поддерживающие команды CPI,ANDI;SUBI,ORI,SBCI,LDI. .def TEMPCODE =r0 /Регистр для команды LPM HE ИЗМЕНЯТЬ гО!!! ;.def =rl /Резерв ;.def =r2 /Резерв ;.def =r3 /Резерв ;.def =r4 /Резерв ;.def =r5 /Резерв ;.def =r6 /Резерв ;.def =r7 /Резерв ;.def =r8 /Резерв ;.def =r9 /Резерв ;.def =rlO /Резерв ;.def =rll /Резерв ;.def =rl2 /Резерв ;.def =rl3 /Резерв ;.def =rl4 /Резерв .def TEMPSREG =rl5 /Временнный регистр SREG /Регистры поддерживающие команды CPI,ANDI,SUBI,ORI,SBCI,LDI. .def FLAGS =rl6 /Регистр флагов .equ FLprm =0 /Бит-флаг был принят байт .equ FL1 =1 /Бит-флаг О .equ FL2 =2 /Бит-флаг О .equ FL3 =3 /Бит-флаг О .equ FL4 =4 /Бит-флаг О .equ FL5 =5 /Бит-флаг О .equ FL6 =6 /Бит-флаг О .equ FL7 -1 /Бит-флаг О /.def =rl7 /Резерв ;.def =rl8 /Резерв ;.def =rl9 /Резерв ;.def =r20 /Резерв .def TX_BUF =r21 ;Буфер передатчика .def RX_BUF =r22 /Буфер приемника .def TEMP =r23 /Регистр временных данных
8. Адаптер USB-AVR 111 .def TEMPINT =r24 /Регистр временных данных прерываний .def TEMPPP =г25 /Регистр временных данных подпрограмм /Регистры г26-г31 для косвенной адресации через X,Y,Z .DSEG VARO: .BYTE 16 /Зарезервировать 16 байт в памяти .CSEG ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Вектора прерываний ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .org О rjmp 0P_RESET /Переход по сбросу .org INTOaddr reti /Обработка прерывания INTO .org INTladdr reti /Обработка прерывания INT1 .org ICPladdr reti /Обработка захвата ТС1 .org OClAaddr reti /Обработка ТС1А .org OClBaddr reti /Обработка ТС1В .org OVFladdr reti /Обработка переполнения ТС1 .org OVFOaddr reti /Обработка переполнения ТСО .org SPIaddr reti /Обработка прерывания SPI конец передачи .org URXCaddr reti /Обработка прерывания ПП конец приема .org UDREaddr reti /Обработка прерывания ПП регистр данных пуст .org UTXCaddr reti /Обработка прерывания ПП конец передачи .org ACIaddr reti /Обработка прерывания компаратора OP_RESET: /Переход по сбросу
112 Глава 1. Адаптеры для персонального компьютера IBM PC ;@@@@@@@@@@(а@@@@@@@@@@@@@@@@@§@@@§(а@@@@@@(а@@@@@@@@@{а@@@@@@@@(а@@@@@@(а@@@(а@@@@@@@ ; Указатель стека на вершину ОЗУ ldi TEMP, low (RAMEND) out SPL,TEMP ldi TEMP,high (RAMEND) out SPH, TEMP ;////////////////////////////////////////////////////////////////////////////// /Инициализация порта В ldi TEMP, ObOOOOOOOO ;0=вход 1=выход ; llllllll ; IIIIIII+-0 TO ; IIIIII+--1 Tl ; 11111+—2 AINO ; IIII+—-3 AIN1 ; |||+ 4 -SS ; 11+ 5 MOSI ; |+ б MISO ; + 7 SCK out DDRB,TEMP ldi TEMP, 0Ы111Ш1 ;0=нет резистора 1=есть резистор out PORTB,TEMP •Jlllllllll11llllllllllIlllllllllllllllllllllllllllllllllllllllllllllllllllllll /Инициализация порта D ldi TEMP, 0ЫШ0010 ;0=вход 1=выход ; llllllll ; IIIIIII+-0 RxD ; IIIIII+--1 TxD ; IIIII+—2 RXF(INTO) ; NII+-—3 TXE(INTl) ; 111+ 4 -RDU ; ||+ 5 WRU . |+ б _WR ; + 7 -RD out DDRD,TEMP ldi TEMP, 0Ы1010011 ;0=нет резистора 1=есть резистор out PORTD,TEMP Юсновной модуль MAIN: rcall PrmByte ;Прием команды mov TX_BUF, RX_BUF ;Записать в буфер передатчика rcall PrdByte ;Эхо mov TEMP,RX_BUF /Сохранить команду в рабочем регистре cpi TEMP, 0 /Если команда = О breq MAIN /Конец MAINl: cpi TEMP,0x55 /Код команды ? breq MAING ;Да-выполнить
8. Адаптер USB-AVR 113 cpi TEMP,OxAA ;Код команды ? breq MAING ;Да-выполнить cpi TEMP,0xFF ;Код команды ? breq MAING ;Да-выполнить cpi TEMP,0xC ;Код команды ? brne MAIN2 ;Нет-далее clr TEMP /подготовить обнуление MAING: rcall WrDat ;Да-выполнить команду rjmp MAIN /Конец MAIN2: cpi TEMP, 0x10 ;Код команды ? brne MAIN3 ;Нет-далее rcall RdA ;Да-выполнить команду mov TX_BUF, TEMP set ;T=1 bid FLAGS ,FLprm ;флаг необходимости передачи взвести rcall PrdByte /Передать байт данных rjmp MAIN /Конец MAIN3: cpi TEMP,0x20 /Код команды ? brne MAINE /Нет-далее rcall RdC ;Да-выполнить команду mov TX.BUF, TEMP set ;T=1 bid FLAGS,FLprm /флаг необходимости передачи взвести rcall PrdByte /Передать байт данных MAINE: rjmp MAIN /Конец /Подпрограмма приема байта через FT245AM /Вход: бит D2(-RxF) /Выход: RX_BUF ; Используются :ТЕМРРР PrmByte: clr RX_BUF ; Очистка команды sbic PIND, INPD_RXF ; Если буфер приема FT8U пуст ret / Выход set ; Иначе Т=1 bid FLAGS, FLprm ; флаг приема команды взвести rcall PortACinp ; Порты А и С в режим приема cbi PORTD, OUTD.RDU ; -RDU=0 nop ; Задержка in RX_BUF, PINA / Чтение команды sbi PORTD, OUTD_RDU ; -RDIM ret /Подпрограмма передачи байта через FT245AM
114 Глава 1. Адаптеры для персонального компьютера IBM PC /Вход: бит D3(-TxE) TX_BUF /Выход: FT245AM ; Используются: ТЕМРРР, TEMP PrdByte: sbic PIND, INPD_TXE ; Если нет готовности предатчика ret ; выход sbrs FLAGS, FLprm ; Если не было принято команды ret ; выход rcall PortACout ; Порты А и С на вывод sbi PORTD, 0UTD_WR ; WRU=1 nop ; Задержка out PORTA, TX_BUF ; Запись байта в буфер передачи FT8U cbi PORTD, 0UTD_WR ; WRU=0 rcall PortACinp ; Порты А и С на ввод clt ; Т=0 bid FLAGS,FLprm ; флаг необходимости передачи сбросить ret /Подпрограмма программирования портов А и С на вывод /Вход: /Выход: TORT А,С ; Используются: ТЕМРРР PortACout: ldi ТЕМРРР, 0Ь1111Ш1;0=вход 1=выход out DDRA,TEMPPP out DDRCTEMPPP ret /Подпрограмма программирования портов А и С на ввод /Вход: /Выход: TORT А,С / Используются: ТЕМРРР PortACinp: ldi ТЕМРРР, 0Ь00000000;0=вход 1=выход out DDRA,TEMPPP out DDRCTEMPPP ldi TEMPPP, 0Ь00000000;0=нет резистора 1=есть резистор out PORTA,TEMPPP out PORTC,TEMPPP ret
8. Адаптер USB-AVR 115 /Подпрограмма записи адреса IDMA ;Вход: TEMP ;Выход: шина AD ; Используются :ТЕМР WrDat: rcall PortACout out PORTA, TEMP out PORTC, TEMP cbi PORTD, OUTD.WR ;WR=0 Строб nop /Задержка sbi PORTD, OUTD.WR ;WR=1 rcall PortACinp ret /Подпрограмма чтения младшего байта из порта А /Вход: /Выход: TEMP ; Используются: TEMP RdA: cbi PORTD, OUTD_RD ;RD=0 Строб nop /Задержка in TEMP, PINA /Чтение Sbi PORTD, OUTD_RD ;RD=1 ret /Подпрограмма чтения старшего байта из порта С /Вход: /Выход: TEMP ; Используются :ТЕМР RdC: cbi PORTD, OUTD.RD ;RD=0 Строб nop /Задержка in TEMP, PINC /Чтение Sbi PORTD, OUTD_RD ;RD=1 ret
116 Глава 1. Адаптеры для персонального компьютера IBM PC Перед профаммированием контроллера данная программа транслируется с помощью программного пакета AVR Studio или любого другого, предназначенного для AVR контроллеров. Можно также воспользоваться подготовленной для программирования прошивкой, код которой в формате HEX Intel приведен ниже. Коды прошивки в HEX Intel формате для программирования контроллера AVR :020000020000FC :100000000СС0189518951895189518951895189569 :10001000189518951895189518957FE57DBF72E08D :100020007EBF70E077BB7FEF78BB72EF71BB73ED83 :1000300072BB20D0562F29D0762F7030D1F3753572 :1000400039F07A3A29F07F3F19F07C3019F477279C :1000500034D0EFCF703131F438D0572F689400F995 :1000600014D0E7CF703229F435D0572F689400F9B7 :100070000CD0DFCF662782990895689400F916D0D6 :100080009498000069B3949A08958399089500FFA5 :10009000089508D0969A00005BBB969807D0E89424 :1000A00000F908959FEF9ABB94BB089590E09ABB26 :1000B00094BB90E09BBB95BB0895F4DF7BBB75BB05 :1000C00096980000969AF2DF08959798000079B309 :0E00D000979A08959798000073B3979A089531 :00000001FF Запись программы в контроллер можно осуществить любым доступным внутрисхемным программатором. Некоторые программаторы со схемами и программным обеспечением представлены на русскоязычном сайте фирмы Atmel по адресу http://www.atmel.ru/Hardware. Готовый к употреблению программатор AVR Prog, поддерживаемый программной средой известного пакета AVR Studio, можно приобрести в Интернет-магазине на сайте http://www.xxivek.narod.ru. В качестве управляющей программы со стороны компьютера для проверки адаптера AVR можно воспользоваться программой автора данной книги «test-rs» версии 2.1, которая описывается в разд. 24 «Тестирование СОМ-порта». Данная версия программы поддерживает до восьми физических и виртуальных портов. Эта программа может пригодиться читателям при выполнении различных работ, связанных с последовательными портами компьютера. Аналогично можно разработать подобный адаптер на другом контроллере с достаточным количеством программируемых выводов. Хорошо подходят для этой цели, например, контроллеры семейства MSC, некоторые PIC-контроллеры и т.д.
9. Адаптер USB-HUB 117 9. Адаптер USB-HUB Читателю предлагается познакомиться с еще одним важным устройством USB, которое называют концентратором, расширителем или просто «хабом». Последнее название происходит от английского слова HUB, означающего в переводе «узел». Основное назначение концентратора — увеличение количества портов. В нашем случае HUB служит для получения из одного USB-порта семи портов USB. Кроме того, он имеет в своем составе разъемы для подключения клавиатуры PS/2, манипулятора мышь PS/2 и последовательный СОМ-порт. Адаптер USB-HUB (концентратор) разработан на базе микросхемы FT8U100AX все той же фирмы FTDI, знакомой читателям по предыдущим разделам книги. Краткое описание этой микросхемы было приведено в разд. 7 «Адаптер USB-COM». Напомню, что помимо прямого назначения — контроллера HUB, многофункциональный чип FT8U100AX включает в себя встроенные порты инфракрасного канала, двухпроводную шину 12С, последовательный интерфейс UART, порты PS/2 мыши и клавиатуры. Однако задействовать все перечисленные интерфейсы в одном устройстве невозможно, поскольку одни и те же выводы микросхемы в зависимости от конфигурации выполняют различные функции. Например, при использовании последовательного СОМ-порта невозможно будет использовать инфракрасный порт IrDA, и наоборот. Блок схема данной микросхемы приведена на Рис. 9.1. Микросхема состоит из 12 основных функциональных блоков, связанных между собой магистральными шинами адреса ADDR, данных DATA и управления CTL. Блок EMCU MICROCONTROLLER CORE представляет собой встроенный 8-битовый контроллер. Он производит запись и чтение дескрипторов (записей) во внешней программируемой памяти через шину External ROM Bus. Блок DATA SRAM 256 Bytes является статическим буфером данного контроллера объемом 256 байт, который используется для временного хранения данных. Блок FTDI SERIAL INTERFACE ENGINE обеспечивает следующее функции управления USB: NRZI кодирование/декодирование информации, разделение данных из непрерывного пакета, обнаружение начала и окончания пакета, параллельно-последовательное преобразование, проверку контрольной суммы CRC, декодирование кода производителя PID и другие важные функции внутреннего протокола USB-интерфейса. Данный блок работает в паре с буфером данных ENDPOINT DATA BUFFER 256 Bytes.
118 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 9.1. Блок схема микросхемы FT8U100AX Блок USB HUB REPEATER — обеспечивает маршрутизацию данных функционального назначения для FT8U100AX. Он выполняет функции соединения и разъединения потока данных, управляет скоростью данных при маршрутизации и обнаруживает специальные сигналы управления. Блок HUB PORT POWER CONTROL AND OVERCURRENT DETECT. Обеспечивает управление питанием и обнаружение токовой перегрузки. Вспомогательным блоком для поддержки интерфейса связи с клавиатурой и мышкой PS/2 является блок PS/2 KEYBOARD I/F PS/2 MOUSE I/F.
9. Адаптер USB-HUB 119 Кроме того, чип содержит блок двухпроводного последовательного интерфейса MASTER/SLAVE 2-WIRE SERIAL BUS, блок интерфейса последовательных инфракрасных портов SERIAL PORT l SERIAL PORT2 (IrDA SIR) SERIAL PORT3 (CIR) с блоком контроллера пульта управления FTIR Ir REMOTE CONTROL PORT и блок управления параллельными портами PARALLEL I/O PORTS 1-5. В качестве задающего генератора и схемы синхронизации чипа используется блок OSC 48MHz. Рассмотрим конкретную реализацию 7-портового адаптера USB-HUB на базе этой микросхемы. Принципиальная электрическая схема данного устройства приведена на Рис. 9.2. В Табл. 9.1 приведен перечень элементов, из которых состоит концентратор. В этой же таблице приведены варианты замены некоторых элементов на их отечественные аналоги. Таблица 9.1. Элементы концентратора Позиционное обозначение BQ1 Наименование Резонатор кварцевый 48 МГц Количество 1 Примечание HC-49U Чип конденсаторы керамические 0805 С1—СЗ, С27—С44 С4 С5—С7, С45—С53 С8—С19, С54, С55, С58—С61,С64,С65, С69—С72 С68 47 пФ 8,2 пФ 10 пФ ОД мкФ 10 нФ 21 1 12 24 1 Конденсаторы электролитические SR С20—С26 С56, С57, С66, С67 С62, С63 47мкФ10В 10 мкФ 10 В 470 мкФ 10 В 7 4 2 К53-35 К53-35 К53-35 Микросхемы D1,D2 D3 D4 D5,D6 D7 MIC2527 FT8U100AM 27С256B7С512) Панелька РС-28 74HCT174D AT93C46A, M93C46SC, 93LC46BC(I)/SN 2 1 1 1 2 1 PQFP-100 DIP-28 DIP-28 SOIC-16 SOIC-8
120 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 9.1. (Продолжение) Позиционное обозначение D8 D9 Наименование LM2937-3.3 ADM213EARS, МАХ213С(Е)А1, SP213EHC(E)A Количество 1 1 Примечание ТО-263 28 SSOP 1 Предохранители самовосстанавливающиеся FU1—FU9 HL1—HL7 HL8—HL11 L1 RXE-050 Светодиоды L-937G/Y L-934GD Чип индуктивность 1812 1 мкГн 9 7 4 1 Двухцветный Зеленый 1 Чип резисторы 0805 или 1206 Rl, R64 R2, R3, R24—R37 R4 R5 R6 R7, R52—R55 R8—R23, R60—R62 R38—R51 R54—R59, R63 R65 R66 R67 R68—R70 R71—R79 VD1 100 кОм 33 0м 22 0м 47кОм 15кОм 100Ом ЮкОм 15кОм 4,7 кОм 1,5 кОм 330 кОм 180 кОм 2,2 кОм 220 Ом Диод BAS216 2 16 1 1 1 5 19 14 7 1 1 1 3 9 1 КД521 Транзисторы VT1 VT2, VT3 2N3904 2N3906 1 2 КТ3102БА-Е КТ3107А-Л Соединители ХО XI—Х7 Х8 Х9, Х10 ХР J2 Вилка USB B-4 на плату Вилка USB A-4 на плату Вилка DRB-9M на плату Розетка MINIDIN6 на плату Розетка питания DJK-02A Вилка PLS-3 Джампер MJ-0 1 7 1 2 1 1 1 Тип В Тип А
9. Адаптер USB-HUB 121 Как следует из схемы, ее центральным звеном является микросхема D3 FT8U100AX, которая обеспечивает все основные функции HUB. Непосредственно к ней подключена микросхема постоянной программируемой памяти D4. В этой микросхеме хранятся микропрограммы, используемые концентратором для работы с некоторыми внешними устройствами. Входящий поток USB подключается к разъему ХО. Конденсаторы С1 и С2, СЗ гасят высокочастотные помехи по цепи питания и на шине данных потока USB соответственно. Через согласующие резисторы R2 и R3 дифференциальный поток данных поступает на вход микросхемы концентратора D3. Транзистор VT1 обеспечивает подключение подтягивающего резистора R65 для установки максимальной скорости обмена по интерфейсу. Резистор R63 ограничивает базовый ток транзистора VT1, a R64 запирает этот транзистор при отсутствии напряжения питания со стороны разъема ХО за счет подключения базы транзистора к нулевому потенциалу схемы. Узел сброса всей схемы выполнен на элементах R66, R67, R7, С8 и VD1. Задающий генератор построен на BQ1, С6, С7, R5 и R4. Элементы LI, C4 и С5 обеспечивают стабильный запуск и работу кварцевого резонатора на третьей гармонике резонансной частоты, которая составляет 48 МГц. Микросхемы D1 и D2 с элементами R8—R23 и С9—С12 обеспечивают ограниченное по току питание выходных портов USB. Регистры D5 и D6 формируют сигналы управления индикацией, выполненной на светодиодах HL1—HL11, резисторах R69—R79 и транзисторах VT2, VT3. Светодиоды отображают состояние портов при работе концентратора. Светодиоды HL1—HL7 являются двухцветными и отображают состояние выходных портов USB. Так, свечение светодиода желтым цветом означает низкую скорость потока USB с подключенным к данному порту устройству. Зеленый цвет указывает на максимальную скорость работы по этому порту. При включении питания концентратора все светодиоды должны зажечься на короткое время, что говорит о правильной инициализации всех его внутренних устройств. Микросхема перепрограммируемой памяти D7 используется для хранения описателей устройства (названия кодов производителя и т.д.). Она программируется внутрисхемно, о чем будет сказано далее. Преобразователь уровней сигналов D9 совместно с элементами С69—С72 обеспечивает преобразование уровней сигналов СОМ-порта, выведенных на разъем Х8 в соответствии со стандартом RS-232. Цепочка элементов R68 и С68 является помехозащитной. Выходные потоки USB-портов и интерфейсные сигналы клавиатуры и мыши выведены на разъемы XI—Х9 через согласующие, фильтрующие и корректирующие элементы С13—С53
122 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 9.2. Принципиальная электрическая схема адаптера USB-HUB
9. Адаптер USB-HUB 123 Рис. 9.2. Принципиальная электрическая схема адаптера USB-HUB (продолжение)
124 Глава 1. Адаптеры для персонального компьютера IBM PC и R24—R59. Самовосстанавливающиеся предохранители FU1—FU9 обеспечивают дополнительную защиту концентратора от выхода из строя при возникновении коротких замыканий в его выходных питающих цепях. Питание концентратора осуществляется от внешнего источника питания напряжением +5 В и мощностью не менее 20 Вт, что обусловлено необходимостью обеспечения питанием всех подключаемых к концентратору внешних устройств. Этот источник подключается к разъему ХР. С помощью микросхемы стабилизатора D8 из напряжения +5 В формируется напряжение +3,3 В, необходимое для питания внутренних элементов концентратора. Конденсаторы, подключенные к цепям питания, предназначены для фильтрации и стабилизации питающих цепей. После сборки концентратора надо запрограммировать микросхему перепрограммируемой памяти EEPROM D7, включенную в его состав. Для этого существует специальная программа e2prog.exe. Она доступна на сайте www.ftdichip.com. Перед ее запуском необходимо установить драйверы виртуальных портов VCP, которые также доступны на указанном выше сайте. Установка этих драйверов начинается автоматически после подключения концентратора к компьютеру с помощью стандартного кабеля USB и подключения его к источнику питания через разъем ХР. Процедура этой установки подробно описана в разд. «Адаптер USB-COM». Напомню лишь, что перед установкой драйверов следует убедиться в том, что* на компьютере имеется USB-порт, и он разрешен в SETUP. После запуска программы e2prog.exe на экране монитора появится основная форма программы, которую необходимо заполнить. Изображение этой формы и образец ее заполнения приведены на Рис. 9.3. После этого необходимо щелкнуть левой кнопкой мыши на кнопке с вытянутой рукой или выбрать в меню Device функцию Advanced Setup и в появившемся окне (Рис. 9.4.) отметить поля подключенных портов. Первые 7 из этих портов являются USB-портами. Порт номер 8 является последовательным СОМ-портом, а 9-й порт поддерживает клавиатуру и мышь. ' Если при изготовлении концентратора некоторые из этих портов не устанавливались на плату, отмечать их в конфигураторе не следует. Флажок в поле Plug and Play устанавливается при необходимости поддержки данной функции для подключаемых к концентратору устройств. Далее необходимо выполнить операцию программирования микросхемы D7. Для этого надо выбрать пункт Program меню Device. Результат программирования будет отображен на экране монитора.
9. Адаптер USB-HUB 125 Рис. 93. Форма программы e2prog.exe и образец ее заполнения Рис. 9.4. Окно функции Advanced Setup
126 Глава 1. Адаптеры для персонального компьютера IBM PC После успешного программирования можно протестировать СОМ-порт концентратора, если он присутствует на плате. Для этого потребуется тестирующий кабель, схема и способ изготовления которого подробно описаны в разд. 7 «Адаптер USB-COM». Запускается тест функцией Test из того же меню Device. Результат тестирования также будет отображен на экране монитора. В концентраторе присутствует еще одна микросхема памяти D4, которая является однократно программируемой (ОТР ROM) и служит для хранения микропрограмм. Данные микропрограммы позволяют выполнить более гибкую настройку конфигурации подключаемого устройства. На сайте фирмы FTDI можно скачать прошивки этой микросхемы для работы с клавиатурой и мышкой компьютеров типа «Apple». После выполнения всех перечисленных операций концентратор готов к работе.
10. Адаптер USB-Serial 127 10. Адаптер USB-Serial Данный раздел посвящен микросхеме контроллера PL-2303 и разработанному на ее основе адаптеру с USB-интерфейсом, который может найти широкое применение в повседневной практике разработчиков и пользователей компьютеров. Микросхема PL-2303 представляет собой контроллер моста между интерфейсом USB и последовательным интерфейсом RS232. Данный контроллер обладает следующими характеристиками: • Полное соответствие со спецификацией USB vl.l и USB CDC vl.l. • Полная поддержка последовательного интерфейса RS232. • Поддержка протокола автоматического режима «рукопожатия». • Поддержка дистанционного запуска и управления питанием. • Встроенные 256-байтовые буферы для исходящих и входящих потоков данных. • Поддержка встроенного ROM или внешнего EEPROM для конфигурации устройства. • Однокристальный приемопередатчик USB. • Встроенный однокристальный генератор, работающий на частоте 12 МГц. • Поддержка операционных систем Windows98SE/ME/2000/XP, WindowsCE3.0/CE.NET, Linux и Mac. • Малогабаритный 28-выводной корпус SSOP. • Расширенный рабочий температурный диапазон от минус 45°С до плюс 85°С. • Питание от однополярного источника напряжением от 4,75 до 5,25 В. • Малый ток потребления в рабочем режиме 19. мА, а в режиме ожидания 400 мкА. Структурная схема контроллера представлена на Рис. 10.1. Согласно этой схеме, в ней заложены все необходимые функциональные блоки для работы с портом USB. В первую очередь, это блок приемопередатчика, который осуществляет согласование приема и передачи данных по двум дифференциальным двунаправленным линиям связи USB-порта. С ним непосредственно связан блок преобразователя интерфейса, отвечающий за выделение и преобразование данных из потока USB. Синтезатор частоты обеспечивает синхронизацию потока данных. Блок управляется вместе с регистрами статуса и управления, которые отвечают за поддержание протокола USB. Принимаемые по USB данные
128 Глава 1. Адаптеры для персонального компьютера IBM PC из блока преобразователя поступают в 256-байтовый буфер входного потока. Передаваемые данные поступают на блок преобразователя из 256-байтового буфера выходного потока. Оба буфера организованы по принципу FIFO (первый пришел, первый ушел). Это позволяет осуществить мягкую синхронизацию между двух различных по скорости потоков данных между компьютером и внешним устройством. Непосредственно с данными буферами связан блок интерфейса RS-232, отвечающий за управление последовательными потоками данных через эти буферы. Он так же, как и блок преобразователя, управляется блоком управления. Синхронизация блока интерфейса RS- 232 осуществляется от блока синхронизатора частоты. На выходе блока интерфейса RS-232 формируются все стандартные сигналы интерфейса RS-232. Эти сигналы присутствуют на внешних выводах микросхемы в стандартных логических уровнях ТТЛ. Дополнительно в состав микросхемы включен блок стабилизатора напряжения на 3,3 В. Это напряжение используется для подтягивания одной из дифференциальных линий связи USB, чтобы установить скорость пере- Рис. 10.1. Структурная схема контроллера
10. Адаптер USB-Serial 129 дачи данных по интерфейсу USB. Так, при подключении этого напряжения через ограничительный резистор к положительному сигналу шины данных USB по интерфейсу USB можно будет передавать данные с максимально возможной скоростью 12 Мбод. Если вместо положительного сигнала к источнику 3,3 В подключить отрицательный сигнал шины данных, по интерфейсу USB можно будет передавать данные только со скоростью 1,5 Мбод. Эта возможность заложена в спецификации протокола USB с целью совместимости с низкоскоростной периферией. Роль синхронизации всех процессов внутри микросхемы отведена блоку генератора и синтезатору частоты. К блоку генератора должен подключаться внешний кварцевый резонатор на 12 МГц. Синтезатор частоты формирует из частоты 12 МГц задающего генератора внутреннюю частоту 48 МГц, необходимую для синхронизации скоростных процессов внутри микросхемы. Блок интерфейса EEPROM позволяет осуществить запись и чтение специальных данных об устройстве в подключаемую извне микросхему энергонезависимой, электрически перепрограммируемой постоянной памяти. К таким данным относятся: серийный номер изделия, его название, информация о фирме-производителе, поставщике продукции и т.д. Более подробно об этом будет рассказано ниже. Согласно приведенным выше технических характеристикам, микросхема PL-2303 имеет малогабаритный корпус SOIC-28. Описание всех выводов микросхемы приводится в Табл. 10.1. Таблица 10.1. Описание выводов микросхемы Вывод 1 2 3 4 5 6 7 8 Название TXD DTR_N RTS_N VDD_232 RXD RI_N GND VDD Тип 0 0 о p I I p p * Описание Выход данных в последовательный порт Сигнал RS-232 «Data Terminal Ready», активный уровень низкий Сигнал RS-232 «Request To Send», активный уровень низкий Питание встроенного блока интерфейса RS-232. Выходные сигналы RS-232 (выводы 1—3), поддерживают уровни напряжения 5 В, 3,3 В или 3 В. Вывод VDD_232 должен быть подключен к тому же источнику питания, что и внешний преобразователь уровней интерфейса RS- 232. Входные сигналы RS-232 могут иметь произвольный уровень сигналов от 3 до 5 В Вход данных от последовательного порта Сигнал RS-232 «Ring Indicator», активный уровень низкий Земля Питание
130 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 10.1. (Продолжение) Описание Сигнал RS-232 «Data Set Ready», активный уровень низкий Сигнал RS-232 «Data Carrier Detect», активный уровень низкий Сигнал RS-232 «Clear To Send», активный уровень низкий Отключение внешнего преобразователя уровней интерфейса RS232 Во время сброса, этот вывод является входом для тестирования. В нормальном режиме, на этом выводе формируется сигнал синхронизации внешней постоянной последовательной памяти SROM Сигнал данных SROM Сигнал положительного потенциала данных USB Сигнал отрицательного потенциала данных USB Питание 3,3 В для приемо-передатчика USB Общий вывод 3,3 В Системный сброс Питание Общий вывод питания Этот вывод после сброса определяет состояние выводов RS-232. Высокий уровень этого сигнала переводит выходы RS-232 в неактивное состояние в режиме отключения внешнего преобразователя уровней. Низкий уровень данного сигнала переводит эти выходы в третье состояние Этот вывод является входом в течение сброса. Подключение этого вывода к питанию через резистор 220 кОм установит режим максимальной нагрузки USB E00 мА). Подключение данного вывода к общему выводу через резистор 220 кОм установит режим малой нагрузки USB A00 мА). После сброса этот вывод становится выходным сигналом, инверсным по отношению к сигналу SHTD_N Питание 5 В для блока PLL Общий вывод блока PLL Управление режимом тестирования блока PLL Входной сигнал для подключения кварцевого резонатора Выходной сигнал для подключения кварцевого резонатора — входной сигнал; О — выходной сигнал; I/O — двунаправленный сигнал;
10 Адаптер USB-Senal 131 Контроллер поддерживает различные форматы данных и имеет программируемый генератор скорости приемопередатчика. Возможные форматы данных контроллера показаны в Табл. 10.2. Таблица 10.2. Возможные форматы данных контроллера Данные Стоп биты Тип паритета Биты данных Формат 1,1Д 2 Нет (None) Нечетный (Odd) Четный (Even) Маркер (Mark) Пробел (Space) 5,6,7,8 или 16 Благодаря встроенному в контроллер программируемому генератору и регистрам управления можно управлять скоростью передачи данных по последовательному интерфейсу, задавая слово управления скоростью. Программируемый генератор поддерживает скорости вплоть до 1,2 Мбод, как показано в Табл. 10.3. Таблица 103. Установки скорости Слово 0012C000h 000E1000h 00096000b 00070800b 00038400b 0001C200h OOOOElOOh 00009600h 00007080h 00004B00h 00003840b 00002580b 00001 C20h 000012C0h Скорость, бод 1228800 | 921600 614400 460800 230400 115200 57600 38400 28800 19200 14400 9600 7200 4800
132 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 103. (Продолжение) Слово ОООООЕЮп 00000960b 00000708h 000004B0h 00000258b 0000012Ch 00000096b 0000004Bh Скорость, бод 3600 2400 1800 1200 600 300 150 75 Контроллер PL-2303 допускает хранение данных конфигурации во внешней микросхеме электрически перепрограммируемой постоянной памяти EEPROM с последовательным доступом. После сброса контроллером проверяются первые два байта EEPROM. Если они имеют значение 067Bh, EEPROM используется и ее содержимое будет загружено для конфигурирования параметров контроллера. В противном случае будет использована конфигурационная установка по умолчанию. Содержимое внешней микросхемы EEPROM показано в Табл. 10.4. Таблица 10.4. Содержимое внешней микросхемы EEPROM Байты 1:0 3:2 5:4 7:6 10:8 Название ЕЕСНК VID (Vendor ID) PID (Product ID) RN (Release number) DCR (Device Configuration Register) Описание Если внешняя микросхема EEPROM подключенаи запрограммирована, эти два байта должны иметь значение 067Вп. После сброса контроллера они будут проверены самим EEPROM-контроллером на соответствие этому значению. При их совпадении следующая информация будет загружена как параметры контроллера Идентификационный номер поставщика Идентификационный номер производителя Номер версии в двоично-десятичном формате (BCD) Регистр конфигурации устройства Регистр конфигурации контроллера используется для управления некоторыми специальными функциями. Назначение каждого бита в регистре конфигурации PL-2303 описано в Табл. 10.5.
10. Адаптер USB-Serial 133 Таблица 10.5. Регистр конфигурации устройства Номер бита 23 22 21 20 19 18 17 16 15 14 Название RESERVED TRI_OUT RW_MODE WURX WUDSR WURI WUDCD WUCTS RESERVED RESERVED Описание Зарезервировано Состояние выходных сигналов RS-232: 1 — выходы RS-232 в третьем состоянии; 0 — выходы RS-232 в режиме вывода Дистанционный способ пробуждения: 0 — когда происходит пробуждение, устройство подключает пассивный сигнал; 1 — когда происходит пробуждение, устройство подключает активный сигнал Разрешение триггера пробуждения для RXD: 0 — запрещен; 1 — разрешен триггер пробуждения для изменения состояния RXD Разрешение триггера пробуждения для DSR: 0 — запрещен; 1 — разрешен триггер пробуждения для изменения состояния DSR Разрешение триггера пробуждения для RI: 0 — запрещен; 1 — разрешен триггер пробуждения для изменения состояния RI Разрешение триггера пробуждения для DCD: 0 — запрещен; 1 — разрешен триггер пробуждения для изменения состояния DCD Разрешение триггера пробуждения для CTS: 0 — запрещен; 1 — разрешен триггер пробуждения для изменения состояния CTS Всегда установлено в единицу Всегда установлено в ноль Значение по умолчанию 1 0 0 1 0 0 1 0 0 1 0
134 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 10.5. (Продолжение) Номер бита 13 12 11:6 5:4 3:1 0 Название RESERVED RWJNH RESERVED RTSM RESERVED RSPDM Описание Всегда установлено в ноль Приостановка дистанционных функций: 1 — приостановить USB дистанционные функции; 0 — разрешить USB дистанционные функции Всегда установлено в ноль Метод управления RTS: 00 — RTS управляется через карту битов управления. Активный сигнал низкий; 01 — RTS управляется через карту битов управления. Активный сигнал высокий; 10 — RTS активен, когда выходной поток буфера данных не пустой; в противном случае RTS неактивный; 11 — RTS неактивен, когда выходной поток буфера данных не пустой; в противном случае RTS активный Всегда установлено в ноль Режим засыпания приемопередатчика RS-232: 1 — Приемопередатчик засыпает, когда USB приостановлен; 0 — Приемопередатчик не засыпает, даже когда USB приостановлен Значение по умолчанию 0 0 000000 00 000 1 На базе описываемого контроллера мной был разработан адаптер USB- Serial, позволяющий осуществлять передачу данных между интерфейсом USB и любыми устройствами с последовательным интерфейсом стандарта RS-232, например с СОМ-портом компьютера или с последовательным портом программатора. Фактически адаптер представляет собой преобразователь USB-интерфейса в последовательный СОМ-порт. Необходимость в таком устройстве обусловливается следующими причинами. Большое количество различных промышленных и самодельных электронных устройств (манипуляторов мыши, модемов, программаторов,
10. Адаптер USB-Senal 135 эмуляторов и т. п.) подключается к компьютеру через последовательный СОМ-порт. Однако в связи с тем, что персональные компьютеры, как правило, имеют всего два таких последовательных порта, возникает необходимость в регулярном переподключении различных устройств к компьютеру поочередно. В то же время компьютер имеет два, а последние модели компьютеров даже четыре и более свободных портов USB. С помощью предлагаемого адаптера эти порты можно использовать для увеличения количества СОМ-портов. Причем количество USB-портов у компьютера можно увеличить без дополнительных затрат, например, с помощью встроенного в некоторые модели мониторов четырехпортового устройства HUB USB. В отличие от СОМ-портов, к порту USB можно подключить до 127 устройств. Интерфейс USB позволяет подключать периферийные устройства без отключения компьютера («горячая стыковка»). Предлагаемый адаптер обладает таким же свойством, поскольку имеет интерфейс USB. Принципиальная электрическая схема адаптера, приведенная на Рис. 10.2, позволит понять, как легко и просто можно внедрить интерфейс USB в новые разработки на базе микроконтроллеров и процессоров с универсальным, последовательным приемопередатчиком (UART), который присутствует практически во всех микроконтроллерах. Таким образом, на основе предложенной схемы можно будет разрабатывать различные устройства со встроенным USB-портом. В Табл. 10.6 дается перечень элементов, из которых она состоит, с указанием типов компонентов, их параметров, вариантов замены и других данных. Таблица 10.6. Элементы адаптера Позиционное обозначение BQ1 CI, C8 Наименование Резонатор кварцевый 6000 кГц Конденсатор электролитический SR-10-10 Количество 1 2 Примечание HC-49U 10 мкФ 10 В Чип-конденсаторы керамические 0805A206) С2—С7,С9—С15 С9, СЮ ОД мкФ 10 пФ 13 2 10—18 пФ Микросхемы D1 D2 D3 L1 PL2303 24С02 MAX213CAI (SP213ECA, ADM213EARS) Чип-индуктивность 1812 100 мкГн 1 1 1 1 SSOP-28 SOIC-8 SSOP-28
136 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 10.6. (Продолжение) Позиционное | обозначение Наименование Количество Примечание Чип-резисторы 0805A206) Rl, R2 R3 R4, R5 R6, R7 27 0м 1,5 кОм 220 кОм 4,7 кОм 2 1 2 2 Соединители XI Х2 Вилка USB B-4 на плату Вилка DRB-9M на плату 1 1 тип В Порт USB подключается к адаптеру через соединитель XI «USB». В адаптере все операции по поддержанию протокола USB и преобразованию данных выполняет контроллер D1. Для согласования по уровню выходных сигналов контроллера с подключаемой периферией в схеме применен преобразователь уровней D3. Он содержит в своем составе DC/DC преобразователь и позволяет преобразовывать сигналы ТТЛ-уровней в сигналы стандарта RS-232. Преобразованные данной микросхемой сигналы подключены непосредственно к разъему Х2 «СОМ». В качестве внешней энергонезависимой памяти применяется микросхема D2. Она представляет собой постоянную, электрически перепрограммируемую микросхему памяти EEPROM с последовательным интерфейсом 12С. Объем памяти данного чипа составляет 1 Кбит. Стирание и запись информации в него производится через интерфейс USB с помощью контроллера D1 после распайки на плате, т.е. внутрисхемно. Дроссель L1 вместе с конденсаторами С1—С8 осуществляет фильтрацию питающих напряжений адаптера. Резисторы R1 и R2 являются согласующими элементами шины данных USB. Резистор R3, как было сказано выше, определяет скорость работы по интерфейсу. Конденсаторы С9, СЮ вместе с кварцевым резонатором BQ1 обеспечивают генерацию задающей частоты контроллера. Конденсаторы СИ—С14 участвуют в формировании положительного и отрицательного напряжений для сигналов интерфейса СОМ-порта. Резисторы R4 и R5 задают режим работы котроллера, а резисторы R6 и R7 подтягивают сигналы интерфейса 12С к шине питания. Микросхему D2 и резисторы R6 и R7 можно не устанавливать, если нет необходимости в изменении заводской конфигурации контроллера. Назначение цепей и контактов в разъеме Х2 «СОМ» соответствует стандартному СОМ-порту. Поэтому при подключении периферийного устройства к данному адаптеру не потребуется никаких переходников или дополнительных кабелей. Со стороны
10. Адаптер USB-Serial 137 Рис. 10.2. Принципиальная электрическая схема адаптера
138 Глава 1. Адаптеры для персонального компьютера IBM PC USB адаптер подключается к компьютеру через разъем XI «USB» с помощью стандартных кабелей USB длиной от 1,5 до 5 м, которые имеются в продаже во многих магазинах и фирмах, торгующих компьютерной техникой. Для изготовления адаптера автором книги была разработана печатная плата. Чертежи топологии для верхней и нижней сторон платы приведены на Рис 103 и Рис 10.4. На Рис 10.5 и Рис 10.6 приведены схемы размещения элементов на верхней и нижней стороне платы. Рис 10.3. Топология верхней стороны печатной платы Рис. 10.4. Топология нижней стороны печатной платы
10. Адаптер USB-Serial 139 После установки и монтажа всех элементов на плате ее можно поместить в подходящий по размерам малогабаритный пластиковый корпус. Множество подобных корпусов можно найти в известной компании Платан (www.platan.ru) или Мастер КИТ (www.masterkit.ru). Разумеется, можно разработать другую плату под имеющийся в наличии корпус. Рис. 10.5. Схемы размещения элементов для верхней стороны печатной платы Рис. 10.6. Схемы размещения элементов для нижней стороны печатной платы В схеме адаптера допускается замена большинства компонентов их аналогами. В частности, допустима замена всех резисторов и конденсаторов другим типом с аналогичными характеристиками, поскольку, например, ЧИП компоненты для поверхностного монтажа могут оказаться недоступными или неудобными при монтаже схемы на макетной плате.
140 Глава 1. Адаптеры для персонального компьютера IBM PC Адаптер не требует дополнительного источника питания, так как питается от USB-порта и потребляет не более 50 мА. До подключения адаптера к компьютеру следует убедиться в том, что порт USB разрешен в SETUP компьютера. Обычно вход в SETUP происходит после перезапуска! компьютера удержанием клавиши DEL или F1 (в зависимости от BIOS компьютера). После разрешения USB-порта в SETUP и перезапуска компьютера произойдет обнаружение этого порта, и компьютер произведет автоматическую установку всех необходимых драйверов для USB-порта из инсталляционного пакета операционной системы. После выполнения этой процедуры, или если порт USB уже был разрешен ранее, в свойствах компьютера должна присутствовать запись о наличии контроллера шины USB, включающего в себя корневой развет- витель USB и универсальный хост-контроллер. Пример такой записи для операционной системы Windows98 приведен на Рис. 10.7. Рис. 10.7. Окно свойств компьютера в операционной системе Windows98 Затем необходимо запустить программу с названием pl-2303.exe для установки драйверов адаптера. Эту программу можно бесплатно загрузить с сайта производителя микросхемы по адресу http://www.prolific.com. Программа обеспечивает установку драйвера на операционные системы Windows98SE/ME/2000/XP.
10 Адаптер USB-Senal 141 После запуска данной программы мастер установки автоматически распакует программу, и через несколько секунд на экране появится окно сообщения, показанное на Рис. 10.8. В нем программа приветствует пользователя и сообщает о том, что будет выполнена установка драйверов на компьютер. Для продолжения установки необходимо щелкнуть левой кнопкой мыши на кнопке Next. Рис. 10.8. Окно с приглашением установки драйвера Далее программа выполнит установку драйверов и выведет окно сообщения, показанное на Рис. 10.9. Рис. 10.9. Окно с сообщением об успешной установке драйвера
142 Глава 1. Адаптеры для персонального компьютера IBM PC В нем содержится сообщение об успешной установке драйверов и предлагается нажать кнопку Finish для завершения установки. Кроме того, в сообщении говорится о том, что если к компьютеру был подключен адаптер до запуска программы установки драйверов, его необходимо отключить и подключить вновь после завершения работы программы. При необходимости удалить установленный драйвер следует запустить программу деинсталляции, используя путь Пуск-»Программы->РЬ-2303 USB-Serial Driver->Uninstaller. При этом программа деинсталляции автоматически произведет удаление установленных драйверов контроллера PL-2303 и выведет окно сообщения, показанное на Рис. 10.10, в котором пользователю будет предложено перегрузить компьютер. Рис. 10.10. Окно с предложением перегрузки компьютера После установки драйвера к компьютеру можно подключить адаптер. Однако перед первым подключением адаптера к компьютеру следует убедиться в правильности монтажа адаптера и в отсутствии короткого замыкания между любыми контактами разъема XI «USB», а также в отсутствии замыканий между разноименными цепями схемы. Как только адаптер будет подключен к порту USB, компьютер обнаружит его и автоматически включит в состав системы, назначив для него свободный номер виртуального СОМ-порта.
10. Адаптер USB-Senal 143 При успешном выполнении этих процедур в свойствах компьютера должна присутствовать запись Profilic USB-to-Serial Comm Port в составе контроллера шины USB, а также новый виртуальный порт USB to Serial Port в составе портов СОМ и LPT, которому будет присвоен номер COM3 или другой свободный. Пример такой записи для операционной системы Windows98 приведен на Рис. 10.11. Рис 10.11. Пример записи виртуального порта для операционной системы Windows98 После этого можно использовать адаптер как обычный СОМ-порт, естественно, за исключением прямых обращений к регистрам порта, как это можно было делать в DOS. Другими словами к нему можно подключить любое периферийное устройство, которое раньше подключалось к СОМ- порту компьютера. При этом оно так же автоматически будет обнаруживаться компьютером как устройство, подключенное через СОМ-порт. Для тестирования адаптера и обычных СОМ-портов компьютера можно использовать разработанную автором книги программу test-rs.exe
144 Глава 1. Адаптеры для персонального компьютера IBM PC и тестовую заглушку, описываемые в разд. 24 «Тестирование СОМ- порта». На основе описанной здесь схемы адаптера можно изготовить очень популярные в последнее время Data-кабели для подключения к компьютеру мобильного сотового телефона. Такие кабели позволяют не только обеспечить доступ к ресурсам мобильного телефона для загрузки новых мелодий, картинок, редактирования записной книжки и телефонных номеров, но и использовать телефон в качестве модема GPRS для выхода в Интернет. Благодаря мобильности телефона выход в Интернет возможен не только с работы или из дома, но и на природе, в поезде, машине и любом другом месте, где доступна сотовая связь. В зависимости от модели телефона, Data-кабель должен иметь соответствующий разъем и назначение контактов в нем сигнальным цепям. Многие модели сотовых телефонов имеют встроенный беспроводный интерфейс инфракрасной связи (IRDA). Заменив в предложенном адаптере микросхему преобразователя уровней RS-232 на микросхему адаптера интерфейса IRDA, можно получить адаптер USB-IRDA. Таким образом, рассмотренный здесь адаптер может быть легко переработан в любой из перечисленных интерфейсных устройств для обеспечения связи компьютера через порт USB с различными электронными приборами.
11. Адаптер для связи компьютеров через интерфейс USB 145 11. Адаптер для связи компьютеров через интерфейс USB В этом разделе говорится о том, как можно обеспечить связь между двумя компьютерами через интерфейс USB с помощью простого адаптера. В настоящее время интерфейс USB является одним из самых распространенных компьютерных интерфейсов и входит в состав практически всех современных моделей компьютеров типа IBM PC. Фактически интерфейс USB стал стандартом для подключения к компьютеру внешних устройств. Однако он допускает подключение к компьютеру только подчиненных устройств и не позволяет подключить к компьютеру другой компьютер для организации канала связи между ними. Это связано с тем, что, согласно спецификации на данный интерфейс, главным (ведомым) устройством в процессе обмена данными может быть только одно устройство, например, компьютер. Тем не менее эту проблему можно довольно просто решить, применив в схеме связи между двумя компьютерами простой адаптер USB-USB. Этот адаптер разработан автором на основе микросхемы СР2101, которая представляет собой мост USB-UART. С помощью двух таких микросхем, включенных навстречу друг другу интерфейсами UART, можно изготовить адаптер с двумя интерфейсами USB, которые могут быть подключены к разным управляющим компьютерам. Для каждого из двух компьютеров адаптер будет представлять собой подчиненное периферийное устройство, и конфликтной ситуации в использовании интерфейса USB не возникнет. При этом интерфейсы UART внутри адаптера обеспечат взаимный обмен информацией между компьютерами. Помимо простоты схемы, данный адаптер обладает еще одним замечательным качеством — он не требует разработки драйверов и другого специального программного обеспечения для реализации протокола связи между компьютерами. Дело в том, что в состав операционных систем Windows входит программа, имеющая название «прямое кабельное соединение», которую можно использовать для связи компьютеров по интерфейсу USB через данный адаптер. Например, в операционной системе Windows98 эта программа находится в директории C:\WINDOWS и называется directcc.exe. Если такой программы в указанной директории нет, это означает, что пользователь ее не установил при инсталляции операционной системы на компьютер, и необходимо произвести установку этой программы. Принципиальная электрическая схема адаптера приведена на Рис. 11.1.
146 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 11.1. Принципиальная электрическая схема адаптера Как следует из схемы, она состоит всего лишь из двух микросхем СР2101, четырех фильтрующих конденсаторов, и двух разъемов. Перечень элементов схемы с указанием их типов и номиналов приводится в Табл. 11.1. ЧИП-конденсаторы керамические 0805 ЧИП-конденсаторы электролитические Микросхемы СТ-100±20%-010-А СР2101 (СР2102) Соединители Вилка USB B-4 на плату, тип В 10 мкФ 10 В MLP-28 Таблица 11.1. Элементы адаптера USB-USB
11. Адаптер для связи компьютеров через интерфейс USB 147 Микросхема СР2101 представляет собой однокристальный преобразователь USB-UART, не требующий никаких внешних элементов, кроме фильтрующих конденсаторов. Эта микросхема имеет малые габаритные размеры 5x5 мм, что позволяет создавать на ее основе компактные устройства (подробно об этой микросхеме далее). Для изготовления адаптера мною была разработана печатная плата, на которой устанавливаются все элементы устройства. Сборочный чертеж адаптера приведен на Рис. 11.2, а на Рис. 113 и Рис. 11.4 приведена топология печатной платы для данного адаптера со стороны установки компонентов и с обратной стороны соответственно. Файлы для этой печатной платы были подготовлены с помощью программного пакета PCAD2002. Рис. 112. Сборочный чертеж адаптера Рис. 11-3. Топология печатной рис цд Топология печатной платы платы адаптера со стороны адаптера с обратной стороны установки компонентов
148 Глава 1. Адаптеры для персонального компьютера IBM PC Перед первым подключением адаптера к компьютеру следует с помощью тестера убедиться в отсутствии короткого замыкания между выводами разъемов XI и Х2, а также в отсутствии замыканий между соседними выводами микросхем Din D2. Адаптер не требует отладки и настройки и при правильной сборке сразу начинает работать. Рассмотрим подключение и установку драйверов для адаптера на компьютер с операционной системой Windows98. До подключения адаптера к компьютеру необходимо разрешить на компьютере работу USB- портов и установить на компьютер драйверы для работы с адаптером. Разрешение работы USB-портов производиться через SETUP компьютера в соответствии с инструкцией на компьютер. После этой процедуры в свойствах компьютера должна присутствовать запись о наличии контроллеров шины USB, включающих в себя корневой разветвитель для USB и универсальный хост-контроллер. Пример такой записи для операционной системы Windows98 приведен на Рис. 11.5. Рис. 11.5. Окно свойств компьютера Для установки драйверов адаптера загрузите с сервера производителя микросхемы СР2101 по адресу www.silabs.com свободно распространяемые
11. Адаптер для связи компьютеров через интерфейс USB 149 драйверы для микросхемы СР2101 и запустите на выполнение файл setup.exe из загруженного пакета. После запуска программа выведет на экран монитора окно, показанное на Рис. 11.6. Рис. 11.6. Окно после запуска программы setup.exe Для продолжения работы программы нажмите кнопку Install в окне программы. После завершения работы этой программы будет выведено окно сообщения, приведенное на Рис. 11.7, а на жестком диске компьютера будет создан каталог с драйверами в разделе «C:\Program Files\Cyg- nal\CP2101 USB to UART Bridge Controller». Рис. 11.7. Окно после завершения работы программы setup.exe Теперь подключите адаптер USB-USB к компьютеру с помощью обычного кабеля USB для периферийных устройств. При этом компьютер автоматически выведет сообщение о том, что обнаружено новое устройство, и начнет поиск и создание базы драйверов для него. При появлении данного запроса от компьютера укажите путь к каталогу размещения драйверов, приведенному выше. Далее компьютер автоматически выполнит установку драйверов (Рис. 11.8).
150 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 11.8. Процесс установки драйверов на компьютер После завершения данной процедуры в списке контроллеров шины USB компьютера должны появиться устройства с названием «Cygnal USB Composite Device» и «СР2101 USB to UART Bridge Controller». В списке портов компьютера должен появиться новый виртуальный СОМ-порт с названием «СР2101 USB to UART Bridge Controller(COM3)», которому будет присвоен номер COM3 или другой свободный (Рис. 11.9). Рис. JL1.9. Свойства компьютера поле установки драйверов
11. Адаптер для связи компьютеров через интерфейс USB 151 При необходимости деинсталлировать драйверы адаптера, следует отключить адаптер USB-USB от компьютера и запустить программу CYGJJninstall.exe из каталога «C:\Program Files\Cygnal\CP2101 USB to UART Bridge Controller», а затем перезагрузить компьютер. После установки драйверов на двух разных компьютерах можно осуществить между ними связь с помощью адаптера USB-USB и программы прямого соединения. Но прежде требуется открыть доступ к какому-либо каталогу на каждом из компьютеров. Для этого необходимо через свойства сетевого окружения установить на каждом компьютере службу доступа к файлам и принтерам сетей Microsoft, входящей в состав инсталляционного пакета операционной системы Windows, и открыть доступ к файлам компьютера. Пример такой установки показан на Рис. 11.10 и Рис. 11.11. Рис. 11.10. Окно свойств сетевого окружения
152 Глава 1. Адаптеры для персонального компьютера IBM PC Рис. 11.11. Окно службы доступа к файлам После этого с помощью проводника надо выбрать на компьютере какой-нибудь каталог для обмена файлами между компьютерами или создать его специально и задать в его свойствах полный доступ без пароля (Рис. 11.12). Рис. 11.12. Окно для задания доступа в свойствах каталога
11. Адаптер для связи компьютеров через интерфейс USB 153 В результате проводник будет отображать данный каталог в виде папки на ладони, например, как изображено на Рис. 11.13, для каталога «Мои документы». Рис. 11.13. Окно проводника с доступной папкой «Мои документы» Теперь можно запустить программу прямого кабельного соединения поочередно на каждом из компьютеров. При этом один из компьютеров необходимо будет назначить ведущим, а другой — ведомым (Рис. 11.14). Рис. 11.14. Окно настройки прямого соединения Далее требуется выбрать порт для соединения между компьютерами. В данном случае это будет последовательный виртуальный СОМ-порт, который появился в оборудовании компьютера после подклю-
154 Глава 1. Адаптеры для персонального компьютера IBM PC чения к нему адаптера USB-USB и установки соответствующих драйверов (Рис. 11.15). Рис. 11.15. Пример выбора порта для прямого соединения Если требуемый порт отсутствует в списке оборудования программы прямого кабельного соединения, надо нажать в окне выбора порта (Рис. 11.15) кнопку установки новых портов. По завершении настройки программы должно появиться окно (Рис 11.16) с сообщением о готовности компьютера. Рис. 11.16. Окно с сообщением о готовности компьютера Аналогично производится установка программы для второго компьютера, но уже в роли ведомого. После чего дается разрешение на работу про-
11. Адаптер для связи компьютеров через интерфейс USB 155 грамм на обоих компьютерах путем нажатия кнопки готовности. При этом на экране монитора появляется окно установки соединения (Рис. 11.17). Рис. 11.17. Окно установки соединения Через несколько секунд на экране монитора ведущего компьютера должно появиться окно (Рис. 11.18) проверки имени пользователя и его пароля. Рис. 11.18. Окно проверки имени пользователя и его пароля Рис. 11.19. Структурная схема СР2101
156 Глава 1. Адаптеры для персонального компьютера IBM PC После этого открывается доступ к каталогу ведомого компьютера со стороны ведущего компьютера. Причем пользователь ведущего компьютера может свободно читать и записывать файлы каталога ведомого компьютера с помощью проводника или любого другого навигатора. Таким образом, адаптер USB-USB позволяет организовать между двумя компьютерами полноценную связь с возможностью обмена файлами, используя готовое программное обеспечение, входящее в состав операционной системы компьютера. Теперь настало время подробнее раскрыть характеристики микросхемы СР2101 для оценки возможностей адаптера. Для большей наглядности на Рис. 11.19 приведена структурная схема СР2101, на основании которой можно получить представление о составе микросхемы. Основные узлы и технические характеристики микросхемы СР2101 приведены ниже: • встроенный контроллер USB интерфейса спецификации 2.0 со скоростями передачи до 12 Мбит в секунду; • встроенный асинхронный последовательный контроллер с поддержкой всех сигналов модемного интерфейса; • поддержка 5,6, 7 и 8-битных форматов передачи данных с 1,1,5 или 2 стоп-битами, контролем четности, нечетности и т.д.; • обеспечение связи на скоростях от 300 бод до 921,6 Кбод; • встроенный буфер принимаемых данных до 512 байт и передаваемых данных до 512 байт; • встроенные 512 байт энергонезависимой памяти EEPROM для записи идентификационных номеров USB, названия, версии устройства и т.д.; • интегрированный приемопередатчик USB, не требующий внешних компонентов обвязки; • интегрированный тактовый генератор на 48 МГц, не требующий подключения внешнего кварцевого резонатора; • встроенная схема сброса и инициализации; • малое потребление энергии (в активном режиме 18 мА и 90 мкА в режиме ожидания); • встроенный стабилизатор напряжения на 3,3 В и выходным током 80 мА, обеспечивающий питание самого контроллера СР2101 непосредственно от USB-шины с напряжениями от 4 до 5,25 В, а также внешних активных элементов; • миниатюрный корпус MLP-28 с размерами 5x5 мм; • широкий рабочий температурный диапазон от -45 до +85°С.
11. Адаптер для связи компьютеров через интерфейс USB 157 На основе микросхемы СР2101 можно разработать множество полезных устройств. Вот далеко не полный перечень области ее применения: • адаптеры USB-UART для модернизации различных устройств; • адаптеры USB-RS232/RS422/RS485; • интерфейсы для мобильных телефонов, цифровых фотокамер, МРЗ проигрывателей и т. п.; • считыватели Smart Card, Flash Card и т. п.; • USB-модемы; и системы управления; • USB-считыватели штрих-кодов. Производителем СР2101 до недавнего времени являлась фирма Cygnal, которая в 2004 году была выкуплена фирмой Silicon Laboratories. В настоящее время этой фирмой выпущена модернизированная версия микросхемы с названием СР2102, которая полностью совместима с СР2101 как по контактам корпуса, так и по программному обеспечению. Ее выпуск преследовал цель повышения степени защиты некоторых внутренних узлов от некорректных действий со стороны пользователя. Поэтому эти микросхемы являются полностью взаимозаменяемыми. После изготовления адаптера при желании можно выполнить программирование конфигурационной памяти EEPROM, входящей в состав самой микросхемы СР2101, например, с целью изменения названия адаптера или его серийного номера. При изготовлении все микросхемы программируются заводскими установками. Перепрограммирование может потребоваться и в том случае, когда необходимо подключить к компьютеру одновременно нескольких адаптеров. В этом случае номера адаптеров должны отличаться друг от друга. Для этого вовсе не понадобится какого-либо программатора и источника питания. Программирование будет производиться непосредственно через интерфейс USB, который одновременно будет служить источником питания адаптера. Перед программированием необходимо скачать по адресу www.silabs.com свободно распространяемую программу CP2101SetIDs.exe вместе с исходным текстом программы, которые запакованы в файле AN144SW.zip. Размер архивного файла составляет всего 160797 байт. Распакуйте все файлы из архивного файла AN144SW.zip в отдельный каталог, подключите адаптер к USB-интерфейсу компьютера и запустите программу CP2101SetIDs.exe. В результате на экране монитора появится окно с полями для заполнения различных идентификаторов, кода продукта, его названия и т. п. В Табл. 11.2 приведены данные, которые должны находиться в полях данных программы, и их назначение.
158 Глава 1. Адаптеры для персонального компьютера IBM PC Таблица 11.2. Поля данных программы CP2101SetIDs.exe и их назначение Название поля Select Device VID PID Max. Power BmA Units) Power Use Attributes Serial Number Product String Release Version Назначение Выбранное устройство Код поставщика Код производителя Максимальное потребление тока B мА на единицу) Атрибуты питания Серийный номер Название продукта Номер версии Данные Служебное имя устройства 10С4 ЕА60 32 Self-powered (Режим энергосбережения) 0001 (не более 63 символов) СР2102 USB to UART Bridge Controller (не более 126 символов) 1.0 На Рис. 11.20 приведена копия экрана с заполненной формой программы в качестве образца. Рис. 11.20. Копия экрана с заполненной формой программы CP2101SetIDs.exe Для успешного перепрограммирования СР2101 следует изменить значение номера или название устройства в соответствующем поле формы программы, установить флажок напротив этого поля и щелкнуть левой кнопкой мыши на кнопке Program Device.
11. Адаптер для связи компьютеров через интерфейс USB 159 При этом курсор изменит вид на изображение песочных часов на время, необходимое для перепрограммирования, а после завершения программирования будет иметь прежний вид. Поскольку адаптер содержит в себе две микросхемы СР2101, их следует программировать по очереди, подключив адаптер к компьютеру сначала со стороны первого, а затем со стороны второго разъема. Если вы не хотите изменять заводские установки, программирование микросхем адаптера не следует выполнять. Описанный адаптер, можно модифицировать, превратив его в полноценный адаптер USB-UART, USB-COM, USB-RS422, USB-485 и т. п. Это осуществляется применением соответствующих согласующих микросхем, включаемых после микросхемы СР2101. Таким образом, адаптер может быть трансформирован для решения множества задач.
160 Глава 1. Адаптеры для персонального компьютера IBM PC 12. Адаптер FLASH-памяти В настоящее время очень популярными являются устройства внешней флэш-памяти с интерфейсом USB. Они предназначены для хранения и переноса информации и отличаются компактностью, малым энергопотреблением, большой емкостью, высокой надежностью и простотой использования. Благодаря появлению на рынке электронных компонентов в большом количестве микросхем флэш-памяти и разнообразных контроллеров к ним, становится возможным создание подобных устройств самостоятельно. Один из вариантов такого устройства, разработанный автором данной книги, предлагается вниманию читателей. Устройство флэш-памяти выполнено на основе контроллера USB Flash фирмы SigmaTel и имеющего название STBD2011N. Фирма-изготовитель своевременно позаботилась о драйверах для данного контроллера. Благодаря этому устройство, собранное на основе контроллера, автоматически поддерживается операционными системами MAC, Linux, Windows ME/2000/XP и более старшими версиями операционных систем Windows. Драйверы для контроллера свободно доступны на сайте компании www.sigmatel.com и включены в состав драйверов некоторых современных операционных систем, например Windows XP. Рассмотрим вначале архитектуру контроллера. Структурная схема контроллера приведена на Рис. 12.1. Рис. 12.1. Структурная схема контроллера
12. Адаптер FLASH-памяти 161 Как следует из рисунка, в состав контроллера входят все необходимые блоки для поддержки интерфейса USB и работы с флэш-памятью. Поддержка интерфейса USB осуществляется с помощью блока высокоскоростного приемопередатчика USB2.0 Hi-Speed Transceiver и устройства управления USB2.0 Hi-Speed Device Controller. Протокол интерфейсов USB и Flash-памяти поддерживается встроенным микроконтроллером High Performance Microcontroller, который использует для своей работы встроенную постоянную память программ ROM и оперативную память RAM. Внутренний синтезатор частот PLL обеспечивает необходимую синхронизацию работы всех внутренних устройств с помощью внешнего кварцевого резонатора на 24 МГц. Блок GPIO обеспечивает внешнее управление и индикацию режима работы контроллера. Связь контроллера с флэш-памятью осуществляется через интерфейс памяти Flash Memory Interface. Встроенный регулятор напряжения Voltage Regulators формирует из входного напряжения 5 В, поступающего от интерфейса USB, необходимые для работы ядра контроллера и внешних микросхем памяти напряжения питания 3,3 В и 1,8 В. Контроллер имеет встроенный интерфейс USB2.0 и позволяет обслуживать от одной до четырех микросхем флэш-памяти, выполненных по современной NAND технологии с 8 или 16-разрядной шиной данных. Типовая схема подключения микросхем памяти к контроллеру показана на Рис. 12.2. Рис. 12.2. Типовая схема подключения микросхем памяти к контроллеру
162 Глава 1. Адаптеры для персонального компьютера IBM PC Питание микросхемы контроллера производится от плюс 5 В интерфейса USB через внутренний регулятор напряжения. В Табл. 12.1 приведены основные эксплуатационно-технические характеристики данной микросхемы. Таблица 12.1. Эксплуатационно-технические характеристики микросхемы Рабочий температурный диапазон Температура хранения Напряжение источника питания Напряжение питания входов-выходов Напряжение питания ядра Ток потребления в рабочем режиме Ток потребления в режиме ожидания Контроллер выпускается в современном малогабаритном 48-выводном корпусе типа QFN с габаритными размерами всего 7x7 мм. Описание назначения выводов контроллера приводится в Табл. 12.2. Таблица 12.2. Описание назначения выводов микросхемы 5VIN Вход источника питания USB DP Положительный сигнал данных USB USB DM Отрицательный сигнал данных USB GND Общий вывод REF RES Резистор калибровки USB RESET n TMCLK Сброс и синхронизация тестового режима SM READY Сигнал Flash готов/занят SMREn Сигнал Flash разрешения чтения SM СЕОп Сигнал Flash выбор кристалла О SM CEln Сигнал Flash выбор кристалла 1 GP1 Сигнал блока управления GP1 GP2 Сигнал блока управления GP2
12. Адаптер FLASH-памяти 163 Таблица 122. (Продолжение) 1 13 1 14 1 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 * 37 38 39 40 41 42 43 44 45 46 NC NC NC SM СЕ2п SM_CE3n VDDCORE GND VDDIO NC SM_D15 SM_D7 SM_D14 SM_D6 SM_D13 SM_D5 SM_D12 SM_D4 VDDIO GND SM_D11 SM_D3 SM_D10 SM_D2 SMJD9 SM_D1 SM_D8 SM_D0 SM_CLE SM_ALE SM_WEn GPO VDDIO GND VDDCORE NC NC NC 04 04 V G V NC 104 Ю4 Ю4 104 104 104 Ю4 Ю4 G A 104 104 104 104 104 104 104 Ю4 04 04 04 104 V G V He используется He используется He используется Сигнал Flash выбор кристалла 2 Сигнал Flash выбор кристалла 3 | Питание ядра Общий вывод Питание для ввода-вывода Не используется Сигнал Flash вход/выход 15 Сигнал Flash вход/выход 7 | Сигнал Flash вход/выход 14 Сигнал Flash вход/выход 6 Сигнал Flash вход/выход 13 Сигнал Flash вход/выход 5 Сигнал Flash вход/выход 12 Сигнал Flash вход/выход 4 Питание для ввода-вывода Общий вывод Сигнал Flash вход/выход 11 Сигнал Flash вход/выход 3 Сигнал Flash вход/выход 10 Сигнал Flash вход/выход 2 Сигнал Flash вход/выход 9 Сигнал Flash вход/выход 1 Сигнал Flash вход/выход 8 Сигнал Flash вход/выход 0 Сигнал Flash разрешение защелки команды Сигнал Flash разрешение защелки адреса Сигнал Flash разрешения записи Сигнал блока управления GPO Питание для ввода-вывода Общий вывод Питание ядра
164 Глава 1 Адаптеры для персонального компьютера IBM PC Таблица 12.2. (Продолжение) Вывод 47 48 Название XTALI XTALO Тип I О Описание Вход резонатора Выход резонатора Условные обозначения. О — выход, NC — не подключенный вывод, V — питающий вывод, G — общий вывод, 104 — вход/выход 4 мА, 04 — выход 4 мА, А — аналоговый вывод, I — вход Принципиальная схема разработанного мной устройства флэш-памяти USB приведена на Рис. 12.3. Рис. 123. Принципиальная схе на устройства флэш-памяти USB
12. Адаптер FLASH-памяти 165 В схеме могут быть использованы микросхемы D2—D5 флэш-памяти с 8-разрядной шиной данных фирмы Samsung типа K9K2G08UXM-Y с питанием от 3,3 В или K9K2G08Q0M-Y с питанием от 1,8 В, каждая из которых имеет объем 2 Гбит). При использовании четырех таких микросхем устройство будет иметь объем памяти 8 Гбит), т.е. 1 Гбайт). Такой объем памяти превышает объемом CD-ROM и позволяет хранить и переносить огромный объем информации. Если вместо четырех микросхем памяти установить только одну такую микросхему, объем памяти устройства сократится, соответственно, в 4 раза. Вместо микросхем памяти K9K2G08UXM-Y можно без изменений принципиальной схемы устройства применить микросхемы с меньшим объемом памяти. Например, фирма ST-Microelectronics производит подобные микросхемы флэш-памяти типа NAND01G-A, NAND512-A, NAND256-A и NAND128-A с объемом памяти 1 Гбайт, 512 Мбайт, 256 Мбайт и 128 Мбайт, соответственно. Применение меньшего количества микросхем памяти или микросхем с меньшей емкостью позволит уменьшить размеры и снизить цену устройства, естественно, за счет уменьшения объема памяти самого устройства. При использовании всех 16 разрядов ввода-вывода контроллера в устройстве можно применить микросхемы памяти с 16-разрядной шиной данных. Это повысит скорость обмена с микросхемами, но несколько усложнит топологию печатной платы. Напряжение питания поступает на устройство от интерфейса USB через разъем XI. Элементы LI, CP1 и О обеспечивают фильтрацию этого напряжения по высокой и низкой частоте. Контроллер D1 формирует из него напряжения питания 3,3 В и 1,8 В, необходимые как для питания ядра самого контроллера, так и для питания микросхем памяти. Дополнительную фильтрацию напряжений питания осуществляют блокировочные конденсаторы С4—С9. Выбор питающего напряжения памяти осуществляется с помощью перемычки Л и J2. Благодаря этому в устройстве можно применять микросхемы флэш-памяти, использующие напряжение питания 3,3 В или 1,8 В. Переключатель SA1 позволяет запретить запись в микросхемы памяти, для защиты информации от стирания. Переключатель SA1 управляет выводом GP1 контроллера. Вывод контроллера GP0 управляет через ограничительный резистор R12 светодиодом HL1, отвечающим за индикацию режима работы контроллера (хранение- чтение-запись). Резисторы R1 и R2 обеспечивают согласование входов контроллера с дифференциальными сигналами DM и DP интерфейса USB. Остальные резисторы устройства служат в качестве сопротивлений, подтягивающих уровни сигналов контроллера к напряжению питания или к заземляющему потенциалу. Кварцевый резонатор BQ1 совместно с
166 Глава 1. Адаптеры для персонального компьютера IBM PC конденсаторами С2 и СЗ обеспечивает формирование задающей частоты контроллера 24 МГц. Перечень элементов устройства с указанием типа применяемых электронных компонентов, их номиналов и типов корпусов приведен в Табл. 12.3. Таблица 123. Элементы устройства Позиционное обозначение BQ1 С1, С4—С9 С2, СЗ СР1 D1 D2—D5 L1 Rl, R2 R3 R4—R11 R12 HL1 Л, J2 XI SA1 Наименование Количество Резонаторы кварцевые HC-49SM (HC-49U) 24000 кГц ЧИП конденсаторы 0805 0,1 мкФ 22 нФ 1 7 2 Конденсаторы электролитические SR-25-10 Микросхемы STBD2011N K9K2G08UXM-Y ЧИП-индуктивность 1812 100 мкГн ЧИП-резистор 0805 45 Ом±5% 620Ом±1% 10кОм±5% 1кОм±5% Светодиод L-934HC Соединители Вилка PLS-3 Вилка USB A-4 на плату, тип А (USBA-1J) Переключатель SS22 1 1 4 1 2 1 8 1 1 2 1 1 Примечание 10 мкФ 25В QFN-48 TSOP-48 Для изготовления устройства потребуется разработать печатную плату. На Рис. 12.4 приведен внешний вид корпуса микросхемы контроллера, а все размеры представлены в Табл. 12.4.
12. Адаптер FLASH-памяти 167 Рис. 12.4. Внешний вид корпуса микросхемы контроллера А D D1 Е Е1 Е В 0,8 0,18 0,85 7,00 6,75 7,00 6,75 0,5 0,25 0,9 0,3 Схема не требует отладки и при правильной сборке начинает работать сразу же при подключении к интерфейсу USB компьютера. При первом подключении операционная система компьютера обнаружит новое устройство и произведет установку необходимых для его работы драйверов в автоматическом режиме. В дальнейшем устройство будет присутствовать в составе компьютера в качестве сменного диска, с которым можно осуществлять любые операции по чтению, записи и стиранию информации как с обычным жестким диском. Таблица 12.4. Размеры корпуса микросхемы
Глава 2 Устройства на контроллерах 13. Контроллер 8088 В данном разделе приводится описание разработанного автором контроллера на базе микропроцессора Intel8088, который является родоначальником персональных компьютеров типа IBM PC. Преимуществом этого микропроцессора является его совместимость с системой команд компьютеров IBM. Отсюда следует, что для написания программного обеспечения для него можно пользоваться различными языками программирования, разработанными для компьютеров типа IBM PC, которых насчитывается большое количество (Assembler, С, Pascal, Fort и др.). Для отладки программ можно также пользоваться множеством утилит компьютера IBM (debuger, afd и др.) в силу совместимости системы команд. Контроллер 8088 (далее контроллер), разработанный автором на базе процессора 18088 фирмы Intel, способен выполнять разнообразные операции ввода-вывода, хранения и обработки цифровой информации и предназначен для решения множества прикладных задач и задач управления различными автоматическими процессами. Возможности контроллера определяются приведенными ниже характеристиками. • тип процессора —18088 фирмы Intel; • тактовая частота процессора — 4 МГц; • емкость постоянного запоминающего устройства (ПЗУ) — от 2 до 32 Кбайт; • емкость оперативного запоминающего устройства (ОЗУ) — от 2 до 32 Кбайт.
13. Контроллер 8088 169 Контроллер имеет следующие интерфейсы: • один некоммутируемый интерфейс RS-232; • четыре мультиплексированных интерфейса RS-232; • восемь входов прерываний; • три 8-разрядных двунаправленных порта ввода-вывода; • 8-разрядная шина «Microbus» с возможностью подключения до 32-внешних устройств. Параметры входных и выходных цифровых сигналов контроллера соответствуют уровням ТТЛ Питание контроллера осуществляется от источников: • плюс 5 В не более 600 мА; • плюс 15 В не более 10 мА; • минус 15 В не более 10 мА. Контроллер имеет следующие размеры: • длина — 150 мм; • ширина — 200 мм; • высота — 25 мм. Все операции, производимые контроллером, определяются программой, находящейся в постоянном запоминающем устройстве. Контроллер позволяет принимать сигнал в формате RS-232 по одному некоммутируемому и четырем мультиплексированным каналам, обрабатывать до восьми прерываний, вести внутренний отсчет времени и обмениваться информацией или управлять по 24-м дискретным линиям ввода-вывода. В качестве внешних устройств могут выступать любые устройства, подключаемые по параллельным или последовательным каналам. Структурная схема контроллера приведена на Рис. 13.1. Основой контроллера является процессор (CPU), который обеспечивает обслуживание всех внутренних и внешних устройств контроллера и принимаемой от них информации под управлением рабочей программы, хранящейся в постоянном запоминающем устройстве ROM. Оперативное запоминающее устройство RAM служит для организации стека процессора и хранения оперативной информации. Работой процессора управляет генератор G, формирующий тактовую частоту процессора и периферийных устройств. Генератором управляет схема сброса R, предназначенная для приведения процессора в исходное состояние.
170 Глава 2. Устройства на контроллерах Информация,,которой контроллер обменивается с внешними устройствами по интерфейсам RS-232C, преобразуется блоками F1 и F2 в уровни ТТЛ и поступает на программируемые последовательные интерфейсы STD1 и STD2 соответственно. Перед формирователем F2 включен мультиплексор MX, разветвляющий канал на четыре направления. Скорость передачи информации определяется программой и формируется с помощью программируемого таймера РСТ. Рис. 13.1. Структурная схема контроллера
13 Контроллер 8088 171 Обслуживание STD1 и STD2 происходит по прерыванию, которое вырабатывает программируемый контроллер PIC. Программируемый параллельный интерфейс PPI служит для параллельного обмена информацией и управления периферией по трем 8-разрядным каналам А, В и С. Все внешние устройства выбираются посредством дешифратора DC. Резисторные матрицы NR1—NR4 служат для подтягивания уровня высокого логического сигнала к потенциалу источника питания. Буферные формирователи ВА, BD и BU предназначены для повышения нагрузочной способности шин процессора. Принципиальная электрическая схема контроллера приведена на Рис. 13.2. На этой схеме легко определить логические блоки, которые описаны в структурной схеме. Контроллер выполнен на базе импортных электронных элементов, хотя допускается замена всех этих элементов отечественными аналогами. Адресное пространство памяти и внешних устройств контроллера разделено и представлено в Табл. 13.1. Таблица 13.1. Карта адресации модуля Тип микросхемы Диапазон адресов (HEX формат) Активный выход дешифратора Условное обозначение устройства Наименование устройства Адреса памяти 1 6264 6264 - 27С256 0000—1FFF 2000-3FFF 4000—7FFF 8000—FFFF I Ад 8059 8051 8051 8054 8055 I/O 0,1 20,21 40,41 60,61,62,63 80,81,82,83 Е0—FF RAM0 RAMI - ROM/ RAM0 RAMI - ROM0 Банк 0 ОЗУ 8 Кбайт Банк 1 ОЗУ 8 Кбайт Резерв 1 Банк 0 ПЗУ 32 Кбайт реса внешних устройств | PIC/ STD1/ STD2/ РСТ/ PPI/ ЕХТ/ KP0A, КРОВ PS0D, PS0R PS0D, PS0R T0C0,1,2, R PP0A, В, С, R — Контроллер прерываний Последовательный порт 1 Последовательный порт 2 Таймер Параллельный порт Внешние устройства
172 Глава 2. Устройства на контроллерах Рис. 13.2. Принципиальная электрическая схема контроллера
13. Контроллер 8088 173 Рис. 13.2. Принципиальная электрическая схема контроллера (продолжение)
174 Глава 2. Устройства на контроллерах Объем ПЗУ зависит от установки перемычек 1—9 и типа установленной в панельку микросхемы. Способ выбора объема и типа ПЗУ приведен в Табл. 13.2. Таблица 13.2. Способ выбора объема и типа ПЗУ Состояние перемычек 1-3,4-6, 7-9 1-2,4-6, 7-9 1-2,4-6,7-8 1-2,4-5, 7-8 Тип микросхемы ПЗУ Импортная 27С16 27С64 27С128 27С256 К573РФ2E) К573РФ4F) - К573РФ7 Емкость ПЗУ, Кбайт 2 8 16 32 В постоянной памяти ROM хранится программа процессора и константы, необходимые для работы. В оперативной памяти RAM хранятся временные данные и организуется стек процессора. Оперативная память выполнена по схеме энергонезависимой памяти и способна сохранять данные в течение разряда автономного источника питания, которое составляет несколько лет ввиду ничтожно малого потребления тока микросхемами статической памяти. Контроллер позволяет обращаться к 32-м внешним устройствам ввода-вывода по восьмиразрядной шине данных «Microbus». Перемычки 10—18 позволяют инвертировать сигналы прерывания IRQ5—IRQ7, что бывает необходимо делать при работе с внешними источниками прерываний. Контроллер содержит следующие БИС: • 18255А — параллельный программируемый интерфейс на три 8-разрядных канала; • I8259A — программируемый восьмиуровневый контроллер прерываний; • 18251А—универсальный последовательный приемопередатчик B шт.); • I8253A — программируемый трехканальный 16-разрядный таймер. В контроллере применены внешние соединители типа МРН8 и МРН32, допускающие замену любыми другими с электрическими характеристиками не хуже данных. Подробный перечень элементов контроллера приведен в Табл. 13.3. В графе «Примечание» таблицы приведена допустимая замена импортных электронных элементов отечественными аналогами.
13. Контроллер 8088 175 Таблица 13 J. Элементы контроллера Позиционное обозначение BQ1 Наименование Резонатор кварцевый 12000 кГц Количество 1 Примечание 1 Конденсаторы | С1 С2, СЗ С4—С25 С26 С27 SS-10-220 SS-16-220 CL1206CG225 CL0805CG300 SS-10-47 1 2 22 1 1 K50-35-6,3 В-220 мкФ 1 К50-35-16 В-220 мкФ КМ-6-Н90-0,22мкФ КМ-5-М750-30 пФ К50-35-6,3 В-47 мкФ | 1 Микросхемы | D1 D2 D3 D4 D5, D15 D6, D16 D7 D8 D9 D10, D11 D12, D13 D14 D17 D18 D19 D20 D21 18284 18088 I8259A 74LS374 74LS244 74LS245 74LS257 74LS138 12764 6264 I8251A I8253A I8255A 74LS04 74LS08 74LS86 HI3-0509-5 1 1 1 1 2 2 1 1 1 2 2 1 1 1 1 1 1 К1810ГФ84 1 К1810ВМ88 К1810ВН59 К555ИР23 К555АП5 К555АП6 К555КП11 К555ИД7 К573РФ4 К537РУ17 К580ВВ51 К580ВИ53 К580ВВ55 К555ЛН1 К555ЛИ1 К555ЛП5 К590КНЗ Резисторы | NR1—NR4 Rl—R5 R6, R7 R8—R13 R14—R17 R18, R19 R20 R21 R22 R23 RAA10222J CF-0,125-103 CF-0,125-222 CF-0,125-102 CF-0,125-103 CF-0,125-102 CF-0,125-562 CF-0,125-222 CF-0,125-162 CF-0,125-513 4 5 2 6 4 2 1 1 1 1 НР1-4-9М 2,2 кОм С1-4-0Д25-10 кОм С1-4-0,125-2,2 кОм С1-4-0,125-1,0 кОм С1-4-0Д25-10 кОм С1-4-0,125-1,0 кОм С1-4-0,125-5,6 кОм С1-4-0,125-2,2 кОм С1-4-0,125-1,6 кОм С1-4-0Д25-51 кОм Диоды VD1—VD7 | 1N4001 | 7 | КД522Б Транзисторы VT1—VT3 VT4—VT8 KT361 KT315 3 5 Соединители XI Х2, ХЗ XS1 Вилка МРН-8 Вилка МРН-32-2 Панелька РС28 1 2 1
176 Глава 2. Устройства на контроллерах Конструктивно контроллер выполнен в виде одноплатного устройства с боковыми разъемами, расположенными вдоль длинной стороны. Внешний вид контроллера приведен на Рис. 13.3. Рис. 133. Внешний вид контроллера В качестве примера рабочей программы для данного контроллера мной была написана тестовая программа. Ниже приводится полный исходный текст программы на языке Ассемблер. Программа снабжена комментариями, которые позволяют легко читать и понимать ее. В качестве устройства индикации и управления использовался терминал на базе микросхемы 18279, который успешно может быть заменен ПК с интерфейсом RS-232 (СОМ-порт) и несложной программой обмена для него. В этом случае следует заменить подпрограмму обращения к микросхеме 18279 на подпрограмму обмена по последовательному порту.
13. Контроллер 8088 177 Текст программы тестирования контроллера Программа тестирования микроконтроллера 8088 Автор :0.Д. Вальпа ; Включаемые файлы :1810init.h,1810_ram.asm 1810f unc. asm, ШОргос. asm Д 810_int. asm ; Внешние файлы : include 1810imt.h ; Включить файл определений ; Инициализация адресов портов КРОА EQU 000H ; Контроллер прерываний 580ВН59 КРОВ EQU 001H ; PSOD EQU 020H ; Интерфейс послед. 580ВВ51 PSOR EQU 021H ; TOCO EQU 060H ; Таймер 580ВИ53 Т0С1 EQU 061H ; Т0С2 EQU 062H ; TOCR EQU 063H ; РРОА EQU 080H ; Интерфейср паралл-ный 580ВВ55 РРОВ EQU 081H ; РРОС EQU 082H ; PPOR EQU 083H ; PS1D EQU 040H ; Интерфейс послед-ный 580ВВ51 PS1R EQU 041H ; PDOD EQU 0E0H ; Контроллер терминала 580ВВ79 PDOR EQU 0E1H ; SIZE_RAM EQU 2000H ; Размер ОЗУ=8Кб (8192 байт) SIZE.ROM EQU 2000H ; Размер ПЗУ=8Кб (8192 байт) SIZE.BNK EQU 0400H ; Размер одного банка ОЗУ=2Кб B048 байт) BEGRAM EQU 0400h . Инициализация клавиш Fl EQU 10h ; F2 EQU llh ; F3 EQU 12h ; F4 EQU 13h ; F5 EQU 14h ; F6 EQU 15h ; F7 EQU 16h ; F8 EQU 17h ; SHIFT_F1 EQU 90h ; SHIFT_F2 EQU 91h ; CTRL_F1 EQU 50h ; CTRL_F2 EQU 51h ; CTRL_SHIFT_F1 EQU ODOh ; CTRL_SHIFT_F2 EQU ODlh ; _0 EQU OOh ; _1 EQU Olh ; _2 EQU 02h ;
178 Глава 2. Устройства на контроллерах _3 EQU 03h ; _4 EQU 04h ' ; _5 EQU 05h ; _6 EQU 06h ; _7 EQU 07h ; _8 EQU 08h ; _9 EQU 09h ; _А EQU OAh ; _В EQU OBh ; _С EQU OCh ; _D EQU ODh ; _E EQU OEh ; _F EQU OFh ; ENTER. EQU lAh ; DEL. EQU 19h ; SPACE. EQU 18h ? POINT. EQU lBh ; CTRL_DEL EQU 59h ; Некоторые примеры определений ;MYSELF equ 7h ;ERROR equ 5h ;STAT_79 equ 3801h ;DATA_79 equ 3800h ;SOUND equ Pi.2 ; выход на пищаль ;BEG_RAM equ OOOOOh ; начало «extend» памяти ;END_RAM equ 00200h ; конец «extend» памяти ;SENDER equ Pl.l ; управление передатчиком ;Put_00 equ 01800h ; адрес П/П выдачи 00 ;Put_01 equ OlAOOh ; адрес П/П выдачи 01 ;COUNT_lmS equ (OFFFFh - A000 - 7)) ;TIM_pause equ (OFFFFh - C12 - 35)) ;ERR_MAN equ 040h ; ошибка - сбой Манчестера ;ADDR_RBLOCK equ BEG.RAM + 9 ; адрес блока информации ;****** extern 1810_int ***********; Включить файл обработки прерываний ; Начало области ПЗУ 8Кб FIKTIV SEGMENT AT 0FE00H ; Фиктивный сегмент BEGIN LABEL DWORD FIKTIV ENDS ; Начало области ОЗУ 8Кб OZU SEGMENT AT OH TBL.VEK LABEL DWORD ; Таблица векторов прерываний ORG 8h*4 ; Отступить 8*4 байт от 0 VEKINT8 LABEL DWORD ; Двойное слово для вектора INT8 ORG 9h*4 ; Отступить 9*4 байт от 0 VEKINT9 LABEL DWORD ; Двойное слово для вектора INT9 ORG 0Ah*4 ; Отступить 10*4 байт от 0 VEKINTA LABEL DWORD ; Двойное слово для вектора INTA
13. Контроллер 8088 179 ORG 0Bh*4 ; Отступить 11*4 байт от О VEKINTB LABEL DWORD ; Двойное слово для вектора INTB ORG 0Ch*4 ; Отступить 12*4 байт от О VEKINTC LABEL DWORD ; Двойное слово для вектора INTC ORG 0Dh*4 ; Отступить 13*4 байт от О VEKINTD LABEL DWORD ; Двойное слово для вектора INTD ORG 0Eh*4 ; Отступить 14*4 байт от О VEKINTE LABEL DWORD ; Двойное слово для вектора INTE ORG 0Fh*4 ; Отступить 15*4 байт от О VEKINTF LABEL DWORD ; Двойное слово для вектора INTF ORG BEGRAM ; Область системных переменных BUF_KEY DB ? ; Буфер кода клавиши BUFJTEMP DB ? ; Буфер данных температуры BUF_P0RT DB ? ; Буфер данных порта BUF_PRM0 DB ? ; Буфер данных порта BUF_PRD0 DB ? ; Буфер данных порта BUF_PRM1 DB ? ; Буфер данных порта BUF_PRD1 DB ? ; Буфер данных порта H0T_START DW ? ; Ячейки контроля горячего старта CT_TIME DD ? ; Счетчик таймерных прерываний CT_T_AUT DB ? ; Счетчик тайм-аута FL_T_AUT DB ? ; Флаг тайм-аута FLG_KEY DB ? ; Флаг наличия кода клавиши OZU ENDS . Организация стека SSEG SEGMENT AT ОН PUBLIC 'STACK' ORG SIZE_RAM STEND LABEL WORD SSEG ENDS ; Организация сегмента кода CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS: CSEG, DS: CSEG, SS: SSEG, ES: OZU ORG OH ; Заполнить всю область ПЗУ FFH DB SIZE_ROM DUP(OFFH) ; для облегчения режима прогр. . Начало программы ORG ОН ; Начальный адрес ПЗУ=0 ; Инициировать сегмент данных START: MOV AX,0FE00H MOV DS,AX ; Область памяти ПЗУ . Инициировать сегмент дополнительных данных XOR АХ,АХ MOV ES,AX ; Область памяти ОЗУ . Инициализация ВВ79 MOV AL,022H ; Частота сканирования = F:2 OUT PDOR,AL
180 Глава 2. Устройства на контроллерах MOV AL,08H ; 16 разр. вывод слева+кодир.сканир. OUT PD0R,AL ' ; + блокир.2клав. MOV AL,90H ; Вывод в нулевую позицию с инкр. OUT PD0R;AL ; Вывод на дисплей сообщения о начале теста LEA SI;S_TESTBEG PR_BEG: LODSB CMP AL/$' ; Конец сообщения ? JE PR_END ; Если да, закончить OUT PD0D,AL ; Вывести символ JMP PR_BEG ; Проложить PR_END: MOV AX, ES: WORD PTR H0T_START; Проверим на горячий старт CMP AX,1234h JNE TESTBEG ; Если холодный старт, тест ОЗУ JMP INIT_S1 ; Иначе обходим тест ОЗУ TESTBEG:include 1810_ram.asm ; Включить файл тестирования ОЗУ . ТЕСТЫ ОЗУ * CLD ; Автоувеличение DF=0 для DI XOR DL,DL ; Результат теста = норме ;***** Организация циклического тестирования ОЗУ **************** M0V ВРДО TESTRAM: .***** пеовый тест ОЗУ ****************************************** ; Запись в ОЗУ слов = 5555Н MOV СХ,01000Н ; Заполнить 8Кб ОЗУ словами XOR АХ,АХ MOV DI,AX MOV AX,05555H WR5555: ST0SW LOOP WR5555 . Чтенние из ОЗУ и анализ слов 5555Н по банкам M0V ВН,4 ; Номер банка ОЗУ=4 MOV BL,8 ; Маска ошибки D-й банк) M5555_0:MOV AH,BH ; Вычисление адреса DI DEC АН ; ... MOV CL,3 ; ... SHL AH,CL ; ... XOR AL,AL ; ... MOV DI,AX ; Конец вычисления DI=(hom.6.-1)*800H MOV АХ,05555Н ; Эталон проверки MOV CX,SIZE_BNK ; Счетчик одного банка M5555_1:SCASW ; Сравнить я.п.(ЕБ:01) с АХ JNZ ER_5555 ; Если не равно обраб. ошибки
13. Контроллер 8088 181 LOOP M5555_l JMP SHORT M5555_2 ; Хорошее завершение ER_5555:OR DL,BL ; Коррекция флагов ошибок M5555_2:SHR BL,1 ; Подготовить флаг ошибки нового банка DEC BH ; Повторить цикл если JNZ М5555_0 ; не все банки .***** конец первого теста ОЗУ ********************************** .•**** втоюой тест ОЗУ ****************************************** ; Запись в ОЗУ слов = ААААН M0V СХ,01000Н ; Заполнить 8Кб ОЗУ словами X0R АХ,АХ MOV DI,AX MOV АХ,0ААААН WRAAAA: ST0SW LOOP WRAAAA . Чтенние из ОЗУ и анализ слов ААААН по банкам M0V ВН,4 ; Номер банка ОЗУ=4 MOV BL,8 ; Маска ошибки D-й банк) MAAAA_0:MOV АН,ВН ; Вычисление адреса DI DEC АН ; ... MOV CL,3 ; ... SHL AH,CL ; ... XOR AL,AL ; ... MOV DI,AX ; Конец вычисления DI=(hom.6.-1)*800H MOV AX,0AAAAH ; Эталон проверки MOV CX,SIZE_BNK ; Счетчик одного банка MAAAA_1:SCASW ; Сравнить я.п.(ЕЗ:01) с АХ JNZ ER_AAAA ; Если не равно обраб. ошибки LOOP MAAAA.1 JMP SHORT MAAAA_2 ; Хорошее завершение ER_AAAA:0R DL,BL ; Коррекция флагов ошибок MAAAA_2:SHR BL,1 ; Подготовить флаг ошибки нового банка DEC BH ; Повторить цикл если JNZ МАААА_0 ; не все банки .***•* конец втооого теста ОЗУ ********************************** .***** тпетии тест ОЗУ ****************************************** ; Запись в ОЗУ увеличивающихся на единицу слов M0V СХ,01000Н ; Записать 8Кб ОЗУ словами M0V АХ, 0 ; от 0000Н MOV DI,AX ; до 1FFFH WR_0ZU: STOSW INC AX LOOP WR_0ZU
182 Глава 2. Устройства на контроллерах . Чтенние из ОЗУ и анализ записанных слов MOV ВН;4 / Номер банка ОЗУ=4 MOV BL,8 ; Маска ошибкиD-й банк) MINCR_0:MOV AH;BH ; Вычисление слова (АХ) для сравнения DEC АН ; ... MOV CL,2 ; ... SHL AH;CL ; ... XOR AL,AL ; Конец вычисления AX=(hom.6.-1)*SIZE_BNK MOV DI;AX ; DI=... SHL DI,1 ; ...=AX*2 т.к. Б1=адрес MOV CX,SIZE_BNK ; Счетчик одного банка MINCR_1:SCASW ; Сравнить я.п.(Е8:Ш) с АХ JNZ ER_INCR ; Если не равно обраб. ошибки INC АХ ; Новое значение ячейки LOOP MINCR.1 JMP SHORT MINCR_2 ; Хорошее завершение ER_INCR:0R DL,BL ; Коррекция флагов ошибок MINCR_2:SHR BL,1 ; Подготовить флаг ошибки нового банка DEC BH ; Повторить цикл если JNZ MINCRJ) ; не все банки .***** конец тоетьего теста ОЗУ ********************************* DEC BP ; Все циклы проверки ОЗУ ? JZ TESTEND ; Да -> конец тестирования JMP TESTRAM ; Нет -> повтор тестирования TESTEND:OR DL,DL ; Если не было ошибок.то JZ INIT_ST ; Инициализация стека ; >»» продолжение в головном файле ; Вывод на дисплей сообщения о браке ERR_0ZU:M0V СХД2 ; Вывод 12-и символов LEA SI,S_BRK_BNK ; сообщения о браке блоков PR.BAD :LODSB OUT PD0D,AL LOOP PR_BAD MOV CX,4 ; Вывод на дисплей 4-х символов MOV АН, 8 ; Маска ошибки банка MOV DH/4' ; Номер плохого банка=4 PR_BNK: MOV AL/ ' ; Нет ошибки в банке TEST DL,AH ; Сравнить флаги ошибок с маской JZ NERR ; Если нет ошибок в банке иди на NEER MOV AL,DH ; Если есть ошибка... NERR: OUT PD0D,AL ; ...вывод банка SHR АНД ; Сдвиг маски ошибки банка DEC DH ; Уменьшить номер плохого банка LOOP PR.BNK
13. Контроллер 8088 183 OST: JMP OST /ОСТАНОВ !!! ; Инициализация стека INIT_ST:MOV AX,1234h ; Запишем признак горячего старта MOV ESrWORD PTR HOT_START,AX MOV AX,SSEG MOV SS,AX MOV AX,0FFSET SS:STEND MOV SP,AX . Инициализация переменных памяти XOR AX, AX ; Очистить время MOV ES.-WORD PTR CT_TIME,AX ; Очистить секунды и доли секунд MOV ES:W0RD PTR CT_TIME+2,AX; Очистить часы и минуты MOV ESrBYTE PTR BUF_KEY,AL ; Очистить буфер кода клавиши MOV ESrBYTE PTR BUF_TEMP,AL ; Очистить буфер данных температуры ; Вывод на дисплей сообщения о норме LEA SI,S_RAMGOOD CALL PSET CALL DELIS ; Задержать сообщение 1 с. JMP INIT.53 INIT_S1:M0V AX,1234h ; Запишем признак горячего старта MOV ES:W0RD PTR HOT_START,AX MOV AX,SSEG MOV SS,AX MOV AX,OFFSET SSrSTEND MOV SP,AX ; Вывод на дисплей сообщения о горячем старте LEA SI,S_HOTTEST CALL PSET CALL DELIS ; Задержать сообщение 1 с. JMP INIT_53 INIT_53: ; Вывод на дисплей сообщения о инициализации К580ВИ53 LEA SI,S_TESTWI53 CALL PSET CALL DELIS ; Задержать сообщение 1 с. ; Инициализация ВИ53 MOV AL,36H ; Счетчик 0 таймера 0 в режим 3 OUT T0CR,AL MOV AL,76H ; Счетчик 1 таймера 0 в режим 3 OUT T0CR,AL MOV AL,0BAH ; Счетчик 2 таймера 0 в режим 5 OUT T0CR,AL MOV AX, 20000 ; Загрузка в счетчик 0 таймера 0 OUT T0C0,AL ; коэфф. деления = 20 000
184 Глава 2. Устройства на контроллерах MOV AL,AH ,; для частоты 100 Гц OUT T0C0,AL MOV AX, 13 ; Загрузка в счетчик 1 таймера 0 OUT T0C1,AL ; коэфф. деления = 13 MOV AL,AH ; для частоты B400 X 64)Гц OUT T0C1,AL MOV AX, 3000 ; Загрузка в счетчик 2 таймера 0 OUT T0C2,AL ; коэфф. деления N*100 MOV AL,AH ; для сторожевой собаки OUT T0C2,AL ; через Nc ; Вывод на дисплей сообщения о начале теста ВВ55 LEA SI,S_TESTWW55 CALL PSET CALL DELIS ; Задержать сообщение 1 с. ; Инициализация и тестирование К580ВВ55 ; D7 [D6 D5] D4 D3 D2 Dl D0 ; Реж. Реж.В,С4-7 Кан. А Кан.С4-7 Реж.В,С0-3 Кан. В Кан.СО-3 ; 1 00 01 IX 0 1 0 1 0 10 10 1 ; Прог. 0 1 2 Out Inp Out Inp 0 1 Out Inp Out Inp MOV AL,9BH ; Настроить БИС К580ВВ55 в режим OUT PP0R,AL ; A<~ B<~ C<~ CALL DEL5MKS IN AL,PP0A ; Считать данные из порта «А» CMP AL,0FCH ; Сравнить с FC JNE ERR1WW55 ; Если не равны уйти на обраб. ошибки IN AL,PP0B ; Считать данные из порта «В» CMP AL,0FFH ; Сравнить с FF JNE ERR2WW55 ; Если не равны уйти на обраб. ошибки IN AL,PP0C ; Считать данные из порта «С» CMP AL,0FFH ; Сравнить с FF JNE ERR3WW55 ; Если не равны уйти на обраб. ошибки MOV AL,82h ; Настроить БИС К580ВВ55 в режим OUT PP0R,AL ; А-> B<~C [8Ah:A~>B CL->CH] MOV CX,0h ; Загрузить счетчик на 256 циклов Tl_WW55:MOV AL,CL ; Скопировать данные счетчика для теста OUT PP0C,AL ; Передать данные в порт «С» CALL DEL5MKS IN AL,PP0B ; Считать данные из порта «В» CMP AL,CL ; Сравнить с тем что писали JNZ ERR_WW55 ; Если не равны уйти на обраб. ошибки LOOP T1_WW55 ; Иначе продолжить LEA SI,S_GOD_WW55 ; Вывод сообщения о норме К580ВВ55 CALL PSET CALL DELIS ; Задержать сообщение 1 с. JMP T_WW55_END ; Уйти в конец тестов
13. Контроллер 8088 185 ERR1WW55: PUSH AX LEA SI,S1BAD_WW55 ; Вывод сообщения о браке К580ВВ55 CALL PSET ЮР АХ JMP T_WW55_ERR ; Уйти в конец тестов ERR2WW55: PUSH AX LEA SI,S2BAD_WW55 ; Вывод сообщения о браке К580ВВ55 CALL PSET ЮР АХ JMP T_WW55_ERR ; Уйти в конец тестов ERR3WW55: PUSH AX LEA SI,S3BAD_WW55 ; Вывод сообщения о браке К580ВВ55 CALL PSET ЮР АХ JMP T_WW55_ERR ; Уйти в конец тестов ERR_WW55: LEA SI,S_BAD_WW55 ; Вывод сообщения о браке К580ВВ55 CALL PSET CALL DELIS ; Задержать сообщение 1 с. JMP T_WW55_END ; Уйти в конец тестов T_WW55_ERR: MOV AH,0Eh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DELIS ; Задержать сообщение 1 с. JMP T_WW55_END ; Уйти в конец тестов T_WW55_END: MOV AL,83h ; Настроить БИС К580ВВ55 в режим OUT PP0R;AL ; А~> В<— CL<~ CH—> ; MOV AL,0EFH ; Подготовить пассивные сигналы OUT PP0C,AL ? Вывести их в порт «СН» MOV AL,9Bh ; Настроить БИС К580ВВ55 в режим OUT PP0R,AL ; А-> В<~ CL<~ CH-> ; Вывод на дисплей сообщения о начале теста ВВ51 LEA SI,S_TESTWW51 CALL PSET CALL DELIS ; Задержать сообщение 1 с. . Инициализация ВВ51 MOV AL,0H ; Первичный программный сброс OUT PS0R,AL ; последовательного порта О OUT PS1R,AL ; последовательного порта 1 CALL DEL5MKS ; Задержка в 10 тактов OUT PS0R,AL ; последовательного порта О OUT PS1R,AL ; последовательного порта 1 CALL DEL5MKS ; Задержка в 10 тактов
186 Глава 2. Устройства на контроллерах OUT PS0R,AL ; последовательного порта О OUT PS1R,AL >; последовательного порта 1 CALL DEL5MKS ; Задержка в 10 тактов MOV AL,40H ; Первичный программный сброс OUT PS0R,AL ; последовательного порта 0 OUT PS1R,AL ; последовательного порта 1 CALL DEL5MKS ; Задержка в 10 тактов ;[D7 D6] D5 D4 [D3 D2] [Dl DO] ; 11 10 01 0-неч. 0-н.к. 11 10 01 00 И 10 01 ;2с. 1.5с.1с. 1-чет. 1-е.к. 86 76 66 56 1:64 1:16 1:1 MOV AL,5FH ; Режим работы OUT PS0R,AL ; поел, порта 0 OUT PS1R,AL ; и поел, порта 1 CALL DEL5MKS ; Задержка в 10 тактов ;D7 D6 D5 D4 D3 D2 Dl DO ;0-Х 0-Х 0-Х 0-Х 0-Х 0-н.пр. 0-Х 0-н.пер. ;1-поиск 1-прогр. 1-запрос 1-сброс 1- 1-е. пр. 1-запрос 1-е. пер. ;синхрос. сброс гот.пр.ву тр.ош. пауза гот.пер.ву MOV AL,37H ; Режим команд OUT PS0R,AL ; поел, порта 0 OUT PS1R,AL ; и поел, порта 1 CALL DEL5MKS ; Задержка в 10 тактов MOV CX,0Fh T.WW51: MOV AL,1 ; Этап 1 MOV AH,0Eh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим XOR AL,AL ; Сбросим MOV ES:BYTE PTR CT_T_AUT,AL ; счетчик тайм-аута MWATE0: CALL DEL1MLS ; Задержка в 10 тактов MOV AL,ES:BYTE PTR CT_T_AUT ; Читаем счетчик тайм-аута CMP AL,05 ; Переполнен ? JNZ MWATE01 ; Если нет, продолжим JMP ERR1WW51 ; Если да на обр. ошибки MWATE01:INC AL ; Увеличим счетчик и MOV ES:BYTE PTR CT_T_AUT,AL ; перезапишем IN AL,PS0R ; Чтение и анализ готовности прд. TEST AL,1H ; поел, порта 0 JZ MWATE0 MOV AL,CL ; Вспомнить данные и передать OUT PS0D,AL ; через поел, порт 0 MOV AL,2 ; Этап 2 MOV AH,0Eh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим XOR AL,AL ; Сбросим MOV ES:BYTE PTR CT_T_AUT,AL ; счетчик тайм-аута MREAD1: CALL DEL1MLS ; Задержка в 10 тактов MOV AL,ES:BYTE PTR CT_T_AUT ; Читаем счетчик тайм-аута CMP AL,05 ; Переполнен ?
13. Контроллер 8088 187 JNZ MREAD11 ; Если нет, продолжим JMP ERR2WW51 ; Если да на обр. ошибки MREADlhINC AL ; Увеличим счетчик и MOV ES:BYTE PTR CT_T_AUT,AL ; перезапишем IN AL,PS1R ; Чтение и анализ готовности прм. TEST AL,2H ; поел, порта О JZ MREAD1 IN AL,PS1D ; Чтение и сохранение данных CMP AL,CL ; Сравнить с тем что писали JNZ ERR_WW51 ; Если не равны уйти на обраб. ошибки MOV AL,3 ; Этап 3 MOV AH,0Eh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим XOR AL,AL ; Сбросим MOV ES:BYTE PTR CT_T_AUT,AL ; счетчик тайм-аута MWATE1: CALL DEL1MLS ; Задержка в 10 тактов MOV AL,ES:BYTE PTR CT_T_AUT ; Читаем счетчик тайм-аута CMP AL,05 ; Переполнен ? JNZ MWATE11 ; Если нет, продолжим JMP ERR3WW51 ; Если да на обр. ошибки MWATEllrINC AL ; Увеличим счетчик и MOV ES:BYTE PTR CT_T_AUT,AL ; перезапишем IN AL,PS1R ; Чтение и анализ готовности прд. TEST AL,1H ; поел, порта О JZ MWATE1 MOV AL,CL ; Вспомнить данные и передать OUT PS1D,AL ; через поел, порт О MOV AL,4 ; Этап 4 MOV AH.OEh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим XOR AL,AL ; Сбросим MOV ES:BYTE PTR CT_T_AUT,AL ; счетчик тайм-аута MREADO: CALL DEL1MLS ; Задержка в 10 тактов MOV AL,ES:BYTE PTR CT_T_AUT ; Читаем счетчик тайм-аута CMP AL,05 ; Переполнен ? JNZ MREAD01 ; Если нет, продолжим JMP ERR4WW51 ; Если да на обр. ошибки MREAD01:INC AL ; Увеличим счетчик и MOV ES:BYTE PTR CT_T_AUT,AL ; перезапишем IN AL,PS0R ; Чтение и анализ готовности прм. TEST AL,2H ; поел, порта О JZ MREADO IN AL,PS0D ; Чтение и сохранение данных CMP AL,CL ; Сравнить с тем что писали JNZ ERR0WW51 ; Если не равны уйти на обраб. ошибки JMP T_WW511 ; Иначе продолжить T_WW510:JMP T_WW51 T_WW511:LOOP T_WW510
188 Глава 2. Устройства на контроллерах LEA SI,S_G0D_WW51 ? Сообщение о норме К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR.WW51: LEA SI,S_BAD_WW51 ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR0WW51: LEA SI,S0BAD_WW51 ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR1WW51: LEA SI,S1BAD_WW51 ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR2WW51: LEA SI,S2BAD_WW51 ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR3WW51: LEA SI,S3BAD_WW51 ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END ERR4WW51: LEA SI,S4BAD_WW5L ; Сообщение о браке К580ВВ51 CALL PSET CALL DELIS ; Отображать 1 с. JMP T_WW51_END T_WW51_END: . Установка векторов прерывании MOV CX,0400h ; Заполнить 1Кб ОЗУ XOR АХ,АХ ; байтами = 00 LEA DI,TBL_VEK ; с нулевого адреса WR_0: STOSB LOOP WR_0 . Установка вектора прерывания INT8 (таймер) MOV WORD PTR VEKINT8,OFFSET INT_8 ; Адрес смещения прер. MOV WORD PTR VEKINT8+2,CS ; Адрес сегмента прер. ; Установка вектора прерывания INT9 (приемник порта 51/0) ~ MOV WORD PTR VEKINT9,OFFSET INT_9 ; Адрес смещения прер. MOV WORD PTR VEKINT9+2,CS ; Адрес сегмента прер.
13. Контроллер 8088 189 . Установка вектора прерывания INTA (приемник порта 51/1) ~ MOV WORD PTR VEKINTA,OFFSET INT_A ; Адрес смещения прер. MOV WORD PTR VEKINTA+2,CS ; Адрес сегмента прер. ; Установка вектора прерывания INTB (передатчик порта 51/0) — MOV WORD PTR VEKINTB,OFFSET INT_B ; Адрес смещения прер. MOV WORD PTR VEKINTB+2,CS ; Адрес сегмента прер. . Установка вектора прерывания INTC (передатчик порта 51/1) ~ MOV WORD PTR VEKINTC,OFFSET INT_C ; Адрес смещения прер. MOV WORD PTR VEKINTC+2,CS ; Адрес сегмента прер. . Установка вектора прерывания INTD (резерв) MOV WORD PTR VEKINTD,OFFSET INT_D ; Адрес смещения прер. MOV WORD PTR VEKINTD+2,CS ; Адрес сегмента прер. . Установка вектора прерывания INTE (резерв) MOV WORD PTR VEKINTE,OFFSET INT_E ; Адрес смещения прер. MOV WORD PTR VEKINTE+2,CS ; Адрес сегмента прер. . Установка вектора прерывания INTF (клавиатура) MOV WORD PTR VEKINTF,OFFSET INT_F ; Адрес смещения прер. MOV WORD PTR VEKINTF+2,CS ; Адрес сегмента прер. . Инициализация ВН59 ; D7 D6 D5 D4 D3 D2 Dl DO MOV AL,17H ; 0001 0 1 1 1 OUT KP0A,AL ; X X X 1 Дин.вх. Х 1 контр. 18086 MOV AL,08H ; 0 0 0 0 1 0 0 0 OUT KP0B,AL ; AF AE AD AC AB X X X MOV AL;17H ; 00010 1 0 1 OUT KP0B,AL ; ПВ Без буф Ведущий Об.оконч 18086 ; Маска прерываний: 0-разрешены 1-запрещены MOV AL,060H ; 0 1 1 0 0 0 0 0 OUT KP0B,AL ; 79 - - PS1 TY PS0 TY PSl RY PS0 RY T0C0 . Вывод на дисплей сообщения о завершении тестов LEA SI,S_TESTEND CALL PSET CALL DELIS ; Задержать сообщение 1 с. STI ; Разрешить прерывания !!! ; Вывод на дисплей сообщений справочника PR_HELP:CALL PR_CLR ; Очистка дисплея терминала HELP_BEG:LEA SI,S_HELP ; Подготовить к выводу строку справки
190 Глава 2. Устройства на контроллерах MOV AL,18H ; Режим вывода справа OUT PD0R,AL , ; Загрузить в К580ВВ79 M_HELP: L0DSB ; Взять символ строки CMP AL,'$' ; Конец сообщения ? JE HELP_BEG ; Да - начать сначала OUT PD0D,AL ; Нет - выводим символ CALL DEL01S ; Задержать сообщение 0.1 с. MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_HELP ; Да - продолжить вывод MOV AL,ES:BYTE PTR BUF_KEY ; Нет-читаем код клавиши из буфера CMP AL,F1 ; Клавиша = F1 ? JE MET.F1 ; Да - вызвать функцию F1 ( тест клавиш ) CMP AL,F2 ; Клавиша = F2 ? JE MET_F2 ; Да - вызвать функцию F2 ( тест таймера ) CMP AL,F3 ; Клавиша = F3 ? JE MET_F3 ; Да - вызвать функцию F3 ( тест портов 55 ) CMP AL,F4 ; Клавиша = F4 ? JE MET.F4 ; Да - вызвать функцию F4 ( тест портов 51 ) CMP AL,F5 ; Клавиша = F5 ? JE MET_F5 ; Да - вызвать функцию F5 ( генер. порт А ) CMP AL,F6 ; Клавиша = F6 ? JE MET_F6 ; Да - вызвать функцию F6 ( температура ) CMP AL,F7 ; Клавиша = F7 ? JE MET_F7 ; Да - вызвать функцию F7 ( монитор портов ) CMP AL,F8 ; Клавиша = F8 ? JE MET_F8 ; Да - вызвать функцию F8 ( монитор памяти ) CMP AL,CTRL_DEL ; Клавиша = <Cntr/Del> ? JE MET_CNTR_DEL ; Да - вернуться в начало через JMP JMP M.HELP ; ЗАЦИКЛИТЬ СООБЩЕНИЕ !!! MET_F1: CALL F_.F1 ; Вызвать функцию F1 ( тест клавиш ) JMP PRJffiLP ; Вывод справки METJ2: CALL FJ2 ; Вызвать функцию F2 ( тест таймера ) JMP PR_HELP ; Вывод справки MET__F3: CALL FJ3 ; Вызвать функцию F3 ( тест портов 55 ) JMP PR_HELP ; Вывод справки MET_F4: CALL F__F4 ; Вызвать функцию F4 ( тест портов 51 ) JMP PR_HELP ; Вывод справки METJ5: CALL FJ5 ; Вызвать функцию F5 ( генер. порт А ) JMP PRJffiLP ; Вывод справки MET_F6: CALL F_F6 ; Вызвать функцию F6 ( температура ) JMP PR_HELP ; Вывод справки * METJ7: CALL F_F7 ; Вызвать функцию F7 ( монитор портов ) JMP PRJffiLP ; Вывод справки MET_F8: CALL F__F8 ; Вызвать функцию F8 ( монитор памяти ) JMP PR_HELP ; Вывод справки MET_CNTR_DEL: CLI ; Запретить прерывания JMP START ; Вернуться в начало программы
13. Контроллер 8088 191 include 1810func.asm ; Включить файл функций . функция F1 ( тест клавиш ) ; Вход : ; Выход: F_F1 PROC NEAR LEA SI,S_UVK_HELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей M0V АН, 13 ; Загрузим адрес позиции дисплея M_F_F1: MOV AL,ES:BYTE PTR BUFJCEY ; Читаем код клавиши из буфера CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ESrBYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F1 ; Да - продолжить анализ MOV AL,ES:BYTE PTR BUF_KEY ; Нет - читаем код клавиши из буфера CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JNZ M_F_F1 ; Если не 'Del', то уйти в начало RET S_UVK_HELP DB 'Код клавиши: h$' F_F1 ENDP ; XX. ;0123456789ABCDEF . Функция F2 ( тест таймера ) ; Вход : ; Выход: F_F2 PROC NEAR LEA SI,S_TIM_HELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей ; Вывод часов M_F_F2: MOV AX,ES:WORD PTR CT_TIME+2 ; Прочесть старшее слово MOV AL,AH ; Взять старший байт слова MOV АН, 5 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем ст. байт в ASCII код и выводим ; Вывод минут MOV AX,ES: WORD PTR CT_TIME+2 ; Прочесть старшее слово MOV АН,9 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем мл. байт в ASCII код и выводим ; Вывод секунд MOV AX,ES:WORD PTR CT_TIME ; Прочесть младшее слово MOV AL,AH ; Взять старший байт слова MOV АНДЗ ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем ст. байт в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры
192 Глава 2. Устройства на контроллерах M1_F_F2:M0V AL,ES:BYTE PTR FLGJCEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F2 ; Да - продолжить вывод MOV AL,ES:BYTE PTR BUF_KEY ; Нет-читаем код клавиши из буфера CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JZ F_F2_END ; Если 'Del', то конец CMP AL,SPACE_ ; Иначе сравнить с кнопкой 'Space' JNZ M2_F_F2 ; Если не 'Space', то анализ дальше ; Иначе сбросить показания часов MOV AX, ES: WORD PTR CT_TIME ; Читаем секунды и доли секунд X0R АХ,АХ ; Очистить секунды и доли секунд MOV ESrWORD PTR CT_TIME,AX ; Записываем секунды и доли секунд MOV AX,ES:WORD PTR CTJTIME+2; Читаем часы и минуты X0R АХ,АХ ; Очистить часы и минуты MOV ESrWORD PTR CT_TIME+2,AX; Записываем часы и минуты M2_F_F2: CMP AL,ENTER_ ; Сравнить с кнопкой 'Enter' JNZ M_F_F2 ; Если не 'Enter', то уйти в начало ; Иначе сбросить показания секунд XOR АХ,АХ ; Очистить время MOV ESrWORD PTR CT_TIME,AX ; Очистить секунды и доли секунд MOV ESrWORD PTR CT_TIME+2,AX; Очистить часы и минуты JMP M_F_F2 ; Уйти в начало F_F2_END:RET S_TIM_HELP DB 'Часыг ч м с$' F_F2 ENDP ; XX..XX..XX. ;0123456789ABCDEF ; Функция F3 ( тест портов 55 ) ; Вход : Порты 55 ; Выход: Дисплей F_F3 PROC NEAR LEA SI,S_WW55_HELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей ' MOV AL,9BH ; Настроить БИС К580ВВ55 в режим OUT PP0R,AL ; А<~ В<— С<~ M_F_F3: IN AL,PP0A ; Прочесть байт из порта «А» MOV АН, 2 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим IN AL,PP0B ; Прочесть байт из порта «В» MOV АН, 8 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим IN AL,PP0C ; Прочесть байт из порта «С» M0V АН, 14 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры
13. Контроллер 8088 193 MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F3 ; Да - уйти в начало MOV AL,ES:BYTE PTR BUFJCEY ; Нет - читаем код клавиши из буфера CMP AL;DEL_ ; Сравнить с кнопкой 'Del' JNZ M_F_F3 ; Если не 'Del' уйти в начало MOV AL,9Bh ; Настроить БИС К580ВВ55 в режим OUT PPOR,AL ; А~> В<— CL<~ CH--> RET S_WW55_HELP DB 'А= В= С=$' F_F3 ENDP ;..ХХ....ХХ....ХХ ;0123456789ABCDEF ; Функция F4 ( тест портов 51 ) ; Вход : Порты 51 ; Выход: Дисплей F_F4 PROC NEAR LEA SI,S_F4 ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей OUT PSOD,AL ; пуск передатчика 0 любым байтом OUT PS1D,AL ; пуск передатчика 1 любым байтом M_F_F4: MOV AL,ES:BYTE PTR BUF_PRMO ; Читаем байт из буфера прм.О MOV АН, 0 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим MOV AL,ES:BYTE PTR BUF_PRDO ; Читаем байт из буфера прд.О MOV АН, 5 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим MOV AL,ES:BYTE PTR BUF.PRM1 ; Читаем байт из буфера прм.1 MOV АН, 9 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ? Преобразуем байт в ASCII код и выводим MOV AL,ES:BYTE PTR BUF_PRD1 ; Читаем байт из буфера прд.1 MOV AH,OEh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F4 ; Да - уйти в начало MOV AL,ES:BYTE PTR BUFJCEY ; Нет - читаем код клавиши из буфера CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JNZ M_F_F4 ; Если не 'Del' уйти в начало RET S_F4 DB 'XX>0>XX XX>1>XX$'
194 Глава 2. Устройства на контроллерах F_F4 ENDP ;0123456789ABCDEF ; Функция F5 ( Генер. порт А ) ; Вход : ; Выход: F_F5 PROC NEAR LEA SI,S_F5 ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей M_F_F5: MOV AL,CL OUT PP0A,AL ; Передать данные в порт «А» MOV AH,0Eh ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 1 с для опроса клавиатуры INC CL ; Готовим следующее значение MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ESrBYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F5 ; Да - уйти в начало MOV AL,ES:BYTE PTR BUF_KEY ; Нет - читаем код клавиши из буфера CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JNZ M_F_F5 ; Если не 'Del' уйти в начало RET S_F5 DB 'Генер. порт А= $' F_F5 ENDP ;0123456789ABCDEF ; Функция F6 { температура ) ; Вход : ; Выход: Дисплей F_F6 PROC NEAR LEA SI,S_TEMP_HELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей M_F_F6: MOV AL,ES:BYTE PTR BUF_TEMP ; Читаем данные температуры SUB AL,80H ; Преобразовать код в град.С JZ M2_F_F6 XOR СХ,СХ MOV CL.AL XOR AL,AL M1_F_F6: INC AL DAA LOOP M1_F_F6 M2_F_F6: MOV AH,0CH ; Загрузим адрес позиции дисплея
13. Контроллер 8088 195 CALL PRE0B_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 1 с для опроса клавиатуры MOV AL,ES:BYTE PTR FLGJCEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных симюлов 0 ? JZ M_F_F6 ; Да - уйти в начало MOV AL,ES:BYTE PTR BUFJCEY ; Нет - читаем код клавиши из буфера CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JNZ M_F_F6 ; Если не 'Del' уйти в начало RET S_TEMP_HELP DB 'Температура С$' F_F6 ENDP ; XXX. ;0123456789ABCDEF . Функция F7 ( монитор портов ) ; Вход : ; Выход: F_F7 PROC NEAR MOV DX,0 LEA SI,S_PORTHELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей M_F_F7: MOV AL,DH ; Взять старшую часть адреса порта M0V АН, 6 ; загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем ст. адрес в ASCII код и выводим MOV AL,DL ; Взять младшую часть адреса памяти M0V АН, 8 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем мл. адрес в ASCII код и выводим MOV AL,':' ; Загружаем разделитель OUT PD0D,AL ; Выводим его на дисплей IN AL,DX ; Прочесть байт из порта M0V АН, 11 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим MOV AL,ES:BYTE PTR BUF_P0RT ; Читаем код из буфера M0V АН, 14 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры M0_F_F7:MOV AL,ES:BYTE PTR FLG_KEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLG_KEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ? Введенных символов 0 ? JZ M_F_F7 ; Да - продолжить вывод
196 Глава 2. Устройства на контроллерах MOV AL,ES:BYTE PTR BUF_KEY ; Нет-читаем код клавиши из буфера CMP AL,F1 ,; Сравнить с кнопкой ТГ JNZ M1_F_F7 ; Если нет, проверяем дальше DEC DX ; Если да уменьшаем адрес порта JMP M_F_F7 ; Уйти в начало M1_F_F7:CMP AL,F2 ; Сравнить с кнопкой 'F2' JNZ M2_F_F7 ; Если нет, проверяем дальше INC DX ; Если да увеличиваем адрес порта JMP M_F_F7 ; Уйти в начало M2_F_F7:CMP AL,SHIFT_F1 ; Сравнить с кнопкой 'Shift+Fl' JNZ M3_F_F7 ; Если нет, проверяем дальше SUB DX,10H ; Если да уменьшаем адрес порта на 16 б JMP M_F_F7 ; Уйти в начало M3_F_F7:CMP AL,SHIFT_F2 ; Сравнить с кнопкой 'Shift+F2' JNZ M4_F_F7 ; Если нет, проверяем дальше ADD DX,10H ; Если да увеличиваем адрес порта на 16 б JMP M_F_F7 ; Уйти в начало M4_F_F7:CMP AL,CTRL_F1 ; Сравнить с кнопкой 'Ctrl+Fl' JNZ M5_F_F7 ; Если нет, проверяем дальше SUB DX,100H ; Если да уменьшаем адрес порта на 256 б JMP M_F_F7 ; Уйти в начало M5_F_F7:CMP AL,CTRL_F2 ; Сравнить с кнопкой 'Ctrl+F2' JNZ M6_F_F7 ; Если нет, проверяем дальше ADD DX,100H ; Если да увеличиваем адрес порта на 256 б JMP M_F_F7 ; Уйти в начало M6_F_F7:CMP AL,CTRL_SHIFT_F1; Сравнить с кнопкой 'Ctrl+Shift+Fl' JNZ M7_F_F7 ; Если нет, проверяем дальше SUB DX,1000H ; Если да уменьшаем адрес порта на 8 Кбайт JMP M_F_F7 ; Уйти в начало M7_F_F7:CMP AL,CTRL_SHIFT_F2? Сравнить с кнопкой 'Ctrl+Shift+F2' JNZ M8_F_F7 ; Если нет, проверяем дальше ADD БХДОООН ; Если да увеличиваем адрес порта на 8 Кбайт JMP M_F_F7 ; Уйти в начало M8_F_F7:CMP AL,_F ; Сравнить с кнопками '0\..'F' JG M9_F_F7 ; Если код клавиш больше проверяем дальше MOV AH,AL ; Иначе сохраняем байт MOV AL,ES:BYTE PTR BUF_PORT ; Читаем данные из буфера AND AL,0FH ; Берем младшую тетраду MOV CL,4 ; Сдвигаем на 4 разряда SHL AL,CL ; влево OR AL,AH ; Объединяем две тетрады MOV ES:BYTE PTR BUF_PORT,AL ; Пишем код в буфер JMP M_F_F7 ; Уходим в начало
13. Контроллер 8088 197 M9_F_F7:CMP AL,ENTER_ ; Сравнить с кнопкой 'Enter' JNZ MZ_F_F7 ; Если нет, проверяем дальше MOV AL,ES:BYTE PTR BUF_P0RT ; Иначе читаем данные из буфера OUT DX,AL ; и пишем в порт из буфера JMP M_F_F7 ; Уйти в начало MZ_F_F7:CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JZ F_F7_END ; Если 'Del', то конец JMP M_F_F7 ; Уйти в начало F_F7_END:RET S.PORTHELP DB 'Порт: : = $' F_F7 ENDP ; XXXX.XX XX ;0123456789ABCDEF . Функция F8 ( монитор памяти ) ; Вход : ; Выход: F_F8 PROC NEAR MOV BX,0 LEA SI,S_MON_HELP ; Подготовить сообщение CALL PSET ; Вывести сообщение на дисплей M_F_F8: MOV AL,BH ; Взять старшую часть адреса памяти M0V АН, 9 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем ст. адрес в ASCII код и выводим MOV AL,BL ; Взять младшую часть адреса памяти M0V АН, 11 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем мл. адрес в ASCII код и выводим MOV AL,':' ; Загружаем разделитель OUT PD0D,AL ; Выводим его на дисплей MOV AL,ES:BX ; Прочесть байт из памяти M0V АН, 14 ; Загрузим адрес позиции дисплея CALL PREOB_PSET ; Преобразуем байт- в ASCII код и выводим CALL DEL01S ; Задержка на 0.1 с для опроса клавиатуры M0_F_F8:MOV AL,ES:BYTE PTR FLGJCEY ; Читаем флаг налич. кода в буфере MOV ES:BYTE PTR FLGJCEY,0 ; Обнуляем флаг налич. кода в буфере OR AL,AL ; Введенных символов 0 ? JZ M_F_F8 ; Да - продолжить вывод MOV AL,ES:BYTE PTR BUF_KEY ; Нет-читаем код клавиши из буфера CMP AL,F1 ; Сравнить с кнопкой 'F1' JNZ Ml_F_F8 ; Если нет, проверяем дальше DEC BX ; Если да уменьшаем адрес памяти JMP M_F_F8 ; Уйти в начало
198 Глава 2. Устройства на контроллерах M1_F_F8:CMP AL,F2 ; Сравнить с кнопкой 'F2' JNZ M2_F_F8 ; Если нет, проверяем дальше INC BX ; Если да увеличиваем адрес памяти JMP M_F_F8 ; Уйти в начало M2_F_F8:CMP AL,SHIFT_F1 ; Сравнить с кнопкой 'Shift+Fl' JNZ M3_F_F8 ; Если нет, проверяем дальше SUB ВХДОН ; Если да уменьшаем адрес памяти на 16 б JMP M_F_F8 ; Уйти в начало M3_F_F8:CMP AL,SHIFT_F2 ; Сравнить с кнопкой 'Shift+F2' JNZ M4_F_F8 ; Если нет, проверяем дальше ADD ВХДОН ; Если да увеличиваем адрес памяти на 16 б JMP M_F_F8 ; Уйти в начало M4_F_F8:CMP AL,CTRL_F1 ; Сравнить с кнопкой 'Ctrl+Fl' JNZ M5_F_F8 ; Если нет, проверяем дальше SUB ВХДООН ; Если да уменьшаем адрес памяти на 256 б JMP M_F_F8 ; Уйти в начало M5_F_F8:CMP AL,CTRL_F2 ; Сравнить с кнопкой 'Ctrl+F2' JNZ M6_F_F8 ; Если нет, проверяем дальше ADD ВХДООН ; Если да увеличиваем адрес памяти на 256 б JMP M_F_F8 ; Уйти в начало M6_F_F8:CMP AL,CTRL_SHIFT_F1; Сравнить с кнопкой 'Ctrl+Shift+Fl' JNZ M7_F_F8 ; Если нет, проверяем дальше SUB ВХД000Н ; Если да уменьшаем адрес памяти на 8 Кбайт JMP M_F_F8 ; Уйти в начало M7_F_F8:CMP AL,CTRL_SHIFT_F2; Сравнить с кнопкой 'Ctrl+Shift+F2' JNZ M8_F_F8 ; Если нет, проверяем дальше ADD ВХД000Н ; Если да увеличиваем адрес памяти на 8 Кбайт JMP M_F_F8 ; Уйти в начало M8_F_F8:CMP AL,_F ; Сравнить с кнопками '0'...'F' JG MZ_F_F8 ; Если код клавиш больше проверяем дальше MOV AH,AL ; Иначе сохраняем байт MOV AL,ES:BX ; Читаем байт из памяти AND AL,0FH ; Берем младшую тетраду MOV CL,4 ; Сдвигаем на 4 разряда SHL AL,CL ; влево OR AL,AH ; Объединяем две тетрады MOV ES:BX,AL ; и пишем код в память JMP M_F_F8 ; Уходим в начало MZ_F_F8:CMP AL,DEL_ ; Сравнить с кнопкой 'Del' JZ F_F8_END ; Если 'Del', то конец JMP M_F_F8 ; Уйти в начало
13. Контроллер 8088 199 F_F8_END:RET S_M0N_HELP DB 'Монитор: : $' F_F8 ENDP ; XXX&XX ;0123456789ABCDEF include 1810proc.asm ; Включить файл процедур ;; Процедура вывода строки на дисплей справа с инкриментом — ;; Вход : SI = адрес сообщения заканчивающегося символом '$' ;; Выход: Дисплей ; PRINT PROC NEAR PUSH AX ; PUSH AX ; Запомним входную информацию ; MOV AL,18H ; Режим вывода справа OUT PD0R,AL ; Загрузить в К580ВВ79 ЮР АХ ; Вспомним входную информацию ;M_PRINT:LODSB ; Взять байт сообщения CMP AL,'$' ; Конец сообщения ? JE M_PRINT_END ; Да, уйти в конец ; OUT PD0D,AL ; Иначе выводим символ ; JMP M_PRINT ; И продолжаем цикл ;M_PRINT_END: ЮР АХ RET /PRINT ENDP ;; Процедура вывода символа на дисплей справа с инкр. ;; Вход : AL = /символ сообщения ;; Выход: Дисплей ;PRINT_1 PROC NEAR ; PUSH AX ; Запомним входную информацию ; MOV AL,18H ; Режим вывода справа OUT PD0R,AL ; Загрузить в К580ВВ79 ; ЮР АХ ; Вспомним входную информацию OUT PD0D,AL ; Выводим символ RET ;PRINT_1 ENDP . Процедура вывода на дисплей слева с инкр. с поз. О ; Вход : SI = адрес сообщения заканчивающегося символом '$' ; Выход: Дисплей PSET PROC NEAR PUSH AX MOV AL,08H ; Режим вывода слева OUT PD0R,AL ; Загрузить в К580ВВ79 MOV AL,90H ; Вывод с нулевой позиции с инкр. OUT PD0R,AL ; Загрузить в К580ВВ79 M_PSET: L0DSB ; Взять байт сообщения
200 Глава 2. Устройства на контроллерах CMP AL/$' ; Конец сообщения ? JE M_PSET_END ; Да, уйти в конец OUT PD0D,AL ; Иначе вывести JMP M_PSET ; Повторить M_PSET_END: ; MOV AL,40H ; Подготовим режим чтения OUT PD0R,AL ; Определим его для К580ВВ79 POP AX RET PSET ENDP ; Процедура преобразования байта AL в код ASCII ; и вывода на дисплей с инкр. начиная с позиции АН ; Вход : AL = исходный байт АН = Адрес позиции- дисплея ; Выход: Дисплей PREOB_PSET PROC NEAR PUSH AX PUSH DX PUSH AX ; Запомним входную информацию MOV AL,08H ; Режим вывода слева OUT PD0R,AL ; Загрузить в К580ВВ79 MOV AL,AH ; Взять адрес позиции AND AL,0FH ; Очистить биты КОП К580ВВ79 OR AL,90H ; Наложить КОП записи в К580ВВ79 OUT PD0R,AL ; Загрузить в К580ВВ79 ЮР АХ ; Вспомним входную информацию CALL PRE0B ; Преобразуем старшую часть в ASCII код MOV AL,DH ; Берем старший код из DH OUT PD0D,AL ; Выводим его на дисплей MOV AL,DL ; Берем младший код из DL OUT PD0D,AL ; Выводим его на дисплей ; MOV AL,40H ; Подготовим режим чтения OUT PD0R,AL ; Определим его для К580ВВ79 POP DX ЮР АХ RET PREOB_PSET ENDP . Процедура преобразования байта в ASCII код ; Вход : AL = исходный байт ; Выход: DX = ASCII коды старшей и младшей тетрады исходного байта PREOB PROC NEAR PUSH AX PUSH СХ MOV AH,AL ; Скопируем AL в АН AND AH,0F0H ; Берем старшую тетраду MOV CL,4 ; Сдвинуть на 4 разряда
13. Контроллер 8088 201 SHR AH,CL ' ; байт из АН OR АН, ЗОН ; Преобразуем байт в ASCII код СМР АН,39Н ; Если код <= '9' JLE M_PREOB ; то не корректируем, идем на М_Р ADD AH,7 ; Иначе корректируем M_PRE0B:M0V DH,AH ; Сохраним АН в DH AND AL,0FH ; Берем младшую тетраду OR AL,30H ; Преобразуем байт в ASCII код CMP AL,39H ; Если код <= '9' JLE M1_PRE0B ; то не корректируем, идем на М1_Р ADD AL,7 ; Иначе корректируем M1_PRE0B:M0V DL,AL ; Сохраним AL в DL ЮР СХ POP AX RET PREOB ENDP ; Процедура очистки дисплея ; Вход : ; Выход: PR_CLR PROC NEAR LEA SI,S_CLEER CALL PSET RET PR_CLR ENDP ; Процедура задержки на 5 микросекунд ; Вход : ; Выход: DEL5MKS PROC NEAR NOP NOP NOP RET DEL5MKS ENDP ; Процедура задержки на 1 мс ; Вход : ; Выход: DEL1MLS PROC NEAR PUSH СХ MOV СХДОО DEL1MLS0:CALL DEL5MKS LOOP DEL1MLS0 ЮР СХ RET DEL1MLS ENDP . Процедура задержки на 0.1 секунду ; Вход : ; Выход:
202 Глава 2. Устройства на контроллерах DEL01S PROC NEAR PUSH СХ MOV СХДОО DEL01S0:CALL DEL1MLS LOOP DEL01S0 ЮР СХ RET DEL01S ENDP . Процедура задержки на 1 секунду ; Вход : ; Выход: DELIS PROC NEAR PUSH СХ MOV СХДО DEL1S0: CALL DEL01S LOOP DEL1S0 ЮР СХ RET DELIS ENDP include 1810_int.asm ; Включить файл обработки прерываний . Прерывание обработки таймера ; Вход : я/п по адресу CTJTIME (двойное слово) ; Выход: я/п по адресу CTJTIME (двойное слово) увеличенное на 1 INT_8 PROC NEAR PUSH AX PUSH СХ XOR CX,CX ; Обработка тайм-аута MOV AL,ES:BYTE PTR FLJT_AUT ; Читаем флаг тайм-аута TEST AL,1 ; Флаг установлен ? JNZ M_AUTO ; Если да идем на M_AUT0 MOV AL,ES:BYTE PTR CTJT_AUT ; Иначе читаем счетчик тайм-аута INC AL ; Увеличим его CMP AL,0FFh ; Сравним с конечным числом JNZ M_AUT1 ? Если не достигли на M_AUT1 MOV AL,1 ; Иначе MOV ES:BYTE PTR FL_T_AUT,AL ; установим флаг тайм-аута M_AUT0: XOR AL,AL ; Обнулим счетчик тайм-аута M_AUT1: MOV ES:BYTE PTR CT_T_AUT/AL ; Запомним новое значение MOV AX,ES:WORD PTR CTJTIME ; Читаем секунды и доли секунд INC AL ; Увеличиваем сот. доли секунд DAA ; Корр. сотых и десятых долей с. JNC M_INT_8 ; Если нет переполнения запишем ; ; Иначе считываем темп, и сбрас. сторож, соб. ; PUSH AX ; Сохраним время MOV AL,11011111B ; Подгот. акт. сигн. изм. темп, и сбр. соб. OUT PP0C,AL ; Вывести их в порт «СН> D5=0 D4=l
13. Контроллер 8088 203 ; IN AL,PP0B ; Прочесть байт темп, из порта «В» MOV ES:BYTE PTR BUF_TEMP,AL ; Записываем код темр. в буфер M0V АЬДПОПИВ ; Подгот. пас. сигн. изм. темп, и сбр. соб. ; OUT PP0C,AL ; Вывести его в порт «СН» разряд 4 ; Запись счетчиков БДМГ и БДАС в буферы МПИ раз в 1 с. MOV AL, 11001111В ; Подгот. акт. сигн. OUT PP0A,AL ; Вывести в порт «A» Dl=l D0=1 MOV АЬДЮОПООВ ; Подгот. пас. сигн. ; OUT PP0A,AL ; Вывести в порт «A» D1=0 D0=0 ; ЮР АХ ; Восстановить время INC АН ; Корректируем секунды MOV СЪ,АН ; Копируем секунды AND CL,0FH ; Берем ед. секунд CMP СЪ,0АН ; Сравниваем с числом 10 JNZ M_INT_8 ; Если не достигнуто запишем AND AH,0F0H ; Иначе обнуляем ед. секунд ADD АН ДОН ; Увеличиваем дес. секунд MOV CL,AH ; Снова копируем секунды AND CL#0F0H ; Берем дес. секунд CMP СЪ,060Н ; Сравниваем с числом 60 JNZ M_INT_8 ; Если не достигнуто запишем XOR АН, АН ; Иначе обнуляем секунды MOV СНД ; И устанавливаем флаг переполнения M_INT_8:MOV ES:WORD PTR CT_TIME,AX ; Записываем секунды и доли секунд MOV AX,ES:WORD PTR CT_TIME+2; Читаем часы и минуты ADD AL,CH ; Корректируем минуты MOV CL,AL ; Копируем минуты AND CL,0FH ; Берем ед. минут CMP СЪ,0АН ; Сравниваем с числом 10 JNZ M1INT_8 ; Если не достигнуто запишем AND AL,0F0H ; Иначе обнуляем ед. минут ADD АЬДОН ; Увеличиваем дес. минут MOV CL,AL ; Снова копируем минуты AND CL,0F0H ; Берем дес. минут CMP CL,060H ; Сравниваем с числом 60 JNZ M1INT_8 ; Если не достигнуто запишем XOR AL,AL ; Иначе обнуляем минуты MOV СНД ; И устанавливаем флаг переполнения ADD АН,СН ; Корректируем часы MOV CL,AH ; Копируем часы AND CL,0FH ; Берем ед. часов CMP CL,04H ; Сравниваем с числом 4 JNZ M1INT_8 ; Если не достигнуто запишем AND AH,0F0H ; Иначе обнуляем ед. часов
204 Глава 2. Устройства на контроллерах ADD АН ДОН ; Увеличиваем дес. часов MOV CL,AH ; Снова копируем часы AND CL,0F0H ; Берем дес. часов CMP CL,030H ; Сравниваем с числом 3 JNZ M1INT_8 ; Если не достигнуто запишем X0R АН,АН ; Иначе обнуляем часы M1INT_8:M0V ES:W0RD PTR СТ_Т1МЕ+2,АХ? Записываем часы и минуты INT_8_END: ЮР СХ ЮР АХ STI IRET INTJ ENDP ; Прерывание обработки приемника 51-0 ; Вход : приемник порта О ; Выход: я/п по адресу BUF_PRM0 INT_9 PROC NEAR PUSH AX IN AL,PS0D ; Чтение приемника О MOV ES:BYTE PTR BUF_PRMO,AL ; Запись данных в буфер INT_9_END: ЮР АХ STI IRET INT_9 ENDP ; Прерывание обработки приемника 51-1 ; Вход : приемник порта 1 ; Выход: я/п по адресу BUF_PRM1 INT.A PROC NEAR PUSH AX IN AL,PS1D ; Чтение приемника 1 MOV ES:BYTE PTR BUF_PRM1,AL ; Запись данных в буфер INT_A_END: ЮР АХ STI IRET INT_A ENDP ; Прерывание обработки передатчика 51-0 ; Вход : я/п по адресу СТ_Т1МЕ ( секунды ) ; Выход: передатчик порта 0 и я/п по адресу BUF_PRD0 INT_B PROC NEAR PUSH AX MOV AX, ES: WORD PTR CT_TIME ; Читаем секунды и доли секунд MOV AL,AH OUT PS0D,AL ; и передаем через поел, порт О MOV ES:BYTE PTR BUF_PRD0,AL ; Запись данных в буфер INT_B_END: ЮР АХ STI IRET
13. Контроллер 8088 205 INT_B ENDP . Прерывание обработки передатчика 51-1 ; Вход : я/п по адресу СТ_Т1МЕ ( секунды ) ; Выход: передатчик порта 1 и я/п по адресу BUF_PRD1 INT_C PROC NEAR PUSH AX MOV AX,ES:WORD PTR CT_TIME ; Получаем обратный счет с. MOV AL,AH MOV AH, 59 SUB AH,AL MOV AL,AH DAA ; Корр. с. OUT PS1D,AL ; и передаем через поел, порт 1 MOV ES:BYTE PTR BUF_PRD1,AL ; Запись данных в буфер INT_C_END: ЮР АХ STI IRET INT_C ENDP ; Прерывание обработки резервное ; Вход : ; Выход: INT_D PROC NEAR PUSH AX INT_D_END: ЮР AX STI IRET INT_D ENDP . Прерывание обработки резервное ; Вход : ; Выход: INT_E PROC NEAR PUSH AX INT_E_END: ЮР AX STI IRET INT_E ENDP ; Прерывание обработки клавиатуры ; Вход : ; Выход: я/п по адресу BUF_KEY (байт-код клавиши) ? я/п по адресу FLGJCEY (байт-флаг наличия кода) INT_F PROC NEAR PUSH AX MOV AL,40H ; Подготовим режим чтения OUT PD0R,AL ; Определим его для К580ВВ79 IN AL,PD0D ; Читаем код клавиши из БИС MOV ES:BYTE PTR BUF_KEY,AL ; Записываем код клавиши в буфер MOV AL,1 ; Подготовим флаг наличия кода MOV ES:BYTE PTR FLG_KEY,AL ; Записываем флаг в я/п ЮР АХ IRET INT_F ENDP
206 Глава 2. Устройства на контроллерах ORG $+6 ' ; Выровнять сообщения . Сообщения SJTESTBEG DB ' Тест МК1810 $' S_HGTTEST DB ' Горячий старт !$' S_RAMGOOD DB ' ОЗУ исправно ! $' S_TESTWI53 DB 'Загрузка таймера$' S_TESTWW51 DB 'Тест ВВ51 этап00$' S_BAD_WW51 DB 'Брак обмена 0->1$' S0BAD_WW51 DB 'Брак обмена 1->0$' S1BADJW51 DB 'Т-аут перед.О $' S2BAD_WW51 DB 'Т-аут приемн.1 $' S3BAD_WW51 DB 'Т-аут перед. 1 $' S4BADJW51 DB 'Т-аут приемн.О $' SJ30D_WW51 DB 'Порты 51 в норме$' S_TESTWW55 DB 'Тест портов ВВ55$' S_BAD_WW55 DB 'Брак обмена С->В$' S1BAD_WW55 DB 'Брак входов А=хх$' S2BAD..WW55 DB 'Брак входов В=хх$' S3BAD_WW55 DB 'Брак входов С=хх$' ;0123456789ABCDEF S_GOD_WW55 DB 'Порт 55 в норме $' SJTESTEND DB 'Тесты завершены!$' S_BRK_BNK DB 'Брак банков:$' S_HELP DB 'Fl-тест клавиш ' DB Т2-тест таймера ' DB ТЗ-тест портов 55 ' DB Т4-тест портов 51 ' DB Т5-генер. порт А ' DB Тб-температура ' DB 'F7-mohhtop портов ' DB Т8-монитор памяти ' DB ЧОеЬ-выход из любого теста ' DB '<Ctrl/Del>-noBTOp тестов /17.08.1994 О.Д.Вальпа/' S_CLEER DB ' $' ; Команды перехода в начало ПЗУ ORG IffOH CLI ; Запрет прерываний JMP FAR PTR BEGIN ; Переход в начало MAKE DB '07/09/1994' ; Конец программы CSEG ENDS END START
14. Минитерминал MCS 207 14. Минитерминал MCS Довольно часто в процессе тестирования и эксплуатации различных электронных и микропроцессорных устройств возникает необходимость в некотором пульте, с помощью которого можно было бы отображать тестовую и другую информацию и управлять этими устройствами. В роли такого пульта целесообразно использовать малогабаритный электронный блок, способный обмениваться с внешними устройствами по последовательному каналу. Если же этот блок содержит в себе микропроцессор, он становится универсальным средством, способным работать с любыми протоколами и даже выступать в качестве самостоятельного автономного программируемого устройства управления и контроля. Именно о таком устройстве, разработанном автором, говорится в этом разделе. Исходя из назначения данного пульта и наличия в нем микроконтроллера КР1816ВЕ31 семейства MCS, он был назван минитерминалом MCS. В настоящее время доступны импортные микроконтроллеры семейства MCS, к которым относится КР1816ВЕ31. Поэтому микроконтроллер КР1816ВЕ31 может без всяких переделок заменен аналогичным импортным микроконтроллерам, например, АТ89С51 фирмы Atmel. С целью расширения функциональных возможностей минитерминал снабжен жидкокристаллическим дисплеем, расширенной клавиатурой, стандартным последовательным портом RS-232 и рядом дополнительных узлов, которые допускается устанавливать и использовать с целью расширения его возможностей. Ниже приведены основные технические характеристики минитерминала. • Тип процессора — К1816ВЕ31E1). • Тактовая частота процессора —12 МГц. • Емкость постоянного запоминающего устройства — от 2 до 32 Кбайт. • Емкость оперативного запоминающего устройства — 2 Кбайт. • Количество клавиш клавиатуры — 64 сканируемые клавиши + 2 автономные клавиши. • Звуковой излучатель — пьезоэлектрический. Минитерминал имеет следующие интерфейсы: • один порт аппаратно формируемого интерфейса RS-232; • один порт программно формируемого интерфейса «токовая петля»; • два входа внешних прерываний (INTO/, INT1/); • два канала таймера (Т0/Д1/); • один восьмиразрядный порт ввода (РАО—РА7); • один восьмиразрядный порт вывода (РВО—РВ7); • один выход «открытый коллектор».
Рис 14.1. Структурная схема минитерминала 208 Глава 2. Устройства на контроллерах
Рис. 142. Принципиальная электрическая схема минитерминала 14. Минитерминал MCS 209
210 Глава 2. Устройства на контроллерах Питание минитерминала осуществляется от стабилизированного источника питания постоянного тока напряжением плюс 5 В. Ток потребления минитерминала не превышает 0,5 А. Минитерминал имеет следующие габаритные размеры: • длина —135 мм; • ширина —185 мм; • высота — 20 мм. Режим работы минитерминала — непрерывный круглосуточный. На Рис. 14.1. приведена структурная схема минитерминала. Основой минитерминала является микропроцессор CPU, который обеспечивает выполнение всех операций по вводу, обработке и выводу данных через различные порты и интерфейсы. На структурной схеме интерфейсы RS-232 и «токовая петля» обозначены в виде блоков RS/TTL, TTL/RS и INP/TTL, TTL/OUT. CPU выполняет также любые другие операции под управлением рабочей программы, хранящейся в постоянном запоминающем устройстве ROM. Для хранения оперативных данных используется блок оперативного запоминающего устройства RAM. Обращение к этим устройствам осуществляется под управлением дешифратора DC. Регистры RGI и RGO предназначены для связи с клавиатурой, а регистры RGA и RGB для организации 8-разрядных параллельных портов связи с внешними устройствами. Рези- сторные матрицы ER1, ER2 служат для подтягивания уровней высокого логического сигнала к потенциалу источника питания. Принципиальная электрическая схема минитерминала приведена на Рис. 14.2. На этой схеме легко определить логические блоки, соответствующие описанным выше в структурной схеме. Минитерминал разработан полностью на отечественных элементах, хотя допускается замена всех комплектующих импортными аналогами. Адресное пространство минитерминала разделено на область ROM и область RAM с внешними устройствами. Карта адресации минитерминала приводится в Табл. 14.1. Таблица 14.1. Карта адресации минитерминала
14. Минитерминал MCS 211 Таблица 14.1. (Продолжение) Объем постоянного запоминающего устройства ROM определяется состоянием перемычек и типом установленных микросхем ПЗУ. Возможные варианты объема памяти минитерминала приведены в Табл. 14.2. Таблица 142. Варианты объема памяти минитерминала Перемычки Е10—Е15 позволяют определить режим работы интерфейса «токовая петля». Так, при установке перемычек Е10—Е11 и Е13—Е14 данный интерфейс будет функционировать аппаратно от выводов RXD и TXD процессора, а при установке перемычек ЕЮ—Е12 и Е13—Е15 функционирование будет производиться программно от выводов Р1.6 и 10. Первый способ предпочтительнее, но при этом отключается интерфейс RS-232. При втором способе оба интерфейса доступны, но потребуется программа работы с выводами Р 1.6 и 10 в режиме поддержки последовательного интерфейса. Параметры сигналов входных и выходных цифровых портов соответствуют уровням сигналов ТТЛ. Минитерминал имеет внешние соединители типа МРН. Подробный перечень элементов минитерминала приведен в Табл. 14.3.
212 Глава 2. Устройства на контроллерах Таблица 143. Элементы минитерминала А1 А2,АЗ ВА1 BQ1 Жидкокристаллический индикатор от микрокалькулятора МК-85 Набор резисторов НР1-4-9М 3,3 кОм Звуковой преобразователь ЗП-3 Резонатор кварцевый 12000 кГц 1 2 1 1 1 Конденсаторы | С1,С2 сз С4 С5—С17 К10-17а-30 пФ К53-16-6.3В-10 мкФ К53-18-6,ЗВ-220 мкФ К10-17а-0,22 мкФ 2 1 1 13 Микросхемы | D1 D2 D3 D4,D5,D10 D6,D11 D7 D8 D9 DA1,DA2 К1816ВЕЗЦ51) К573РФ4 К537РУ10 К555ИР23 К555ИР22 К555ИД7 К555ЛН1 К555ЛЛ1 АОТ110 1 1 1 3 2 1 1 1 2 АТ89С51 1 2764 Резисторы | Rl R2 R3 R4,R6 R5,R8,R9 R10,R12 R11,R13 С2-23-0Д25-100кОм С2-23-0Д25-680Ом С2-23-0Д25-51 Ом С2-23-0Д25-10 кОм С2-23-0Д25-1 кОм С2-23-0Д25-510 Ом С2-23-0Д25-1 МОм 1 1 1 2 3 2 2 Диоды VD1—VD11 КД522 11 Транзисторы VT1 VT2,VT3 КТ361 КТ315 1 2 Соединители XI X2 X3 X4 МРН8 МРН22 МРН32 Панелька РС28 1 1 1 1
14. Минитерминал MCS 213 В качестве средства отображения информации в минитерминале используется 12-разрядный знакосинтезирующий жидкокристаллический индикатор от микрокалькулятора МК-85. Однако в настоящее время существует богатый выбор подобных индикаторов, которые успешно могут быть применены вместо примененного индикатора. При такой замене необходимо будет лишь заменить подпрограммы обращения к индикатору для поддержания интерфейса связи с новым индикатором. Конструктивно минитерминал выполнен в виде небольшого блока, в котором установлена печатная плата устройства. Внешний вид печатной платы минитерминала приведен на Рис. 14.3. Рис 143. Внешний вид печатной платы Верхней крышкой является сама клавиатура, выполненная из пяти элементов. Основой ее является печатная плата в виде пересекающихся разомкнутых проводников, имеющих топологию в виде входящих друг в друга «расчесок» на местах пересечений. Вторым элементом служит маска из непроводящей пленки с отверстиями напротив площадок с «расческа-
214 Глава 2. Устройства на контроллерах ми». Третьим элементом служит фольга. Четвертым элементом служит бумага с нанесенными на ней обозначениями клавиш. И, наконец, последним элементом является защитная прозрачная пленка. При нажатии на любую из клавиш фольга продавливается через маску до проводников «расчесок» и замыкает последние между собой. Схема клавиатуры приведена на Рис. 14.4, а на Рис. 14.5 чертеж расположения клавиш. Рис 14.4. Схема клавиатуры При нажатии любой из 64-х клавиш происходит замыкание одной из пар проводников, которые непрерывно опрашиваются процессором минитерминала. Дополнительные две клавиши Ctrl и Shift могут быть замкнуты одновременно с любой из остальных 64-х клавиш. В результате можно получить 256 комбинаций кодов нажатия клавиш. Коды клавиатуры минитерминала приведены в Табл. 14.4. Формат байта кодировки клавиатуры минитерминала представлен в Табл. 14.5.
14. Минитерминал MCS 215 Таблица 14.4. Коды клавиатуры Таблица 14.5. Формат кодировки клавиатуры минитерминала
216 Глава 2. Устройства на контроллерах Рис. 14.5. Расположение клавиш на клавиатуре В качестве примера рабочей программы мной была написана тестовая программа. Ниже приводится полный исходный текст программы на языке Ассемблер. Программа снабжена комментариями, которые позволяют легко читать и понимать ее. Текст программы тестирования минитерминала ;Файл «mmt_main.asm» $ALLPUBLIC ; Программа минитерминала ; Версия 2.00 ; Автор. О.Д. Вальпа include «mmt_defn.asm» SEG CODE org RESET ; RESET vector jmp Start org EXTIO ; EXTO interrupt vector reti org TIMERO ; Timer 0 vector reti org EXTI1 ; EXT1 vector reti org TIMER1 ; Timer 1 vector
14. Минитерминал MCS 217 reti org SINT ; Serial port vector jmp I_Smt org 30h ;;;;;;;;;;;;;;;; '0123456789ABCDEF' db ' Mimterminal ' db ' Version 2.00 ' db ' Copyright (C) ' db db ' Valpa Oleg .•л*********************************************************** ; Старт программы .a************************************************** Start: clr FlSpeed ; Скорость 2400 setb FlErrRAM ; Флаг ошибок ОЗУ setb FlRdyORS ; Передатчик RS готов clr FlRdylRS ; Приемник RS не готов clr FlRdyKB ; Клавиатура не нажата mov DPTR, #SONGBIP ; Сигнал включения call MUSIC /Инициализация дисплея ; setb SYNC ; Все линии упр. setb ADI ; в исходное clr SHIFT ; состояние call mt_clri ? Очистка и иниц. дисплея ;Начало теста ОЗУ call mt_clrb ; Очистка буфера дисплея mov mt_curX, #0 ; Курсор в положение 0 mov DPTR, #TEXTBRAM call mt_text ;Тест ОЗУ StartO: call Test_RAM jnb FlErrRAM,Startl ; Если ОЗУ в норме, то в обход mov DPTR, #TEXTERAM call mt_text mov DPTR, #SONGBRAM call MUSIC jmp StartO Start1: mov mt_curX, #0 ; Курсор в положение 0 mov DPTR, #TEXT0 call mt_text mov DPTR, #SONGGOOD call MUSIC mov mt_curX, #0 ; Курсор в положение 0
218 Глава 2. Устройства на контроллерах mov DPTR, #TEXTRDY call mt_text call Init Begin: call ASK ; Любая клавиша нажата? jnc Wiwod ; Если нет, дальше Wwod: call KEYBRD call Obr_Key ; Обработка команды call Beep ; Сигнал нажатия клавиши call mt_char ; и на индикатор Wiwod: call KB_ind ; Вывод кольцевого буфера на индикатор call ASCII call mt_char mov А, В call mt_char mov A, #20h call mt_char jmp Begin include «mmt_tram.asm» include «mmt_keyb.asm» ; Подпрограмма вывода сообщения из кольцевого буфера ; Вход: А -код клавиши ; Выход :FlRdyORS -флаг готовности передатчика ; Использует: А ; П/п: mt_char ObrJCey: cjne A, #KeyF12, Obr.Keyl ; Обработка клавиши 'F12' cpl FISpeed ; инверсия флага скорости clr EA ; запрет прерыв. call Init ; инициализ. setb EA ; разреш. прерыв mov DPTR, #TEXTSPD0 jnb FISpeed, ObrJCeyO mov DPTR, #TEXTSPD1 ObrJCeyO: call mt_text jmp ObrJCeyE Obr.Keyl: call SIMV ; Преобразуем коды в ASCII call OutB_RS ObrJteyE:
14. Минитерминап MCS 219 ret .*******•************•****************•*•************* Подпрограмма преобразования кодов для табло из альт, кодировки .•А************************************************ SIMV: inc A move А,@А+РС ret ; Коды IBM PC Символы Коды «Минитерминала» db 000h,000h,000h,000h ; Fl F2 F3 F4 000h,001h,002h,003h db 000h,000h,000h,000h ; F5 F6 F7 F8 004h,005h,006h,007h db 000h,000h,000h,000h ; F9F10F11F12 008h,009h,00ah,00bh db 060h,031h,032h,033h ; ч 1 2 3 00ch,00dh,00eh,00fh db 034h,035h,036h,037h ; 4 5 6 7 010*1,01111,01211,01311 db 038h,039h,030h,02dh ? 8 9 0 - 014h,015h,016h,017h db 03dh,071h,077h,065h ; = q w e 018h,019h,01ah,01bh db 072h,074h,079h,075h ; r t у u 01ch,01dh,01eh,01fh db 069h,06fh,070h,05bh ; i о p [ 020h,021h,022h,023h db 061h,073h,064h,066h ; a s d f 024h,025h,026h,027h db 067h,068h,06ah,06bh ; g h j k 028h,029h,02ah,02bh db 06ch,03bh,027h,00dh ; 1 ; ' Ent 02ch,02dh,02eh,02fh db 07ch,07ah,078h,063h ; \ z x с 030h,031h,032h,033h db 076h,062h,06eh,06dh ; v b n m 034h,035h,036h,037h db 03ch,03eh,03fh,05dh ; , . / ] 038h,039h,03ah,03bh db 008h,000h,020h,000h ; BS Al Sp Dl 03ch,03dh,03eh,03fh db 000h,000h,000h,000h ; Fl F2 F3 F4 040h,041h,042h,043h db 000h,000h,000h,000h ; F5 F6 F7 F8 044h,045h,046h,047h db 000h,000h,000h,000h ; F9F10F11F12 048h,049h,04ah,04bh db 07eh,021h,040h,023h ; ~ ! @ # 04ch,04dh,04eh,04fh db 024h,025h,05eh,026h ; $ % A & 050h,051h,052h,053h db 02ah,028h,029h,05fh ; * ( ) _ 054h,055h,056h,057h db 02bh,051h,057h,045h ; + Q W E 058h,059h,05ah,05bh db 052h,054h,059h,055h ; R T Y U 05ch,05dh,05eh,05fh db 049h,04fh,050h,05bh ; I О P { 060h,061h,062h,063h db 041h,053h,044h,046h ; A S D F 064h,065h,066h,067h db 047h,048h/04ah,04bh ; G H J К 068h,069h,06ah,06bh db 04ch,03bh,027h,00dh ; L : « Ent 06ch,06dh,06eh,06fh db 05ch,05ah,058h,043h ; I Z X С 070h,071h,072h,073h db , 056h,042h,04eh,04dh ; V В N M 074h,075h,076h,077h db 02ch,02eh,02fh,05dh ; < > ? } 078h,079h,07ah,07bh db 008h,000h,020h,000h ; BS Al Sp Dl 07ch,07dh,07eh,07fh db 080h,081h,082h,083h ; А Б В Г 080h,081h,082h,083h db 084h,085h,086h,087h ;-Д Е Ж 3 ' 084h,085h,086h,087h db 088h,089h,08ah,08bh ; И Й К Л 088h,089h,08ah,08bh db 08ch,08dh,08eh,08fh ; M H О П 08ch,08dh,08eh,08fh db 09011,09111,09211,09311 ; P С Т У O90h,091h,092h,093h db 094h,095h,096h,097h ; Ф X Ц Ч 094h,095h,096h,097h db 098h,099h,09ah,09bh ; Ш Щ Ъ Ы 098h,099h,09ah,09bh db 09cti,09dh,09eh,09fh ; Ь Э Ю Я 09ch,09dh,09eh,09fh db 0a0h,0alh,0a2h,0a3h ; а б в г 0a0h,0alh,0a2h,0a3h db 0a4h,0a5h,0a6h,0a7h ; д е ж з 0a4h,0a5h,0a6h,0a7h
220 Глава 2. Устройства на контроллерах db 007h,008h,0aah,0abh ; и й к л 0a8h,0a9h,0aah,0abh db 0ach,0adh,0aeh,0afh ; м н о n 0ach,0adh,0aeh,0afh db 0b0h,0plh,0b2h,0b3h ; псевдогр. 0b0h,0blh,0b2h,0b3h db 0b4h,0b5h,0b6h,00dh ; —»»— 0b4h,0b5h,0b6h,0b7h db 0b8h,0b9h,0bah,0bbh ; ---»»--- 0b8h,0b9h,0bah,0bbh db Obch,Obdh,Obeh,Obfh ; —»»--- Obch,Obdh,Obeh,Obfh db 0c0h,0clh,0c2h,0c3h ; —»»— 0c0h,0clh,0c2h,0c3h db 0c4h,0c5h,0c6h,0c7h ; —»»— 0c4h,0c5h,0c6h,0c7h db 0c8h,0c9h,0cah,0cbh ; —»»— 0c8h,0c9h,0cah,0cbh db Occh,Ocdh,Oceh,Ocfh ; —»»— Occh,Ocdh,Oceh,Ocfh db 0d0h,0dlh,0d2h,0d3h ; —»»— 0d0h,0dlh,0d2h,0d3h db 0d4h,0d5h,0d6h,0d7h ; —»»-- 0d4h,0d5h,0d6h,0d7h db 0d8h,0d9h,0dah,0dbh ; —»»--- 0d8h,0d9h,0dah,0dbh db Odch,Oddh,Odeh,Odfh ; —»»— Odch,Oddh,Odeh,Odfh db 0e0h,0elh,0e2h,0e3h ; p с т у ОеО^ОеП^Оег^ОеЗп db 0e4h,0e5h,0e6h,0e7h ? ф х ц ч 0e4h,0e5h,0e6h,0e7h db 007h,008h,0eah,0ebh ; ш щ ъ ы 0e8h,0e9h,0eah,0ebh db Oech,OedJi,Oeeh,Oefh ; ь э ю я Oech,Oedh,Oeeh,Oefh db 0f0h,0flh,0f2h,0f3h ; спец. 0f0h,0flh,0f2h,0f3h db 0f4h,0f5h,0f6h,00dh ; символы 0f4h,0f5h,0f6h,0f7h db 0f8h,0f9h,0fah,0fbh ; —»»— 0f8h,0f9h,0fah,0fbh db Ofch,Ofdh,Ofeh,Offh ; --»»— Ofch,Ofdh,Ofeh,Offh ; Подпрограмма вывода сообщения из кольцевого буфера ; Вход: UkBegKB, UkBegKB - указатели начала и конца буфера ; FlRdyKB - флаг готовности кольцевого буфера ; Выход: Дисплей. ; Использует: A, DPTR ; П/п: mt_char KB_ind: jnb FlRdyKB,KB_indE ; Если ничего не принято, дальше push PSW push ACC push DPH push DPL mov DPTR,#Beg_KB ; Начало кольцевого буфера KB.indO: mov DPL ,UkBegKB movx A, @DPTR cjne A, #08h, KB_indl; Реакция на <1аг назад> mov A, mt^curX jz KB.indW dec mt_curX jmp KB_indW KB_indl: cjne A, #07h, KB_ind2; Реакция на <Звонок>
14. Минитерминал MCS 221 call Phone jmp KB^indW KB_ind2: cjne A, #Enter; KB_ind3; Реакция на <Enter> call mt_clrb ; Очистка буфера дисплея mov mt_curX, #0 ; Курсор в положение 0 jmp KB_indW KB_ind3: call mt_char KB_indW: inc UkBegKB mov A ,UkEndKB ; Указатель конца кольцевого буфера cjne A, UkBegKB, KB.indO clr FlRdyKB pop DPL pop DPH pop ACC pop PSW KB_indE: ret ; Подпрограмма вывода сообщения ; Вход: DPTR=aflpec сообщения ; Выход: Дисплей. ; Использует: A, DPTR ; П/п: mt_char mt_text: textbeg:clr A move A, @A+DPTR cjne A, #'$', text_m0 jmp textend text_mO:call mt_char inc DPTR jmp textbeg textend:ret ; Подпрограмма очистки индикатора ; Вход: R3 - адрес регистра, R2 - данные ; Выход: - ; П/п: mt_out_line портит бит С mt_clri: push 2 push 3 ; Очистить все регистры
222 Глава 2. Устройства на контроллерах mov R3, #5fh mov R2, #0h clrindO:call mt_out_line djnz R3, clrindO call mt_out_line ; Очистим нулевой адрес ; Разблокировать вывод mov 3, #68h ; Готовим адрес mov 2, #0 ; Готовим данные call mt_out_line ; Выводим строку ; Курсор в позицию ?, тип курсора _ mov 3, #60h ; Адрес курсора mov 2, #0lCh ; тип_, позиция 12, т.е. за пределы call mt_out_line ; Выводим строку pop 3 pop 2 ret ; Подпрограмма передачи одного байта в контроллер дисплея ; Вход: R3 - адрес регистра, R2 - данные ; Выход: - ; П/п: - ; портит бит С mt_out_line: push ACC push 7 . * . mov R7, #7 ;* семь битов mov A, R3 ;* адрес cpl A ;* в инверсном виде ol_000: rrc A ;* младший разряд mov ADI, с ;* на ADI setb SHIFT ;* подготовка строба пор clr SHIFT ;* строб - вывели бит djnz R7, ol_000 ; Вывод CS пор clr ADI ;* вывод CS=0 setb SHIFT ;* подготовка строба nop clr SHIFT ;* строб - вывели бит . * . nop mov R7, #8 ;* пять битов + три mov A, R2 ;* данные cpl A ;* в инверсном виде clr SYNC ;* выводим данные ol_001:
14. Минитерминал MCS 223 rrc A ;* младший разряд mov ADI, С ;* данных на ADI setb SHIFT ;* подготовка строба пор clr SHIFT ;* строб - вывели бит djnz R7, ol_001 setb ADI ;* сигналы управления setb SYNC ;* в исходное состояние pop 7 pop ACC ret .л******************************************************************* ; Подпрограмма задержки на 1 ms .л******************************************************************* Del_lms: mov TL0,#low CT_lms mov TH0,#high CT_lms setb TRO jnb TF0,$ clr TRO clr TFO ret ; Подпрограмма. задержки на 10 ms .••л***************************************************************** Del_10ms: mov TL0,#low CT_10ms mov TH0,#high CT_10ms setb TRO jnb TFO, $ clr TRO clr TFO ret .л******************************************************************* Подпрограмма задержки на 50 ms .л******************************************************************* Del_50ms: mov TL0,#low CT_50ms mov TH0,#high CT_50ms setb TRO jnb TF0,$ clr TRO clr TFO ret .л******************************************************************* ; Подпрограмма задержки на 100 ms .л******************************************************************* Del_100ms: push 7
224 Глава 2. Устройства на контроллерах mov R7,#10 Del_100ms0:call Del_10ms djnz R7,Del_100msO pop 7 ret .л******************************************************************** ; Подпрограмма задержки на 10 mks .A******************************************************************** ; П/п: - DellOmks: nop ret ; Подпрограмма заполнения буфера индикатора пробелами ; П/п: - Ничего не портит. mt_clrb: push 7 push 0 mov rat_curX, #0 mov R0, #mt_sim mov R7, #IND_SIZE mtclr_00: mov @R0, #020H ;* очистить индикатор inc R0 djnz R7, mtclr.OO call mt_iso pop 0 pop 7 ret ; Подпрограмма обновления индикатора данными из буфера ; П/п: mt_put ; Ничего не портит. mt_iso: ; push ACC ; Сохранить регистры push 3 ; push 2 ; push 7 ; mov R3, #0 mov R0, #mt_sim ; mov R7, #IND_SIZE ; mtiso_00: ;
14. Минитерминал MCS raov 2, @R0 call mt_put ; вывод символа inc R3 inc RO djnz R7, mtiso_00 ; pop 7 ; Восстановить регистры pop 2 ; pop 3 pop ACC ret ; Подпрограмма вывода символа в позицию курсора ; с коррекцией положения курсора и обновлением индикатора ; Вход: А=символ ; Выход: Дисплей. Ничего не портит. ; П/п: mt_iso, mt_put mt_char : push 3 push 2 push 1 push 0 push ACC ;* сохраним символ mov A, rat_curX ;* проверим полож. курсора cjne A, #IND_SIZE, mtptchhOO ; с размером диспл. ;* надо сдвинуть влево mov R3, #IND_SIZE-1 mov RO, #mt_sim mov Rl, #mt_sim+l mtptchh02: mov A; @R1 mov @R0, A inc RO inc Rl djnz R3, mtptchh02 mov RO, #mt_sim+IND_SIZE-l pop 2 ;* восстановим символ push 2 ;* mov @R0, 2 ;* запишем в образ call mt_iso ;* обновим индикатор jmp mtptchhOl mtptchhOO: ; ;* вывод без сдвига влево mov R3, mt_curX ;* позиция mov A, #mt_sim 225
226 Глава 2. Устройства на контроллерах add A, R3 mov R0, А , pop 2 ;* восстановим символ push 2 ;* mov @R0, 2 ;* запишем в образ call mt_put ;* выведем inc mt_curX ;* двинем курсор вправо mtptchhOl: pop ACC pop О pop 1 pop 2 pop 3 ret ; Подпрограмма вывода символа в фиксированную позицию ; Вход: В2=сжвоп, КЗ=позиция ; Выход: Дисплей. Ничего не портит. ; П/п: mt_get_line, mt_out_line mt_put: push DPH push DPL push ACC push В push 7 push 2 push 3 mov B, R2 ;* вычислим смещение символа в фонте mov A, #5 mul AB mov DPTR, #Font_7x5 ; адрес фонта add A, DPL mov DPL, A mov А, В addc A, DPH mov DPH, A ;* вычислили mov A, R3 ;* вычислим адрес линии на индикаторе rl A rl A rl A anl A, #0F8h inc A mov R3, А ;* вычислили mov R7, #7 ;* счетчик mov В, #1 ;* маска
14. Минитерминал MCS 227 mt_ptchOO: call mt_get_line ;* получим строчку call mt_out_line ;* выведем mov А, В rl A ;* сдвинем маску mov В, А inc R3 ;* след. строчка djnz R7, mt_ptch00 ;* выводим семь строчек pop 3 pop 2 pop 7 pop В pop ACC pop DPL pop DPH ret ; Подпрограмма формирования строки из столбца фонта ; Вход: DPTR=aflpec символа фонта, В=номер формируемой строкиA...7) ; Выход: R2=строка. Ничего не портит. ; П/п: - mt_get_line: push DPH ;* DPTR - адрес в фонте push DPL push ACC push 7 push 0 mov R7, #5 ;* счетчик mov RO, #1 ;* маска mov R2, #0 mtglOOO: clr A move A, 0A+DPTR anl А, В jz mtglOOl mov A, R2 orl A, RO mov R2, A mtglOOl: mov A, RO rl A ;* сдвиг маски mov RO, A inc DPTR djnz R7, mtglOOO pop 0
228 Глава 2. Устройства на контроллерах pop 7 pop ACC, pop DPL pop DPH ret '123456789ABC TEXTO: db ' H e 1 1 о !$' TEXTRDY: db 'Read y...$' TEXTBRAM: db ' Test RAM...$' TEXTERAM: db ' Bad RAM !!!$' TEXTSPDO: db 'Speed 2400 $' TEXTSPD1: db 'Speed 300 $' include «mmt_sint.asm» include «mmt_init.asm» include «mmt_text.asm» include «mmt_font.asm» include «mmt_muza.asm» include «mmt_beep.asm» end ;Файл «mmt_defn.asm» ;R0 мл. байт длины посл-сти ;R1 ст. байт длины посл-сти ;R2 счетчик циклов теста ОЗУ и счетчик циклов общий ;R6 принимаемый байт команды ;R7 накопитель контрольной суммы и накопитель общий KD equ 1 ; Коэффициент деления кварца для отладки SPEED2400 equ 0F3h ; Скорость обмена SPEED300 equ 098h ; Скорость обмена SPEED300.2 equ OEFh ; Скорость обмена ;;; #0F3h ; Делит, в тайм.1 B400 бод, 12.000 мГц) ;;; #098h ; Делит, в тайм.1 ( 300 бод, 12.000 мГц) ;;; #0EFh ; Делит, в тайм.1 ( 300 бод, 2.000 мГц) L_ADDR equ 00h ;(R0)mji. байт длины посл-сти H_ADDR equ 01h ;(R1)ct. байт длины посл-сти SUMMA equ 07h ;(R7) накопитель контр, суммы FlErrRAM bit 2Fh.7 ; Флаг теста ОЗУ A-брак 0-норма) FIRdyORS bit 2Fh.6 ; флаг готовности данных передачи @-готовы 1-не готовы) FlRdylRS bit 2Fh.5 ; флаг заполения буфера передачи @-пуст 1-полон) FlRdyKB bit 2Fh.4 ; флаг заполения кольцевого буфера @-пуст 1-полон) FISpeed bit 2Fh.3 ; флаг скорости обмена по порту @-2400 1-300 ) Beg_RAM equ Oh ; Начало внешней памяти ОЗУ End_RAM equ 7FFh ; Конец внешней памяти ОЗУ (8Кб) IND_SIZE equ 12 ; Количество знакомест дисплея Beg_KB equ Oh ; Начало кольцевого буфера
14. Минитерминал MCS 229 mt_sim equ 74h ; Начало буфера дисплея mt_curX equ 73h ; Текущее положение курсора 0...11 UkBegKB equ 6Fh ; Указатель начала кольцевого буфера UkEndKB equ 6Eh ; Указатель конца кольцевого буфера BufOutRS equ 6Dh ; буфер передатчика BuflnpRS equ 6Ch ; буфер приемника RGO equ 800h ; Регистр выходной клавиатурный RGI equ lOOOh ; Регистр входной клавиатурный CT.lms equ (NOTA000/KD)) ; Счетчик на 1 мс CT_10ms equ (NOTA0000/KD)) ; Счетчик на 10 мс CT_50ms equ (NOTE0000/KD)) ; Счетчик на 10 мс ; Определение нот LY equ 0 LY_ equ 1 SI equ 2 DO equ 3 DO_ equ 4 RE equ 5 RE_ equ 6 MI equ 7 FA equ 8 FA_ equ 9 SL equ OAh SL_ equ OBh ADI equ P1.0 ; Адрес /Данные SHIFT equ Pl.l ; Строб SYNC equ PI. 2 ; Выбор адрес /данные SOUND equ P1.3 ; Выход на пищаль CTRL equ PI.4 ; Клавиша 'Ctrl' SH equ P1.5 ; Клавиша 'Shift' ; Определение клавиш KeyFl2 equ OObh ; Клавиша 'F12' Enter equ OOdh ; Клавиша 'Enter' ;Файл «mmt_tram.asm» ;//////////////////////////////////////////////////////////////////// ; Подпрограмма проверки RAM ;//////////////////////////////////////////////////////////////////// ;Вход : Beg_RAM-aflp.Ha4.03y, End_RAM-aflp.KOHna.03y ;Выход : FlErrRAM-флаг ош.ОЗУ @-норма 1-брак) /Использует: R0,R1,R2,B,A Test.RAM: mov R2, #3 ; Организуем 3 цикла mov В,#0 ; Подготовить нулевую маску данных
230 Глава 2. Устройства на контроллерах LoopJT: ; Запись 16 разрядных, слов в ОЗУ mov R0,# low Beg_RAM ; Загрузим эталон mov Rl,# high Beg_RAM ; адресом начала ОЗУ mov DPTR, #Beg_RAM ; Начнем заполнять с начала ОЗУ Loop_W: mov A, Rl ; Пишем ст. эталон в ОЗУ xrl А, В ; наложив маску на данные movx @DPTR, A ; через аккумулятор inc DPTR ; Co следующей ячейки mov A, R0 ; пишем мл.эталон в ОЗУ xrl А, В ; наложив маску на данные movx @DPTR, A ; через аккумулятор inc DPTR ; Готовим новый адрес inc R0 ; Готовим новый эталон inc R0 ; Проверка эталона djnz R0,Loop_Wl ; на переполнение inc Rl ; При переп. увеличим эталон Loop_Wl:mov А,# low(End_RAM+l) ; Проверим адрес области cjne A, DPL,Loop_W ; ОЗУ на переполнение mov A,# high(End_RAM+l) ; если нет переп. cjne A, DPH,Loop_W ; то продолжаем запись ; иначе ; Чтение и проверка 16 разрядных слов из ОЗУ mov R0,# low Beg_RAM ; Загрузим эталон mov Rl,# high Beg_RAM ; адресом начала ОЗУ mov DPTR, #Beg_RAM ; Начнем проверять с начала ОЗУ Loop_R: movx A, @DPTR ; Читаем данные из ОЗУ xrl А, В ; Наложить маску на данные xrl A, R1 ; Сравним данные со ст. эталоном jnz Err_RAM ; Если ошибка идем на обработку inc DPTR ; Со следующей ячейки movx A, @DPTR ; читаем данные из ОЗУ xrl А, В ; Наложить маску на данные xrl A, R0 ; Сравним данные с мл.эталоном jnz Err_RAM ; Если ошибка идем на обработку inc DPTR ; Готовим новый адрес inc R0 ; Готовим новый эталон inc R0 ; Проверка эталона djnz R0,Loop_Rl ; на переполнение inc Rl ; При переп. увеличим эталон Loop_Rl:mov А,# low(End_RAM+l) ; Проверим адрес области cjne A, DPL,Loop_R ; ОЗУ на переполнение mov А,# high(End_RAM+l) ; если нет переп. cjne A, DPH,Loop_R ; то продолжаем запись ; иначе mov А, В ; Инвертировать маску cpl A mov В, А djnz R2, Loop_T ; Выполняем новый цикл clr FlErrRAM ; Флаг контр.ОЗУ = 0 (норма) ret Err_RAM:setb FlErrRAM ; Флаг контр.ОЗУ = 1 (брак)
14. Минитерминал MCS 231 ret .•л****************************************************************** ;Файл «mmtjceyb.asm» ; Подпрограмма опроса нажатия любой клавиши ; Вход: - ; Выход: С=1 есть нажатие ; Использует: С, больше ничего не портит ; П/п: - ASK: push ACC push DPH push DPL clr A ; Готовим код опроса clr С ; и результат mov DPTR, #RGO ; Производим movx @DPTR, A ; опрос mov DPTR, #RGI ; клавиатуры movx A, @DPTR ; Если нет нажатий,то A=FF cpl A ; Проверим NOT (A) jz ASKEND ; на =0 и выходим cpl С ; Иначе было нажатие ASKEND: pop DPL pop DPH pop ACC ret ; Подпрограмма чтения нажатой клавиши ; Вход: - ; Выход: А=код клавиши ; Использует: А, больше ничего не портит ; П/п: - KEYBRD: push DPH push DPL push 4 push 5 push 6 push 7 ; Сканирование клавиатуры SKAN: mov R4, #0 ; Сброс сканкода mov R7, #8 ; Загрузка счетчика сканирования mov R5, #1ШШ0В ; Загрузка байта сканир. SCANO: mov A, R5 mov DPTR, #RGO ; Производим movx @DPTR, A ; опрос rl A ; Сдвиг бита сканир. mov R5, A ; и сохранение mov DPTR, #RGI ; Опрос клавиатуры movx A, 0DPTR ; Если нет нажатийдо A=FF
232 Глава 2. Устройства на контроллерах mov R6, #8 ; Загрузка счетчика проверки SCAN1: ггс А , ; Ищем бит=0 jnc DBNC ; Если нажли, то устр. дребезг inc R4 ; Иначе новый сканкод djnz R6, SCAN1 ; Новый цикл проверки djnz R7, SCAN0 ; Новый цикл сканирования mov R4, #0FFh ; He было нажатия ; Устранение дребезга при нажатии DBNC: call Del_50ms ; Задержка 10 мс устр. дреб. . Ожидание отпускания клавиши WAITOP: movx A, @DPTR ; Если нет нажатий,то A=FF cpl A jnz WAITOP . Устранение дребезга при отпускании call Del_50ms ; Задержка Юме устр. дреб. . Определение нажатой клавиши mov A, R4 dec R6 ; Коректируем коды строки dec R7 ; и столбца mov A, R6 • Берем код строки swap A ; Сдвигаем на гг А ; разряды 5, 4, 3 orl A, R7 ; Берем код столбца orl A, #0C0h; Пассив, разрядов 'Ctrl' и 'Shift' cpl A ; Формируем прямой код mov R7, А ; Временно сохраним код clr A orl A, P1 ; Читаем anl A, #30h ; клавишу 'Ctrl' и 'Shift' swap A ; Сдвигаем rrc A ; 'Ctrl' в разр. 7 rr A ; 'Shift' в разр. 6 rrc A ; cpl A ; Формируем прямой код anl A; #0C0h; клавиш 'Ctrl' и 'Shift' orl A, R7 ; Теперь все биты учтены pop 7 pop 6 pop 5 pop 4 pop DPL pop DPH ret ; Подпрограмма преобразования байта в коды ASCII цифр ; Вход: А=байт ; Выход: А=код ASCII старший, В=код ASCII младший ; Использует: А,В,С, больше ничего не портит ; П/п: - ASCII: push ACC
14. Минитерминал MCS 233 anl A, #Ofh 6rl A, #30h push ACC add A, #@FFh-39h) pop ACC jnc ASCIIO add A, #7 ASCIIO: mov В, А pop ACC swap A anl A, #0fh orl A, #30h push ACC add A, #@FFh-39h) pop ACC jnc ASCII1 add A, #7 ASCII1: ret ;Файл «mmt_sint.asm» ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Процедура обработки прерывания от входа SINT ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;Назначение: прием и передача байт ; Использует: ; BufOutRS - буфер передатчика ; BuflnpRS - буфер передатчика ; FlRdyORS - флаг готовности передатчика A-готовы 0-не готов) ; FIRdyIRS - флаг готовности приемника @-пуст 1-полон ) /Портит : - ;Вход : флаг FIRdyOut, буфер BufOut ; Выход : флаг FIRdyOut ; Сигнал S12345678PF ; Алгоритм работы: Начало Прер.от прием.? О 1 Обработка прием. ; Конец I_Sint: jb RI,Obr_RI ; Если прер. от прием., обработать setb FlRdyORS ; Уст. фл. гот перед. clr TI ; Сбр. прерыв. от перед. reti ; Иначе выход Obr_RI: ; Принят байт push PSW
234 Глава 2. Устройства на контроллерах push ACC push В t push DPH push DPL mov A, SBUF mov С, Р cpl С jc Obr_l Obr_0: jb RB8, Obr_Err jmp Obr_Norm Obr_l: jnb RB8, Obr_Err Obr_Norm: mov BuflnpRS, A setb FlRdylRS ; Байт принят и лежит в BuflnpRS mov A, UkEndKB cjne A, UkBegKB, ObrJCBl ObrJCB: mov DPTR,#BegJCB ; Начало кольцевого буфера mov DPL ,UkEndKB ; Указатель конца кольцевого буфера mov A, BuflnpRS movx 0DPTR, А inc UkEndKB setb FlRdyKB jmp Obr_End ObrJCBl: inc UkEndKB mov A, UkEndKB cjne A, UkBegKB, Obr_KB2 dec UkEndKB jmp Obr_End ObrJCB2: dec UkEndKB jmp ObrJCB Obr_Err: Obr.End: clr RI ; Сброс готовности приемника pop DPL pop DPH pop В pop ACC pop PSW reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;////////////////////////////////////////////////////////////////////
14. Минитерминал MCS 235 Подпрограмма передачи байта по RS-232 ;//////////////////////////////////////////////////////////////////// ;Вход: А - передаваемый байт ;Выход: - OutB_RS: public OutB_RS push PSW jnb FlRdyORS,$ ; Передатчик готов ? mov С, Р ; Битконтроля по нечетности cpl С mov ТВ8,С ; Загрузим в бит паритета mov SBUF,A ; Прередаем байт clr FlRdyORS ; Сброс готовности передатчика pop PSW ret ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;Файл «mmt_init.asm» ;//////////////////////////////////////////////////////////////////// ; Подпрограмма инициализации ;//////////////////////////////////////////////////////////////////// Init: ; Инициализация разреш./запрета прерываний mov IE, #00010000В;Назн. Разр. INTO - ТО INT1 - Т1 SINT - Общ. ; Инициализация высокого приоритета прерываний mov IP, #00000000В;Назн. Выс.приор. INTO - ТО INT1 - Т1 SINT - ; Инициализация флагов и управл. mov TCON, #00000101В;Бит Назнач. IT0 TCON.0 1-срез, 0-низк. IE0 TCON.1 Флаг INTO IT1 TCON.2 1-срез, 0-низк. IE1 TCON.3 Флаг INT1 TR0 TCON.4 Упр. ТО 1-пуск, 0-стоп
236 Глава 2. Устройства на контроллерах TFO TC0N.5 Флаг ТО TR1 TC0N.6 Упр. Т1 1-пуск, 0-стоп TF1 TC0N.7 Флаг Т1 ; Инициализация таймеров raov TMOD, #00100001В;Бит Назнач. МО TMOD.4 0\TL0 1\T0 0\TH0>TL0 1\Т1стоп Ml TMOD.5 0/:5 0/:1б 1/:25б 1/TL0:256T/C TH0:256' С/-Т TMOD.2 1-счет от ТО 0-счет внутр. GATE TMOD.3 1-T0(INT0=1 & TR0=1) 0-T0(TR0=l) MO TMOD.4 0\TL1 1\T1 0\TH1>TL1 1\Т1стоп Ml TMOD.5 0/:5 0/:16 l/:256 1/TL0:256T/C TH0:256' C/-T TMOD.6 1-счет от Tl 0-счет внутр. GATE TMOD.O 1-T1(INT1=1 & TR1=1) 0-Tl(TRl=l) mov TH1, #SPEED2400 ; Делит, в тайм.1 jnb FlSpeed, Initl ; Если скорость 2400 дальше mov TH1, #SPEED300 ; иначе изменим скорость на 300 Бод Initl: mov ТЫ, ТН1 ; Делаем первую загрузку setb TR1 ; Запуск таймера 1 ; Инициализация последовательного порта mov PCON, #0Ь000000В;Бит Назнач. ; IDL PCON.0 1-холост.ход 0-норм. режим ; PD PCON.1 1-пониж.потр. 0-норм. потр. GFO PCON.2 Флаг общ. назн. GF1 PCON.3 Флаг общ. назн. только в КМОП PCON.4 не исп. PCON.5 не исп. PCON.6 не исп. SMOD PCON.7 1-удв.скор. 0-один. скор, mov A,SBUF ; Очистить буфер приемника mov SCON, #11010010В;Бит Назнач. ; RI SCON.0 1-гот.приемн. 0-негот. приемн. TI SCON.1 1-гот.перед. 0-негот. перед. RB8 SCON.2 принятый бит9 ТВ8 SCON.3 1-бит9=1 0-бит9=0 REN SCON.4 1-разр.прием 0-запр.прием SM2 SCON.5 1-запр.с бит9=0 0-разр.с бит9=Х SMI SCON. 6 0\реж 1\реж 0\реж 1\реж SMO SCON.7 0/0 0/3 1/2 1/3 mov UkBegKB,#0 ; указатель в начало mov UkEndKB,#0 ; буфер пуст ; Снять блокировку прерываний setb EA ret ;Файл «mmt_text.asm» TEXT00: db 30h/31h,32h,33h,34h,35h/36h,37h,38h,39h,41h,42h,24h ;0123456789AB$ db 8Fh,2Dh,OE0h,2Dh,0A8h,2Dh,OA2h,2Dh,OA5h,2Dh,OE2h,21h,24h ;П-р-и-в-е-т!$
14. Минитерминал MCS ;Файл «mmt_font.asm» Font_7x5: db OOOH, 000H, OOOH, OOOH, OOOH, 03EH, 045H, 051H db 045H, 03EH, 03EH, 07BH, 06FH, 07BH, 03EH, 01EH db 03FH, 07EH, 03FH, OlEH, 008H, 01CH, 03EH, 01CH db 008H, 01AH, 04FH, 07FH, 04FH, OlAH, 008H, 05CH db 07FH, 05CH, 008H, OOOH, 018H, ОЗСН, 018Н, OOOH db 07FH, 077H, 063H, 077H, 07FH, OICH, 036H, 022H db 036H, OICH, 07FH, 063H, 05DH, 063H, 07FH, ОЗОН db 048H, 049H, 03FH, ООЗН, 006H, 029H, 079H, 029H db 006H, 040H, 060H, 03FH, 005H, 007H, 060H, 03FH db 005H, 035H, OlFH, 055H, ОЗЕН, 063Н, ОЗЕН, 055Н db 07FH, ОЗЕН, OICH, OICH, 008H, 008H, OICH, OICH db ОЗЕН, 07FH, 014H, 036H, 07FH, 036H, 014H, OOOH db 05FH, OOOH, OOOH, 05FH, 006H, 009H, 07FH, 001H db 07FH, 020H, 04AH, 055H, 029H, 002H, OOOH, 070H db 070H, 070H, OOOH, 054H, 076H, 07FH, 076H, 054H db 004H, 006H, 07FH, 006H, 004H, OIOH, ОЗОН, 07FH db ОЗОН, OIOH, 008H, 008H, 02AH, OICH, 008H, 008H db OICH, 02AH, 008H, 008H, 03CH, 020H, 020H, 020H db 020H, 008H, ОЗЕН, 008Н, ОЗЕН, 008Н, ОЗОН, ОЗСН db ОЗЕН, ОЗСН, ОЗОН, 006Н, 01ЕН, ОЗЕН, OlEH, 006H db OOOH, OOOH, OOOH, OOOH, OOOH, OOOH, 006H, 05FH db 006H, OOOH, OOOH, 007H, OOOH, 007H, OOOH, 014H db 07FH, 014H, 07FH, 014H, 024H, 06EH, 06BH, ОЗВН db 012H, 046H, ОЗОН, 018H, OOCH, 062H, ОЗОН, 04AH db 05DH, 032H, 048H, 005H, 003H, OOOH, OOOH, OOOH db OICH, 03EH, 063H, 041H, OOOH, 041H, 063H, 03EH db OICH, OOOH, 02AH, 03EH, OICH, ОЗЕН, 02АН, 008H db 008H, 03EH, 008H, 008H, OOOH, 040H, 060H, 020H db OOOH, 008H, 008H, 008H, 008H, 008H, OOOH, 040H db 040H, OOOH, OOOH, 060H, ОЗОН, OICH, 006H, ООЗН db ОЗЕН, 051Н, 049H, 045H, ОЗЕН, 040Н, 042H, 07FH db 040H, 040H, 042H, 061H, 051H, 049H, 046H, 021H db 049H, 04DH, 04BH, 031H, 018H, 014H, 052H, 07FH db 050H, 027H, 045H, 045H, 045H, 039H, ОЗСН, 04АН db 049H, 049H, 032H, ООЗН, 071Н, 009H, 005H, ООЗН db 036H, 049H, 049H, 049H, 036H, ООбН, 049Н, 049H db 029H, OlEH, OOOH, 066H, 066H, OOOH, OOOH, 040H db 073H, 033H, OOOH, OOOH, 008H, OICH, 036H, 063H db 041H, 024H, 024H, 024H, 024H, OOOH, 041H, 063H db 036H, OICH, 008H, 002H, 051H, 059H, 009H, 006H db 03EH, 041H, 05DH, 05DH, OlEH, 07CH, 012H, 013H db 012H, 07CH, 041H, 07FH, 049H, 049H, 036H, OICH db 022H, 041H, 041H, 022H, 041H, 07FH, 041H, 022H db OICH, 041H, 07FH, 049H, 05DH, ОбЗН, 041Н, 07FH db 049H, OIDH, ООЗН, OICH, 022H, 041H, 051H, 032H db 07FH, 008H, 008H, 008H, 07FH, OOOH, 041H, 07FH db 041H, OOOH, ОЗОН, 040H, 041H, 03FH, OOIH, 041H db 07FH, 008H, 014H, 063H, 041H, 07FH, 041H, 040H db 070H, 07FH, 006H, OOCH, 006H, 07FH, 07FH, 006H db OOCH, 018H, 07FH, ОЗЕН, ОбЗН, 041Н, ОбЗН, ОЗЕН
238 Глава 2. Устройства на контроллерах db 041H, 07FH, 049H, 009H, 006H, OlEH, 021H, 061H db 071H,( 05EH, 041H, 07FH, 009H, 019H, 066H, 026H db 04DH,' 049H, 059H, 032H, ООЗН, 041H, 07FH, 041H db 003H, 03FH, 040H, 040H, 040H, 03FH, 01FH, 020H db 040H, 020H, OlFH, 07FH, ОЗОН, 018H, ОЗОН, 07FH db 063H, 014H, 008H, 014H, 063H, 007H, 048H, 078H db 048H, 007H, 063H, 051H, 049H, 045H, 063H, OOOH db 07FH, 041H, 041H, OOOH, ООЗН, 006Н, 01CH, ОЗОН db 060H, OOOH, 041H, 041H, 07FH, OOOH, 004H, 002H db OOIH, 002H, 004H, 040H, 040H, 040H, 040H, 040H db OOOH, 003H, 007H, 004H, OOOH, 020H, 054H, 054H db 03CH, 040H, 041H, 07FH, 048H, 048H, ОЗОН, 038Н db 044H, 044H, 044H, 028H, ОЗОН, 048Н, 049H, 03FH db 040H, 038H, 054H, 054H, 05CH, OOOH, 048H, 07FH db 049H, 003H, OOOH, 04CH, 052H, 052H, 07CH, 002H db 041H, 07FH, 008H, 004H, 078H, OOOH, 045H, 07DH db 040H, OOOH, ОЗОН, 040H, 040H, 03DH, OOOH, 041H db 07FH, OIOH, 038H, 044H, OOOH, 041H, 07FH, 040H db OOOH, 07CH, 008H, 038H, OOCH, 078H, 07CH, 004H db 004H, 078H, OOOH, 038H, 044H, 044H, 038H, OOOH db 004H, 078H, 024H, 024H, 018H, 018H, 024H, 024H db 078H, 004H, 044H, 078H, 04CH, 004H, 018H, 048H db 054H, 054H, 024H, OOOH, OOOH, 004H, 07FH, 044H db OOOH, 03CH, 040H, 040H, 03CH, 040H, OICH, 020H db 040H, 020H, OICH, ОЗСН, 060H, 038H, 060H, 03CH db 044H, 028H, OIOH, 028H, 044H, 04CH, 050H, 050H db ОЗСН, OOOH, 044H, 064H, 054H, 04CH, OOOH, 008H db ОЗЕН, 077H, 041H, OOOH, OOOH, OOOH, 077H, 077H db OOOH, 041H, 077H, ОЗЕН, 008Н, OOOH, 002H, OOIH db 003H, 002H, OOIH, 070H, 04CH, 046H, 04CH, 070H db 070H, OICH, 016H, 013H, 07FH, 07FH, 049H, 049H db 049H, ОЗОН, 07FH, 049H, 049H, 04EH, 038H, 07FH db OOIH, OOIH, OOIH, OOIH, 040H, 07FH, 041H, 07FH db 040H, 07FH, 049H, 049H, 049H, 040H, ОбЗН, 014Н db 07FH, 014H, 063H, 020H, 04AH, 049H, 049H, 036H db 07FH, ОЗОН, 018Н, OOCH, 07FH, 07FH, ОЗОН, 019Н db OOCH, 07FH, 07FH, 008H, OOCH, 012H, 061H, 060H db 018H, OOCH, 006H, 07FH, 07FH, 006H, OOCH, 006H db 07FH, 07FH, 008H, 008H, 008H, 07FH, ОЗЕН, 041Н db 041H, 041H, 03EH, 07FH, OOIH, OOIH, OOIH, 07FH db 07FH, 009H, 009H, 009H, 006H, ОЗЕН, 041Н, 041H db 041H, 022H, OOIH, OOIH, 07FH, OOIH, OOIH, 027H db 048H, 048H, 048H, 03FH, OICH, 022H, 07FH, 022H db OICH, 063H, 014H, 008H, 014H, 063H, 07FH, 040H db 040H, 07FH, 040H, 007H, 008H, 008H, 008H, 07FH db 07FH, 040H, 07FH, 040H, 07FH, 03FH, 020H, 03FH db 020H, 07FH, OOIH, 07FH, 048H, 048H, 078H, 07FH db 048H, 078H, OOOH, 07FH, 07FH, 048H, 048H, 048H db ОЗОН, 022H, 041H, 049H, 049H, ОЗЕН, 07FH, 008H db 07FH, 041H, 07FH, 046H, 029H, 019H, 009H, 07FH db 020H, 054H, 054H, 07CH, 040H, 07CH, 04AH, 04AH db 07AH, OOOH, 07CH, 054H, 054H, 058H, 020H, 07CH
14. Минитерминал MCS 239 db 004H, 004H, 004H, OOOH, 040H, 07CH, 044H, 07CH db 040H, 038H, 054H, 054H, 05CH, OOOH, 044H, 028H db 07CH, 028H, 044H, 028H, 044H, 054H, 054H, 028H db 07CH, 020H, 010H, 07CH, OOOH, 07CH, 021H, 011H db Ю7СН, OOOH, 07CH, 010H, 010H, 028H, 044H, 040H db 020H, 010H, 008H, 07CH, 07CH, 008H, 010H, 008H db 07CH, 07CH, 010H, 010H, 07CH, OOOH, 038H, 044H db 044H, 044H, 038H, 07CH, 004H, 004H, 07CH, OOOH db 02AH, 055H, OOOH, 02AH, 055H, 02AH, 02AH, 055H db 02AH, 02AH, 055H, 02AH, 055H, 02AH, 055H, OOOH db OOOH, 07FH, OOOH, OOOH, OIOH, OIOH, 07FH, OOOH db OOOH, 014H, 014H, 07FH, OOOH, OOOH, OIOH, 07FH db OOOH, 07FH, OOOH, OIOH, 070H, OIOH, 070H, OIOH db 014H, 014H, 07CH, OOOH, OOOH, 014H, 077H, OOOH db 07FH, OOOH, OOOH, 07FH, OOOH, 07FH, OOOH, 014H db 074H, 004H, 07CH, OOOH, 014H, 017H, OIOH, OlFH db OOOH, OIOH, OlFH, OIOH, OlFH, OOOH, 014H, 014H db OlFH, OOOH, OOOH, OIOH, OIOH, 070H, OOOH, OOOH db OOOH, OOOH, OlFH, OIOH, OIOH, OIOH, OIOH, OlFH db OIOH, OIOH, OIOH, OIOH, 070H, OIOH, OIOH, OOOH db OOOH, 07FH, OIOH, OIOH, OIOH, OIOH, OIOH, OIOH db OIOH, OIOH, OIOH, 07FH, OIOH, OIOH, OOOH, OOOH db 07FH, 014H, 014H, OOOH, 07FH, OOOH, 07FH, OIOH db OOOH, OlFH, OIOH, 017H, 014H, OOOH, 07CH, 004H db 074H, 014H, 014H, 017H, OIOH, 017H, 014H, 014H db 074H, 004H, 074H, 014H, OOOH, 07FH, OOOH, 077H db 014H, 014H, 014H, 014H, 014H, 014H, 014H, 077H db OOOH, 077H, 014H, 014H, 014H, 017H, 014H, 014H db OIOH, OlFH, OIOH, OlFH, OIOH, 014H, 014H, 074H db 014H, 014H, OIOH, 070H, OIOH, 070H, OIOH, OOOH db OlFH, OIOH, OlFH, OIOH, OOOH, OOOH, OlFH, 014H db 014H, OOOH, OOOH, 07CH, 014H, 014H, OOOH, 070H db OIOH, 070H, OIOH, OIOH, 07FH, OIOH, 07FH, OIOH db 014H, 014H, 07FH, 014H, 014H, OIOH, OIOH, OlFH db OOOH, OOOH, OOOH, OOOH, 070H, OIOH, OIOH, 07FH db 07FH, 07FH, 07FH, 07FH, 070H, 070H, 070H, 070H db 070H, 07FH, 07FH, 07FH, OOOH, OOOH, OOOH, OOOH db OOOH, 07FH, 07FH, OOFH, OOFH, OOFH, OOFH, OOFH db 07CH, 024H, 024H, 03CH, OOOH, 038H, 044H, 044H db 028H, OOOH, 004H, 004H, 07CH, 004H, 004H, 04CH db 050H, 050H, 03CH, OOOH, 018H, 024H, 07EH, 024H db 018H, 044H, 028H, OIOH, 028H, 044H, 07CH, 040H db 040H, 07CH, 040H, OOCH, OIOH, OIOH, 07CH, OOOH db 07CH, 040H, 07CH, 040H, 07CH, 03CH, 020H, 03CH db 020H, 07CH, 004H, 07CH, 050H, 050H, 070H, 07CH db 050H, 070H, OOOH, 07CH, 07CH, 050H, 050H, 050H db 070H, 028H, 044H, 054H, 054H, 038H, 07CH, OIOH db 038H, 06CH, 038H, 048H, 054H, 034H, 014H, 078H db 07EH, 053H, 052H, 053H, 042H, 038H, 055H, 054H db 055H, 008H, OOOH, OOOH, 040H, 020H, OIOH, OIOH db 020H, 040H, OOOH, OOOH, 004H, 002H, OOIH, OOOH db OOOH, OOOH, OOOH, OOIH, 002H, 004H, 008H, 008H
240 Глава 2. Устройства на контроллерах db 02АН, ОЗЕН, 008Н, 008Н, ОЗЕН, 02АН, 008Н, 008Н db 010Н, ОЗОН, 07FH, ОЗОН, 010Н, 004Н, ООбН, 07FH db 006Н, 0U4H, 008Н, 06ВН, 06ВН, 008Н, ОООН, 044Н db 05FH, 05FH, 044Н, ОООН, 07FH, 004Н, 008Н, 07FH db ООЗН, 05АН, 024Н, 024Н, 024Н, 05АН, ОООН, ОЗСН db ОЗСН, ОЗСН, ОООН, ОООН, ОООН, ОООН, ОООН, ОООН ;Файл «mmt_muza.asm» ; Подпрограмма воспроизведения мелодии ; Вход: DPTR=aflpec кодовой записи ; Выход: Пищаль ; Использует: A, DPTR ; П/п: MUSIC: push 7 ; Сохраним регистры push б mov TMOD, #llh ; Оба таймера в режим 16 разр. Ml: clr A ; Берем длительность move A, 0A+DPTR ; ноты в виде знаменателя jz EXIT ; Если конец, выходим mov В, А ; Преобразуем mov A, #16 ; знаменатель div AB ; в количество 1/16 долей mov R7, А ; Сохраним длительность inc DPTR ; Готовим адрес кода частоты ноты clr A move A, @A+DPTR ; Берем код частоты ноты rl A ; Умножим на 2 т.к. код=16 битам mov R6, А ; Сохраним код частоты SOUND_: clr TRO ; Загружаем таймер на 1/16 с. clr TFO mov TL0,#LOW(NOTF2500/KD)+KD) mov TH0,#HIGH(NOTF2500/KD)+KD) setb TRO ; и запускаем SI: cpl SOUND ; Звучим jbc TFO, S2 ; Если 1/16 с истекли, уходим clr TRl ; Готовим таймер частоты ноты clr TF1 mov A, R6 ; Определим частоту ноты add A, # (TAB-$-2-1) ; по таблице move А, @А+РС ; Сначала старший байт mov TH1, А ; загрузим в таймер mov A, R6 ; Теперь младший байт add А, #(ТАВ-$-2) move A, BA+PC mov TL1, А ; загрузим в таймер setb TRl ; Запустим таймер SO: jbc TF1, SI ; Если таймер отсчитал, уходим jmp SO ; Иначе ждем ! S2: djnz R7, SOUND_ ; Если не вся длительность, продолжим inc DPTR ; Иначе готовим новый адрес ноты
14. Минитерминал MCS 241 jmp Ml ; И продолжаем EXIT: pop 6 pop 7 ret TAB: dw not(A136-16*KD)/KD);LY Ля 1-й октавы dw not(A073-16*KD)/KD);LY_ Ля# 1 dw not(A012-16*KD)/KD);SI Си 1 dw not((956-16*KD)/KD) ;D0 До 2 dw not((902-16*KD)/KD) ;D0_ До# 2 dw not((850-16*KD)/KD) ;RE Pe 2 dw not((804-16*KD)/KD) ;RE_ Pe# 2 dw not(G58-16*KD)/KD) ;MI Ми 2 dw not(G16-16*KD)/KD) ;FA Фа 2 dw not(F77-16*KD)/KD) ;FA_ Фа# 2 dw not(F38-16*KD)/KD) ;SL Соль 2 dw not(F02-16*KD)/KD) ;SL_ Соль# 2 SONGGOOD: ; Мелодия приветствия 1 db 4,MI,4,MI,2,MI,4,MI db 4,MI,2,MI,4,MI,4,SL db 4,DO,4,RE,l,MI,4,FA db 4,FA,4,FA,4,FA,4,FA db 4,MI,4,MI,4,MI,4,MI db 4,RE,4,RE,4,MI,2,RE db 2,SL db 4,MI,4,MI,2,MI,4,MI db 4,MI,2,MI,4,MI,4,SL db 4,DO,4,RE,l,MI,4,FA db 4,FA,4,FA,4,FA,4,FA db 4,MI,4,MI,4,MI,4,SL db 4,FA,4,MI,4,RE,l,DO db 0 ; Мелодия приветствия 2 db 16,MI,16,MI,8,MI,16,MI db 16,MI,4,MI,16,MI,16,SL db 16,DO,16,RE,2,MI,16,FA db 16,FA,16,FA,16,FA,16,FA db 16,MI,16,MI,16,MI,16,MI db 16,RE,16,RE,16,MI,4,RE db 4,SL db 16,MI,16,MI,8,MI,16,MI db 16,MI,8,MI,16,MI,16,SL db 16,DO,16,RE,2,MI,16,FA db 16,FA,16,FA,16,FA,16,FA db 16,М1,16,М1Д6,М1,16,8Ь db 16,FA,16,MI,16,RE,2,TO db 0 ; Мелодия приветствия З db 8,LY,8,LY_,8,SI,8,TO,8,DO_,8,RE,8,RE_,8,MI,8,FA,8,FA_,8,SL,8,SL_
242 Глава 2. Устройства на контроллерах db 8,SL_,8lSL,8,FAb.#8,FA#8lMI,8fRE_#8,RE#8,DO_,8,DO,8,SIl8,L5Ll8lLY db 0 SONGBRAM: ; Мелодия ошибки ОЗУ db 4,SI,4,LY,4,SL,4,FA db 4,MI,4,RE,l,DO db 0 SONGBIP: db 4, SI db 0 ;Файл «mmtjjeep.asm» .**************************************************•************** Подпрограмма формирования короткого звукового сигнала .л**************************************************************** Веер: push 3 push 4 mov R3, #1 mov R4, #10 ВеерО: cpl SOUND call Del_lms djnz R4, BeepO mov R4, #10 djnz R3, BeepO pop 4 pop 3 ret .••л************************************************************** Подпрограмма формирования длинного звукового сигнала .•л*************************************************************** Phone: push 3 push 4 mov R3, #10 mov R4, #30 PhoneO: cpl SOUND call Del_lms djnz R4, PhoneO mov R4, #30 djnz R3, PhoneO pop 4 pop 3 ret
14. Минитерминал MCS 243 В качестве тестирующего устройства использовался персональный компьютер типа IBM PC с интерфейсом RS-232 (СОМ-портом) и несложной программой обмена. Исходный текст программы обмена, написанной на языке C++, приведен ниже. Текст программы обмена // Программа «ibm_mt» тестирует минитерминал по следующему алгоритму: // // - оператор вводит с клавиатуры IBM любые символы // - программа передает символы по порту «coml» или «сот2» (см. описатель «СОМ») // и одновременно отображает их на экране // - все принимаемые от минитерминала по СОМ-порту символы отображаются // в другом окне экрана // // Автор: О.Д. Вальпа //============================================================================= #include <stdio.h> linclude <conio.h> #include <bios.h> #include <stdlib.h> #include <dos.h> #include <time.h> #include <graphics.h> tdefine COM 1 // Назначение номера «com» порта: 0 или 1 #define MAXTIM 3 // Ожидание ответа об оконч. передачи по порту в с tdefine DELAY_MS 54 // Ожидание подтвержд. приема по порту( не более 55 мс) tdefine BAIT_INIT ОхЕЗ // Байт иниц. «com» порта: 9600бод, нечет., 8 бит, 1 стоп #define KB_F1_ ОхЗЬОО // скан код клавиши Enter #define CR OxlcOd // скан код клавиши Enter #define BS 0x0e08 // скан код клавиши <-- #define ESC Oxllb // скан код клавиши Esc #define MAP_X 1 // координата 'х' служебного поля #define MAP_Y 14 // координата 'у' служебного поля #define INF_X 3 // координата 'х' информац. поля tdefine INF_Y 2 // координата 'у' информац. поля Idefine INIT 0x00 // адрес регистра инициализации «com» порта #define PERED 0x01 // адрес регистра приемника «com» порта # define PRIEM 0x02 // адрес регистра передатчика «com» порта #define STAT 0x03 // адрес регистра статуса «com» порта tdefine TAIM_AUT 0x8000 // слово состояния при тайм-ауте «com» порта int i; // переменная цикла int с; // переменная вводимого символа 16 бит unsigned char s; // младший байт вводимого символа 8 бит
244 Глава 2. Устройства на контроллерах unsigned char m[256]; // буфер выводимых символов int peredcom ( char bait); // п/п передатчика иниц. «com» порта void exitclr ( void); // п/п выхода с очисткой экрана int instr (int,int); // п/п вывода инструкции /*******•****** начало программы *****************************************/ main(void) { int xr=MAP_X+ 0,yr=MAP_Y- 9; /* кординаты приемного буфера */ int xk=MAP_X+ 0,yk=MAP_Y+ 0; /* кординаты приемного буфера */ int i=0, ]=0, status; /* переменные цикла, статуса, длины строки */ instr(xk,yk); /* Вывод инструкции на дисплей */ bioscom ( INIT, BAIT_INIT, COM);/* инициализация «com» порта */ /* читаем статус порта и если буфер не пуст очистим его */ if (((status = bioscom(STAT,0,COM)) & 0x100) != 0) bioscom (PRIEM,0,COM); /* Главный цикл программы */ while ( 1) { /* Ввод команды */ if (bioskey A)) { с = bioskey @) ; /* Ввод символа через п/п BIOS */ if ( с == ESC) { exitclr (); /* Аварийный выход по символу «Esc» */ } if ( с == KB_F1_) { instr(xk,yk); /* Вывод инструкции на дисплей */ continue; } /* Передача в порт */ if ( с == CR) { status = bioscom (STAT, 0,СОМ); if ((status & TAIM.AUT) != 0) { gotoxy (MAP_X,MAP_Y+1) ; cprintf ( «He подключен кабель к порту COM%ld»,COM+l); continue; } textbackground(BLACK) ; textcolor(LIGHTRED); gotoxy (MAP_X,MAP_Y-1) ; cprintf («Передач a:»); xk = MAP_X; gotoxy (xk,yk); /* установить маркер в поле прд.*/ for (i=0; i < j; i++) { status = peredcom ( m[i] ); putchar ( 0x20); /* выводим эхо */ }
14. Минитерминал MCS 245 gotoxy (MAP_X,MAP_Y-1); textbackground(BLACK) ; textcolor(LIGHTGREEN) ; cprintf («Ввод: «); textbackground(BLACK) ; textColor(YELLOW); gotoxy (xk,yk); /* установить маркер в поле прд.*/ J = 0; continue; } if (j == 256) { put char @x07); /* выводим эхо */ continue; } s = с & Oxff; m[j] = s; j++; xk++; putchar ( s ); /* выводим эхо */ } /* Прием из порта ответа */ if ((bioscom(STAT,0,COM) & 0x100) != 0) { gotoxy (xr,yr); putchar ( bioscom(PRIEM,0,COM) & Oxff ); /* выводим эхо */ xr++; if (xr == 80) { xr=0; yr++; } gotoxy (xk,yk); } } } /*============= п/п передачи байта ================================*/ int peredcom ( char bait) { int status; while ( ( status = bioscom ( STAT, 0, COM ) & 0x2000) == 0) continue; status = bioscom ( PERED, bait, COM ); /* передача */ return status; } /*============= п/п выхода с очисткой =============================*/ void exitclr ( void) { int i = 0; textbackground(BLACK) ; textcolor(LIGHTGRAY); for (i=0;i<=34;i++) cprintf(«\n»);
246 Глава 2. Устройства на контроллерах exit @), } /*============= п/п вывода инструкции =============================*/ int instr( xk,yk) { int i; textbackground(BLACK) ; tex t color (LIGHTCYAN) ; cprintf(«\r\n»); cprintf(« Схема подключения »); cprintf(«| I»); cprintf(«l I»); cprintf(«| I»); cprintf(«| I»); cprintf(«| I»); cprintf(«l I 1 I»); cprintf(«l II II I»); cprintf(«| II II I»); cprintf(«| II II I»); cprintf(«| II || I»); cprintf(«| I 1 I»); cprintf(«l I Минитерминал I I»); cprintfH СОМШ I I |»,COM+l); cprintf(«l I IBM PC/AT I I I I»); cprintf(«l I»); cprintf(«l I»); cprintf(«| I»); cprintf(«| I»); cprintf(«l I»); cprintf(«| I»); cprintf(«| I»); cprintf(«l I»); cprintf(« -Для продолжения нажмите любую клавишу —»); с = bioskey @); /* Ожидание для чтения информации */ cprintf(« »); cprintf(«l Программа тестирования минитерминала I»); cprintf(« »); textbackground(BLACK)? textCOlor(LIGHTBLUE); cprintf(«n p и е м: «); textbackground(BLACK) ; textcolor (YELLOW); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); textbackground(BLACK) ; textcolor (LIGHTGREEN);
14. Минитерминал MCS 247 Минитерминал соединяется с компьютером с помощью кабеля, электрическая схема которого приведена на Рис. 14.6. Рис 14.6. Электрическая схема кабеля После запуска программы обмена на экране монитора появится изображение, на котором приводится схема подключения минитерминала к компьютеру и указан номер используемого СОМ-порта (Рис 14.7). cprintf(«B вод: «); textbackground( BLACK) ; textcolor(YELLOW); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); cprintf(« «); textbackground (BLACK) ; textcolor(LIGHTCYAN); cprintf(« »); cprintf(«| Fl-Помощь Esc - Выход из программы I»); cprintf(« »); textbackground (BLACK) ; textcolor (YELLOW); gotoxy (xk,yk); /* установить маркер в служ. поле */ return 0; }
248 Глава 2. Устройства на контроллерах Рис. 14.7. Работа программы обмена после запуска После нажатия любой клавиши изображение на экране сменится и программа войдет в режим диалога сообщениями между компьютером и минитерминалом (Рис. 14.8). Рис. 14.8. Работа программы обмена в режиме диалога Здесь можно вводить с клавиатуры команды для минитерминала и следить за его реакцией, осуществляя, таким образом, проверку его работоспособности.
15. Контроллер с дистанционной модификацией программ 249 15. Контроллер с дистанционной модификацией программ При автоматизации производства с помощью микроконтроллеров, как правило, применяют запрограммированные контроллеры или контроллеры с постоянным запоминающим устройством (ПЗУ), в котором хранятся рабочие программы. А как быть, если программу требуется модифицировать в процессе работы, к тому же дистанционно? Об этом говорится в данном разделе. Несмотря на неординарность описанной выше задачи, ее актуальность очевидна. Ярким примером такого решения является наша повседневная работа на компьютере. Ведь мы даже не задумываемся о том, как много раз за день меняем программу для процессора компьютера, загружая различные программы и приложения. В данном случае задача облегчается тем, что компьютер имеет встроенный носитель данных в виде жесткого диска, на котором размещены все программы. Но вот мы подключаемся к Интернету. И теперь нам доступны программы с любого конца света, которые мы можем загрузить и выполнить! Правда, здорово?! А теперь представим себе, что наш контроллер установлен на каком-либо станке и управляет им с помощью рабочей программы. Для того чтобы сменить режим работы станка, необходимо заменить управляющую программу контроллера. Лучше всего сделать это дистанционно, поскольку при таком способе процедура многократно ускоряется, не изнашивается оборудование, нет ограничений по числу итераций. Одним словом, налицо все преимущества данного способа. Вот вам наглядный пример, где это может пригодиться. А теперь о реализации. Для решения большинства задач автоматизации подходят хорошо известные многим разработчикам цифровой техники микроконтроллеры семейства MCS (Micro Computer Systems), другое название которых — однокристальные микроэвм. Известно также, что данные микроконтроллеры, в отличие от классической организации процессоров «фон-неймановского» типа, имеют «гарвардскую» архитектуру, поэтому память программ и память данных у них физически и логически разделены. По этой причине MCS-микроконтроллеры не позволяют дистанционную загрузку новой программы во время работы при стандартном включении внешней памяти, что ограничивает возможность их применения. Однако этот недостаток легко устраняется путем нестандартного подключения памяти программ и данных. Данный прием реализован в разработанном мной и предлагаемом вниманию читателей контроллере.
250 Глава 2. Устройства на контроллерах Контроллер построен на базе микропроцессора 80С31 семейства MCS. Этот процессор позволяет подключить 64 Кбайт внешней памяти программ и такой же объем памяти данных. Поскольку обращение к памяти программ производится с помощью отдельного сигнала процессора, память данных не может быть использована для хранения и выборки из нее кода программ. Однако если объединить с помощью простой логики сигналы выборки памяти программ и памяти данных, для микропроцессора не будет разницы между этими типами данных. Именно этот прием и реализован в описываемом здесь контроллере. В качестве канала связи с внешним миром используется интерфейс RS-232. С целью расширения функциональных возможностей контроллер снабжен регистровыми портами ввода-вывода, которые можно устанавливать по мере необходимости. Ниже приведены основные технические характеристики контроллера. • Тип процессора — 80СЗЦ51). • Тактовая частота процессора —11052 кГц. • Емкость постоянного запоминающего устройства — 8 Кбайт. • Емкость оперативного запоминающего устройства — 8 Кбайт. • Звуковой излучатель — пьезоэлектрический. Контроллер имеет следующие интерфейсы. • Один порт аппаратно формируемого интерфейса RS-232. • Один вход внешнего прерывания (-INTO). • Один вывод таймера (ТО). • Шесть двунаправленных программируемых выводов (Р11—Р16). • Два восьмиразрядных регистра ввода (RIA, RIB). • Два восьмиразрядных регистра вывода (ROA, ROB). Питание контроллера осуществляется от источника постоянного стабилизированного напряжения +5 В. Ток потребления контроллера не превышает 0,4 А. Параметры сигналов входных и выходных портов соответствуют уровням сигналов ТТЛ. На Рис. 15.1 приведена структурная схема контроллера. Контроллер имеет доступ к ОЗУ, ПЗУ, регистрам ввода RIA, RIB и регистрам вывода ROA, ROB через шину адреса и шину данных. Выбор конкретного устройства производиться с помощью схемы управления СУ. Связь с управляющим компьютером осуществляется по интерфейсу RS-232. Преобразователь уровней ПУ обеспечивает прямое и обратное преобразование сигналов ТТЛ-уровней в уровни сигналов интерфейса RS-232. Принципиальная электрическая схема контроллера приведена на Рис. 15.2.
15 Контроллер с дистанционной модификацией программ 251 Рис. 15.1. Структурная схема контроллера В схеме применены в основном элементы импортного производства, которые допускают прямую замену — отечественными аналогами. Подробный перечень элементов контроллера приведен в Табл. 15.1. Таблица 15.1. Элементы контроллера Позиционное обозначение ВА1 BQ1 Наименование Резонатор кварцевый 11052 кГц Звуковой преобразователь ЗП-3 Количество 1 1 Примечание Конденсаторы CI—C2 СЗ, С4 С5—С17 СР1 СР2, СРЗ К10-17а-ПЗЗ-30 пФ К10-17б-1,0 мкФ К10-176-0Д мкФ К53-35-25В-10 мкФ К53-35-6,ЗВ-10 мкФ 2 2 13 1 2 Микросхемы D1 D2 D3 D4 D5 D6 D7 80С31 74LS00 74LS32 74LS138 NE555 27С64 6264 1 1 1 1 1 1 1 KP1830BE31 К555ЛАЗ К555ЛЛ1 К555ИД7 КР1006ВИ1 К573РФ4 К537РУ17
252 Глава 2. Устройства на контроллерах Таблица 15.1. (Продолжение) D8, D9 D10—D12 HL1 74LS374 74LS373 Светодиод АЛ307АМ 2 3 1 К555ИР23 К555ИР22 Красный 1 Резисторы типа МЛТ-0,125 Вт Rl—R5 R6 R7 R8 R9 SB1 4,7 кОм 47кОм ЮкОм 1МОм 1кОм Кнопка тактовая типа КТ 5 Диоды VD1—VD3 | КД522Б | 3 Транзисторы VT1 VT2 КТ361 КТ315 1 1 Соединители XI—Х5 хс ХР Вилка ВН-16 Вилка DRB-9M Вилка WF-2 Панелька РС-28 5 1 1 1 При включении контроллера программа загружается из ПЗУ в микропроцессор. Под управлением этой программы выполняются команды, поступающие по интерфейсу RS-232, в том числе и команда загрузки новой рабочей программы в ОЗУ и передаче ей управления. Таким образом, в контроллер можно загружать новые программы со скоростью передачи данных, равной 115200 Бод, причем неограниченное число раз. Кроме перечисленных устройств контроллер имеет таймер аварии на базе микросхемы NE555. Данный таймер примерно раз в секунду формирует сигнал INT1 — прерывания для контроллера. В ответ на это прерывание котроллер должен сбрасывать таймер сигналом Т1. В случае, если контроллер «зависнет» или выйдет из строя, сброс таймера не будет осуществляться, и он включит индикатор «АВАРИЯ», сигнализирующий о неисправности контроллера. Внешняя память контроллера поделена с помощью дешифратора на области по 8 Кбайт: две области отведены для ПЗУ и ОЗУ, а остальные используются для доступа к регистрам ввода и вывода. Данный способ
Рис 152. Принципиальная схема контроллера
254 Глава 2. Устройства на контроллерах подключения регистров позволяет использовать при обращении к ним любые команды работы с памятью, что бывает весьма удобно при разработке программ. Карта адресации устройств контроллера приведена в Табл. 15.2. Таблица 15.2. Карта адресации устройств контроллера 1 2 3 4 5 6 7 8 0000—1FFF 2000—3FFF 400O-5FFF 6000—7FFF 8000—9FFF А000—BFFF С000—DFFF Е000—FFFF -CS0 -CS1 -CS2 -CS3 -CS4 -CS5 -CS6 -CS7 ROM RAM ROA ROB RIA RIB - - ПЗУ ОЗУ Регистр вывода А Регистр вывода В Регистр ввода А Регистр ввода В Резерв Резерв В качестве примера рабочей программы для данного контроллера мной была написана тестовая программа «uk-mcs» на языке Ассемблер. Данная программа принимает от компьютера пакеты команд, трансформирует их в коды управления и выводит данные коды через регистры вывода ROA и ROB. Если пакет команд заканчивается символом «0», происходит передача управления программе в ОЗУ. Ниже приводится исходный текст данной программы. Программа снабжена комментариями. Текст программы «uk-mcs» для контроллера $ALLPUBLIC ; Программа тестирования модуля MCS ; Файл : uk-mcs.asm ; Автор: О.Д.Вальпа ;#################################################################### ; Включаемые файлы : Нет ; Внешние файлы : Нет ;//////////////////////////////////////////////////////////////////// мспользуемые регистры ;R0 мл. байт длины посл-сти ;R1 ст. байт длины посл-сти
15. Контроллер с дистанционной модификацией программ 255 ;R2 счетчик циклов теста ОЗУ и счетчик циклов общий ;R3 переменная в формирователе звука ;R4 переменная в формирователе звука ;R5 переменная в формирователе задержки на 50мс ;R6 принимаемый байт команды ;R7 накопитель контрольной суммы и накопитель общий ;//////////////////////////////////////////////////////////////////// ; мспользуемые флаги ;F0 флаг приема посылки @-брак 1-норма) ;F_RAM флаг теста ОЗУ @-брак 1-норма) ;//////////////////////////////////////////////////////////////////// ; мспользуемые переменные L_ADDR equ 00h ;Ш0)мл. байт длины посл-сти H_ADDR equ Olh ;(Rl)cr. байт длины посл-сти SUMMA equ 07h ;(R7)накопитель контр.суммы F_RAM bit 2fh.7 ; Флаг теста ОЗУ @-брак 1-норма) KEY_0 equ 030h ; Код клавиши 0 B_WQRK equ Tl ; Выход запуска одновибратора B_S0UND equ PI.0 ; Выход управления звуком B_ENBL equ Pi .7 ; Выход разрешения регистров команд BEG_RAM equ 02000h ; Начало внешней памяти ОЗУ END_RAM equ 03fffh ; Конец внешней памяти ОЗУ (8 Кб) ADR.RGA equ 04000h ; Адрес регистра ROA (OUT0...7) ADR_RGB equ 06000h ; Адрес регистра ROB (OUT8...15) ADR_RGC equ 08000h ; Адрес регистра RIA (IN0...7) ADR_RGD equ OAOOOh ; Адрес регистра RIB (IN8...15) COUNTJJ25 equ (NOTB50)) ; Счетчик на 0.25 мс COUNTJ- equ (NOT A000)) ; Счетчик на 1 мс COUNT_5 equ (NOTE000)) ; Счетчик на 5 мс ;//////////////////////////////////////////////////////////////////// org RESET ; RESET vector jmp START ; Переход к началу программы org EXTIO ; EXTO interrupt vector reti ; без процедуры обработки org TIMERO ; Timer 0 vector reti ; без процедуры обработки org EXTI1 ; EXT1 vector jmp I_INT1 ; и переход на его обработку org TIMER1 ; Timer 1 vector reti ; без процедуры обработки org SINT ; Serial port vector reti ; без процедуры обработки org 30h '0123456789ABCDEF' db ' MCS db ' Version 1.00 ' db ' Copyright (c) ' db ' 22.11.2002
256 Глава 2. Устройства на контроллерах db ' Valpa Oleg ;//////////////////////////////////////////////////////////////////// Начало программы ;//////////////////////////////////////////////////////////////////// START: call BIP ; Сигнал начала работы call INIT ; инициализация процессора call TST_RAM ; Тест ОЗУ call BIP ; Сигнал завершения теста ОЗУ jb F_RAM,W0RK ; Если ОЗУ в норме, обходим гудки call NO_BIP ; Гудки тревоги call BIP ; при браке ОЗУ call NO.BIP ; ... call BIP ; ... WORK: call PRIEM ; Прием посылки команд по порту call PER_ST ; Передача статуса по порту jnb F0,WORK ; Если дефект снова на прием mov A, R6 cjne A,KEY_0,WORK1 ; Если команда = KEY_0 jmp PRG_RAM ; переход на программу в RAM W0RK1: call COMAND ; Выполнение команд call DEL50 ; Подождем 50мс для успокоения реле call PER_IN ; Передача информации по порту jmp WORK ;//////////////////////////////////////////////////////////////////// ; Подпрограмма инициализации процессора ;//////////////////////////////////////////////////////////////////// INIT: ; инициализация прерываний mov IE, #04h ; Разр.прер.1ЫТ1,блокир.все прерыв. mov IP, #00h ; Низш.приор.всех прер. mov TCON,#05h ; Ост.тайм.,сбр.гот.тайм. ; сбр.фл.прер.,уст.запр.прер.срезом ; инициализация таймеров mov TMOD, #21h ; Таймер 1 - режим с автозагрузкой ; Таймер 0-16 разрядный таймер mov TH1, #0fdh ; Делит, в тайм.1 (9600 бод, 11.059 мГц) mov ТЫ, ТН1 ; Делаем первую загрузку setb TR1 ; Запуск таймера 1 ; инициализация последовательного порта mov PCON, #00h ; Уст. неудвоенную скорость передачи mov SCON, #0d2h ; Реж. 3, разр.9 бит и прм. поел, порта mov A,SBUF ; Очистить буфер приемника clr RI ; Очистить флаг гот-сти приемника setb TI ; Установить флаг гот-сти передатчика ; инициализация устройств в/в контроллера mov DPTR, #ADR_RGA ; В регистр команд (OUT0...7) mov A,#0ffh ; пишем movx @DPTR, A ; пассивные уровни mov DPTR, #ADR_RGB ; В регистр команд (OUT8...15) mov A,#0ffh ; пишем
15. Контроллер с дистанционной модификацией программ 257 movx @DPTR, A ; пассивные уровни clr B_ENBL ; Разрешить выходы регистров команд , Снять блокировку прерываний setb EA clr B_WORK ; Пуск одновибратора setb B.WORK ; ... ret ;//////////////////////////////////////////////////////////////////// Подпрограмма проверки RAM ;//////////////////////////////////////////////////////////////////// TST_RAM:mov R2, #3 ; Организуем 3 цикла mov В,#0 ; Подготовить нулевую маску данных L00P.T: ; Запись 16 разрядных слов в ОЗУ mov R0,# low BEG_RAM ; Загрузим эталон mov Rl,# high BEG_RAM ; адресом начала ОЗУ mov DPTR, #BEG_RAM ; Начнем заполнять с начала ОЗУ L00P_W: mov A, Rl ; Пишем ст.эталон в ОЗУ, xrl А, В ; наложив маску на данные movx @DPTR, A ; через аккумулятор inc DPTR ; Co следующей ячейки mov A, R0 ; пишем мл.эталон в ОЗУ xrl А, В ; наложив маску на данные movx @DPTR, A ; через аккумулятор inc DPTR ; Готовим новый адрес inc R0 ; Готовим новый эталон inc R0 ; Проверка эталона djnz RO,LOOP_W1 ; на переполнение inc Rl ; При переп. увеличим эталон L00P_Wl:mov А,# low(END_RAM+l) ; Проверим адрес области cjne A, DPL,LOOP_W ; ОЗУ на переполнение mov А,# high(END_RAM+l) ; Если нет переп. cjne A, DPH,L00P_W ; To продолжаем запись ; Иначе ; Чтение и проверка 16 разрядных слов из ОЗУ mov R0,# low BEG_RAM ; Загрузим эталон mov Rl,# high BEG_RAM ; адресом начала ОЗУ mov DPTR, #BEG_RAM ; Начнем проверять с начала ОЗУ L00P_R: movx A, @DPTR ; Читаем данные из ОЗУ xrl А, В ; Наложить маску на данные xrl A, R1 ; Сравним данные со ст. эталоном jnz ERR_RAM ; Если ошибка, идем на обработку inc DPTR ; Co следующей ячейки movx A, @DPTR ; читаем данные из ОЗУ xrl А, В ; Наложить маску на данные xrl A, R0 ; Сравним данные с мл.эталоном jnz ERR_RAM ; Если ошибка, идем на обработку inc DPTR ; Готовим новый адрес inc R0 ; Готовим новый эталон inc R0 ; Проверка эталона djnz RO,LOOP_R1 ; на переполнение inc Rl ; При переп. увеличим эталон
258 Глава 2. Устройства на контроллерах LOOP_Rl:mov A;# low(END_RAM+l) ; Проверим адрес области cjne A, OPL,L00P_R ; ОЗУ на переполнение mov А,# high(END_RAM+l) ; если нет переп. cjne A, DPH,LOOP_R ; то продолжаем запись ; иначе mov А, В ; инвертировать маску cpl A mov В, А djnz R2, L00PJT ; Выполняем новый цикл setb F_RAM ; Флаг теста ОЗУ = 1 (норма) ret ERR_RAM:clr F_RAM ; Флаг теста ОЗУ = 0 (брак) ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма звучания ;//////////////////////////////////////////////////////////////////// BIP: mov R3, #10 ; Количество циклов формирования mov R4, #30 ; звуковых импульсов = R3*R4 C00 шт.) В_00: cpl B_SOUND ; Формируем звуковой импульс call DEL_1 ; Задержка 1 мс djnz R4, В_00 ; Новые циклы mov R4, #70 djnz R3, В_00 ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма отсутствия звука ;//////////////////////////////////////////////////////////////////// NO_BIP: mov R3, #10 ; Количество циклов формирования mov R4, #30 ; звуковых пауз = R3*R4 C00 шт.) NB_00: call DEL_l ; Формируем паузу djnz R4, NBJH ; Задержка 1 мс mov R4, #70 ; Новые циклы djnz R3, NB_00 ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 0.25 мс ;//////////////////////////////////////////////////////////////////// DEL_025:clr TR0 clr TF0 mov TL0,# low COUNT_025 mov TH0,# high COUNT_025 setb TR0 jnb TF0,$ ret ;//////////////////////////////////////////////////////////////////// Подпрограмма задержки на 1 мс ;//////////////////////////////////////////////////////////////////// DEL_1: clr TR0 clr TF0 mov TL0,# low COUNT.l mov TH0,# high COUNT.l setb TR0
15. Контроллер с дистанционной модификацией программ 259 jnb TF0,$ ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 5 мс ;//////////////////////////////////////////////////////////////////// DEL_5: Clr TRO clr TFO mov TL0,# low C0UNT_5 mov TH0,# high C0UNT_5 setb TRO jnb TF0,$ ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма формирования задержки на 50 мс ;//////////////////////////////////////////////////////////////////// DEL50: mov R5,#10 W7: call DEL_5 djnz R5,W7 ret ;//////////////////////////////////////////////////////////////////// Подпрограмма приема последовательности ;//////////////////////////////////////////////////////////////////// PRIEM: call IB_BYTE ; Прием байта FF jnb F0, PRIEM cjne A,#0ffh,PRIEM call IR_BYTE ; Прием младшей половины адреса jnb F0,NCOMPL mov L_ADDR,A call IR_BYTE ; Прием старшей половины адреса jnb F0,NCOMPL mov H_ADDR,A anl A,#0F0h ; Анализ длины на превышение 4Кб jnz NCOMPL mov SUMMA,#0 mov DPTR,#BEG_RAM INFOR: call IR_BYTE ; Прием информации jnb F0,NCOMPL mov R6, A ; Сохраним байт команды xch A,SUMMA ; Формирование контр.суммы add A,SUMMA ; ... xch A,SUMMA ; ... movx @DPTR,A ; запись в RAM inc DPTR ; mov A,L__ADDR ; Если не достигли конца ОЗУ, add A,# low BEG.RAM cjne A, DPL,INFOR ; то продолжаем запись mov A,H_ADDR ; ... add A,# high BEG_RAM cjne A, DPH,INFOR ; ... call IR_BYTE ; прием контрольной суммы jnb F0,NCOMPL cjne A,SUMMA,NCOMPL
260 Глава 2. Устройства на контроллерах COMPL: setb F0 ; Успешный выход ret NCOMPL: clr FO ; Неуспешный выход ret Подпрограмма приема байта по RS-232 (без контроля по времени) IB_BYTE: clr FO ; Сброс флага принятого байта jnb RI,$ ; Приемник готов? mov C,RB8 ; Бит контроля -> С mov A,SBUF ; Прием байта clr RI ; Сброс готовности приемника cpl С ; мнверсия бита четности jc ЕХТ_5 ; Если С = 1, то анализ для 1 orl С,Р ; мначе анализ для О jc EXT_4 ; При ошибке по четности выход setb FO ; Успешная проверка ЕХТ_4: ret ; Выход ЕХТ_5: anl С,Р jnc EXT_4 ; При ошибке по четности выход setb FO ; Успешная проверка ret ; Выход с принятым байтом Подпрограмма приема байта по RS-232 ( с контролем по времени) IR_BYTE:clr TR0 ; Останов таймера О clr TFO ; Сброс флага таймера О mov TL0,#LOW(NOTA500)) ; Загрузка таймера 0 на время mov TH0,#HIGH(NOTA500)) ; приема 11 бит для 9600 бод clr F0 ; Сброс флага принятого байта setb TR0 ; Пуск таймера WAIT_2: jb RI,EXT_1 ; Приемник готов? jnb TF0,WAIT_2 ; Таймер окончил счет? clr TR0 ; Останов таймера 0 clr TFO ; Сброс флага таймера 0 ret ; Выход по окончанию времени ЕХТ_1: mov C,RB8 ; Бит контроля -> С mov A,SBUF ; Прием байта clr RI ; Сброс флага приемника cpl С ; мнверсия бита паритета clr TR0 ; Останов таймера 0 clr TFO ; Сброс флага таймера О jc ЕХТ_3 ; Если С = 1, то анализ для 1 orl С,Р ; мначе анализ для О jc EXT_2 ; При ошибке по четности выход setb F0 ; Успешная проверка ЕХТ_2: ret ; Выход ЕХТ_3: anl С,Р jnc EXT_2 ; При ошибке по четности выход setb F0 ; Успешная проверка ret ; Выход с принятым байтом
15. Контроллер с дистанционной модификацией программ 261 ;//////////////////////////////////////////////////////////////////// Подпрограмма подготовки и передачи статуса ;//////////////////////////////////////////////////////////////////// PER_ST: mov A,#0ffh , ; Загрузим маркер call 0R_BYTE ; Передаем маркер в порт mov А,#0 ; Приготовим статус=0 (норма) jb F_RAM,P_ST01 ; Если ОЗУ в норме идем дальше orl A,#40h ; мначе наложим маску брака ОЗУ P_ST01: jb F0;P_ST_ ; Если прием нормальный идем дальше orl A,#80h ; мначе наложим маску брака посылки P_ST_: call 0R_BYTE ; Передаем статус в порт ret ;//////////////////////////////////////////////////////////////////// ; Подпрограмма подготовки и передачи информации ;//////////////////////////////////////////////////////////////////// PER_IN: mov A,#0ffh ; Загрузим маркер call 0R_BYTE ; Передаем маркер в порт mov DPTR, #ADR_RGC ; Готовимся читать состояния mov R7; #0ffh ; Очистим накопитель состояния mov R2, #80 ; Организуем 80 циклов PER_1: movx A, @DPTR ; Читаем данные из регистра RGC anl A, R7 ; Накопим состояние mov R7, А ; Ложим в накопитель состояние call DEL_025 ; Готовим новую выборку 50,425 Гц, 1 кГц djnz R2, PER_1 ; Выполняем новый цикл mov A, R7 ; Передаем информацию в порт call OR_BYTE ret ; Подпрограмма передачи байта по RS-232 OR_BYTE:jnb TI,$ ; Передатчик готов ? clr REN ; Запретить прием mov C,P ; Готовим бит cpl С ; контроля по нечетности mov TB8,C ; Загрузим бит контроля mov SBUF,A ; Прередаем байт clr TI ; Сброс готовности передатчика jnb TI, $ ; Ждать готовности передатчика, ; чтобы исключить прием от себя. setb REN ; Теперь можно разрешить прием. mov A,SBUF ;* Почистим буфер. clr RI ;* Подготовим приемник. setb TI ;* Подготовим передатчик. ret ;//////////////////////////////////////////////////////////////////// Подпрограмма выполнения команд ;//////////////////////////////////////////////////////////////////// COMAND: setb B_ENBL ; Запретить выходы регистров команд call DEL50 mov A, R6 ; Берем байт команды
262 Глава 2. Устройства на контроллерах call SIMV ; Преобразуем его в код команды RGA mov DPTR', #ADR_RGA ; и записываем в регистр movx @DPTR, A ; в регистр RGA mov A, R6 ; Берем снова байт команды call SIMV1 ; Преобразуем его в код команды RGB mov DPTR, #ADR_RGB ; и записываем в регистр movx @DPTR, A ; в регистр RGB clr B_ENBL ; Разрешить выходы регистров команд ret ; и выходим ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Процедура обработки прерывания от входа INT1 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% I_INT1: clr B_W0RK ; Бит пуска одновибратора в «О» setb B_W0RK ; Бит пуска одновибратора в «1» reti ; Снять блокир.прер. и возврат ;%%m%%mmm%mmmm%mm%%m%mmmmnmmm%m ;//////////////////////////////////////////////////////////////////// ; Подпрограмма преобр. кодов команд в коды исполнения OUT0-7 ;//////////////////////////////////////////////////////////////////// SIMV: inc A move А,@А+РС ret ; Коды исполнения Символы Коды IBM PC •db 0ffh,0ffh,0ffh,0ffh ; ST VS CR 000h.001h.002h.003h db 0ffh,0ffh,0ffh,0ffh ;<]<- LAT DEL 004h.005h.006h.007h db 0ffh,0ffh,0ffh,0ffh ; -> спец. 008h.009h.00ah.00bh db 0ffh,0ffh,0ffh,0ffh ; символы 00ch.00dh.00eh.00fh db 0ffh,0ffh,0ffh,0ffh ; —»»— 010h.011h.012h.013h db 0ffh,0ffh,0ffh,0ffh ; —»»— 014h.015h.016h.017h db 0ffh,0ffh,0ffh,0ffh ; —»»— 018h.019h.01ah.01bh db 0ffh,0ffh,0ffh,0ffh ; —»»— 01ch.01dh.01eh.01fh db 0ffh,0ffh,0ffh,0ffh ; ! « # 020h.021h.022h.023h db 0ffh,0ffh,0ffh,0ffn ; $ % & ' 024h.025h.026h.027h db 0ffh,0ffh,0ffh,0ffh ; ( ) * + 028h.029h.02ah.02bh db 0ffh,0ffh,0ffh,0ffh ; , - . / 02ch.02dh.02eh.02fh db 0ffh,0feh,0fdh,0fbh ; 0 1 2 3 030h.031h.032h.033h db 0f7h,0efh,0dfh,0bfh ; 4 5 6 7 034h.035h.036h.037h db 07fh,0ffh,0ffh,0ffh ; 8 9 : ; 038h.039h.03ah.03bh db 0ffh,0ffh,0ffh,0ffh ; < = > ? 03ch.03dh.03eh.03fh db 0ffh,0ffh,0ffh,0ffh ; @ А В С 040h.041h.042h.043h db 0ffh,0ffh,0ffh,0ffh ; D E F G 044h.045h.046h.047h db 0ffh,0ffh,0ffh.Offh '; H I J К 048h.049h.04ah.04bh db 0ffh,0ffh,0ffh,0ffh ; L M N О 04ch.04dh.04eh.04fh db 0ffh,0ffh,0ffh,0ffh ; P Q R S 050h.051h.052h.053h db 0ffh,0ffh,0ffh,0ffh ; T U V W 054h.055h.056h.057h db 0ffh,0ffh,0ffh,0ffh ; X Y Z [ 058h.059h.05ah.05bh db 0ffh,0ffh,0ffh,0ffh ; \ ] Л _ 05ch.05dh.05eh.05fh db 0ffhf0ffh,0ffh,0ffh ; X a b с 060h.061h.062h.063h db 0ffh,0ffh,0?fh,0ffh ; d е f g 064h.065h.066h.067h db 0ffh,0ffh,0ffh,0ffh ; h i j k 068h.069h.06ah.06bh db 0ffh,0ffh,0ffh,0ffh ; 1 m n о 06ch.06dh.06eh.06fh
15. Контроллер с дистанционной модификацией программ 263 db 0ffh,0ffh,0ffh,0ffh ; р q r s 070h.071h.072h.073h db 0ffh,0ffh,0ffh,0ffh ; t u v w 074h.075h.076h.077h db 0ffh,0ffh,0ffh,0ffh ; x у z { 078h.079h.07ah.07bh db 0ffh,0ffh,0ffh,0ffh ; I } - 07ch.07dh.07eh.07fh db 0ffh,0ffh,0ffh,0ffh ; А Б В Г 080h.081h.082h.083h db 0ffh,0ffh,0ffh,0ffh ; Д Е Ж 3 084h.085h.086h.087h db 0ffh,0ffh,0ffh,0ffh ; м Й К Л 088h.089h.08ah.08bh db 0ffh,0ffh,0ffh,0ffh ; M Н О П 08ch.08dh.08eh.08fh db Of fh,0ffh,0f fh,0ffh ; Р^СТУ 090h.091h.092h.093h db 0ffh,0ffh,0ffh,0ffh ; Ф X Ц Ч 094h.095h.096h.097h db 0ffh,0ffh,0ffh,0ffh ; Ш Щ Ъ Ы 098h.099h.09ah.09bh db 0ffh,0ffh,0ffh,0ffh ; Ь Э Ю Я 09ch.09dh.09eh.09fh db 0ffh,0ffh,0ffh,0ffh ; а б в г 0a0h.0alh.0a2h.0a3h db 0ffh,0ffh,0ffh,0ffh ? д е ж з 0a4h.0a5h.0a6h.0a7h db 0ffh,0ffh,0ffh,0ffh ; и й к л 0a8h.0a9h.0aah.0abh db 0ffh,0ffh,0ffh,0ffh ; м н о n 0ach.0adh.0aeh.0afh db 0ffh,0ffh,0ffh,0ffh ; псевдогр. 0b0h.0blh.0b2h.0b3h db 0ffh;0ffh,0ffh,0ffh ; ---»»-- 0b4h.0b5h.0b6h.0b7h db 0ffh,0ffh;0ffh,0ffh ; —»»— 0b8h.0b9h.0bah.0bbh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0bch.0bdh.0beh.0bfh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0c0h.0clh.0c2h.0c3h db 0ffh,0ffh,0ffh,0ffh ; —»»-- 0c4h.0c5h.0c6h.0c7h db j0ffh,0ffh,0ffh,0ffh ; —»»— 0c8h.0c9h.0cah.0cbh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0cch.0cdh.0ceh.0cfh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0d0h.0dlh.0d2h.0d3h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0d4h.0d5h.0d6h.0d7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0d8h.0d9h.0dah.0dbh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0dch.0ddh.0deh.0dfh db Offh,0ffh,0ffh,0ffh ; p с т у 0e0h.0elh.0e2h.0e3h db 0ffh,0ffh;0ffh,0ffh ; ф х ц ч 0e4h.0e5h.0e6h.0e7h db 0ffh,0ffh,0ffh,0ffh ; ш щ ъ ы 0e8h.0e9h.0eah.0ebh db 0ffh,0ffh,0ffh,0ffh ; ь э ю я 0ech.0edh.0eeh.0efh db 0ffh,0ffh,0ffh,0ffh ; Ё ё спец. 0f0h.0flh.0f2h.0f3h db 0ffh,0ffh,0ffh,0ffh ; символы 0f4h.0f5h.0f6h.0f7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0f8h.0f9h.0fah.0fbh db 0ffh,0ffh,0ffh,0ffh ; —»»— Ofch.Ofdh.Ofeh.Offh ;//////////////////////////////////////////////////////////////////// Подпрограмма преобр. кодов команд в коды исполнения OUT8-15 ;//////////////////////////////////////////////////////////////////// SIMV1: inc A move A,@A+PC ret ; Коды исполнения Символы Коды IBM PC db 0ffh,0ffh,0ffh,0ffh ; ST VS CR 000h.001h.002h.003h db 0ffh,0ffh,0ffh,0ffh ;<]<- LAT DEL 004h.005h.006h.007h db 0ffh,0ffh,0ffh,0ffh ; -> спец. 008h.009h.00ah.00bh db 0ffh,0ffh,0ffh,0ffh ; символы 00ch.00dh.00eh.00fh db 0ffh;0ffh,0ffh,0ffh ; —»»— 010h.011h.012h.013h db 0ffh,0ffh,0ffh,0ffh ; —»»— 014h.015h.016h.017h db 0ffh,0ffh,0ffh,0ffh ; —»»— 018h.019h.01ah.01bh db 0ffh,0ffh,0ffh,0ffh ; —»»— 01ch.01dh.01eh.01fh
264 Глава 2. Устройства на контроллерах db Offh,Offh,Offh,Offh ; ! « # 020h.021h.022h.023h db 0ffft,0ffh,0ffh,0ffh ; $ % & ' 024h.025h.026h.027h db 0ffh,0ffh,0ffh,0ffh ; ( ) * + 028h.029h.02ah.02bh db Offh,0ffh,0ffh,0ffh ; , - . / 02ch.02dh.02eh.02fh db 0ffh,0ffh,0ffh,0ffh ; 0 1 2 3 030h.031h.032h.033h db 0ffh,0ffh,0ffh,0ffh ; 4 5 6 7 034h.035h.036h.037h db 0ffh,0ffh,0ffh,0ffh ; 8 9 : ; 038h.039h.03ah.03bh db 0ffh,0ffh,0ffh,0ffh ; < = > ? 03ch.03dh.03eh.03fh db 0ffh,0ffh,0ffh,0ffh ; @ А В С 040h.041h.042h.043h db 0ffh,0ffh,0ffh,0ffh ; D E F G 044h.045h.046h.047h db 0ffh,0ffh,0ffh,0ffh ; H I J К 048h.049h.04ah.04bh db 0ffh,0ffh,0ffh,0ffh ; L M N 0 04ch.04dh.04eh.04fh db 0ffh,0ffh,0ffh,0ffh ; P Q R S 050h.051h.052h.053h db 0ffh,0ffh,0ffh,0ffh ; T U V W 054h.055h.056h.057h db 0ffh,0ffh,0ffh,0ffh ; X Y Z [ 058h.059h.05ah.05bh db 0ffh,0ffh,0ffh,0ffh ; \ ] Л _ 05ch.05dh.05eh.05fh db 0ffh,001h,002h,004h ; ч a b с 060h.061h.062h.063h db 008h,010h,020h,040h ; d e f g 064h.065h.066h.067h db 080hf0ffhf0ffh,0ffh ; h i j к 068h.069h.06ah.06bh db 0ffh,0ffh,0ffh,0ffh ; 1 m n о 06ch.06dh.06eh.06fh db 0ffh,0ffh,0ffh,0ffh ; p q r s 070h.071h.072h.073h db 0ffh,0ffh,0ffh,0ffh ; t u v w 074h.075h.076h.077h db 0ffh,0ffh,0ffh,0ffh ; x у z { 078h.079h.07ah.07bh db 0ffh;0ffh,0ffh,0ffh ; I } ~ 07ch.07dh.07eh.07fh db 0ffh,0ffh,0ffh,0ffh ; А Б В Г 080h.081h.082h.083h db 0ffh;0ffh;0ffh,0ffh ; Д Е Ж 3 084h.085h.086h.087h db 0ffh,0ffh,0ffh,0ffh ; м Й К Л 088h.089h.08ah.08bh db 0ffh,0ffh,0ffh,0ffh ; M Н О П 08ch.08dh.08eh.08fh db 0ffh,0ffh,0ffh,0ffh ; P С Т У 090h.091h.092h.093h db 0ffh,0ffhf0ffh,0ffh ; ФхЦ Ч 094h.095h.096h.097h db 0ffh,0ffh,0ffh,0ffh ; Ш Щ Ъ Ы 098h.099h.09ah.09bh db 0ffh,0ffh,0ffh,0ffh ; Ь Э Ю Я 09ch.09dh.09eh.09fh db 0ffh;0ffh,0ffh,0ffh ; а б в г 0a0h.0alh.0a2h.0a3h db 0ffh,0ffh,0ffh,0ffh ; д е ж з 0a4h.0a5h.0a6h.0a7h db 0ffh,0ffh,0ffh,0ffh ; и й к л 0a8h.0a9h.0aah.0abh db 0ffh,0ffh,0ffh,0ffh ; м н о п 0ach.0adh.0aeh.0afh db 0ffh,0ffh,0ffh,0ffh ; псевдогр. 0b0h.0blh.0b2h.0b3h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0b4h.0b5h.0b6h.0b7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0b8h.0b9h.0bah.0bbh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0bch.0bdh.0beh.0bfh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0c0h.0clh.0c2h.0c3h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0c4h.0c5h.0c6h.0c7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0c8h.0c9h.0cah.0cbh db 0ffh,0ffh,0ffh,0ffh ; —»»— 0cch.0cdh.0ceh.0cfh db 0ffh,0ffh,0ffh,0ffh ; —»»- 0d0h.0dlh.0d2h.0d3h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0d4h.0d5h.0d6h.0d7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0d8h.0d9h.0dah.0dbh db 0ffh,0ffh,0ffhf0ffh ; —»»— 0dch.0ddh.0deh.0dfh db 0ffh,0ffh,0ffh,0ffh ; р с т у 0e0h.0elh.0e2h.0e3h db 0ffh,0ffh,0ffh,0ffh ; фхц ч 0e4h.0e5h.0e6h.0e7h db 0ffh,0ffh,0ffh,0ffh ; ш щ ъ ы 0e8h.0e9h.0eah.0ebh db 0ffh,0ffh,0ffh,0ffh ; ь э ю я 0ech.0edh.0eeh.0efh
15. Контроллер с дистанционной модификацией программ 265 В качестве устройства управления и загрузки программ в контроллер используется персональный компьютер типа IBM PC с интерфейсом RS-232 (СОМ-портом) и программой тестирования контроллера «testjncs». Данная программа написана мной на языке C++. Во время тестирования контроллер соединяется с компьютером с помощью стандартного нуль-модемного кабеля, схема которого приведена на Рис. 15.3. Не более 15м Рис. 15.3. Схема нуль-модемного кабеля db 0ffh,0ffh,0ffh,0ffh ; Ё е спец. 0f0h.0flh.0f2h.0f3h db 0ffh,0ffh,0ffh,0ffh ; символы 0f4h.0f5h.0f6h.0f7h db 0ffh,0ffh,0ffh,0ffh ; —»»— 0f8h.0f9h.0fah.0fbh db 0ffh,0ffh,0ffh,0ffh ; —»»— Ofch.O/dh.Ofeh.Offh ;================== программа размещаемая в ОЗУ ===================== org 02000h PRG_RAM: nop ; Пустая команда end
266 Глава 2. Устройства на контроллерах После запуска программы test_mcs.exe на экране монитора появится изображение, на котором приводится схема подключения контроллера к компьютеру и указан номер используемого СОМ-порта (Рис. 15.4). Рис. 15.4. Работа программы test jncs после запуска После нажатия любой клавиши изображение сменится, и на экране будет отображаться справка по протоколу обмена информацией между компьютером и контроллером (Рис. 15.5). Рис. 15.5. Справочное окно программы test jncs
15. Контроллер с дистанционной модификацией программ 267 Нажав еще раз любую клавишу, вы переведете программу в режим обмена. Здесь можно вводить с клавиатуры команды для контроллера и следить за его реакцией, осуществляя, таким образом, проверку его работоспособности (Рис. 15.6). После нажатия на клавиатуре любой из доступных командных клавиш соответствующая команда передается по СОМ-порту контроллеру, после чего будет ожидаться ответ от него. Если при передаче не произошло ошибок и команда правильно воспринята контроллером, он пошлет подтверждение приема команды. Вызов справки в программе осуществляется нажатием клавиши F1. Для дистанционной загрузки программы в ОЗУ контроллера и передачи ей управления необходимо подготовить бинарный файл новой рабочей программы для контроллера и записать его в файл с именем «boot.bin». Необходимо также учесть, что область ОЗУ в контроллере начинается с адреса 2000h, поэтому в новой программе необходимо в начале программы вставить строку команды «org 2000h» для обеспечения правильных переходов по условным и безусловным переходам в программе. Поскольку после компиляции данного файла будет создан бинарный файл с нулевого адреса, первые 8 Кбайт будут нулевыми. Удаление первых 8 Кбайт из файла boot.bin происходит автоматически в программе testjncs. Новая программа, загружаемая в контроллер дистанционно, может использовать все подпрограммы и обработчики прерываний, записанные в ПЗУ контроллера, так как они являются неотъемлемой частью контрол- Рис. 15.6. Работа программы testjncs в режиме обмена
268 Глава 2. Устройства на контроллерах лера и всегда доступны. Это своего рода BIOS контроллера. Пример такой программы с именем boot.asm приведен ниже. Текст программы boot.asm контроллера org 02000h ; Стартовый адрес в ОЗУ W0RKRAM: пор ; Пустая операция ; здесь ваша программа jmp W0RKRAM ; Зациклить end При выполнении команды «О» в программе testjncs данный файл будет передан компьютером в контроллер, и ему автоматически будет передано управление. В таблице основного рабочего окна программы testjncs имеются комментарии для каждой команды. При модификации данной программы их можно заменить любыми другими комментариями и перекомпилировать программу. В результате программа превратится в новый инструмент для решения конкретной задачи. Текст программы testjncs с комментариями приведен ниже. Текст программы testjncs для тестирования контроллера /////////////////////////////////////////////////////////////////////////// // Программа передает команды по СОМ-порту удаленному контроллеру MCS // и выводит на дисплей монитора принятые от него данные // // Автор:О.Д.Вальпа // ммя :test_mcs /////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <conio.h> #include <bios.h> #include <stdlib.h> #include <dos.h> #include <time.h> #define MAXTIM 5 // Ожидание ответа об оконч. передачи по порту в с # define MAXDEL 10 // Ожидание первого ответа по порту в мс #define BAIT_INIT OxEB // Байт иниц. СОМ~порта:9600 бод, нечет., 8 бит, 1 стоп // Скан коды клавиш #define KB_F1_ ОхЗЬОО // F1 #define KB_0 ОхОЬЗО // 0 #define KB_PLU 0x4e2b // + доп #define KB_MUN 0x4a2d // - доп
15. Контроллер с дистанционной модификацией программ 269 #define CR OxlcOd // Enter #define BS 0x0e08 // <-- #define ESC 0x011b // Esc // Координаты полей #define MAP_X 46 // X служебного поля #define MAP_Y 17 // Y служебного поля #define INF_X 46 // X информац. поля #define INF_Y 5 // Y информац. поля #define TIM_X 38 // X поля времени #define TIM_Y 23 // Y поля времени // Регистры СОМ-порта #define INIT 0x00 // Адрес регистра инициализации #define PERED 0x01 // Адрес регистра приемника #define PRIEM 0x02 // Адрес регистра передатчика #define STAT 0x03 // Адрес регистра статуса #define TAIM_AUT 0x8000 // Слово состояния при тайм-ауте unsigned char BUFPER[10]; // Буфер передатчика unsigned char BUFKEY[10j; // Буфер клавиатуры unsigned char BUFPRI[10]; // Буфер приемника int ncom=0; // Номер порта int с; // Переменная вводимого символа 16 бит int be; // Байты читаемые из файла int s; // Младший байт вводимого символа 8 бит int maska=l; // Маска проверки активных бит int n55ms; // Время задержки =п*55 мс struct time t; void clrkursor ( void ); // п/п скрытия курсора void setkursor ( void ); // п/п восстановления курсора void d55ras ( void); // п/п задержки на 55 мс void exitclr ( void); // п/п выхода с очисткой экрана void instr( void); // п/п вывода инструкции int peredcom ( char bait); // п/п передатчика иниц. СОМ-порта int pnem_bait ( void); // п/п приемника СОМ-порта void obsl_key ( void); // п/п обслуживания клавиатуры int wwod_str ( void); // п/п ввода строки int pered_str ( int dl_str); // п/п передачи строки int priem_otw_10 ( void); // п/п приема ответа int priem_otw_end ( void); // п/п приема информации /************** начало программы *****************************************/ int main(int argc, char **argv) { // Переменные цикла, статуса, длины строки register char **p; int 1=0, ib=0, status, dl_str; unsigned int far *b; long bios_time;
270 Глава 2. Устройства на контроллерах FILE *file_inp; if(argc!=l) { switch (atoi(argv[l])) { case 1. ncom=0; break; case 2: ncom=l; break; default: printf(«\nnporpaMMa тестирования удаленного контроллера»); printf(«\n формат запуска:test_mcs.exe n»); printf(«\n где n = 1 или 2 (номер СОМ-порта)»); printf(«\nH0Mep СОМ-порта должен быть I или 2»); print^«\пНажмите любую клавишу для выхода...»); while (IkbhitO) ; // Ждем нажатия любой клавиши return 1; } } clrkursor (); // Скрыть курсор instr(); // Вывод инструкции на дисплей bioscom ( INIT, BAIT_INIT, ncom); // инициализация СОМ-порта // читаем статус порта и если буфер не пуст очистим его if (((status = bioscom(STAT,0,ncom)) & 0x100) != 0) bioscom(PRIEM,0,ncom); //================= главный цикл программы ========================== while ( 1) { gotoxy (MAP_X,MAP_Y); // установить маркер в служ. поле /* Ввод команды */ dl_str = wwod_str (); // Ввод строки с эхо // аварийный выход по «Esc» if ( с == ESC) { exitclr (); // Аварийный выход по символу «Esc» } // Помощь по F1 if ( с == KB_F1_) { instrO; // Вывод инструкции на дисплей continue; } // Команда О if ( с == КВ_0) { if ((f ile_inp=fopen («boot .bin»,»rb»))==NULL) {
15. Контроллер с дистанционной модификацией программ 271 putchar ( 0x07); // сигналим gotoxy (MAP_X,MAP_Y); cprintf ( «0 «); gotoxy (MAP_X,MAP_Y+1); cprintf ( «Нет файла с именем boot.bin «); gotoxy (MAP_X,MAP_Y+3); cprintf ( « «); gotoxy (MAP_X,MAP_Y+4); cprintf ( « «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X,INFJf+i); // установить маркер в инф. поле cprintf («X»); } continue; } else { for (ib=0;ib<B91;ib++) // Удалим первые пустые 8кБ { if((bc=getc(file_inp))==EOF) { putchar ( 0x07); // сигналим gotoxy (MAPJC,MAP_Y); cprintf ( «0 «); gotoxy (MAPJC,MAP_Y+1); cprintf ( «Файл меньше 8кБ «); gotoxy (MAP_X,MAP_Y+3); cprintf ( « «); gotoxy (MAP_X,MAP_Y+4); cprintf ( « «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X,INF_Y+i); // установить маркер в инф. поле cprintf («X»); } break; } } } while (ib>8190) { if((bc=getc(file_inp))==EOF) {i=0; break;} status = peredcom( be ); ib++; } if(ib>8190) { putchar ( 0x07); // сигналим gotoxy {MAP_X,MAP_Y); cprintf ( «0 «);
272 Глава 2. Устройства на контроллерах gotoxy (MAP_X,MAP_Y+1); cprintf ( «Передано %d байт «ДЬ-8192); gotoxy (MAPjCMAP_Y+3); cprintf ( « «); gotoxy (MAP_X,MAP_Y+4); cprintf ( « «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X,INF_Y+i); // установить маркер в инф. поле cprintf («X»); } } continue; } if ( dl_str ==0 ) // если ввели не тот символ { putchar ( 0x07); // сигналим gotoxy (MAP_X,MAP_Y); cprintf ( «? «); gotoxy (MAP_X,MAP_Y+1); cprintf ( «Неверная команда, вводите снова.»); gotoxy (MAP_X,MAP_Y+3); cprintf ( « «); gotoxy (MAP_X,MAP__Y+4); cprintf ( « «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X/INF_Y+i); // установить маркер в инф. поле cprintf («X»); } continue; } // При нормальном вводе gotoxy (MAP_X,MAP_Y) ; putchar (s); // выводим эхо i Передача в порт V gotoxy (MAP_X,MAP_Y+3); cprintf ( « «); gotoxy (MAP_X,MAP_Y+4); cprintf ( « «); gotoxy (MAP_X,MAP_Y+1); // установить маркер в служ. поле cprintf ( «Передана команда:%с «,BUFKEY[0]); gotoxy (MAP_X+17,MAP_Y+1); // установить маркер в поле символа status = pered_str ( dl_str); // Передача строки в порт // аварийный выход по тайм-ауту if ( status & TAIM_AUT ) { gotoxy (MAP_X,MAP_Y+1); // установить маркер в служ. поле cprintf ( «Не подключен кабель к порту COM«,ncom+l);
15. Контроллер с дистанционной модификацией программ 273 continue; } /* Очистка порта */ // читаем статус порта и если буфер не пуст очистим его if (((status = bioscom(STAT,0,ncom)) & 0x100) ! = 0) bioscom(PRIEM,0,ncom); /* Прием из порта ответа V status = priem_otw_10 (); // аварийный выход по «Esc» if ( с == ESC ) { exitclr (); } if ( status & TAIM_AUT) // сообщение по тайм-ауту { gotoxy (MAP_X,MAP_Y+3); cprintf ( «Нет ответа от контроллера ! «); gotoxy (MAP_X,MAP_Y+1); cprintf ( «Повторите запрос или выходите. «); continue; } // В остальных случаях gotoxy (MAP_X,MAP_Y+3); for (i=0;i<=l;i++) // вывод байт { if ( (BUFPRI[i] <= Oxf) ) { cprintf(«0»); cprintf («%lX»,BUFPRI[i] ) ; } else cprintf («%2X»,BUFPRI[i]); cprintf(« «); } cprintf(« «); gotoxy (MAP_X,MAP_Y+4); if ( BUFPRI[1] & 0x80 ) // если ошибка контр, суммы { gotoxy (MAP_X,MAP_Y+D; cprintf ( «Брак посылки! «); continue; ) if ( BUFPRI[1] & 0x40 ) // если брак ОЗУ Мм { gotoxy (MAP_X,MAP_Y+1); cprintf ( «Брак ОЗУ Мм! «); continue; } if ( BUFPRI[1] & 0xC0 ) // если ошибка контр, суммы {
274 Глава 2. Устройства на контроллерах gotoxy (MAP_X,MAP_Y+1); cprintf ( «Брак посылки и брак ОЗУ Мм! «); continue; } /* Прием из порта информации */ status = priem_otw_end О; // аварийный выход по «Esc» if ( с == ESC ) { exitclr (); } if ( status & TAIM_AUT) // сообщение по тайм-ауту { gotoxy (MAPJC,MAP_Y+4); cprintf ( «Нет инф. байта в течении 3 с »; gotoxy (MAP_X,MAP_Y+1); cprintf ( «Повторите запрос или выходите. «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X,INF_Y+i); // установить маркер в инф. поле cprintf («*>); } continue; } // В остальных случаях gotoxy (MAP_X,MAP_Y+4); for (i=0;i<=l;i++) // вывод байт { if (!(BUFPRI[i] & Oxf)) { cprintf(«0>); cprintf («%lX»,BUFPRI[i]) ; } else cprintf («%2X»,BUFPRI[i]); cprintf (« «); } cprintf (« «); for (i=0;i<=7;i++) // вывод активных бит { gotoxy (INF_X/INF_Y+i); // установить маркер в инф. поле if (BUFPRI[1] & (maska « i)) { textcolor (LIGHTGREEN) ; cprintf («1»); textcolor (LIGHTCYAN); } else { textcolor (LIGHTRED);
15. Контроллер с дистанционной модификацией программ 275 cprintf («О»); textcolor(LIGHTCYAN); } } } } //============= п/п задержки на 55 мс ============================void d55ms ( void) { char tik; int i; // Ждем перехода на новое значение tik=peekb @x0040,0x006c) &0xff; while(tik == (peekb@x0040,0x0060&0xff)) ; } //============= п/п ввода строки с клавиатуры с эхо ==============// Выход по нажатию клавиш «0-F», или «Esc» int wwod_str ( void) { int chkey =0; // chkey - число символов с = 0; // Вводим пока не будет введен символ «0-F»+»CR» или «Esc» while ( с != CR && с != ESC && с != KB_F1_ && с != КВ_0) { while (bioskey(l) == 0) { gettime(fct); gotoxy (TIMJC,TIM_Y) ? // установить маркер в поле времени printf(«Время: -: d: d\n», t.tijiour, t.tijmn, t.ti_sec); } с = bioskey @); // Ввод символа через п/п BIOS s = с & Oxff; // Проверим что ввели if ( (('Г <= s) && (s <= '9')) II (('а' <= s) && (s <= 'h')) ) { BUFKEY[chkey++] = s; // пишем в буфер символ с = CR; // для выхода из п/п опр. символ выхода } else { if (с == ESC) continue; if (с == KB_F1_) continue; if (c == KB_0) continue; // во всех остальных случаях с = CR; } } // конец ввода строки return chkey; // возврат из п/п числа символов в буфере }
276 Глава 2. Устройства на контроллерах /*============= п/п передачи строки в порт ========================*/ int pered_str ( int dl_6tr) { int chper = 0, i, status; // число симв перед.,перем. цикла, статус unsigned char sim, ks = 0; // беззнаковый символ и контр.сумма BUFPER[chper++] = Oxff; BUFPER[chper++] = dl_str & Oxff; BUFPER[chper++] = dl_str » 8; for ( l = 0; l < dl_str; i++ ) { sim = BUFKEY[i]; BUFPER[chper++] = sim; ks += sim; } // конец формирования строки осталась только контрольн. сумма BUFPER[chper++] = ks; // Начало передачи в порт for ( i = 0; i < chper; i++){ status = peredcom( BUFPER[i]); if ( status & TAIM_AUT) break; } if ( status & TAIM.AUT) return TAIM_AUT; return status; } /*============= п/п приема ответа начального ======================*/ int priem_otw_10 ( void) { int status; unsigned char bait; n55ms=MAXDEL; // Время задержки =п*55мс // пока время таймера не выйдет проверяем while ( n55ms~ != 0) { d55ms(); bait = status = priem_bait (); // прием первого байта if ( с == ESC) break; if ( status & TAIM_AUT) continue; if ( bait != Oxff && bait != 0 ) continue;// !!! if ( bait == 0 ){BUFPRI[0] = OxFF; BUFPRI[l] = bait? break;} BUFPRI[0] = bait; bait = status = priem__bait (); // прием второго байта if ( с == ESC) break; if ( status & TAIM.AUT) continue;// BUFPRI[1] = bait; break; }
15. Контроллер с дистанционной модификацией программ 277 return ( status); } /*============= п/п приема ответа последнего =======================*/ int pnem_otw_end ( void) { long tim_st,tim_tek; int tim, int status; unsigned char bait; tim_st = biostime@, 0L); // опрашиваем время старта программы tim = 0; // пока время таймера не выйдет проверяем while ( tim <= MAXTIM ) { tim_tek = biostime@, 0L); // опрашиваем текущее время tim = (tim_tek - tim_st)/CLK_TCK; // вычисляем время с момента старта bait = status = priem_bait О; if ( с == ESC) break; if ( status & TAIM_AUT) continue; // заверш. анализ по тай-ауту /* if ( bait != Oxff) continue, */ /* заверш. анализ если не маркер */ BUFPRI[0] = bait; // ложим первый байт в буфер приемника bait = status = priem_bait О; if ( с == ESC) break; // аварийный выход по «Esc» if ( status & TAIM_AUT) continue; // заверш. анализ по тай-ауту BUFPRI[1] = bait; // ложим второй байт в буфер приемника break; // выходим } /*if ( status & TAIM_AUT) cprintf ( «\n Нет ответа от ММТ !»);*/ return ( status); } /*==========s=r п/п передачи байта ================================*/ int peredcom ( char bait ) { int status; // Пока передатчик не готов проверяем на «Esc» while ( ( status = bioscom ( STAT, 0, ncom ) & 0x2000) ==0) { obsl_key (); if ( с == ESC) break; } if ( с == ESC) return 0; status = bioscom ( PERED, bait, ncom ); // передача obsljcey (); return status; } /*============= п/п приема байта ==================================*/
278 Глава 2. Устройства на контроллерах int priem_bait ( void ) { int CH_TA = 0, unsigned int status = 0; // Пока приемник не готов проверяем на «Esc» while (((status = bioscom(STAT,0,ncom )) & 0x100) ==0) { obsl_key(); if (c == ESC) return(O); if ( CHJTA++ >= 100 ) return ( TAIM_AUT); // выход если сч циклов>100 } status = (status & OxleOO) I bioscom(PRIEM,0,ncom ), obsl_key(); if (c == ESC) return(O); return(status ); } /*============= п/п обсл клавиат =================================*/ void obsl_key ( void) { if (bioskey A)) { с = bioskey@); } } /*============= п/п выхода с очисткой =============================*/ void exitclr ( void) { /* Очистка экрана перед выходом */ textbackground(BLACK); /* Смена цвета фона */ textcolor(LIGHTGRAY); /* Смена цвета текста */ system («els»); setkursor (); exit@); } /*============= п/п вывода инструкции =============================*/ void instr( void) { int i; textbackground(LIGHTGRAY) ; textcolor(BLACK); cprintf(«\r\n»); cprintf(«b Схема проверки i»); cprintf(«i i»); cprintf(«i l»), cprintf(«i i»), cprintf(«i i»), cprintf(«i Ъ 1 i»); cprintf(«i ib li i»), cprintf(«i li li i»); cprintf(«i li li l»), cprintf(«i li li l»), cprintf(«i li li i»);
15. Контроллер с дистанционной модификацией программ 279 cprintf(«i iA Щ1 Ъ i i»); cprintf («i А—В В—Щ i Удаленный i i»); cprintf(«i Ъ—Б Б—iCOM i контроллер i i»,ncom+l) ; cprintf («ibr" IBM PC/AT Г Г MCS i i»); cprintf(«iiA Щ A Щ i>); cprintf («iibBBBBBBBBBBBBBBBBi i») ; cprintf(«i АББББББББББББББББЩ i»); cprintf («i i»); cprintf («i i»); cprintf («i i»); cprintf («A Для продолжения нажмите любую клавишу Ш»; с = bioskey @); // Ожидание для чтения информации cprintf («Ъ Протокол обмена информацией i»); cprintf («i i»); cprintf («i 1.0ператор вводит по запросу команду для контроллера. i»); cprintf («d i»); cprintf(«i 2.Программа передает команду по СОМ-порту контроллеру. i»,ncom+l); cprintf(«i д>); cprintf(«i 3.Формат посылки:Ъ В В В В В В В 1 i»); cprintf(«i i FF i LL i LH i II i 12 i . . . i IN i KS i i»); cprintf («i АначалоБ Б Б Б Б Б Бконец-Щ i»); cprintf («i FF - маркер A байт) i»); cprintf («i LL - мл.байт длины массива команд i>)? cprintf («i LH - ст.байт длины массива команд i»); cprintf(«i II...IN- массив команд i»); cprintf («i KS - контр.сумма массива без учета переноса A байт) i»); cprintf(«i i»); cprintf («i 4.В течение ИОмс ожидается статусный ответ модуля:FF,BS, где i»); cprintf («i FF - маркер A байт) i»); cprintf («i BS - статусный байт @0-норма, 80-брак посылки,40-ошибка теста ОЗУ) i»); cprintf («i i»); cprintf («i 5.Затем в течение с ожидается информационный ответ модуля:FF,BI, где i»,MAXTIM); cprintf («i FF - маркер A байт) р>); cprintf («i BI - информационный байт i>); cprintf(«i i»); cprintf («A Для продолжения нажмите любую клавишу Щ»); с = bioskey @); // Ожидание для чтения информации cprintf («Ъ Программа тестирования контроллера MCS 1»); cprintf(«ib В- КОМАНДЫ 1 Ъ В ПРмНЯТЫЙ БАЙТ ii»); cprintf («ПКоманда1 Назначение i 1Бит1Состояние1 Назначение ii»); cprintf («ir Е Г Г Е Е й»), cprintf («ii 0 1Дистанционная загрузка i i 0 i - i ii»); cprintf («ii 1 iROA 11 1110 ROB h i ili - i ii»); cprintf («ii 2 iROA 11 1101 ROB h i i 2 i - i ii»); cprintf («ii 3 iROA 11 1011 ROB h i i 3 i - i ii»); cprintf («ii 4 iROA 11 0111 ROB h i i 4 i - i ii»); cprintf («ii 5 iROA 10 1111 ROB h i i 5 i - i ii»);
280 Глава 2. Устройства на контроллерах cprintf(«n 6 iROA 01 1111 ROB h i i 6 i - i ii»); cprintf(«n 7 iROA,11 1111 ROB h i i 7 l - i ii»); cprintf(«n 8 iROAll 1111 ROB h i A Б Б ПЦ»); cprintf(«n 9 1резерв i Активный логический уровень = 0 i»); cprintf(«n a iROB=0000 0001 ROA h i i»); cprintf(«n b iROB=0000 0010 ROA h i Ъ ii»); cprintf(«n с iROB=0000 0100 ROA h i команда: ii»); cprintf(«n d iROB=0000 1000 ROA h i д.Помощь : ii»); cprintf(«n e iROB=0001 0000 ROA h i Г rl»); cprintf(«n f iROB=0010 0000 ROA h i 1Статус : ii»); cprintf(«n g iROBOO 0000 ROA h i 1Информ.: ii»); cprintf(«n h iROB 00 0000 ROA h i A li»); cpr int f («l A Б Щ i») ; cprintf(«A Esc-Выход из программы Fl-Помощь Щ»); textbackground(WHITE); // Смена цветов textcolor(BLUE); // Очистка служебных строк gotoxy (MAP_X,MAP_Y ); // установить маркер в служ. поле cprintf (« «); gotoxy (MAP_X,MAP_Y+1); cprintf (« «); gotoxy (MAP_X,MAP_Y+3); cprintf (« «); gotoxy (MAP_X/MAP_Y+4); cprintf (« «); for (i=0;i<=7;i++) { gotoxy (INF_X-l,INF_Y+i); // установить маркер в инф. поле cprintf (« X «); } } /* Функция скрытия курсора */ void clrkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.ex = OxOfOO; int86@xl0, os, os); } /* Функция восстановления курсора */ void setkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.cx = 0x0708; int86@xl0, os, os); }
16. Универсальные цифровые часы на контроллере AVR 281 16. Универсальные цифровые часы на контроллере AVR С момента появления электроники было разработано огромное количество схем цифровых часов как на дискретных элементах, так и на специализированных микросхемах. Тем не менее, я хочу предложить вниманию читателей собственный вариант электронных часов. При разработке этих часов преследовалась цель — разработать универсальные часы, которые можно было бы перепрограммировать у добавляя в них новые функции. Для решения этой задачи я решил разработать их на основе микропроцессора. Что из этого получилось — судить вам. Часы собраны на недорогом микропроцессоре AT90S2313 фирмы ATMEL, что позволяет перепрограммировать их внутрисхемно. Возможность программирования позволяет дополнить часы новыми функциями. Это могут быть программно формируемые будильники и таймеры, функции передачи времени по линии связи удаленному объекту, управление исполнительными устройствами и др. Согласитесь, что таким набором функций обладают разве что компьютерные часы. Кроме перечисленных достоинств, часы имеют малые габариты, низкое потребление энергии и яркие индикаторы, позволяющие выполнять функцию ночного светильника. Принципиальная электрическая схема часов приведена на Рис. 16.1. Часы состоят из нескольких элементов. Сердцем часов является микропроцессор D1, который тактируется кварцевым резонатором BQ1, и обеспечивает высокую точность и стабильность хода часов. Процессор формирует на своих выводах 9 и И счетные выходы, которые заставляют дешифратор D2 формировать импульсы сканирования индикаторов НО—НЗ и кнопок SBO—SB3. Диоды VD1—VD4 защищают выводы дешифратора 9—12 от выхода из строя при одновременном нажатии нескольких кнопок. Транзисторы VT0—VT3 совместно с резисторами RIO—R17 образуют каскады формирователей тока для индикации. Звуковой излучатель ВА1 совместно с усилителем VT4 обеспечивает формирование звуковых сигналов. Диод VD5 шунтирует отрицательные импульсы напряжения на излучателе ВА1, возникающие в связи с индуктивным эффектом обмотки излучателя, и защищает транзистор VT4 от пробоя. Разъем Л предназначен для программирования микропроцессора D1 непосредственно на плате. Разъем XI обеспечивает связь часов с внешними устройствами. На этот разъем выведены сигналы RXD и TXD последовательного порта, сигнал запроса прерывания-IRQ, сигнал сброса -RES и выводы питания.
282 Глава 2. Устройства на контроллерах Рис 16.1. Принципиальная электрическая схема часов
16. Универсальные цифровые часы на контроллере AVR 283 Таким образом, часы могут передавать информацию о времени по последовательному каналу, управлять электронными устройствами сигналом -IRQ и воспроизводить звуковые сигналы. Четыре кнопки, включенные в схему, позволяют производить первоначальную установку времени, коррекцию часов и прочие операции. В качестве индикаторов были выбраны семисегментные элементы с повышенной яркостью свечения и малым током потребления. В настоящее время существует довольно широкий выбор подобных индикаторов, предлагаемых зарубежными производителями. Тактовая частота резонатора выбрана равной 7,3728 МГц с целью минимизации ошибок при работе по последовательному каналу на стандартных скоростях интерфейса RS-232, популярного до настоящего времени. При необходимости преобразовать ТТЛ-уровни сигналов последовательного порта в уровни сигналов RS-232, можно воспользоваться микросхемой МАХ232 или аналогичной ей. Подробный перечень элементов часов приведен в Табл. 16.1. Таблица 16.1. Элементы часов Позиционное обозначение ВА1 BQ1 Наименование Излучатель звуковой НСМ1206А Резонатор кварцевый 7,3728 МГц Количество 1 1 Примечание Конденсаторы керамические | С1—СЗ С4,С5 СР1 ОД мкФ 30 пФ Конденсатор электролитический 10 мкФ 6,3 В 3 2 1 Микросхемы D1 D2 НО—НЗ AT90S2313-10PC КР1533ИД4 Индикатор SA04-11GWA 1 1 4 74LS155 Резисторы 0,125 Вт R1 R2—R9 RIO—R13 R14—R18 SBO—SB3 VDO—VD3 VTO—VT4 ЮкОм 240 Ом 1,8 кОм 1кОм Кнопка SWT ДиодКД521 Транзистор КТ502Б 1 8 4 4 4 4 5
284 Глава 2. Устройства на контроллерах Таблица 16.1. (Продолжение) Часы монтируются на монтажной плате и размещаются в подходящем по размерам корпусе, в котором предварительно изготавливаются отверстия под индикаторы, кнопки и разъемы. В качестве источника питания можно использовать внешний сетевой адаптер, весьма распространенный в настоящее время, с выходным напряжением 5 В и током не менее 150 мА. После распайки всех элементов проверяется весь монтаж и цепи питания на предмет отсутствия короткого замыкания и переполюсовки. При включении часов необходимо убедиться в наличии импульсов тактовой частоты на выводе 4 процессора. Затем необходимо запрограммировать микропроцессор часов. Для этого можно воспользоваться простейшим программатором «Жгучий кабель», приведенным в Интернете по адресу http://www.atmel. ru/Hardware. Там же находится и программное обеспечение для него. Программатор подключается к компьютеру типа IBM PC через СОМ-порт. В будущем данный программатор пригодится для программирования других устройств. Либо можно запрограммировать процессор до установки на плату на любом программаторе, допускающем программирование микросхем AT90S2313. Для часов мной была написана рабочая программа, обеспечивающая функции работы часов с отображением времени в форматах «часы-минуты» и «минуты-секунды». В дальнейшем эту программу можно самостоятельно развить, включив в ее состав функции нескольких будильников, календарь и другой сервис. Далее приведена прошивка для микросхемы AT90S2313 в формате HEX Intel. Прошивка для микросхемы :020000020000FC :1000000020C048C04BC04EC051C054C057C07DC076 :1000100082C085C088C0436C6F636B323331335606 :10002000312E302028ED34A4E1A222EC20A0602360 :100030003725327277DFBFFFF70028ED34A4E1A245 :1000400022EC3FED3DBFA8953FE031BD33E033BF2B :100050003DE832BF6894332731F939BF3FEF38BBF1
16. Универсальные цифровые часы на контроллере AVR 285 :100060003FEF37BB3FE032BB3AE731BB33E039B952 :1000700038E93AB9EE27FF2733273083E395EE318D :10008000E1F7EFED35E53083EA95E036E1F768D149 :1000900078944DCOFFB60000FFBE1895FFB6000073 :1000A000FFBE1895FFB60000FFBE1895FFB6000012 :1000B000FFBE1895FFB60000FFBE1895FFB6689406 :1000C00000F94DE842BF73957A30A1F4772703F920 :1000D00083958A3079F4882704F9E89410F96894B4 :1000E0009395953011F405F905C09A3019F49927C4 :1000F00005F906F910FF07C006FD05C070FB16F0F4 :10010000949801C0949AFFBE1895FFB6DCBODCB895 ;10011000CD2CFFBE1895FFB60000FFBE1895FFB6A8 ;100120000000FFBE1895FFB60000FFBE189568944A :1001300012F9A2E1BB27A8953C2D303051F13130A6 :1001400021F433276394CC2424C0323021F43327A4 :100150007394CC241EC0333021F433278394CC24F1 :1001600018C0343021F433279394CC2412C0353096 :1001700029F43327AA24BB24CC240BC0363049F4FD :1001800033276624772488249924AA24BB24CC24EA :1001900000C000FFD0CFE89400F905FD67D0E7D09C :1001A000322F3295231761F104FF53C0E89404F90C :1001B000322F3295307F2F70232B3295303001F162 :1001C000CFD0383031F43CB93327689431F9132754 :1001D00040C0343021F43CB9BB24AA243AC03130A9 :1001E00081F43CB911FF06C08394382D363089F56F :1001F00088242FC077246394362D333051F566243C :1002000028C03230C1F43CB911FF06C09394392D97 :100210003A30F9F499241DC0362D323031F0739400 :10022000372D3A30B1F4772414C07394372D34301D :1002300081F477240EC03C3061F43CB9BB24AA247D :1002400099248824772466245AD0A6E0BB2773D04B :10025000FBCF55D0A6E0BB276ED006FF04C042D02E :1002600011D0E89406F9E89405F965CF689412FD79 :100270O0E89412F90895E2ElEE0FF0E0E30FC8957B :10028000302D08957727B3943B2D3A30B32E49F59E :10029000BB24A3943A2D3630A32E19F5AA249394A7 ;1002A000392D3A30932EE9F499248394382D363041 :1002B000382DB9F48824362D323039F47394372D23 :1002C0003430732E71F4772406C07394372D3A308E ;1002D000732E39F477246394362D3330632E09F46A :1002E0006624089552B333273A95E89433F953239B ;1002F00052BB3327689433F9532B52BB089563954F ;10030000643009F466275FEF58BB603039F0613024 :1003100041F0623049F0633051FOOCC095989698E6 ;1003200009C0959A969806C09598969A03C0959A92 :10033000969AOOC0089511FF02COA395A395A60F39 :100340003C9199DF38BB613019F412FF0895C598CC :100350000895AF93A60F3C918EDF38BBAF910895FF :10036000689410F9E89400F903F904F90895C1EODC :10037000C60F3881829915C0353011F0339526COEB :10038000603039F06i3039F0623039F0633039F083 :100390001DC021601BC0226019C0246017C02860E6
286 Глава 2. Устройства на контроллерах Текст программы .л***************************************************************************** ; Название: Clock ; Версия: 1.0 ; Автор: О.Д. Вальпа /Описание: Функции часов : Комбинации кнопок: ; 0001-режим отображения ММ:СС или ЧЧ:ММ ; 1000-установка старшего разряда часов (минут) ; 0100-установка младшего разряда часов (минут) ; 0010-сброс секунд ; ООН-проверка сторожевого таймера (должен произойти сброс не позднее 2 с) .•************************************^^ .include «2313def.inc» ;Включить файл описания регистров .include «kod_key.def» ;Включить файл кодов клавиш .LIST .LISTMAC ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Константы и определения переменных ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Выводы порта D .equ PIN.INT =2 .equ PIN_IRQ =3 .equ PIN_SB =4 .equ PIN_DC0 =5 .equ PIN_DC1 =6 ; Константы WDT .equ DELWDT =7 ; WDP2 WDP1 WDPO MC ;0= 0 0 0 = 16 ;1= 0 0 1 = 32 ;2= 0 1 0 = 64 ;3= 0 1 1 = 128 ;4= 1 0 0 = 256 ;5= 1 0 1 = 512 ;6= 1 1 0 = 1024 ;7= 1 1 1 = 2048 :1003A00015C0303011F03A9511C0603039F061302D :1003B00039F0623039F0633039F008C02E7F06C062 :1003C0002D7F04C02B7F02C0277FOOC03883089593 :OE03DOOOA89595DF06FFFCCFE89406F9089586 :00000001FF Ниже приведен исходный текст программы для часов, написанный на языке Ассемблер для процессоров семейства AVR.
16. Универсальные цифровые часы на контроллере AVR 287 .equ ENWDT =8 ; Разрешение работы ст. таймера WDE ; 0000 1000 = разрешено ; 0000 0000 = запрещено ;============r==r===============================r==r========r=r=r============== ;УстаНОВКИ таймера 0 ;Период тиков lmc (Fclk = 7.3728 MIWCS/N .equ DELCLK =3 ; CS2 CS1 CS0 CS ;0= 0 0 0 = STOP • ;1= 0 0 1=1 ;2= 0 1 0=8 ;3= 0 1 1 = 64 /4= 1 0 0 = 256 ;5= 10 1= 1024 /6= 1 1 0 = TO/ ;7= 1 1 1 = TON .equ PRECLK =0xFF-114 ;Предустановка таймера N таймера 1 /Период тиков = Fclk(Fosc MTu.)/CS/@xFF-PRECLK)/N-flon. регистр .equ DELCLK1 =3 ; CS2 CS1 CS0 ;0= 0 0 0= STOP ;1= 0 0 1 = 1 ;2= 0 1 0 = 8 ;3= 0 1 1 = 64 ;4= 1 0 0 = 256 ;5= 10 1= 1024 ;6= 1 1 0 = TO/ ;7= 1 1 1 = T0\ .equ PRECLK1 =0-114 /Предустановка таймера .equ MODETIM1 =0 ;Bit: 7 6 5 4 3 2 1 0 ;Name:COMlAl COM1A0 x x x x PWML1 PWML0 ;0x= 0 0 = откл. ОС1 ;4x= 0 1 = перекл.ОС1 ;8x= 1 0 = Сброс ОС1=0 ;cx= 1 1 = Уст. ОС1=1 ;Name:COMlAl COM1A0 x x x x PWML1 PWML0 ;x0= 0 0 = ШИМ откл. ;xl= 0 1 = ШИМ 8разр. ;x2= 1 0 = ШИМ 9разр. ;x3= 1 1 = ШИМ Юразр. ;========г==================================================;глобальные регистры переменных /Регистры не поддерживающие команды CPI,ANDI,SUBI,ORI,SBCI,LDI. .equ CTMAX =5 /Максимальное значение счетчиков сравнения .def TEMPCODE =r0 /Регистр для команды LPM НЕ ИЗМЕНЯТЬ г0!!! .equ ADRCKEY =1 /Адрес нулевого счетчика клавиш
288 Глава 2. Устройства на контроллерах .def CTKEYO =rl ;Счетчик клавиши О .def CTKEY1 =г2 /Счетчик клавиши 1 .def CTKEY2 =гЗ ;Счетчик клавиши 2 .def CTKEY3 =г4 ;Счетчик клавиши 3 .def MODEKEY =г5 ;Режим клавиатуры .equ BEGCLOK =6 /Начало регистров часов .def CHSH =гб /Регистр часов .def CHSL =r7 /Регистр часов .def MINH =r8 /Регистр минут .def MINL =r9 /Регистр минут .def SECH =rlO /Регистр секунд .def SECL =rll /Регистр секунд .equ ENDCL0K =11 /Конец регистров часов .def TXJJART =rl2 ; Буфер передатчика .def RX_UART =rl3 /Буфер приемника /.def =rl4 /Резерв .def " TEMPSREG =rl5 /Временнный регистр SREG /Регистры поддерживающие команды CPI,ANDI;SUBI,ORI,SBCI;LDI. .def FLAGS =rl6 /Регистр флагов .equ FL1 =0 /Бит-флаг 0.001 с .equ FL2 =1 /Бит-флаг 0.002 с .equ FL5 =2 /Бит-флаг 0.005 с .equ FL10 =3 /Бит-флаг 0.01 с .equ FL100 =4 /Бит-флаг 0.1 с .equ FL500 =5 /Бит-флаг 0.5 с .equ FL1000 =6 /Бит-флаг 1с .equ FL5000 =7 /Бит-флаг 5с .def FLAGSET =rl7 /Флаги клавиатуры .equ FLSNDEN =0 /Бит-флаг разрешения генерации звука .equ FLSM =1 /Бит-флаг режима отображения ; 1=(с-мин) 0=(мин-час) .equ FLFLASH =2 /Бит-флаг режима мигания точки ;.equ =3 /Бит-флаг резерв ;.equ =4 /Бит-флаг резерв ;.equ =5 /Бит-флаг резерв ;.equ =6 /Бит-флаг резерв ;.equ =7 /Бит-флаг резерв .def FLAGSKEY =rl8 /Флаги клавиатуры /0000 0000 /TEMPKEY ПР ЛЕВ ;0-отпущена /1-нажата .def TEMP =rl9 /Регистр временных данных .def TEMPINT =r20 /Регистр временных данных прерываний .def TEMPPP =г21 /Регистр временных данных подпрограмм .def KODIND =r22 /Регистр кода отображаемого индикатора
16. Универсальные цифровые часы на контроллере AVR 289 .def CT_MS =r23 ; Счетчик единиц миллисекунд def CTJMS =r24 ;Счетчик десятков миллисекунд .def CT_SMS =r25 ;Счетчик сотен миллисекунд /Регистры г26-г31 для косвенной адресации через X,Y,Z .DSEG VARO: .BYTE l ;Переменная-счетчик циклов VAR1: .BYTE 16 /Зарезервировать 16 байт в памяти .CSEG ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Вектора прерываний ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .org О rjmp 0P_RESET /Переход по сбросу .org INTOaddr rjmp OP_INT0 /Переход по прерыванию INTO .org INTladdr r jmp OP_INTl /Переход по прерыванию INT1 .org ICPladdr r jmp 0P_ICP1 /Переход по захвату TCI .org OCladdr rimp 0P_0C1 /Переход по сравнению ТС1 .org OVFladdr rimp 0P_0VF1 /Переход по переполнению ТС1 .org OVFOaddr rimp OP_OVF0 /Переход по переполнению ТС0 .org URXCaddr rjmp OPJJRXC /Переход по прерыванию ПП конец приема .org UDREaddr rjmp OPJJDRE /Переход по прерыванию ПП регистр данных пуст .org UTXCaddr rjmp OPJJTXC /Переход по прерыванию ПП конец передачи .org ACIaddr rimp 0P_ACI /Переход по прерыванию компаратора /Название программы и версия NAME: ;Clock2313V1.0 .DB 0x43,0x6с,0x6f,0x63,0x6b,0x32,0x33,0x31,0x33,0x56,0x31,0x2e,0x30,0x20 /Таблица перекодировки для 7-сегментного индикатора
290 Глава 2. Устройства на контроллерах .equ SGM_H =5 ; Номер разряда сегмента «п» индикатора TABL: ;Номер: 0x00 0x01 0x02 0x03 ; Символ :»0» «1» «2» «3» .DB ОЬООЮЮОО, 0Ы1101101, ОЬООНОЮО, ОЫ0100100 ;Номер: 0x04 0x05 0x06 0x07 ; Символ :»4» «5» «6» «7» .DB ОЬШ00001,ОЬ10100010,ОЬ00100010,ОЬШ01100 ;Номер: 0x08 0x09 0x0а 0x0b ; Символ :»8» «9» «А» «Ь» .DB ОЬ00100000,ОЫ0100000,ОЬ01100000,ОЬ00100011 ; Номер: 0x0с 0x0d 0x0e 0x0f /Символ:»с» «d» «Е» «F» ' .DB 0Ь00110111,0Ь00100101,0Ь00110010,0Ь0Ш0010 /Номер: 0x10 0x11 0x12 0x13 / Символ :»г» «.» «_» « « .db oboiiioiii,obiioiiiii,obioiiiiii,obiiiiiin ;Номер: 0x14 ' 0x15 ; Символ:»-» «8.» .DB ОЬ1ШОШ,ОЬОО0ОО0О0 ;Текст1 индикатора ТЕХТ1: ;Номер: 0x00 0x01 0x02 0x03 ; Символ :»0» «1» «2» «3» .DB ОЬ00101000,ОЬШ01101,ОЬ00110100,ОЬ10100100 ;Номер: 0x04 0x05 0x06 0x07 ; Символ :»4» «5» «6» «7» .DB ОЬШ00001,ОЬ10100010,ОЬ00100010,ОЬШ01100 OP_RESET: ;Переход по сбросу ldi TEMP, low (RAMEND) /Указатель стека на вершину ОЗУ out SPL,TEMP INIT: wdr /Инициализация сторожевого таймера ldi TEMP, DELWDT I ENWDT /Делитель и разрешение out WDTCR, TEMP /Инициализация таймераО ldi TEMP, DELCLK /Делитель CR out TCCR0, TEMP ldi TEMP, PRECLK /Начальнное значение
16. Универсальные цифровые часы на контроллере AVR 291 out TCNTO, TEMP set ; Разрешить прерывания clr TEMP bid TEMP, TOIEO out TIMSK, TEMP /Инициализация портов ldi TEMP, OxFF ; Погасить индикаторы out PORTB,TEMP ldi TEMP, OxFF ;Порт В на вывод out DDRB,TEMP ldi TEMP, ObOOOOllll ;Порт D в исходное состояние out PORTD,TEMP ldi TEMP, ObOllllOlO ;Порт D назначить вход=0/выход=1 out DDRD,TEMP ;Порт D на вывод /Инициализация UART ; Делитель n = (Fclk=7.3728)/16*(Скорость передачи=115200) -1 Итог:п=3 ldi TEMP, 3 ;Делитель out UBRR, TEMP ldi TEMP, OblOOllOOO ;Делитель и разрешение ; ШИШ IIIIIII+- ТХВ8 бит8 передаваемых данных из 0-8 IIIIII+— RXB8 битв принимаемых данных из 0-8 II111+— CHR9 1: длина слова=9бит 0: длина слова=8бит ; 1111+ TXEN работа передатчика 1:разр. 0:запр. UI+ rxen работа периемника 1:разр. 0:запр. ; ц+ UDRIE очистка данных UART 1:разр. 0:запр. ; |+ TXCIE прерыв.передатчика 1:разр. 0:запр. + RXCIE прерыв.приемника 1:разр. 0:запр. out UCR, TEMP /Инициализация переменных ;Очистка регистров clr ZL clr ZH clr TEMP MINITO: St Z,TEMP inc ZL cpi ZL,30 brne MINITO /Очистка RAM ldi ZL,0xdf ldi TEMP,0x5S MINIT1: St Z,TEMP dec ZL cpi ZL,0x60 brne MINIT1
292 Глава 2. Устройства на контроллерах rcall PPBIP ;Разрешить звук 1 кГц 0.1 с ;Разрешить все прерывания sei гjmp MAIN0 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания INTO ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_INT0:m TEMPSREG,SREG /Сохранить per. SREG nop out SREGJEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания INT1 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_INTl:in TEMPSREG,SREG /Сохранить per. SREG nop out SREG,TEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания таймера 1 событие-захват ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_ICPl:in TEMPSREG,SREG /Сохранить per. SREG nop out SREG,TEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания таймера 1 событие-сравнение ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ОР_ОС1: in TEMPSREG,SREG /Сохранить per. SREG nop out SREGJEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания таймера 1 событие-переполнение ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_OVFl:in TEMPSREG,SREG /Сохранить per. SREG nop out SREG,TEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания таймера 0 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_OVF0:in TEMPSREG,SREG /Сохранить per. SREG
16. Универсальные цифровые часы на контроллере AVR 293 set ; Установить bid FLAGS, FL1 ;флаг 1мс ldi TEMPINT, PRECLK ;Начальное значение out TCNTO, TEMPINT ;в таймер inc CT_MS cpi CT_MS,10 brne MOVFX clr CT_MS bid FLAGS, FL10 inc CT_DMS cpi CT_DMS,10 brne MOVFX clr CT_DMS bid FLAGS, FL100 с It ; Сброс bid FLAGSET, FLSNDEN /флага FLSNDEN set ;Восстановить Т=1 inc CT_SMS cpi CT_SMS,5 brne MOVF500 bid FLAGS, FL500 rjmp MOVFX MOVF500:cpi CT_SMS,10 brne MOVFX clr CT_SMS bid FLAGS, FL500 bid FLAGS, FL1000 /Проверка разрешения и генерация звука MOVFX: sbrs FLAGSET,FLSNDEN /Звук разрешен? rjmp MOVFZ /Нет-конец sbrc FLAGS,FL1000 ;lc прошла? rjmp MOVFZ ;Да-конец bst CT_MS,0 /Нет-младший бит счетчика мс в Т brts MOVFY /Если бит=1 -> cbi PORTD,PIN_SB /Иначе 0 на вывод SB rjmp MOVFZ /Конец MOVFY: sbi PORTD,PIN_SB ;-> 1 на вывод SB MOVFZ:out SREG,TEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки приемопередатчика. Событие-конец приема ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_URXC:in TEMPSREG,SREG /Сохранить per. SREG in RX_UART,UDR /Данные из UART в буфер
294 Глава 2. Устройства на контроллерах out UDR, RXJJART /Передать из буфера в UART mov TXJJART, RX_UART out SREGJEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки приемопередатчика. Событие-регистр данных пуст ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*%%%%%%%%%%%%%%%%%%%%%%%%% 0P_UDRE:in TEMPSREG,SREG /Сохранить per. SREG nop out SREGJEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки приемопередатчика. Событие-конец передачи ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0P_UTXC:in TEMPSREG,SREG /Сохранить per. SREG nop out SREG,TEMPSREG /Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания компаратора ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0P_ACI: in TEMPSREG,SREG /Сохранить per. SREG nop out SREG,TEMPSREG /Восстановить per. SREG reti /Основной модуль MAINO: set ;T=1 bid FLAGSET,FLFLASH /Флаг мигания=1 ldi XL,low(TABL) /Указатель буфера символов в XL,XH clr XH MAIN: wdr /Сброс собаки mov TEMP,TX_UART /Если команда cpi TEMP,0 /UART = 0 breq MUARTEND /в конец MUART1: cpi ТЕМРД /Код команды = 1? brne MUART2 /Нет-далее clr TEMP ;Да-выполнить команду inc CHSH Clr TXJJART rjmp MUARTEND /Конец
16. Универсальные цифровые часы на контроллере AVR 295 MUART2: cpi TEMP,2 . ;Код команды = 2? brne MUART3 ;Нет-далее clr TEMP ;Да-выполнить команду inc CHSL clr TXJJART rjmp MUARTEND /Конец MUART3: cpi TEMP,3 ;Код команда = 3? brne MUART4 ;Нет-далее clr TEMP ;Да-выполнить команду inc MINH clr TXJJART rjmp MUARTEND ; Конец MUART4: cpi TEMP,4 ;Код команды = 4? brne MUART5 ;Нет-далее clr TEMP ;Да-выполнить команду inc MINL clr TXJJART rjmp MUARTEND ;Конец MUART5: cpi TEMP, 5 ;Код команды = 5? brne MUART6 ;Нет-далее clr TEMP ;Да-выполнить команду clr SECH clr SECL clr TXJJART rjmp MUARTEND ;Конец MUART6: cpi TEMP, 6 ;Код команды = б? brne MUARTEND ;Нет-далее clr TEMP ;Да-выполнить команду clr CHSH clr CHSL clr MINH clr MINL clr SECH clr SECL clr TXJJART rjmp MUARTEND ;Конец MUARTEND: sbrs FLAGS, FL1 ;Флаг 1 мс установлен ? rjmp MAIN ;Нет-в начало clt ;Да - bid FLAGS,FL1 ; сброс флага 1мс sbrc FLAGS,FL500 ;Если не прошло 0.5с дальше rcall PPFLASH ;если прошло флаг мигания инвертировать rcall PPKEY /Обработка клавиатуры mov TEMP,FLAGSKEY ; Сравнить swap TEMP ;тетрады FLAGSKEY ср FLAGSKEY,TEMP ;Если равны - breq MKEYEND0 ;код старый - конец
296 Глава 2. Устройства на контроллерах sbrs FLAGS, FL100 ;Иначе-прошло 0 lc ? rjmp MKEYEND' ;Нет-конец clt ,Да- bld FLAGS,FL100 ;сброс флага 0 lc mov TEMP,FLAGSKEY /Сравнять swap TEMP ;терады andi TEMP;0xF0 /регистра andi FLAGSKEY,OxOF ; флагов or FLAGSKEYJEMP ;FLAGSKEY swap TEMP ;Код клавиатуры в регистре TEMP cpi TEMP, 0 ;Если кнопки отпущены breq MKEYEND0 ;в конец rcall PPBIP ;Разрешить звук 1кГц 0.5с MKEY1: cpi TEMP,K0001 ;Код клавиатуры=....? brne MKEY2 ;Нет-далее out UDR, TEMP /Передать в UART clr TEMP ;Да-инвертировать флаг FLSM set bid TEMP,FLSM eor FLAGSET,TEMP rjmp MKEYEND ; Конец MKEY2: cpi TEMP,K0010 ;Код клавиатуры=....? brne MKEY4 ;Нет-далее out UDR, TEMP ; Передать в UART clr SECL ;Да-сброс секунд clr SECH rjmp MKEYEND ;Конец MKEY4: cpi TEMP,K1000 ;Код клавиатуры=....? brne MKEY8 ;Нет-далее out UDR, TEMP ;Передать в UART sbrs FLAGSET,FLSM ;Если отображаются с и мин rjmp MKEY41 ;не переходим на коррекцию часов inc MINH ;а увеличить десятки минут mov TEMP,MINH cpi TEMP, 0x6 brne MEYEND Clr MINH rjmp MKEYEND ;Конец MKEY41: clr CHSL /Обнулить ед.часов не допустустить 24-29 часов inc CHSH ,-Увеличить десятки часов mov TEMP,CHSH cpi TEMP, 0x3 brne MKEYEND Clr CHSH MKEYENDO:
16. Универсальные цифровые часы на контроллере AVR 297 rjmp MKEYEND ; Конец MKEY8: cpi ТЕМР,К0100 ;Код клавиатуры=....? brne MKEY9 ;Нет-далее out UDR, TEMP ,-Передать в UART sbrs FLAGSET,FLSM ;Если отображаются с и мин rjmp MKEY81 ;не переходим на коррекцию часов inc MINL ;а увеличить единицы минут mov TEMP,MINL cpi TEMP,0xA brne MKEYEND clr MINL rjmp MKEYEND ;Конец MKEY81: mov TEMP,CHSH cpi TEMP, 2 ,-Проверка на 20 часов breq MKEY82 inc CHSL /Увеличить единицы часов mov TEMP,CHSL cpi TEMP,0xA brne MKEYEND clr CHSL rjmp MKEYEND /Конец MKEY82: inc CHSL /Увеличить единицы часов mov TEMP,CHSL cpi TEMP, 0x4 brne MKEYEND clr CHSL rjmp MKEYEND /Конец MKEY9: cpi TEMP,K0011 /Код клавиатуры=....? brne MKEYEND /Нет-далее out UDR, TEMP /Передать в UART clr SECL /Да-сброс часов clr SECH clr MINL clr MINH clr CHSL clr CHSH MKEY91: rcall PPINC /Инкремент кода индикации и дешифратора ldi XL,BEGCLOK /Указатель буфера символов в XL,XH clr XH rcall PPTYPE rjmp MKEY91 /Зациклить без сброса собаки MKEYEND:
298 Глава 2. Устройства на контроллерах rcall PPINC /Инкремент кода индикации и дешифратора ldi XL,BEGCLOK /Указатель буфера символов в XL,XH clr ХН rcall PPTYPE sbrs FLAGS, FL1000 ;Флаг 1с установлен ? rjmp CLR500 ;Нет-далыпе ; inc TXJJART ; Новое число out UDR, TXJJART /передать через UART rcall PPIRQ ;Да-Вывод IRQ импульс=0 rcall PPCLOK ;и новый отсчет времени clt bid FLAGS,FL1000; сброс флага 1с CLR500: clt bid FLAGS,FL500 /сброс флага 0.5с rjmp MAIN /Подпрограмма инверсии флага мигания /Вход: - бит FLFLASH регистра FLAGSET /Выход: - бит FLFLASH регистра FLAGSET PPFLASH: set ;Т=1 sbrc FLAGSET,FLFLASH /Флаг мигания=0 ? clt /Нет Т=0 bid FLAGSET,FLFLASH /Да флаг=Т ret /Подпрограмма преобразования двоичного кода цифры часов в 7-и сегментный код /Вход TEMP - двоичный код цифры часов /Выход TEMP - 7-и сегментный код PPBIN7S: ldi ZL,low(TABL) /Указатель адреса на таблицу символов add ZL,ZL /Умножить указатель на 2 т.к. слово=2байта ldi ZH,high(TABL) add ZL,TEMP lpm mov TEMP,TEMPCODE ret /Подпрограмма отсчета времени
16. Универсальные цифровые часы на контроллере AVR 299 ;Вход регистры секунд, минут и часов /Выход регистры секунд, минут и часов PPCL0K: clr CT_MS ;Сброс счетчика мс inc SECL ; Отсчет единиц секунд mov TEMP, SECL cpi TEMP, 10 ; Коррекция 9->0 mov SECL,TEMP brne PPCLEND clr SECL inc SECH ;Отсчет десятков секунд mov TEMP, SECH cpi TEMP,б /Коррекция 5->0 mov SECH,TEMP brne PPCLEND clr SECH inc MINL /Отсчет единиц минут mov TEMP,MINL cpi TEMP, 10 /Коррекция 9->0 mov MINLJEMP brne PPCLEND clr MINL inc MINK /Отсчет десятков минут mov TEMP,MINH cpi TEMP,б /Коррекция 5->0 mov TEMP,MINH brne PPCLEND clr MINH /проверка времени суток mov TEMP,CHSH cpi TEMP,2 /вечернее время ? brne PPCLOK1 inc CHSL /Отсчет единиц часов mov TEMP,CHSL cpi TEMP,4 /Коррекция 3->0
300 Глава 2. Устройства на контроллерах mov CHSL,TEMP brne PPCLEND clr CHSL rjmp PPCL0K2 PPCL0K1: inc CHSL ;Отсчет единиц часов mov TEMP,CHSL cpi TEMP, 10 ; Коррекция 9->0 mov CHSL;TEMP brne PPCLEND clr CHSL PPCLOK2: inc CHSH /Отсчет десятков часов mov TEMP, CHSH cpi TEMP,3 ; Коррекция 2->0 mov CHSH,TEMP brne PPCLEND clr CHSH PPCLEND: ret /Подпрограмма отрицательного импульса на вывод IRQ ;Вход: PORTD ;Выход: вывод IRQ ; Используются: TEMPPP, TEMP PPIRQ: in TEMPPP, PORTD clr TEMP ;IRQ=0 dec TEMP clt bid TEMP,PIN_IRQ and TEMPPP,TEMP out PORTDJEMPPP Clr TEMP ;IRQ=1 set bid TEMP,PIN_IRQ or TEMPPP,TEMP out PORTD,TEMPPP ret /Подпрограмма инкремента кода индикации и дешифратора /Вход - регистр KODIND /Выход- регистр KODIND, PORTB
16. Универсальные цифровые часы на контроллере AVR 301 ; Использует-ТЕМРРР, SREG PPINC: ,-Инкремент кода индикатора inc K0DIND cpi K0DIND,4 brne MINCKOD clr KODIND MINCKOD: /Инкремент дешифратора индикаторов ldi TEMPPP,OxFF /Погасить out P0RTB,TEMPPP /индикаторы cpi KODIND, 0 breq MOIND cpi KODIND,1 breq M1IND cpi KODIND, 2 breq M2IND cpi KODIND, 3 breq M3IND rjmp MXIND MOIND: cbi PORTD,PIN_DC0 cbi P0RTD,PIN_DC1 rjmp MXIND M1IND: sbi PORTD,PIN_DC0 cbi P0RTD,PIN_DC1 rjmp MXIND M2IND: cbi PORTD,PINJX:0 sbi P0RTD,PIN_DC1 rjmp MXIND M3IND: sbi PORTD,PIN_DC0 sbi P0RTD,PIN_DC1 rjmp MXIND MXIND: ret /Подпрограмма вывода на индикатор символа /Вход - номер регистра начала буфера строки символов в регистре X /Выход- индикатор /Использует-ХЬ,ХН,ТЕМР PPTYPE: /Вывод на дисплей показаний регистров часов sbrs FLAGSET,FLSM /Флаг отображения мин+с установлен? rjmp MTYPE /Нет - отображать час+мин inc XL /Да - сместить указатель данных inc XL MTYPE: add XL,KODIND /Коррекция указателя на отображаемый разряд Id TEMP,X /Данные в буфер rcall PPBIN7S /Преобразовать в 7-сегм. код
302 Глава 2. Устройства на контроллерах out PORTB,TEMP /Отобразить на индикаторе cpi KODIND,0xl /Отображаем второй раздяд ? brne MTYPE0 ;Нет-выход sbrs FLAGSET,FLFLASH ;Флаг мигания установлен ? ret ;Нет-выход cbi P0RTB;SGM_H ;Да-Зажечь точку MTYPEO: ret /Подпрограмма вывода на индикатор символа /Вход - номер регистра начала буфера строки символов в регистре X /Выход- индикатор ; Использует-Х^ХНдаР РРТЕХТ: push XL add XL,K0DIND /Коррекция указателя на отображаемый разря; Id ТЕМРД /Данные в буфер rcall PPBIN7S /Преобразовать в 7-сегм. код out P0RTB,TEMP /Отобразить на индикаторе pop XL ret /Подпрограмма звукового сигнала частотой 1КГц длительностью 0.1с /Вход - регистр FLAGS /Выход- регистр FLAGS PPBIP: set /Бит Т=1 bid FLAGSET,FLSNDEN /Флаг FLSNDEN=1 clt /Бит Т=0 bid FLAGS,FL1 /Флаги=0 bid FLAGS,FL10 bid FLAGS,FL100 ret /Подпрограмма обработки клавиатуры /Вход - Разряд 2 порта D, Счетчики тиков удержания кнопок /Выход- Флаги нажатых кнопок регистра FLAGSKEY PPKEY: ldi YL;ADRCKEY /Адрес начального счетчика клавиш в YL add YL,KODIND /Переадресовать на опрашиваемую кнопку Id TEMP,Y /Счетчик во временный регистр sbic PIND,2 /Кнопка нажата? rjmp MPPKEY0 ;Нет-> cpi TEMP,CTMAX /Да-счетчик удержания=5? breq MPPKEYS /Да-установить флаг
16. Универсальные цифровые часы на контроллере AVR 303 inc TEMP ;Нет-увеличить счетчик rjmp MPPKEYX ;Выход MPPKEYS:cpi KODIND,0 /Установка флага клавиатуры breq M0PPKEY cpi K0DIND,1 breq M1PPKEY cpi K0DIND,2 breq M2PPKEY cpi K0DIND,3 breq M3PPKEY rjmp MPPKEYX MOPPKEY:sbr FLAGSKEY,0b00000001 rjmp MPPKEYX MlPPKEY:sbr FLAGSKEY,0b00000010 rjmp MPPKEYX M2PPKEY:sbr FLAGSKEY,0b00000100 rjmp MPPKEYX M3PPKEY:sbr FLAGSKEY,0b00001000 rjmp MPPKEYX MPPKEYO:cpi TEMP,0 ;Счетчик удержания=0? breq MPPKEYR ;Да-сбросить флаг -dec TEMP ;Нет-уменыпить счетчик rjmp MPPKEYX ;Выход MPPKEYR:cpi KODIND,0 ;Сброс флага клавиатуры breq MO.PKEY cpi K0DIND,1 breq M1_PKEY cpi K0DIND,2 breq M2_PKEY cpi K0DIND,3 breq M3.PKEY rjmp MPPKEYX MO_PKEY:chr FLAGSKEY,0b00000001 rjmp MPPKEYX Ml_PKEY:cbr FLAGSKEY,0b00000010 rjmp MPPKEYX M2_PKEY:cbr FLAGSKEY,0b00000100 rjmp MPPKEYX M3_PKEY:cbr FLAGSKEY,Ob00001000 rjmp MPPKEYX MPPKEYX:st Y,TEMP ;Конец ret /Подпрограмма задержки на 1 с ;Вход - регистр FLAGS ;Выход- нет PPDELlS:wdr ;Сброс собаки rcall PPINC /Инкремент кода индикации и дешифратора sbrs FLAGS,FL1000 ;Флаг 1 с установлен
304 Глава 2. Устройства на контроллерах rjmp PPDEL1S ;Нет-назад clt ;Да-сброс флага и выход bid FLAGS, FL1000 ret /файл «2313def.inc» .device AT90S2313 ; Регистры .equ SREG =$3f .equ SPL =$3d .equ GIMSK =$3b .equ GIFR =$3a .equ TIMSK =$39 .equ TIFR =$38 .equ MCUCR =$35 .equ TCCRO =$33 .equ TCNTO =$32 .equ TCCR1A =$2f .equ TCCR1B =$2e .equ TCNT1H =$2d .equ TCNT1L =$2c .equ 0CR1AH =$2b .equ 0CR1AL =$2a .equ ICR1H =$25 .equ ICR1L =$24 .equ WDTCR =$21 .equ EEAR =$le .equ EEARL =$le .equ EEDR =$ld .equ EECR =$lc .equ PORTB =$18 .equ DDRB =$17 .equ PINB =$16 .equ PORTD =$12 .equ DDRD ' =$11 .equ PIND =$10 .equ UDR =$0c .equ v USR =$0b .equ UCR =$0a' .equ UBRR =$09 .equ ACSR =$08 ; Биты .equ SP7 =7 .equ SP6 =6 .equ SP5 =5 .equ SP4 =4 .equ SP3 =3 .equ SP2 =2 .equ SP1 =1 .equ SPO =0
16. Универсальные цифровые часы на контроллере AVR 305 .equ INT1 =7 .equ INTO =6 .equ INTF1 =7 .equ INTFO =6 .equ T0IE1 =7 .equ 0CIE1A =6 .equ TICIE =3 .equ TOIEO =1 .equ T0V1 =7 .equ 0CF1A =6 .equ ICF1 =3 .equ TOVO =1 .equ SE =5 .equ SM =4 .equ ISC11 =3 .equ ISC10 =2 .equ ISC01 =1 .equ ISCOO =0 .equ CS02 =2 .equ CS01 =1 .equ CSOO =0 .equ COM1A1 =7 .equ COM1A0 =6 .equ PWM11 =1 .equ PWM10 =0 .equ ICNC1 =7 .equ ICES1 =6 .equ CTC1 =3 .equ CS12 =2 .equ CS11 =1 .equ CS10 =0 .equ WDTOE =4 .equ WDE =3 .equ WDP2 =2 .equ WDP1 =1 .equ WDP0 =0 .equ EEMWE =2 .equ EEWE =1 .equ EERE =0 .equ PB7 =7 .equ PB6 =6
306 Глава 2. Устройства на контроллерах .equ PB5 =5 .equ PB4 Ч .equ PB3 =3 .equ PB2 =2 .equ PB1 =1 .equ PBO =0 .equ DDB7 =7 .equ DDB6 =6 .equ DDB5 =5 .equ DDB4 =4 .equ DDB3 =3 .equ DDB2 =2 .equ DDB1 =1 .equ DDBO =0 .equ PINB7 =7 .equ PINB6 =6 .equ PINB5 =5 .equ PINB4 =4 .equ PINB3 =3 .equ PINB2 =2 .equ PINB1 =1 .equ PINBO =0 .equ PD6 =6 .equ PD5 =5 .equ PD4 =4 .equ PD3 =3 .equ PD2 =2 .equ PD1 =1 .equ PDO =0 .equ DDD6 =6 .equ DDD5 =5 .equ DDD4 =4 .equ DDD3 =3 .equ DDD2 =2 .equ DDD1 =1 .equ DDD0 =0 .equ PIND6 =6 .equ PIND5 =5 .equ PIND4 =4 .equ PIND3 =3 .equ PIND2 =2 .equ PIND1 =1 .equ PIND0 =0 .equ RXC =7 .equ TXC =6 .equ UDRE =5
16. Универсальные цифровые часы на контроллере AVR 307 .equ FE =4 .equ OR =3 .equ RXCIE =7 .equ TXCIE =6 .equ UDRIE =5 .equ RXEN =4 .equ TXEN =3 .equ CHR9 =2 .equ RXB8 -1 .equ TXB8 =0 .equ ACD =7 .equ ACO =5 .equ ACI =4 .equ ACIE =3 .equ ACIC =2 .equ ACIS1 =1 .equ ACISO =0 .def XL =r26 .def XH =r27 .def YL =r28 .def YH =r29 .def ZL =r30 .def ZH =r31 .equ RAMEND =$DF /Последняя ячейка ОЗУ .equ XRAMEND =$DF .equ E2END =$7F .equ FLASHEND=$3FF ; Вектора прерываний .equ INT0addr=$001 .equ INTladdr=$002 .equ ICPladdr=$003 .equ OCladdr =$004 .equ OVFladdr=$005 .equ OVF0addr=$006 .equ URXCaddr=$007 .equ UDREaddr=$008 .equ UTXCaddr=$009 .equ ACIaddr =$00a •файл «Jcodjcey.def» ;Коды клавиш /Расположение клавиш относительно индикаторов ;Вид со стороны индикаторов ; 1-1 1-1 1-1 I--I ; I I I I I I I I ; I I I I I I I I
308 Глава 2. Устройства на контроллерах ; LOI l_ll I.2I IJI ; I--I 1-1 I--I I--I ; LOI Lll l_2l L3I ИМЯ КОД .equ K0000 = ОЬОООООООО ;Отпускание клавиш .equ К1000 = ObOOOOOOOl ; Левая клавиша .equ K0001 = ОЬООООЮОО /Правая клавиша .equ КОНЮ = ОЬООООООЮ ; Вторая клавиша .equ К0010 = ОЬОООООЮО ;Третья клавиша .equ K1001 = ObOOOOlOOl ;Две крайние клавиши .equ K1010 = ObOOOOOlOl ;... .equ K1100 = ObOOOOOOll ;... .equ K0101 = ObOOOOlOlO ; .equ K0011 = ObOOOOllOO ; Для детального знакомства с процессором и его системой команд рекомендую воспользоваться информацией, размещенной в Интернете по адресу http://www.atmel.ru. Литература 1. А. Нечаев. «Простой конвертор RS-232-TTL»// Схемотехника. — 2000 г. — №10.— с. 54.
17. Музыкальная клавиатура 309 17. Музыкальная клавиатура Клавиатура компьютера, в силу своего назначения, подвергается жесткой механической эксплуатации, в результате чего, в конце концов, приходит в негодность. Причины могут быть разные — либо плохо начинают работать некоторые кнопки, либо они выпадают, либо на клавиатуру просто проливают чай или кофе, либо она просто морально стареет. Что же делать с испорченной клавиатурой, у которой полностью исправна вся электроника, в том числе и микропроцессор? Я предлагаю вам способ превращения изношенной и даже частично испорченной клавиатуры в музыкальный инструмент для детей. Для этого в клавиатуре уже есть все необходимое — корпус с кнопками и электроника. Необходимо лишь приобрести дополнительно сетевой источник питания с выходным напряжением 5 В и током нагрузки 0,5 А для автономного питания нового инструмента. Благо, такие источники продаются в настоящее время во многих магазинах и по низкой цене. В конце концов, источник легко изготовить самостоятельно. Разумеется, все клавиатуры отличаются схемотехнически. Однако поняв принцип переделки одной клавиатуры, легко переделать любую, подобную. Я расскажу о том, как превратить в музыкальный инструмент клавиатуру АТ/ХТ. Схема этой клавиатуры приведена на Рис. 17.1. В Табл. 17.1. приведен перечень элементов, из которых состоит клавиатура. Таблица 17.1. Элементы клавиатуры BQ1 BA1 Резонатор кварцевый 6000 кГц Звуковой излучатель ЗП-1 (ЗП-5) 1 1 Конденсаторы | CI, C2 сз С4, С5 С6 С7 K10-17-16-M47-22 пФ К53-19А-16В-3,3 мкФ K10-17-16-M47-100 пФ КМ-5б-Н90-0,1 мкФ K53-19A-6,3 B-47 мкФ 2 1 2 1 1 Микросхемы | D1 D2, D8 D3—D5 1 D6 D7 MSC8035 (KM1816BE35) КМ555ЛН2 КМ555ИР11А К573РФ2 (К573РФ5) KP580BA86 1 2 3 1 1 DIP-40 DIP-14 DIP-16 DIP-24 DIP-20
310 Глава 2. Устройства на контроллерах Таблица 17.1. (Продолжение) Позиционное 1 обозначение Е1 Наименование Набор резисторов НР1-1-9М-0,125-4,7 кОм Количество 1 Примечание Резисторы МЛТ-0,25± 10% Rl—R3, R6 R4, R5 R7—R10 R11 SI—S87 VD1—VD87, VD92 VD88—VD91 VT1 XI 4,7 кОм 2,2 кОм 150 Ом 1кОм Кнопка ИЗОТ-0125Д Диоды КД522Б Светодиоды АЛС307БМ Транзистор КТ315Б Розетка WF-6 4 2 4 1 87 88 4 1 1 Красный Поскольку в клавиатуре, как правило, отсутствует источник звука, его необходимо установить, незначительно доработав клавиатуру. На приведенной схеме уже сделана такая доработка. Она заключается в установке двух дополнительных деталей — резистора R11 и звукового излучателя ВА1. Если вы хотите получить большую громкость звучания, можно в качестве излучателя применить любой малогабаритный громкоговоритель, включив его в цепь эмиттера дополнительного транзистора КТ315 по схеме, приведенной на Рис. 17.2. Резистор R12 в этом случае, как и R11, имеет сопротивление 1 кОм. Шнур клавиатуры будет служить питающим кабелем. Если установить в источник питания ответную часть разъема клавиатуры, то ничего переделывать больше не надо. Если же такого разъема не найти, то нужно заменить клавиатурный разъем любым другим низковольтным разъемом с ответной частью, подключенной к источнику питания. Наконец, последней операцией является замена прошивки с программой клавиатуры. Для этого необходимо вынуть микросхему с программой из панельки, очистить микросхему в ультрафиолетовом стирающем устройстве и запрограммировать микросхему новой прошивкой. Можно также установить новую микросхему, предварительно запрограммировав ее. Код прошивки составляет объем 1 Кбайт и приводится ниже.
Рис 17.1. Схема клавиатуры 17. Музыкальная клавиатура 311
312 Глава 2. Устройства на контроллерах Рис. 17.2. Схема подключения громкоговорителя Код прошивки 000000: 24 00 00 93 00 00 00 04 60 00 00 00 00 00 00 00 $ х 000010: 20 20 20 20 20 50 69 61 6Е 6F 20 20 20 20 20 20 Piano 000020: 20 56 65 72 73 69 6F 6Е 20 20 31 2Е 30 30 20 20 Version 1.00 000030: 20 43 6F 70 79 72 69 67 68 74 20 28 43 29 20 20 Copyright (С) 000040: 20 20 31 37 2Е 30 39 2Е 32 30 30 32 20 20 20 20 17.09.2002 000050: 20 20 56 61 6С 70 61 20 4F 6С 65 67 20 20 20 20 Valpa Oleg 000060: D5 AF В8 23 F0 96 6В 99 EF 04 70 62 09 D3 10 39 ...#..k...pb...9 000070: FF 93 04 7A B9 29 89 08 04 8D F9 D2 74 B8 23 F0 ...z.) t.#. 000080: B8 28 DO C6 8D B8 23 F0 B8 28 A0 Al 19 83 B9 29 .(....#..( ) 000090: Fl 14 9C 19 F9 D2 99 04 90 B9 29 83 B8 23 АО С6 )..#.. 0000A0: AE B8 27 B0 04 14 ВС B8 27 F0 07 A0 96 A5 83 B9 ..' ' 0000B0: 29 Bl 00 19 F9 D2 B9 04 Bl B9 29 83 AF B8 22 23 ) )...»# 0000CO: 3E A0 23 01 14 CF B8 22 F0 07 A0 96 C2 FF 83 AF >.#....» 000ODO: B8 21 A0 B8 20 23 4C A0 F0 07 A0 96 D8 B8 21 F0 .!.. #L !. 0000E0: 07 A0 96 D3 FF 83 00 00 00 00 00 00 00 00 00 00 0000F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000100: 35 15 C5 E5 23 27 39 8A FF B8 3F 27 АО Е8 ОС В9 5...#'9...?'.... 000110: 29 B8 23 F0 62 25 55 ВА D3 54 00 34 87 AE D3 ЗВ ).#.b%U..T.4...; 000120: С6 53 FE D3 ЗС С6 57 FE D3 3D Сб 5В FE D3 ЗЕ С6 .S..<.W.. = . [..>. 000130: 5F FE D3 3F С6 63 FE D3 40 С6 67 FE D3 41 С6 6В _..?.c..@.g..A.k 000140: FE D3 42 С6 6F FE D3 43 Сб 73 FE D3 44 С6 77 14 ..B.O..C.S..D.W. 000150: 72 24 IB ВА 21 24 7F ВА 54 24 7F ВА 85 24 7F ВА г$..!$..Т$...$.. 000160: В8 24 7F ВА D3 24 7F ВА Е4 24 7F 89 08 24 1В 99 .$...$...$...$.. 000170: F7 24 IB 14 AF 24 IB 89 08 14 8E 99 F7 24 IB 89 .$...$ $.. 000180: 08 54 00 99 F7 24 IB B8 26 B0 00 B8 25 B0 00 ВС .Т...$..&...%... 000190: 0B BD 08 34 B3 FC A8 80 67 E6 A8 B8 25 10 ED 98 ...4....g...%... 0001A0: EC 91 34 B3 B8 25 BO FF B8 25 FO ЕЗ В8 23 АО В8 ..4..%...%...#.. 0001B0: 25 FO 83 AF 89 07 B8 26 10 23 ОС DO 96 C2 BO 01 % &.# 0001C0: 89 07 FO A8 23 FF 97 F7 E6 CF E8 C7 ЗА 24 DD 23 ....# :$.# 0001D0: FF ЗА F7 E8 D2 43 F8 A8 09 43 07 58 39 FF 83 00 .:...C...C.X9... 0001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000200: AF FA A3 AB B8 24 АО C6 IF 1A FA A3 B8 23 АО С6 $ #.. 000210: IF 14 ВС B8 24 FB 60 АО 53 OF 96 11 1A 44 01 FF ....$.\S....D.. 000220: 83 04 F8 04 F8 02 F8 04 F8 04 F8 02 F8 04 F8 04
17. Музыкальная клавиатура 313 000230: FB 04 F4 04 F6 01 F8 04 F9 04 F9 04 F9 04 F9 04 000240: F9 04 F8 04 F8 04 F8 04 F8 04 F6 04 F6 04 F8 02 000250: F6 02 FB 00 08 F8 08 F8 04 F8 08 F8 08 F8 04 F8 000260: 08 F8 08 FB 08 F4 08 F6 02 F8 08 F9 08 F9 08 F9 000270: 08 F9 08 F9 08 F8 08 F8 08 F8 08 FB 08 F9 08 F8 000280: 08 F6 02 F4 00 10 F8 10 F8 08 F8 10 F8 10 F8 04 000290: F8 10 F8 10 FB 10 F4 10 F6 02 F8 10 F9 10 F9 10 0002A0: F9 10 F9 10 F9 10 F8 10 F8 10 F8 10 F8 10 F6 10 0002B0: F6 10 F8 04 F6 04 FB 00 10 F4 10 F5 10 F6 10 F7 0002C0: 10 F8 10 F9 10 FA 10 FB 10 FC 10 Fl 10 F2 10 F3 0002D0: 10 F4 00 08 F4 08 F6 08 F8 08 F9 08 FB 08 Fl 04 0002E0: F3 10 F4 00 04 FB 00 00 00 00 00 00 00 00 00 00 0002F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000300: FF FE Fl F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC Fl F0 000310: EF ЕЕ ED EC ЕВ EA E9 E8 E7 E6 E5 E4 E3 E2 El EO 000320: DF DE DD DC DB DA D9 D8 D7 D6 D5 D4 D3 D2 Dl DO 000330: CF CE CD CC CB CA C9 C8 C7 C6 C5 C4 СЗ С2 CI CO 000340: BF BE BD ВС BB BA B9 B8 B7 B6 B5 B4 ВЗ В2 Bl BO 000350: AF AE AD AC AB АО A9 A8 00 00 00 00 00 00 00 00 000360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0003F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 После выполнения такой операции: • при включении можно будет воспроизводить мелодию новогодней песенки; • нажав клавиши F1...F5, можно воспроизвести пять различных мелодий; • при нажатии остальных нефункциональных клавиш воспроизводятся ноты первой октавы в порядке возрастания, проигрываемая мелодия записывается в оперативную память процессора и после заполнения всей памяти зажигается индикатор «RUS»; • клавиша F10 воспроизводит записанную мелодию; • клавиша F9 стирает старую запись и очищает память; • клавиша F7 зажигает индикатор «RUS»; • клавиша F8 гасит индикатор «RUS».
314 Глава 2. Устройства на контроллерах Поскольку в схеме других клавиатур могут быть некоторые отличия от приведенной здесь, приводится исходный текст программы, который может быть легко модифицирован путем изменения назначения выводов процессора и адреса внешних устройств. Программа написана для микропроцессора 8035. Без всяких изменений эта же программа подходит для микропроцессора 8048, на основе которого построено большое количество клавиатур. Микропроцессор 8048, в отличие от 8035, имеет внутреннюю память программ, поэтому для него не требуется внешней ПЗУ, и код программы записывается непосредственно в микропроцессор. Все мелодии в программе записаны в виде символьной записи, которую легко изменить на желаемую или любимую мелодию, например из нотной книги. Так, ноты «ДО», «ДО#», «РЕ», «РЕ#», «МИ», «ФА», «ФА#», «СОЛЬ», «СОЛЬ#», «ЛЯ», «ЛЯ#», «СИ» записываются в программе как DO, DO_, RE, RE_, MI, FA, FA_, SL, SL_, LY, LY_, SI. Перед нотой записывается ее длительность в 1/16 долях. В конце записи вписывается 0, означающий конец песни. Ниже приведен фрагмент программы — нотная запись новогодней английской песенки. Songl: ; English New Year 1 db 4,MI,4,MI,2,MI,4,MI db 4,MI,2,MI,4,MI,4,SL db 4,DO,4,RE,l,MI,4,FA db 4,FA,4,FA,4,FA,4,FA db 4,MI,4,MI,4,MI,4,MI db 4/RE/4/RE,4,MI,2,RE db 2,SL db 0 Надо лишь помнить о длине записи, которая не должна превышать объем памяти ПЗУ. После этого программа транслируется, и получается новая прошивка с новыми мелодиями. Такая музыкальная игрушка очень нравится детям, поскольку не надоедает однообразием. Кроме того, она позволяет тренировать слух и играть в игру «Повтори мелодию». Возможно, вы сами придумаете новые функции для данного инструмента. Ведь это — творчество!
17. Музыкальная клавиатура 315 Текст программы «piano» $ALLPUBLIC $paginate $subtitle( Piano) ;##################################################################### ; Name: Piano ; Purpose: Make piano from keyboard ; Autor: O.D.Valpa ; Version: 1.0 ;##################################################################### ; Fl...F6-play muzic from bank ; F7- light RUS ; F8- dare RUS ; F9- clear RAM melody ; FlO-play melody /Assembler - 8048 /Microprocessor - 1816WE35 /INTERNAL ROM - NO /INTERNAL RAM - 64 BYTE /EXTERNAL ROM - 2048 BYTE BK) /EXTERNAL RAM - 1 RG rd /P1.0 - Led Scroll Lock /Pl.l - Led Num Lock /PI.2 - Led Caps Lock /P1.3 - Led Rus/Lat /PI.4 - Sound out /PI.5 - Enable leds 0-dark l-ligh /PI.6 - Clk keyboard /PI.7 - Data keyboard 76543210 BitRus equ 00001000b BitSnd equ 00010000b BitEnL equ 00100000b FCLK equ 6000 ; kHz Kdel equ 3*5*32 FTIM equ FCLK/Kdel*1000 ; Hz ; Define notes LY equ Offh - 14 / 440 Hz LY_ equ Offh - 13 ; 466 Hz SI equ Offh - 12 ; 494 Hz DO equ Offh - 11 ; 523 Hz DO_ equ Offh - 10 ; 554 Hz RE equ Offh - 9 ; 588 Hz RE_ equ Offh - 8 ; 622 Hz MI equ Offh - 7 ; 660 Hz FA equ Offh - 6 ; 698 Hz FA_ equ Offh - 5 ; 740 Hz
316 Глава 2. Устройства на контроллерах SL equ Offh -» 4 ; 784 Hz SL_ equ Offh - 3 ; 830 Hz ; Define keys _F1 equ 59 ; Key Fl _F2 equ 60 ; Key F2 _F3 equ 61 ; Key F3 _F4 equ 62 ; Key F4 _F5 equ 63 ; Key F5 _F6 equ 64 ; Key F6 _F7 equ 65 ; Key F7 _F8 equ 66 ; Key F8 _F9 equ 67 ; Key F9 _F10 equ 68 ; Key F10 ; User registers Bank 0: ; req rO ; Reg. addres 0 ? req rl ; Reg. addres 1 AMuz req r2 RNote req r3 req r4 ; CtO req r5 ; Ctl SCode req r6 Temp req r7 ; Temp registr ; User memory Bank 0: Beg_RAM equ Oh ; Begin RAM End_RAM equ 3Fh ; End RAM F4 b) ; Int RAM=0-63 /00-3fh/ MCtO equ 20h ; Addr.ctO MCtl equ 21h ; Addr ctl MCt2 equ 22h ; Addr ct2 Note equ 23h ; Addr note Time equ 24h ; Addr time Scan equ 25h ; Addr scan code SCtO equ 26h ; Addr ct scan PCtO equ 27h ; Addr ct play MTemp equ 28h ; Memory temp ARMuz equ 29h ? Memory muzic top end ; Ext RAM=0-255 /0-0ffh/ RgKey equ Oh ; Register read keyboard savenote %MACRO mov r0,#Note ; Save note mov @r0,a %ENDM loadnote %MACRO mov r0,#Note ; Load note
17. Музыкальная клавиатура 317 mov a,@rO %ENDM pusha %MACRO mov TEMP, a ; Push A %ENDM popa %MACRO mov a,TEMP ; Pop A %ENDM rusl %MACRO orl pl,#BitRus ; Light RUS %ENDM rusd %MACRO anl pi, #(not BitRus) ; Dark RUS %ENDM ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFSEG MAIN, ABSOLUTE SEG MAIN ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Vectors org 0 ; RESET vector jmp Start org 3 ; EXTO interrupt vector retr org 7 ; Timer 0 vector jmp Timlnt org lOh ; Table AUTORS .л************************************************************* Table AUTORS .A******************************************************************** 0123456789ABCDEF db ' Piano db ' Version 1.00 ' db ' Copyright (C) ' db ' 17.09.2002 db ' Valpa Oleg ; Subprogramm timer interupt ; Inp: @Note - adress note ; Out: Sound - out sound ; Use: r0',r7' ; Sub: Timlnt: sel RBI ; Register bank = 1
318 Глава 2. Устройства на контроллерах pusha ; Push ACC loadnote ; Load note jnz Timl anl pl,#@ffh xor BitSnd) ; SOUND=0 jmp TimEnd Timl: mov t,a ; Load timer in a,pl ; S0UND=/\/\/\ xrl a,#BitSnd outl pi, a TimEnd: popa ; Pop ACC retr ; return int .••л***************************************************************** ; Subprogramm write note in RAM .**•***************•**••**•*•*•*•*•********************************** ; Input: @Note = note WrNote: jmp WrNl WrNO: mov rl,#ARMuz rusl jmp WrNE WrNl: mov a,rl jb6 WrNO loadnote mov rO,#MTemp ; Load MTemp xrl a,@rO jz WrNE loadnote mov rO,#MTemp ; Load MTemp mov @rO,a mov @rl,a inc rl WrNE: ret .л******************************************************************* ; Subprogramm play note from RAM ; Input: @ARMuz - adress RAM wish music PlNote: mov rl,#ARMuz PINO: mov a,(?rl call Play inc rl mov a,rl jb6 PINE jmp PINO PINE: mov rl,#ARMuz ret .л*******************************************************************
17. Музыкальная клавиатура 319 ; Subprogramm play note from ACC .¦л****************************************************************** ; Input: A - note Play: savenote ; Save note jz PlayE mov rO,#PCtO mov @r0,#4 ; 1/4 takt note Playl: call DelT16 mov rO,#PCtO mov a,@rO dec a mov @rO,a jnz Playl PlayE: ret .••л***************************************************************** ; Subprogramm eraze muzic in memory .***********************************************•******************** ; Input: - ErMuz: mov rl,#ARMuz ErMO: mov @rl,#0 inc rl mov a,rl jb6 ErME jmp ErMO ErME: mov rl,#ARMuz ret .*****•********•***************************************************** ; Subprogramm delay on 1/16 s .•л****************************************************************** DelT16: pusha ; Push ACC mov rO,#MCt2 mov a,#62 mov @rO,a DelT: mov a,#l call DelNms ; Delay for 1 ms mov rO,#MCt2 mov a,@rO dec a mov @rO,a jnz DelT popa ; Pop ACC ret .¦и****************************************************************** ; Subprogramm delay on N ms .**********************•*************************************•******* ; Input A = N ms A-255) DelNms:
320 Глава 2. Устройства на контроллерах pusha ; Push ACC mov rO,#MCtl' raov @rO,a Delll: mov rO,#MCtO ; Delay for the 1 ms mov a,#76 mov @rO,a Dell2: mov a,@rO dec a mov @rO,a jnz dell2 mov rO,#MCtl mov a,@rO dec a mov @rO,a jnz Delll popa ; Pop ACC ret ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% org lOOh ; Start program .•**************************************^ Start: dis tcnti ; Disable interupt timer dis i ; Disable interupt ext. sel rbO ; Select RAM bank 0 sel mbO ; Select ROM bank 0 ; Init MCS mov a,#00100111b IIIIIII+- Scrl & Scan l=scrl 0=scan ; IIIIII+— Num & Scan l=num 0=scan IIIII+— Caps & Scan l=caps 0=scan N11+ Rus l=light 0=dark 111+ Snd l=activ 0=pass 11+ En led l=light 0=dark 1+ Clk KB l=activ 0=pass ; + Data KB l=activ 0=pass outl pi,a ; Port 1 init orl p2,#llllllllb ; Port 2 init ; Init regs mov rO, #End_RAM clr a ; A=0 InitRg: mov @r0, a ; (Regs) <- A=0 djnz rO, InitRg ; ... mov rl, #ARMuz ; Rl=adress muzic in RAM ; Init timer loadnote ; Load note = 0 mov t,a ; Load timer
17. Музыкальная клавиатура 321 en tcnti ; Enable interupt timer strt t ; ALE = F/32 CLK =ALE/3/5 Begin: mov AMuz,#(Song5 and Offh) ; Save note call Sound Next: call ReadKB ; Reading KB mov SCode,a ; ff=no press xrl a,#_Fl jz Fund mov a,SCode xrl a,#_F2 jz Func2 mov a,SCode xrl a,#_F3 jz Func3 mov a,SCode xrl a,#_F4 jz Func4 mov a,SCode xrl a,#_F5 jz Func5 mov a,SCode xrl a,#_F6 jz Func6 mov a,SCode xrl a,#_F7 jz Func7 mov a,SCode xrl a,#_F8 jz Func8 mov a,SCode xrl a,#_F9 jz Func9 mov a,SCode xrl a,#_F10 jz FunclO call WrNote jmp Next
322 Глава 2. Устройства на контроллерах Fund: mov AMuz,#(Songl and Offh) ; Save note jmp FuncS Func2: mov AMuz;#(Song2 and Offh) ; Save note jmp FuncS Func3: mov AMuz,#(Song3 and Offh) ; Save note jmp FuncS Func4: mov AMuz,#(Song4 and Offh) ; Save note jmp FuncS Func5: mov AMuz,#(Song5 and Offh) ; Save note jmp FuncS Func6: mov AMuz,#(SongB and Offh) ; Save note jmp FuncS Func7: rusl ; Rus=Light jmp Next Func8: rusd ; Rus=Dark jmp Next Func9: call ErMuz ; Eraze muzic in memory jmp Next FunclO: rusl ; Rus=Light call PlNote ; Play muzic from RAM rusd ; Rus=Dark jmp Next FuncS: rusl ; Rus=Light call Sound rusd ; Rus=Dark jmp Next .•л****************************************************************** ; Subprogramm read keyboard .*********************************•*******************•*******•****** ; Input: ; Output:@Scan & A =0-87scancod,if 255 no press ; User: rO, r4, r5, @SCan, @Scan ReadKB: mov rO,#SCtO mov @r0,#0 mov rO,#Scan mov @r0,#0 mov r4,#ll ; 11 line
17. Музыкальная клавиатура 323 RKBO: mov r5, #8 ; 8 bit call ScanKB mov a,r4 ; 11 adr keyboard mov rO,a ; for testing movx a,@rO RKB1: rrc a jnc RKBE mov rO,#Scan inc @r0 djnz r5,RKBl djnz r4,RKB0 call ScanKB ; Line in passiv mov rO,#Scan mov @r0,#0ffh RKBE: mov rO,#Scan mov a,@rO movp3 a,@a ; Tranformatsne from table savenote ; Save note mov rO,#Scan mov a,@rO ret ; Subprogramm scan 11 Hne keyboard .•л****************************************************************** ScanKB: ; User: rO mov Temp, a ; Push ACC orl pl,#07 mov rO.iSCtQ inc @r0 mov a, #12 xrl a,@rO jnz Scanl mov @rO,#l orl pi, #07 Scanl: mov a,@r0 mov r0,a mov a,#0ffh clr с Scan2: rlc a jnc Scan3 djnz rO,Scan2 outl p2,a jmp ScanE Scan3: mov a,#0ffh outl p2,a Scan4: rlc a
324 Глава 2. Устройства на контроллерах djnz rO,Scan4 orl a,#0f8h mov rO,a dis tcnti ; Disable interupt timer in a,pl orl a,#07 anl a,r0 outl pi,a en tcnti ; Enable interupt timer ScanE: mov a,Temp ; Pop ACC ret ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% org 200h ; Page 1 programm memory ; Subprogramm sound .л******************************************************************* ; Input: AMuz=#(SongX and Offh) Sound: mov Temp, a ; Push ACC Sndl: mov a,AMuz movp a,@a ; Time note from tabl songs mov RNote,a ; Save time note mov rO,#Time mov @r0,a jz SndEnd inc AMuz ; Next tabl mov a, AMuz movp a,@a ; Free note from tabl songs savenote ; Save note jz SndEnd Snd2: call DelTl6 mov rO,#Time mov a,RNote add a,@r0 mov @r0,a anl a,#0fh ; >15? jnz Snd2 inc AMuz ; Next tabl jmp Sndl SndEnd: mov a,Temp ; Pop ACC ret .a*************************************************** ; Tables decoder scan sode in period timers .•л******************************************************************* Songl: ; English New Year 1 db 4,MI,4,MI,2,MI,4,MI
17. Музыкальная клавиатура 325 db 4,MI,2,MI,4,MI,4,SL db 4,DO,4,RE,l,MI,4,FA db 43,43,4,FA,4,FA db 4,MI,4,MI,4,MI,4,MI db 4,RE,4,RE,4,MI,2,RE db 2,SL db 0 Song2: ; English New Year 2 db 8,MI,8,MI,4,MI,8,MI db 8,MI,4,MI,8,MI,8,SL db 8,DO,8,RE,2,MI,8,FA db 8,FA,8,FA,83,83 db 8,MI,8,MI,8,MI,8,SL db 8,FA,8,MI,8,RE,2,DO db 0 Song3: ; db 16,MI,16,MI,8,MI,16,MI db 16,MI,4,MI,16,MI,16,SL db 16,DO,16,RE,2,MI,16,FA db 16,FA,16,FA,16,FA,16,FA db 1б|М1Дб|М1Дб|М1|1б|М1 db 16,RE,16,RE,16,MI,4,RE db 4,SL db 0 Song4: ; DO Ю_ RE ... db 16,DO,16,DO_,16,RE,16,RE_,16,MI,16,FA,163-.,16,SL db 16,SL_,16,LY,16,LY_,16,SI,16,DO db 0 Song5: ; DO RE MI db 8,DO,8,RE,8,MI,83,8,SL,8,LY,4,SI,16,DO db 0 SongB: ; SL db 4,SL db 0 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFSEG VARIABLES, absolute, CLASS = DATA ; SEG VARIABLES org 300h ; Page 3 programm memory .•******•***•********************************************•**•*******•• ; Tables decoder scan sode in note ; LY LY_ SI Ю DO_ RE RE_ MI FA FA_ SL SL_ I octava ; Fl F2 #+1234567890=$ BS Esc Num Scr Prs ; F3 F4 Tab Q W E R T Y U I О P { } Pause 7' 8' 9' -' ; F5 F6 Caps ASDFGHJKL:« Enter 4' 5' 6' +' ; F7 F8 ShL Z X С V В N M < > ? ShR V 2' 3' ; F9 F10 Sh2 Ctrl Alt Space Rus 0' .' Enter db 255,254,LY ,LY_,SI ,DO ,DO_,RE ; Esc 1 2 3 4 5 б ;00-07 db RE_,MI ,FA ,FA_,SL ,SL_,241,240; 7 8 9 0 = + BS Tab;08-15
326 Глава 2. Устройства на контроллерах db 239,238,237,236,235,234,233,232; Q W E R T Y U I ; 16-23 db 231,230,229,228,227,226,225,224; О Р { } Ent Ctr A S ;24-31 db 223,222,221,220,219,218,217,216; D F G H J К L : ;32-39 db 215,214,213,212,211,210,209,208; « # ShL $ Z X С V ;40-47 db 207,206,205,204,203,202,201,200; В N M < > ? ShR Prs;48-55 db 199,198,197,196,195,194,193,192; Alt _ Cps Fl F2 F3 F4 F5 ;56-63 db 191,190,189,188,187,186,185,184; F6 F7 F8 F9 F10 Num Scr 7' ;64-71 db 183,182,181,180,179,178,177,176; 8' 9' -' 4' 5' 6' +' Г ;72-79 db 175,174,173,172,171,160,169,168; 2' 3' 0' .' Rus Sh2 Pau;80-87 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end
18. Автоматический корректор часов 327 18. Автоматический корректор часов В последнее время во многих регионах нашей страны периодически отключают электроэнергию. В результате отключаются все бытовые электроприборы, а электронные часы, не имеющие энергонезависимого режима работы, при этом сбрасываются. Сброс показаний часов приводит к неразберихе и утомляет регулярной переустановкой. Особые неудобства это доставляет ночью, поскольку во многих домах такие часы выполняют функции ночника. Для того чтобы облегчить нашу жизнь и избавиться от подобных неудобств, я предлагаю изготовить разработанный мною автоматический корректор часов. Корректор предназначен для отслеживания пропадания электроэнергии и восстановления показаний реального времени на любых электронных часах, имеющих органы ручной коррекции часов. Данный корректор содержит в себе микроконтроллер с микросхемой энергонезависимых часов (CMOS-часы) и позволяет автоматически устанавливать истинное время на электронных часах, к которым он подключен, после появления напряжения в сети. Устройство состоит из нескольких недорогих и легкодоступных элементов. Его структурная схема приведена на Рис. 18.1. Данная схема не требует особых пояснений. На ней показано, из каких узлов состоит корректор и как он подключается к электронным часам. Принципиальная схема устройства приведена на Рис. 18.2. Из нее видно, каким образом соединяются все элементы и какие контакты корректора используются для подключения к часам. Поскольку корректор не имеет собственного сетевого источника питания, а использует одно из питающих напряжений электронных часов от 5 В до 40 В, в схеме установлен стабилизатор напряжения, выполненный на микросхеме D3. Питающее напряжение подключается к контактам 1 (плюс) и 2 (минус) корректора. Конденсаторы СР1,0—СЗ обеспечивают дополнительную фильтрацию напряжения питания. Однокристальные часы корректора выполнены на микросхеме D2. Кварцевый резонатор BQ1 обеспечивает стабильную генерацию часов с частотой 32768 Гц. Конденсаторы С6 и СТ1 предназначены для коррекции частоты генератора часов. Питание микросхемы часов происходит либо от стабилизатора напряжения D3 через диод VD2, либо от элемента питания В1 напряжением 3,6 В через диод VD3. Диоды обеспечивают защиту от разрядки элемента питания через остальные элементы схемы при отсутствии сетевого питания. Через защитный диод VD4 и токоогра-
328 Глава 2. Устройства на контроллерах Рис. 18.1. Структурная схема устройства Рис. 18.2. Принципиальная схема устройства
18. Автоматический корректор часов 329 ничивающий резистор R2 производится регулярная подзарядка элемента питания В1 до рабочего напряжения 3,6 В от стабилизатора D3. Избыток зарядного напряжения гасится на диодах VD2 и VD4. Резисторы R3 и R4 подтягивают интерфейсные линии шины 12С к источнику питания. По этой последовательной двухпроводной шине с помощью линии синхронизации SCL и линии данных SDA происходит запись и чтение времени микроконтроллером D1 из однокристальных часов D2. Микроконтроллер работает под управляющей программой, записываемой в него внутрисхемно (без выпаивания) через разъем Л. Кнопка SB1 предназначена для установки времени в однокристальных часах D3. При пропадании питания данный контроллер сбрасывается при помощи диода VD1. При наличии напряжения в сети резистор R1 удерживает вход сброса контроллера в пассивном состоянии. В качестве элементов задающего генератора для контроллера используются кварцевый резонатор BQ2 и конденсаторы С4 и С5. Управление электронными часами осуществляется через оптроны U1 и U2 по схеме полной гальванической развязки, что позволяет подключать корректор практически к любым электронным часам, имеющим кнопки коррекции часов и минут. Резисторы 115—R8 ограничивают ток управления через оптрон. Перечень элементов корректора приведен в Табл. 18.1. Допускается отклонение значений применяемых в схеме резисторов и конденсаторов на 20%. В качестве кварцевого резонатора BQ2 можно использовать любой другой от 1 МГц до 12 МГц с последующей коррекцией программы микроконтроллера. Сам микроконтроллер может быть в любом типе корпуса, поскольку не требуется его программирование на отдельном программаторе. В корректоре применен малогабаритный элемент питания В1 типа CR2032, который применяется в современных персональных компьютерах и является в настоящее время легкодоступным и недорогим элементом. Поскольку однокристальные часы корректора потребляют микроамперный ток от этого элемента, то его хватает на много лет работы. Все элементы схемы можно распаять на небольшой макетной плате. Плата устанавливается внутри электронных часов в любом подходящем месте с обеспечением электрической изоляции от других элементов часов. Корректор можно включить до программирования контроллера с целью подстройки кварцевого генератора однокристальных часов. Для этого надо подключить высокоомный вход частотомера к выводу 2 микросхемы D2 и с помощью подстроечного конденсатора СТ1 приблизить частоту генератора к значению 32768 Гц.
330 Глава 2. Устройства на контроллерах Таблица 18.1. Элементы корректора часов Позиционное 1 обозначение В1 Наименование Элемент питания CR2032 Держатель элемента питания ВН-6 Количество 1 1 Примечание 1 Резонаторы кварцевые BQ1 BQ2 32768 Гц 8 МГц 1 1 DT-38 НС-49 | Конденсаторы типа К10-176 С1—СЗ С4, С5 С6 СР1 СТ1 0,1 мкФ 22 пФ 18 пФ Конденсатор электролитический типа К53-16-68 мкФ-6,3 В Конденсатор подстроечный типа КТ4-23-8/30 пФ 1 2 1 1 1 Микросхемы D1 D2 D3 Ul, U2 AT90S1200-12PC(I) PCF8583T 7805 (КРЕН142ЕН5А) АОТ101А 1 1 1 2 S08 Резисторы типа МЛТ-0,125 R1--R4 R5—R8 SB1 VD1—VD4 Л ЮкОм 510 Ом Кнопка КМ1-1 ДиодКД522 Соединитель PLS-6 4 4 1 4 1 При подключении корректора к часам следует определить полярность сигналов на кнопках коррекции часов, минут и сброса с помощью простого тестера. Положительный контакт должен подключаться к коллектору оптрона, а отрицательный к эмиттеру. Контакты 9 и 10 корректора подключают к кнопке коррекции минут электронных часов, контакты 11 и 12 — к кнопке коррекции часов, а контакты 7 и 8 к кнопке сброса часов. Оставшиеся и незадействованные контакты 5 и 6 зарезервированы на предмет дальнейших расширений функций устройства. Алгоритм программы контроллера приведен на Рис. 18.3. При включении электронных часов подается питание и на корректор. Контроллер корректора стартует и определяет состояние управляющей кнопки SB1. Если она не нажата, из однокристальных часов, которые непрерывно работают, считывается текущее время и устанавливаются показания электрон-
18. Автоматический корректор часов 331 ных часов. Если кнопка нажата, происходит установка однокристальных часов совместно с установкой показаний электронных часов. После этого контроллер переходит в спящий режим работы и потребляет при этом ток менее миллиампера. Внутренние однокристальные часы устанавливаются один раз при первом включении корректора, поскольку в дальнейшем они работают безостановочно. При пропадании сети питание этих часов происходит от внутреннего элемента питания. Текст программы корректора на Ассемблере приведен ниже. Из комментариев, сопровождающих программу, следует, какие значения необходимо корректировать при смене частоты генератора контроллера или других параметров программы в случае такой необходимости. Описание системы команд контроллера можно найти в Интернете по адресу http://www.atmel.ru. Рис. 183. Алгоритм программы контроллера
332 Глава 2. Устройства на контроллерах Текст программы корректора ; Название: ак1200 ; Версия: 1.0 ; Автор: О.Д. Вальпа ; Описание: Программа атоматической коррекции электронных часов после сбоя сети /Алгоритм работы: сброс I ; да кнопка УСТ нажата?_нет I I ; установить часы и CMOS установить часы из CMOS ; I I I ; спать .***•*****************•***********************•*********************•*•******** .include «1200def.inc» /Включить файл описания регистров .LIST /Включить листинг программы ;.LISTMAC /Включить листинг макросов ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Константы и определения переменных ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Выводы порта В .equ PB_U0 =0 /Выход .equ PB_U1 =1 /Выход .equ PB_U2 =2 /Выход .equ PB_U3 =3 /Выход /Выводы порта D .equ PD_SB1 =2 /Вход .equ PD_INT1 =3 /Вход .equ PD_SDA =5 /Вход-Выход .equ PD_SCL =6 /Вход-Выход /Переменные в регистрах /Регистры не поддерживающие команды CPI,ANDI,SUBI,ORI,SBCI,LDI. .def TEMPCODE = r0 ? Регистр для команды LPM НЕ ИЗМЕНЯТЬ г0!!! .def TEMPSREG = г15 / Временный регистр для хранения состояния /Регистры поддерживающие команды CPI,ANDI,SUBI,ORI,SBCI,LDI. .def TEMP = rl6 ; Регистр временных данных .def TEMP2 = rl7 ; Регистр временных данных 2 .def ТЕМРЗ = г18 ; Регистр временных данных 3 .def ТЕМРРР = г19 ; Регистр временных данных подпрограмм .def TEMPDEL = г20 ; Переменная цикла задержки .def TBin = r21 ; Регистр данных бинарного байта .def TBCDH = г22 ; Регистр данных BCD (старший байт) .def CtMin = r23 ; Счетчик минут (формат BCD) .def CtChs = r24 ; Счетчик часов (формат BCD)
18. Автоматический корректор часов 333 ; Макросы ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .macro I2C00 ; Передача комбинации SCL=0 SDA=0 по интерфейсу 12С cbi PORTD, PD_SCL ;SCL=0 cbi PORTD, PD.SDA ;SDA=0 rcall del5mks .endm .macro I2C01 ; Передача комбинации SCL=0 SDA=l по интерфейсу 12С cbi PORTD, PD_SCL ;SCL=0 sbi PORTD, PD_SDA ;SDA=1 rcall del5mks .endm .macro I2C10 ; Передача комбинации SCL=1 SDA=0 по интерфейсу 12С Sbi PORTD, PD_SCL ;SCL=1 Cbi PORTD, PD_SDA ;SDA=0 rcall del5mks .endm .macro I2C11 ; Передача комбинации SCL=1 SDA=1 по интерфейсу 12С sbi PORTD, PD_SCL ;SCL=1 Sbi PORTD, PD_SDA ;SDA=1 rcall del5mks .endm .macro I2CSTART; Передача СТАРТ условия по интерфейсу I2C sbi DDRD, PD_SDA ;SDA=выход I2C11 ;{SCL=1 SDA=1} sbi PORTD, PD_SCL ;SCL=1 Sbi PORTD, PD_SDA ;SDA=1 rcall del5mks I2C10 ;{SCL=1 SDA=0} sbi PORTD, PD_SCL ;SCL=1 cbi PORTD, PD_SDA ;SDA=0 rcall del5mks I2C00 ;{SCL=0 SDA=0} Cbi PORTD, PD.SCL ;SCL=0 cbi PORTD, PD_SDA ;SDA=0 rcall del5mks .endm .macro I2CSTOP ; Передача СТОП условия по интерфейсу I2C Sbi DDRD, PD_SDA ;SDA=выход I2C00 ;{SCL=0 SDA=0} cbi PORTD, PD.SCL ;SCL=0 Cbi PORTD, PD_SDA ;SDA=0 rcall del5mks I2C10 ;{SCL=1 SDA=0} sbi PORTD, PD_SCL ;SCL=1 cbi PORTD, PD.SDA ;SDA=0
334 Глава 2. Устройства на контроллерах rcall delSmks I2C11 ;{SCL=1 SDA=1} sbi PORTD, PD_SCL ;SCL=1 sbi PORTD, PD.SDA ;SDA=1 rcall del5mks .endm .macro I2CRDBIT; Прием бита 12С->ТЕМР2 мл.бит cbi DDRD, PD_SDA ;SDA=BXOfl I2C01 ;{SCL=0 SDA=l} cbi PORTD, PD_SCL ;SCL=0 sbi PORTD, PD.SDA ;SDA=1 rcall del5mks I2C11 ;{SCL=1 SDA=1} sbi PORTD, PD_SCL ;SCL=1 sbi PORTD, PD_SDA ;SDA=1 rcall del5mks sbic PIND,PD_SDA ldi ТЕМР2Д sbis PIND, PD.SDA clr TEMP2 I2C01 ;{SCL=0 SDA=l} cbi PORTD, PD.SCL ;SCL=0 sbi PORTD, PD.SDA ;SDA=1 rcall del5mks .endm .macro I2CWRBIT; Передача бита ТЕМР2 мл.бит->12С Sbi DDRD, PD.SDA ;SDA=Bbixofl cbi PORTD, PD.SCL ;SCL=0 sbrc TEMP2,0 sbi PORTD, PD.SDA ;SDA=1 sbrs TEMP2,0 cbi PORTD, PD.SDA ;SDA=0 rcall del5mks sbi PORTD, PD.SCL ;SCL=1 SDA=d rcall del5mks cbi PORTD, PD.SCL ;SCL=0 SDA=d rcall del5mks .endm .CSEG ; Код программы ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Вектора прерываний ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .org 0 rjmp OP.RESET ;Переход по сбросу
18. Автоматический корректор часов 335 .org INTOaddr rjmp OP_INT0 /Переход по прерыванию INTO .org OVFOaddr rjmp OP_OVF0 /Переход по переполнению ТС0 .org ACIaddr rjmp OP_ACI /Переход по компаратору .org $10 ; Выровнять по границе 16 байт NAME: ; Название программы и версия ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0123456789abcdef .DB « akl200e vl.O « .DB « O.D.Valpa (C) « ;%%%%%%%%%%%%%%%*%%%%%%%%%%«%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания INTO ;%%%%%%%%%%%%%%%%%%%%%%%*%%%%«%%%%%%*%%%%%%%%%%%%%%*%%%%%«%%%%%%%%%%%%%%%%%%%%% OP_INT0:in TEMPSREG,SREG / Сохранить per. SREG nop out SREG,TEMPSREG / Восстановить per. SREG reti ,-%%%%%%%%%%«%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания OVF0 ;тптптттттттт%тт%т%птпттптттптт OP_OVF0:in TEMPSREG,SREG ; Сохранить per. SREG nop out SREG,TEMPSREG ; Восстановить per. SREG reti ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Подпрограмма обработки прерывания ACI ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OP_ACI: in TEMPSREG,SREG ; Сохранить per. SREG nop out SREG,TEMPSREG ; Восстановить per. SREG reti OP_RESET: / Переход по сбросу INIT: ; Инициализация /Инициализация сторожевого таймера ldi TEMP, ObOOOOOlll НИ 16 32 64 128 256 512 1024 2048 mc III+-WDP0 0 10 10 1 0 1 II+-WDP0 0 0 110 0 1 1 |+—WDP0 0 0 0 0 11 1 1 + WDE Разр.раб.ст.тайм. 1=разр. 0=запр. out WDTCR, TEMP wdr ; Сброс сторожевого таймера /Инициализация таймераО /Период тиков = (Fclk = 8 MTu)/CS/N
336 Глава 2. Устройства на контроллерах ldi TEMP, ObOOOOOlOl ||| CS STOP 1 8 64 256 1024 TO/ T0\ II+- CSO 0 1 0 1 0 1 0 1 I+-- CS1 0 0 1 1 0 0 1 1 +— CS2 0 0 0 0 1 1 1 1 out TCCRO, TEMP ;Делитель = CS ldi TEMP, OxFF-240 /Предустановка таймера out TCNTO, TEMP ;===========================ПОМОП1Ь============================================= /Инициализация портов ;PORTn 0 10 1 @-земля 1-питание) ;DDRn 0 0 11 @-вход 1-выход) iiii ! ! ! +-Выход 1 ; ! ! +—Выход 0 ; ! + Вход источник тока ; + Вход 3-е состояние ldi TEMP, 0Ы1111Ш ;Порт В в исходное состояние out PORTB,TEMP ldi TEMP, ObOOOOllll ;Порт В назначить вход=0/выход=1 ШИШ IIIIIII+- U0 111111+-- U1 IIIII+— U2 1111+ U3 111+ SS 11+ MOSI 1+ MISO + SCK out DDRB,TEMP ;г==========================порт D============================================= ldi TEMP, Obllllllll ;Порт D в исходное состояние out PORTD,TEMP ldi TEMP, ObOllOOOOO ;Порт D назначить вход=0/выход=1 ШИШ IIIIIII+- 111111+-- IIIII+— SB1 НП+ INT1 ; 111+ 11+ SDA 1+ SCL . + out DDRD,TEMP ;===========================регистр режима===================================== ldi TEMP, ObOOllOOOO /Установка режима работы контроллера ШПП+- ISC00 0 10 1 ШШ+-- ISC01 0 низ. 0 рез. 1 спад 1 фронт IIIII+— резерв II11+ резерв 111+ SM 0-Idle model-Power down
18. Автоматический корректор часов 337 ; II+ SE О-запрет.спать 1-разреш.спать 1+ резерв ; + резерв out MCUCR,TEMP ;= = = = = = = = = = = = = = = = = = г = = = = = = ==реГИСТр KOMnapaTOpa= = = = = = rr = = = = = = = = r = = = = r = = = = = = = = = = ldi TEMP, ОЫОПОООО /Установка режима работы контроллера IIIIIII+- ACIS0 0 10 1 IIIIII+— ACIS1 0 изм. 0 рез. 1 спад 1 фронт ; II111+— резерв ; IHI+ ACIE 0-запр.прер. 1-разр.прер. ; 111+ АС1Флаг прерывания ; 11+ АСО Выход компаратора ; 1+ резерв + ACD 0-разр.комп. 1-запр.комп. out ACSR,TEMP ; Инициализация переменных ;Очистка регистров clr ZL clr TEMP MINITO: St Z,TEMP inc ZL cpi ZL,30 brne MINITO cli /Запретить все прерывания rjmp MAIN -jiiiiii iiii iiiiiiiiiiiiiiiiiiiiiiiiiiiii i пиши ниш и i пи чинши ; Подпрограмма увеличения счетчика часов на 1 в двоично-десятичном коде (BCD) ; с переходом 23->0 ;/////////////////////////////////////////////////////////////////////////// CtChsInc: inc CtChs mov TEMPPP,CtChs andi TEMPPP,0x0f cpi TEMPPP,0x0a brne ChsIncR andi CtChs, OxfO ldi TEMPPP,0xl0 add CtChs,TEMPPP ChsIncR: cpi CtChs,0x24 brne ChsIncE clr CtChs ChsIncErret -,111111II IIII llllllllllllllllllllllllllll IIIIIIIIIIIIIIIIIIIIIIIIIIIII llllll ; Подпрограмма увеличения счетчика минут на 1 в двоично-десятичном коде (BCD) ; с переходом 59->0 ;/////////////////////////////////////////////////////////////////////////// CtMinlnc:
338 Глава 2. Устройства на контроллерах inc CtMin mov TEMPPP,CtMin andi TEMPPP,0x0f cpi TEMPPP,0x0a brne MinlncR andi CtMin, OxfO ldi TEMPPP,OxlQ add CtMin,TEMPPP MinlncR: cpi CtMin, 0x60 brne MinlncE clr CtMin MinlncE:ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма формирования Ы(час) импульсов в РВ_час U0 ;/////////////////////////////////////////////////////////////////////////// ChsSerlmp: mov TBin,CtChs andi TBin,0x0f mov TBCDH,CtChs andi TBCDH, 0x30 swap TBCDH rcall BCDtoBIN cpi Tbin,0 breq CSIEnd CSIloop: cbi PORTB,PB_U0 ; Нажать кнопку ЧАС rcall delOSs ; на 0,5с dec Tbin brne CSIloop CSIEnd: sbi PORTB,PB_U0 ; Отпустить кнопку ЧАС ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма формирования Ы(мин) импульсов в РВ_мин U1 ;/////////////////////////////////////////////////////////////////////////// MinSerlmp: mov TBin,CtMin andi TBin,0x0f mov TBCDH,CtMin andi TBCDH,0x70 swap TBCDH rcall BCDtoBIN cpi Tbin,0 breq MSIEnd MSIloop: cbi PORTB,PB_Ul ; Нажать кнопку МИН rcall del05s ; на 0,5с dec Tbin brne MSIloop MSIEnd: sbi PORTB,PB_Ul ; Отпустить кнопку МИН
18. Автоматический корректор часов 339 ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 0,5 с ;/////////////////////////////////////////////////////////////////////////// del05s: ;ret ;;; ret для режима отладки ldi TEMPDEL, 16 del05s_loop: ldi TEMP, OxFF-243 ; Предустановка таймера out TCNTO, TEMP del05s_wait: in TEMPPP,TCNT0 cpi TEMPPP,0 brne del05s_wait dec TEMPDEL brne del05s_loop ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма задержки на 3 с ;/////////////////////////////////////////////////////////////////////////// del3s: ldi TEMPDEL, 6 del3s_loop: dec TEMPDEL brne del3s_loop ret ; Подпрограммы записи/чтения данных по любому адресу CMOS ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@§@@@@@@@@@@@@@@@@@@@@@ ; Подпрограмма записи данных по любому адресу в CMOS ; Вход: ZL-адрес ТЕМР-данные ; Выход: TIME ; Используются: Z, TEMP2, ТЕМРЗ PPWRCMOS: mov TEMPPP,TEMP ; сохранить данные I2CSTART ;{ СТАРТ } ldi ТЕМР,0Ь10100000 ;{ SLAVE+/W } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } mov TEMP,ZL ;{ АДРЕС ЯП } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } mov TEMP,TEMPPP ;{ ДАННЫЕ } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } I2CSTOP ;{ СТОП } ret
340 Глава 2. Устройства на контроллерах ; Подпрограмма чтения данных по любому адресу из CMOS ; Вход: ZL-адрес ; Выход: ТЕМР-данные ; Используются: Z, TEMP2, ТЕМРЗ PPRDCM0S: I2CSTART ;{ СТАРТ } ldi ТЕМР,0Ы0100000 ;{ SLAVE+/W } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } mov TEMP,ZL ;{ АДРЕС ЯП } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } I2CSTART ;{ СТАРТ } ldi ТЕМР,0Ь10100001 ;{ SLAVE+ R } rcall PPI2WRBYTE I2CRDBIT ;{ АСК } rcall PPI2RDBYTE /данные читать mov TEMPPP,TEMP ;и сохранить ldi ТЕМР2Д I2CWRBIT ;{ АСК write} I2CST0P ;{ СТОП } mov ТЕМРДЕМРРР /данные восстановить ret ; Подпрограмма передачи БАЙТА по интерфейсу I2C ? Вход: TEMP ; Выход: ТЕМР2 мл.бит=данные ; Используются: ТЕМРЗ PPI2WRBYTE: ldi ТЕМРЗ,8 ;8 бит PPI2WRBY0: /Передача старшим битом вперед bst ТЕМР,7 ;Т=ТЕМР(бит7) bid ТЕМР2,0 ;ТЕМР2(битО)=Т andi ТЕМР2Д /Только бит 0 оставить I2CWRBIT /ТЕМР2 битО=данные lsl TEMP ;<-7...0<-0 dec ТЕМРЗ brne PPI2WRBY0 ret ; Подпрограмма приема БАЙТА по интерфейсу I2C ; Вход: ТЕМР2 мл.бит=данные ; Выход: TEMP ; Используются: ТЕМРЗ
18. Автоматический корректор часов 341 PPI2RDBYTE: ldi ТЕМРЗ,8 ;8 бит clr TEMP /Очистить приемник PPI2RDBY0: I2CRDBIT ;ТЕМР2 битО=данные lsl TEMP ;Сдвиг влево or ТЕМР,ТЕМР2 ; Накопить данные dec ТЕМРЗ ; Проверить счетчик бит brne PPI2RDBY0 ret ; Подпрограмма задержки на 5 мкс del5mks:ldi TEMPDEL,14 del5mks_loop: dec TEMPDEL brne del5mks_loop ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма преобразования бинарного кода в двоично-десятичном код (BCD) ;/////////////////////////////////////////////////////////////////////////// BINtoBCD: clr TBCDH ; Очистить MSD bBCDO: subi TBin,10 ; вход = вход - 10 brcs bBCDl ; прервать если заем inc TBCDH ; MSD+1 rjmp bBCDO ; повтор bBCDl: subi TBin,-10 ; воостановить 10 единиц ret ;/////////////////////////////////////////////////////////////////////////// ; Подпрограмма преобразования двоично-десятичного кода (BCD) в бинарный код ;/////////////////////////////////////////////////////////////////////////// BCDtoBIN: BCDbO: subi TBCDH ,1 ; MSB=MSB - 1 brcs BCDbl ; Если переноса нет subi Tbin,-10 ; выход = выход + 10 rjmp BCDbO ; повторить BCDbl: Clr TBCDH ret ; Иначе выход ;/////////////////////////////////////////////////////////////////////////// ;########################## Начало программы ################################## MAIN: cbi PORTB,PB_U2 ; Сброс часов на 1,5 с rcall del05s rcall del05s rcall del05s sbi PORTB,PB_U2
342 Глава 2. Устройства на контроллерах sbic PIND;PD_SB1 ; Кнопка УСТ нажата? rjmp SetTime ; Нет - установить время SetChs: ; Да - установить CMOS rcall CtChsInc ; Счетчик часов увеличить на 1 cbi PORTB,PB_U0 ; Нажать кнопку ЧАС rcall del05s ; на 0,5с sbis PIND,PD_SB1 ; Кнопка УСТ нажата? rjmp SetChs ; Да - повтор ; Нет- установка минут sbi roRTB,PB_U0 ; Отпустить кнопку ЧАС rcall del3s ; Задержка 3 с sbic PIND,PD_SB1 ; Кнопка УСТ нажата? rjmp SetWr ; Нет- конец установки SetMin: ; Да - установить CMOS rcall CtMinlnc ; Счетчик минут увеличить на 1 cbi PORTB,PB_Ul ; Нажать кнопку МИН rcall del05s ; на 0,5с sbis PIND,PD_SB1 ; Кнопка УСТ нажата? rjmp SetMin ; Да - повтор sbi PORTB,PB_Ul ; Нет- Отпустить кнопку МИН SetWr: ; Записать в CMOS время ;//////////////////////////////////////// ; Запись в CMOS минут и часов / ;//////////////////////////////////////// ldi ZL,0x03 ; Адрес минут mov TEMP,CtMin ; данные rcall PPWRCMOS ; записать ldi ZL,0x04 ; Адрес часов mov TEMP,CtChs ; данные rcall PPWRCMOS ; записать ;//////////////////////////////////////// rjmp ProgEnd ; конец записи - спать SetTime: ; Установка времени ;//////////////////////////////////////// ; Чтение из CMOS минут и часов ;//////////////////////////////////////// ldi ZL,0x03 ; Адрес минут rcall PPRDCMOS ; читать mov CtMin,TEMP ; данные ldi ZL,0x04 ; Адрес часов rcall PPRDCMOS ; читать mov CtChs,TEMP ; данные ;//////////////////////////////////////// rcall ChsSerlmp ; Выдать Ы(час) импульсов в РВ_час U0 rcall MinSerlmp ; Выдать Ы(мин) импульсов в РВ_мин U1 ProgEnd: sleep ; Спать rjmp MAIN ; В начало ;########################## Конец программы ##################################
18. Автоматический корректор часов 343 Перед установкой корректора в корпус часов необходимо запрограммировать микроконтроллер. Это можно сделать любым доступным внутрисхемным программатором. Некоторые программаторы со схемами и программным обеспечением представлены на русскоязычном сайте фирмы «Atmel» по адресу http://www.atmel.ru/Hardware. Готовый к употреблению программатор AVR Prog, поддерживаемый программной средой известного пакета AVR Studio, можно купить в Интернет-магазине на сайте http://www.xxivek.narod.ru. Прошивка для программирования микроконтроллера в НЕХ-формате приведена далее. Прошивка для программирования микроконтроллера :020000020000FC :080000002ВС01ЕС021С024С06А :1000200020616В313230306520202076312Е302037 :1000300020204F2E442E56616C70612028432920C9 :10004000FFB60000FFBE1895FFB60000FFBE189572 : 10005000FFB60000FFBE189507E001BDA89505E0BA :1000600003BFOFE002BFOFEF08BBOFE007BBOFEFAE :100O70O002BBO0E601BB00E305BFOOEB08B9EE27B9 :1000800000270083E395EE31E1F7F8941EC18395D4 :10009000382F3F703A3019F4807F30E1830F84327B :1000A00009F4882708957395372F3F703A3019F473 :1000B000707F30E1730F703609F477270895582F59 :1000C0005F70682F60736295FAD0503021F0C0984D :1000D00012D05A95E1F7C09A0895572F5F70672F95 :1000E00060776295ECD0503021F0C19804D05A95D9 :1000F000E1F7C19A089540E10CE002BF32B7303019 :10010000E9F74A95C9F7089546E04A95F1F7089549 :10011000302F8D9A969A959AC7D0969A9598C4D072 :1001200096989598C1D000EA97D08D989698959A10 : 10013000BBD0969A959AB8D0859911E0859B1127E6 :100140009698959AB1D00E2F87D08D989698959ABB :10015000ABD0969A959AA8D0859911E0859B1127E6 :100160009698959AA1D0032F77D08D989698959AC6 :100170009BD0969A959A98D0859911E0859B1127E6 :100180009698959A91D08D9A969895988DD0969AA2 :1001900095988AD0969A959A87D008958D9A969A2E :1001A000959A82D0969A95987FD0969895987CD07B :1001B00000EA52D08D989698959A76D0969A959A0C :1001C00073D0859911E0859B11279698959A6CD0EC :1001DO0OOE2F42D08D989698959A66DO969A959AB9 :1001E00063D0859911E0859B11279698959A5CD0EC :1001F0008D9A969A959A58D0969A959855D09698A1 :10020000959852D001EA28D08D989698959A4CD01E :10021000969A959A49D0859911E0859B11279698D1 :10022000959A42D02CD0302F11E08D9A969810FDDF
344 Глава 2. Устройства на контроллерах :10023000959A10FF959838D0969A36D0969834D0E3 :100240008D9A9tf98959830D0969A95982DD0969AA2 :10025000959A2AD0032F089528E007FB10F9117012 :100260008D9A969810FD959A10FF95981DD0969AA4 :100270001BD0969819D0000F2A9579F7089528E099 :1002800000278D989698959A0FD0969A959A0CD0AB :10029000859911E0859B11279698959A05D0000FB6 :1002A000012B2A9571F708954EE04A95F1F70895CC :1002B00066275A5010F06395FCCF565F0895615041 :1002C00010F0565FFCCF66270895C29814DF13DF45 :1002D00012DFC29A829916C0DADEC0980CDF829BC8 : 1002E000FBCFC09A11DF829906C0DDDEC19803DF23 :1002F000829BFBCFC19AE3E0072F0ADFE4E0082FDF :1003000007DF08C0E3E04ADF702FE4E047DF802F1B :08031000D6DEE3DE8895D9CFAB :00000001FF Данный корректор установлен мной на электронные часы, входящие в состав трехпрограммного приемника АЯН-301. В качестве питающего было использовано внутреннее напряжение питания 25 В электронных часов, которое подключается к выводам 1 (плюс) и 2 (минус) корректора. Выводы 11 и 12 корректора подключаются параллельно контактам 5 и 3 кнопки SA1.2 Ч электронных часов соответственно. Выводы 9 и 10 — параллельно контактам 5 и 3 кнопки SA1.1 М, а выводы 7 и 8 — параллельно контактам 5 и 3 кнопки SA1.3 К электронных часов. Поскольку оптрон корректора полярный, не забудьте определить полярность на контактах кнопок электронных часов, на которые вы будете устанавливать корректор, чтобы избежать обратного приложения напряжения на оптрон. В противном случае он не будет коммутировать ток, а станет имитировать нажатие кнопок. После подключения корректора к электронным часам и их включения необходимо установить время в самом корректоре. Это делается следующим образом. Выключите электронные часы и, удерживая кнопку SB1 в нажатом состоянии, вновь включите часы. При этом контроллер корректора вначале обнулит показания электронных часов, замыкая контакты кнопки К на 1,5 с. Затем он замкнет контакты кнопки Я и будет удерживать их до тех пор, пока будет нажата кнопка SB1. При этом электронные часы производят автоматическое увеличение значения своих часов с периодичностью 0,5 с, а корректор производит внутренний счет энергонезависимых часов с такой же периодичностью. Показания электронных часов начнут изменяться в сторону увеличения. По показаниям электронных часов следите за ходом установки. При достижении необходимого значения часов отпустите кнопку SB1 и вновь на-
18. Автоматический корректор часов 345 жмите ее через 0,5—2,5 с. Через 3 с корректор замкнет контакты кнопки М, и начнется установка минут аналогично установке часов. При достижении необходимого значения минут отпустите кнопку. Теперь внутренние часы корректора установлены, как, впрочем, и время на самих электронных часах; можно не переживать за перебои в подаче электроэнергии. При любом таком сбое корректор сам автоматически установит ваши часы. Вот так современная техника приходит на помощь своим старым прототипам, и ретроустройства обретают новую жизнь. Кстати сказать, большинство современных телевизоров и видеомагнитофонов, имеющих встроенные часы, также страдают недостатком отсутствия их энергонезависимости. Возможно, прочитав этот раздел, у некоторых читателей появятся идеи и решения о том, как устранить этот недостаток с помощью, например, автоматизированного пульта дистанционного управления. Таким читателям я желаю удачи на поприще современной электронной науки.
346 Глава 2. Устройства на контроллерах 19. PIC-контроллер в автомобильных часах PIC-контроллеры применяются в настоящее время во многих областях науки и техники благодаря своим привлекательным характеристикам, простоте, доступной цене и др. качествам. Одним из таких применений я предлагаю воспользоваться для ремонта кварцевых стрелочных часов, установленных в автомобилях марки ВАЗ 2106. Бывает так, что электронная микросхема (ЧИП), которая устанавливается в кварцевых автомобильных стрелочных часах, выходит из строя, и заменить ее нечем, поскольку она выполнена в виде «черной кляксы» без каких-либо обозначений. Благо, что электронная часть этих часов состоит все лишь из нескольких элементов, и ее схему легко понять. Принципиальная схема этих часов приведена на Рис. 19.1. Рис. 19.1. Принципиальная схема часов Согласно схеме шаговым двигателем М управляет микросхема ЧИП через выводы 1 и 2. ЧИП работает на частоте кварца BQ1. На транзисторе VT1 и элементах Rl, C1 и VD2 выполнен стабилизатор напряжения на 6 В. Диод VD1 защищает схему от перепутывания полярности питания при неправильном включении. Мне необходимо было разработать устройство, которое заменило бы неисправный ЧИП и смогло бы формировать импульсы в соответствии с временной диаграммой, приведенной на Рис. 19.2. Эта диаграмма была получена с таких же, но исправных часов. Управляющие импульсы приводят в действие шаговый двигатель М один раз в секунду на полоборота. Обмотка двигателя имеет сопротивление 300 Ом, и при напряжении стабилизатора 6 В импульсы тока в обмотке двигателя достигают 20 мА. Разработать простой электронный эквивалент из цифровых микросхем не удалось. Тем более, что необходимо было обеспечить высокую точность хода. Для замены ЧИП-элемента надо было
19. PIC-контроллер в автомобильных часах 347 применить не менее трех корпусов микросхем, да еще пару транзисторов и несколько дискретных элементов. Вот тогда я и решил воспользоваться Р1С-контроллером. Рис. 192. Временная диаграмма импульсов Благо, система команд у него состоит всего из 33 операторов, и их можно изучить очень быстро. Кроме того, PIC-контроллер позволяет легко подключать кварц и имеет мощные выходы (до 25 мА) уровней логической единицы и нуля. Вдобавок ко всему, он имеет встроенный сторожевой таймер, который восстанавливает работу контроллера в случае «зависания», например при случайном сбое от электрической помехи. Я разработал схему на PIC-контроллере PIC16F84 (он оказался одним из самых распространенных), оставив без изменений стабилизатор часов и используя имеющийся в них кварц, который формирует частоту 32768 Гц. Принципиальная электрическая схема разработанного устройства приведена на Рис. 19.3. Элементы, размещеные на печатной плате часов, обведены на рисунке пунктирной линией. Неисправный ЧИП часов аккуратно снимается горячим паяльником. Вся схема нового устройства распаивается на небольшой макетной плате и подключается к стабилизатору часов четырьмя проводниками (два провода питания и два провода управления). Кроме того, необходимо заменить стабилитрон VD2 на КС156 для снижения напряжения питания, поскольку для PIC-контроллера допустимый диапазон напряжения от 3 до 6 В и не следует эксплуатировать контроллер на верхнем диапазоне питания. В схеме применены доступные элементы. Резистор R2 любого типа имеет номинал от 10 до 39 кОм мощностью 0,125 Вт. Фильтрующий керамический конденсатор С2 емкостью от 0,1 до 1,0 мкФ, конденсаторы СЗ, С4 от 68 до 100 пФ типа К10-17. Элементы СЗ, С4 и BQ1 при монтаже необходимо расположить как можно ближе к выводам 15,16 микросхемы D1, а конденсатор С2 ближе к выводам питания контроллера. Это общепринятые правила монтажа цифровых устройств.
348 Глава 2. Устройства на контроллерах Рис. 193. Принципиальная электрическая схема разработанного устройства Прежде чем припаять микросхему PIC-контроллера на плату, ее следует запрограммировать на любом программаторе, который программирует PIC-контроллеры PIC16F84. Для этого подойдут программаторы «СТЕРХ», «PICPROG» и др. Ниже приведены прошивки для программирования контроллера в НЕХ-формате и в двоичном коде. Прошивка для программирования контроллера в НЕХ-формате :020000000528D1 :080008001F28640003018C00B5 :100010008D0055388E00813081008316F3308500C5 :10002000С5308100А0308В00831264000С1С1528А1 :100030000C100E08850031200301850015288F0063 :100040000C148D0A0E08FF3A8E000C3091006400EB :10005000910B272800000000813081000B110F0850 :0E0060000900273090006400900B3328080040 :084000000100020003000400AE :02400E000400AC :00000001FF
19. PIC-контроллер в автомобильных часах 349 Прошивка для программирования контроллера в двоичном коде 000000:05 28 00 00 00 00 00 00 IF 28 64 00 03 01 8С 00 000010: 8D 00 55 38 8Е 00 81 30 81 00 83 16 F3 30 85 00 000020: С5 30 81 00 АО 30 8В 00 83 12 64 00 ОС 1С 15 28 000030: ОС 10 0Е 08 85 00 31 20 03 0185 00 15 28 8F 00 000040: ОС 14 8D 0А 0Е 08 FF ЗА 8Е 00 ОС 30 91 00 64 00 000050: 91 0В 27 28 00 00 00 00 81 30 8100 0В 11 OF 08 000060:09 00 27 30 90 00 64 00 90 OB 33 28 08 00 00 00 При программировании укажите тип генератора LP и установите биты разрешения работы сторожевого таймера и задержки включения в состояние ON. Бит защиты микросхемы от считывания может быть в произвольном состоянии. Однако хочу предупредить — если бит защиты будет разрешен, вы не сможете проверить, удачно ли прошита микросхема, поэтому рекомендую установить его в состояние OFF. Это позволит убедиться, что контроллер запрограммирован правильно. К тому же нет смысла защищать опубликованную программу. На Рис. 19.4 приведена копия экрана программатора «СТЕРХ». Из нее видно, какое состояние у перечисленных выше бит должно быть установлено. Схема не требует настройки и при правильной сборке начинает работать сразу после включения. После сборки и проверки всей конструкции она помещается в корпус часов. Все навесные элементы необходимо изолировать от металлического корпуса часов любым подходящим изоляционным материалом. Ниже приведен исходный текст программы с комментариями. На примере данной программы видно, как легко реализо- вывать подобные разработки и применять контроллер для решения других задач.
350 Глава 2. Устройства на контроллерах Рис. 19.4. Копия экрана программатора «СТЕРХ» Текст программы для контроллера ; Программа AVT0TIME для процессора PIC16F84 позволяет произвести ; замену электронного кристалла, формирующего управляющие импульсы для ; запуска импульсного двигателя автомобильных часов моделей Жигули ; ВАЗ-2106 и подобных им ; Автор: О.Д. Вальпа ; Частота КВАРЦА=32768 Гц list p=16f84 #include pl6f84.inc ; Конфигурация кварца, задержки при вкл. ; разреш. стор. тайм., кода защиты _C0NFIG _LP_0SC & _PWRTE_0N & _WDT_0N & _CP_0N ?Регистры FLAG equ H'OC' ; Регистр флагов SET1S equ H'O' ; Бит регистра FLAG COUNT equ H'OD' ; Регистр счетчика DATAX equ H'OE' ; Регистр данных PUSH equ H'OF' ; Регистр сохранения аккумулятора W DELO equ H'10' ; Регистр О задержки
19. PIC-контроллер в автомобильных часах 351 DELI equ Н'1Г ; Регистр 1 задержки /Данные DATATIM equ H'81' ;NNh-Ha4. уст. таймера (FFh-NNh) DATADO equ H'27' ;константа п/п задержки 20мс DATAD1 equ Н'ОС' ;константа п/п задержки х м org 0 /Вектор сброса goto ink org 4 /Вектор прерывания goto interupt / Инициализация регистров процессора ink clrwdt ; Сброс собаки clrw ; W=0 movwf FLAG ; FLAG=0 movwf COUNT ; COUNT=0 iorlw H'55' ; W=55 movwf DATAX ; DATAX=55 movlw DATATIM ; W=Ha4. знач. таймера movwf TMRO ; Загрузить таймер bsf STATUS,RPO ; Перекл. на банк1 movlw В'11110011' ; Порты RA2 RA3 на вывод movwf TRISA movlw В'11000101' ; Предв. дел. = 64 movwf OPTION.REG movlw В'10100000' ? Разреш. прерыв. movwf INTCQN bcf STATUS,RPO ; Перекл. на банкО ; Начало программы main clrwdt ; Сброс собаки btfss FLAG,SET1S ; Прошла 1с ? goto main ; Нет bcf FLAG,SET1S ; Да, сброс флага SET1S movf DATAX,W ; W=DATAX movwf PORTA ; PORTA=W metl call d20ms ; Зад. 20 мс clrw ; Обнулить movwf PORTA ; PORTA met2 goto main ; Зациклиться ; Подпрограмма обработки прерывания таймера interupt movwf PUSH ; Сохранить W
352 Глава 2. Устройства на контроллерах bsf FLAG,SET1S ; Установить флаг SET1S incf COUNT,F , ; Счетчик увеличить на 1 movf DATAX,W ; W=DATAX xorlw H'Off ; инверсия W movwf DATAX ; DATAX=W ; Доп. задержка до 1с movlw DATAD1 ; W=DATAD1 movwf DELI ; DEL1=W dopdel clrwdt ; Сброс собаки decfsz DEL1,F ; DELI = 0 ? goto dopdel nop ; Пустая команда nop movlw DATATIM ; Загрузить таймер movwf TMRO bcf INTCON,TOIF ; Сбросить флаг прерыв. movf PUSH,W ; Восстановить W ret fie ; Возврат из прерывания ; Подпрограмма задержки на 20мс d20ms movlw DATADO ; W=DATAD0 movwf DELO ; DEL0=W d20msl clrwdt ; Сброс собаки decfsz DEL0,F ; DELO = 0 ? goto d20msl ; Нет return ; Да-возврат из п/п end
Глава 3 Тестовые устройства и программы 20. Плата диагностики POST В качестве инструмента для поиска неисправности персонального компьютера IBM PC часто используется плата диагностики POST. О том, что это такое и как ее самостоятельно изготовить, говорится в этом разделе. При включении или перезапуске IBM-совместимого компьютера его процессор работает под управлением программы BIOS (Base Input Output System — базовой системы ввода-вывода), которая записана и хранится в постоянном запоминающем устройстве (ПЗУ) компьютера. Сначала выполняется диагностическая часть программы BIOS под названием POST (Power On Self Test — самотестирование по включению питания). Эта программа тестирует и инициализируют аппаратные средства компьютера, такие, как память, процессор, материнская плата, видеоконтроллер, клавиатура, гибкий и жесткий диски и т. д., перед загрузкой операционной системы. Данная процедура позволяет убедиться в работоспособности компьютера и предотвращает работу на неисправном компьютере, которая может привести к потере данных, хранимых на нем. Код тестирования, формируемый программой POST, выводится в виде байта в порт ввода-вывода компьютера по определенному адресу, определяемому фирмой-производителем BIOS (обычно по адресу 0x80 HEX), по мере прохождения теста. Это делается для того, чтобы еще до инициализации видеоконтроллера и отображения информации на экрае монитора можно было получить информацию о прохождении теста компьютера. Ведь в случае неисправности некоторых узлов компьютера изображение может вообще отсутствовать. Кроме того, при обнаружении неисправности во время тестирования программа POST останавливается и выдает код останова в виде звуковых сигналов (гудков) через внутренний динамик компьютера. Это позволяет определить, в каком месте произошла остановка компьютера, и облегчает поиск неисправности.
354 Глава 3. Тестовые устройства и программы Коды POST определяются фирмой производителем BIOS. В настоящее время наиболее распространены компьютеры с BIOS фирмы AWARD. В Табл. 20.1 приведены описания кодов POST данной фирмы для одной из версий BIOS в оригинале и переводе на русский язык.
20. Плата диагностики POST 355 Таблица 20.1. (Продолжение) Код 1 2Fh 1 30h 32h 1 33h 36h 38h 3Ah 1 3Ch 1 3Dh 42h 45h 46h 48h 49h 4Ah 4Bh 4Ch 4Eh 50h 51h 52h 54h 58h 59h 5Ah 5Bh 5Ch 60h 62h 64h 66h 67h 68h 69h 6Ah 1 6Bh 1>док 1-4-1-1 2-1-2-3 2-2-3-1 Описание на английском языке Enable cache before system BIOS shadow RAM failure on data bits xxxx of high byte of memory bus Test CPU bus-clock frequency Initialize Phoenix Dispatch Manager Warm start shut down Shadow system BIOS ROM Autosize cache Advanced configuration of chipset registers Load alternate registers with CMOS values Initialize interrupt vectors POST device initialization Check ROM copyright notice Check video configuration against CMOS ] nitialize PCI bus and devices Initialize all video adapters in system OuietBoot start (optional) Shadow video BIOS ROM Display BIOS copyright notice Display CPU type and speed Initialize EISA board Test keyboard Set key click if enabled Test for unexpected interrupts Initialize POST display service Display prompt «Press F2 to enter SETUP» Disable CPU cache Test RAM between 512 and 640 KB Test extended memory Test extended memory address lines Jump to UserPatchl Configure advanced cache registers Initialize Multi Processor APIC Enable external and CPU caches Setup System Management Mode (SMM) area Display external L2 cache size Load custom defaults (optional) Описание на русском языке Разрешение кэш до затенения системного BIOS Отказ RAM на битах данных хххх старшего байта шины памяти Тест частоты шины часов CPU Инициализация менеджера отправки Отключение теплого старта Затенение системного BIOS ROM Авто определение размера кэш Предоставление конфигурации регистров набора чипов Загрузка альтернативных регистров значениями из CMOS Инициализация векторов прерываний Инициализация устройств POST Проверка авторских записей ROM Проверка видеоконфигурации в CMOS Инициализация шины PCI и устройств Инициализация всех видеоадаптеров системы Быстрый перезапуск (не обязательно) Затенение видео BIOS ROM Отображение авторских записей BIOS Отображение типа и скорости CPU Инициализация платы EISA Тест клавиатуры Установка параметров клавиатуры, если разрешено Тест для неожиданных прерываний Инициализация сервиса отображения POST Отображение приглашения «Нажмите F2, чтобы войти в SETUP» Запрет кэш CPU Тест RAM между 512 и 640 Кбайт Тест расширенной памяти Тест адресных линий расширенной памяти Переход на пользовательскую часть 1 Конфигурирование доступа кэш регистров Инициализация много процессорного режима Разрешение внешнего кэш CPU Установка области режима SMM Отображение размера внешнего кэш L2 Загрузка по умолчанию (не обязательно)
356 Глава 3. Тестовые устройства и программы Таблица 20.1. (Продолжение) 1 6Ch 1 6Eh 70h 72h 76h 1 7Ch 1 7Eh 1 80h 1 81h 1 82h 83h 84h 1 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Fh 90h 91h 92h 93h 95h 96h 97h 98h 1-2 Display shadow-area message Display possible high address for UMB recovery Display error messages Check for configuration errors Check for keyboard errors Set up hardware interrupt vectors Initialize coprocessor if present Disable onboard Super I/O ports and IROs Late POST device initialization Detect and install external RS232 ports Configure non-MCD IDE controllers Detect and install external parallel ports Initialize PC-compatible PnP ISA devices Re-initialize onboard I/O ports. Configure Motheboard Configurable Devices (optional) Initialize BIOS Data Area Enable Non-Maskable Interrupts (NMIs) Initialize Extended BIOS Data Area Test and initialize PS/2 mouse Initialize floppy controller Determine number of ATA drives (optional) Initialize hard-disk controllers Initialize local-bus hard-disk controllers Jump to UserPatch2 Build MPTABLE for multiprocessor boards Install CD ROM for boot Clear huge ES segment register Fixup Multi Processor table Search for option ROMs. One long, two short beeps on checksum failure Отображение сообщения теневой 1 области Отображение сообщения UMB Отображение прочих сообщений 1 Проверка ошибок конфигурации 1 Проверка ошибок клавиатуры 1 Установка векторов аппаратного 1 прерывания Инициализация сопроцессора, если 1 присутствует Запрет на плате суперпортов ввода/ 1 вывода и прерываний Последующая POST инициализация 1 устройств Обнаружение и установка внешних 1 портов RS232 Конфигурирование не MCD IDE I контроллеров Обнаружение и установка внешних 1 параллельных портов Инициализация PC-совместимых | устройств PnP ISA устройств Переинициализация портов ввода/ вывода Конфигурирование перестраиваемых 1 устройств материнской платы (не обязательно) Инициализация области данных BIOS Разрешение немаскируемых прерываний Инициализация расширенной области 1 данных BIOS Тест и инициализация мышки PS/2 1 Инициализация контроллера дисковода 1 Определение числа накопителей ATA I (не обязательно) Инициализация контроллеров жесткого 1 диска Инициализация локальной шины 1 контроллеров жестких диска Переход на пользовательскую часть 2 1 Формирование таблицы MPTABLE I для многопроцессорных плат Установка CD ROM для загрузки Очистка глобального сегментного регистра ES Фиксация много процессорной таблицы Поиск расширения ROM. Один длинный, два коротких гудка при ошибке контрольной суммы
20. Плата диагностики POST 357 Таблица 20.1. (Продолжение)
358 Глава 3. Тестовые устройства и программы Таблица 20.1. (Продолжение) Код E3h E4h E5h E6h E7h E8h E9h EAh EBh ECh EDh EEh EFh FOh Flh F2h F3h F4h F5h F6h I F7h Гудок 1 Описание на английском языке Initialize system timer Initialize system I/O Check force recovery boot Checksum BIOS ROM Go to BIOS Set Huge Segment Initialize Multi Processor Initialize OEM special code Initialize PIC and DMA Initialize Memory type Initialize Memory size Shadow Boot Block System memory test Initialize interrupt vectors Initialize Run Time Clock Initialize video Initialize System Management Mode Output one beep before boot Boot to Mini DOS Clear Huge Segment Boot to Full DOS Описание на русском языке Инициализация системного таймера Инициализация системы ввода/вывода Проверка принудительной загрузки Контрольная сумма BIOS ROM Переход на BIOS I Установка глобального сегмента Инициализация многопроцессорного 1 режима Инициализация специального кода 1 OEM Инициализация PIC и DMA I Инициализация типа памяти 1 Инициализация размера памяти 1 Затенение блока загрузки 1 Тест системной памяти 1 Инициализация векторов прерываний Инициализация «Время Выполнения Часов» Инициализация видео 1 Инициализация режима управления 1 системой Выход и один гудок перед загрузкой 1 Загрузка мини DOS I Очистка глобального сегмента 1 Загрузка полного DOS __ | Гудки формируются следующим образом. 8-битовый код ошибки делится на четыре двухбитовые группы. Каждая группа озвучивается количеством гудков, представленных в группе, плюс один. Между группами формируется пауза, длительностью три гудка. Например, код ошибки 16h = 00-01-01-10 = 1-2-2-3 = 1 гудок + пауза + 2 гудка + пауза + 2 гудка 4- пауза + 3 гудка. Однако озвучивание кода ошибки происходит не во всех точках останова, и для того чтобы определить точку останова, необходимо иметь специальную плату диагностики POST. Плата диагностики представляет собой устройство вывода, подключаемое к персональному компьютеру через интерфейс ISA. Структурная схема платы диагностики приведена на Рис. 20.1.
20. Плата диагностики POST 359 Рис 20.1. Структурная схема платы диагностики Рис. 20.2. Принципиальная электрическая схема платы диагностики
360 Глава 3. Тестовые устройства и программы Плата состоит из регистра диагностики RG, доступ к которому со стороны интерфейса ISA осуществляется с помощью дешифратора DC. Регистр выдает записанные в него данные на единичные индикаторы LED. Плата диагностики POST разработана автором всего на одной микросхеме программируемой логической интегральной схемы (ПЛИС) типа XC9536-15VQ44C фирмы XILINX. Данная микросхема имеет достаточно большую степень интеграции C6 ячеек памяти, 180 логических элементов и 34 программируемых вывода), доступную цену (менее 3 долларов) и возможность ее многократного перепрограммирования (до 100 тысяч раз). Устройства, разработанные на ее базе, реализуют довольно емкие схемы и легко модифицируются посредством перепрограммирования без изменения топологии печатной платы. Путем перепрограммирования ПЛИС легко изменяется логика работы устройства, его адрес и др. схемные особенности. Принципиальная электрическая схема платы диагностики приведена на Рис. 20.2, а перечень элементов схемы приведен в Табл. 20.2. Таблица 202. Элементы схемы Позиционное обозначение CI—C5 СР1 D1 RO—R8 HL1—HL8 Наименование Количество ЧИП конденсаторы 0805 0,1 мкФ 5 Конденсаторы электролитические SR-25-10 1 Микросхемы XC9536-15VQ44C 1 ЧИП-резистор 0805 1кОм 9 Светодиоды L-934HC 8 Примечание 10 мкФ 6,3 В Красный На этой схеме представлены лишь связи между элементами и не видна логика работы схемы. Дело в том, что вся схемотехника скрывается в микросхеме ПЛИС D1. Поскольку ПЛИС определяет всю работу платы, для нее разработана отдельная принципиальная схема с помощью системы автоматизированного проектирования (САПР) «Xilinx Foundation Project Manager», который доступен в Интернет по адресу www.xilinx.com. Схема для ПЛИС приведена на Рис. 20.3.
20. Плата диагностики POST 361 Рис. 203. Схема для ПЛИС На этой схеме все элементы представлены в американском стандарте, поскольку САПР разработан в англоязычной стране. Однако к этим обозначениям довольно легко привыкнуть. Согласно схеме дешифратор адреса выполнен на простых логических элементах, регистр диагностики представляет собой сборку FD8CE наподобие интегральной микросхемы. Аналогично выглядят буферные элементы. Поскольку схемотехника данного устройства получилась очень простой, я добавил в схему дополнительный восьмиразрядный счетчик СВ8СЕ, который считает импульсы синхронизации CLK с шины ISA и доступен при чтении по тому же адресу, что и регистр диагностики. Это позволяет использовать плату не только для диагностики компьютера, но и в качестве аппаратного счетчика задержки там, где это потребуется. Аналогично можно вносить и другие дополнения в схемотехнику платы (изменение адреса, дополнение регистрами и т. д.), не изменяя при этом топологии печатной платы, а лишь перепрограммируя
362 Глава 3. Тестовые устройства и программы ПЛИС. В этом и заключается одно из прекрасных преимуществ ПЛИС перед стандартными логическими микросхемами. Для платы диагностики мной была разработана топология двусторонней печатной платы в САПР PCAD 4.5. Сборочный чертеж данной платы и ее топология со стороны установки компонентов и с обратной стороны приведены на Рис. 20.4, Рис. 20.5 и Рис. 20.6. Рис 20.4. Сборочный чертеж платы Рис 20.5. Топология платы со стороны установки компонентов
20. Плата диагностики POST 363 Рис. 20.6. Топология платы с обратной стороны Рис. 20.7. Схема программатора ПЛИС
364 Глава 3. Тестовые устройства и программы После распайки всех элементов на плате необходимо запрограммировать ПЛИС. Это делается с помощью того же пакета САПР ХШпх и небольшого пгх)фамматораДТАО,подключаемогок1Л^ можно изготовить самостоятельно на небольшой макетной плате. В дальнейшем пакет САПР и программатор JTAG пригодятся для интересной работы по применению ПЛИС в других проектах. Схема программатора JTAG свободно доступна на приведенном выше сайте. Несколько модифицированная мною схема данного программатора приведена на Рис. 20.7. Все резисторы на этой схеме мощностью 0,125 Вт. Конденсаторы любые керамические. Диоды можно заменить на отечественные КД522Б. Вместо микросхем Ul, U2 можно применить отечественные аналоги К555ЛП8. Если нет желания изучать САПР, можно воспользоваться готовым файлом для программирования post.jed, доступным на сайте издательства и компакт-диске для данной книги. В этом случае для программирования достаточно будет скачать с сайта фирмы XILINX только программу программатора. Перед программированием порт LPT персонального компьютера должен быть установлен в режим работы ЕРР с помощью SETUP компьютера. Программатор подключается с одной стороны к LPT- порту компьютера, а с другой к плате диагностики через разъем Л. Плата диагностики должна быть подключена к источнику постоянного тока +5 В непосредственно перед началом процедуры программирования, поскольку программатор питается от программируемого устройства. Питание можно подать на питающие цепи платы с помощью зажимов типа «крокодил». После запуска программатора на экране монитора должно появиться изображение, показанное на Рис. 20.8.
20. Плата диагностики POST 365 Нажмите на клавиатуре компьютера клавиши Ctrl+D, и программа предложит вам выбрать файл для программирования с расширением jed. Найдите на компьютере файл post.jed, скопированный ранее из Интернета или с компакт-диска, и согласитесь с его открытием. На экране появится схема подключения ПЛИС. Щелкните левой кнопкой мыши на рисунке корпуса ПЛИС и выберите в меню Operations команду Program. Установите флажки в пунктах Erase Before Programming и Verify, если они не были установлены, и нажмите программную ОК. Далее следуйте инструкциям, появляющимся на экране. Если вы будете изготавливать программатор самостоятельно, учтите, что длина кабеля до разъема программирования не должна превышать 15 см, а до LPT-порта — 1500 см. Плату программатора можно разместить в небольшой пластиковой коробочке подходящего размера. Для удобства пользования программатором кабель подключения к LPT-порту лучше изготовить отдельно. В дальнейшем он пригодится для других работ. Схема такого кабеля приведена на Рис. 20.9. Назначение цепей кабеля приведено в Табл. 20.3. Рис 20.9. Схема кабеля LPT Таблица 203. Назначение цепей кабеля Цепь -STB D0 D1 D2 D3 D4 D5 Вилка DD-25M 1 2 3 4 5 6 7 Розетка DB-25F 1 2 3 4 5 6 7 I
366 Глава 3. Тестовые устройства и программы Таблица 203. (Продолжение) Цепь D6 D7 -АСК BUSY РЕ SEL -AUTOLF -ERR -INIT -SELIN GND GND GND GND GND GND GND GND Вилка DD-25M 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Розетка DB-25F 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 _ J Отладку платы диагностики в статическом режиме можно легко выполнить с помощью эмулятора интерфейса ISA. В динамическом режиме плата отлаживается с помощью программы pd-test, написанной мной специально для этой цели. Исходный текст этой программы с подробными комментариями приведен ниже. Текст программы pd-test ////////////////////////////////////////////////////////////////////// // Программа pd-test позволяет тестировать плату диагностики POST // // Автор: О.Д.Вальпа ////////////////////////////////////////////////////////////////////// // Подключение библиотек #include <stdio.h> #include <conio.h> #include <bios.h> #include <stdlib.h> #include <dos.h> // Скан коды клавиш #define ESC 0x011b // ESC
20. Плата диагностики POST 367 #define ENTER OxlcOd // ENTER #define UP 0x4800 // Стрелка вверх #define Ю1 0x5000 // Стрелка вниз #define LEFT 0x4B00 // Стрелка влево #define RIGT 0x4D00 // Стрелка вправо tdefine TAB 0x0f09 // Табуляция #define SPACE 0x3920 // Пробел #define Kl 0x0231 // 1 #define K2 0x0332 // 2 #define КЗ 0x0433 // 3 #define K4 0x0534 // 4 #define K5 0x0635 // 5 #define Кб 0x0736 // 6 #define K7 0x0837 // 7 #define K8 0x0938 // 8 #define K9 0x0a39 // 9 #define КО ОхОЬЗО // 0 #define KF1 ОхЗЬОО // Fl #define KF2 ОхЗсОО // F2 #define KF3 0x3d00 // F3 #define KF4 ОхЗеОО // F4 #define KF5 0x3f00 // F5 #define KF6 0x4000 // F6 #define KF7 0x4100 // F7 tdefine KF8 0x4200 // F8 #define KF9 0x4300 // F9 #define KF10 0x4400 // F10 tdefine ADR 0x80 // Адрес порта // Координаты вывода #define XHL 23 // Индикаторы семисегментные #define YHL 5 #define XI 31 // Индикаторы единичные tdefine YI 5 // Цвета tdefine C_FON LIGHTGRAY // Фон tdefine CJTEXT BLACK // Текст заголовка помощи tdefine C_0 LIGHTRED // Нулевые разряды tdefine C_l LIGHTGREEN // Единичные разряды tdefine C_HL LIGHTBLUE // Семисегментный индикатор // Описание функций void clrscreen (void); // Функция очистки экрана void clrkursor (void); // Функция скрытия курсора void setkursor (void); // Функция восст. курсора void instr (vpid); // Функция вывода инструкции //mumnmUMMUmn Начало программы ######################## int main (void) { // Описание переменных
368 Глава 3. Тестовые устройства и программы int key, i, р=0х55, rp[8]; clrkursorO; // Скрыть курсор instr (); // Вывод инструкции // Главный цикл программы while(key != ESC) // Выполнять пока не нажата клавиша ESC { if(bioskeyd)) key = bioskey(O); else key=0; // Вычисление значения разрядов for(i=0;i<=7;i++) rp[i] = (p»i) & 1; // Запись в порт информации outportb(ADR, р); // Вывод на экран данных порта textcolor(C_HL); gotoxy(XHL,YHL); cprintf(«%2.2X»,p); // Вывод на экран разрядов gotoxy(XI,YI); for(i=7;i>=0;i~) { if(rp[i]==0) textcolor(CJ)); else textcolor(C_l); cprintf(«%lX «,rp[i]); } // Обработка нажатой клавиши switch (key) { case Kl: р=рЛ0х80; break; case K2: р=рл0х40; break; case КЗ: р=рл0х20; break; case K4: р=рл0х10; break; case K5: р=рл0х08; break; case Кб: р=рл0х04; break; case K7:
20. Плата диагностики POST 369 р=рЛ0х02; break; case K8: р=рл0х01; break; case KF5: р=0х55; break; case KF6: p=0xAA; break; case KF7: p=0xFF; break; case KF8: p=0; break; case SPACE: p=pA0xFF; break; default: break; } } clrscreenO; // Очистить экран setkursorO; // Восстановить курсор return 0; } //================= функция очистки экрана =========================== void clrscreen( void ) { textbackground(BLACK); textcolor(C_FON); system («els»); } //================= функция скрытия курсора ========================== void clrkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.cx = OxOfOO; int86@xl0, fcregs, &regs); } //================= функция восстановления курсора =================== void setkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.cx = 0x0708; int86@xl0, &regs, &regs); } //================= функция вывода инструкции ========================
370 Глава 3. Тестовые устройства и программы Перед запуском этой программы плата диагностики должна быть установлена в свободный слот ISA компьютера. До установки платы в компьютер следует убедится, что адрес 0x80 не занят другими устройствами. Это легко проверяется в Windows через свойства компьютера. Для DOS можно воспользоваться утилитой debug.exe. После ее запуска введите команду о80,55, а затем i80, в ответ на экране монитора должно отобразится число FF. Если полученное значение отличается от FF, значит, данный адрес используется другим устройством ввода-вывода. Для выхода из debug введите команду q. Исполняемый код программы pd-test.exe находится на компакт-диске. После запуска данной программы на экране монитора появиться окно, приведенное на Рис. 20.10. void instr(void) { textbackground(C_FON); textcolor(C_TEXT); cprintf(«\r»); cprintf(« »); cprintf(«! Тест платы диагностики POST !»); cprintf(«!! КОД! !»); cprintf(«!+ T—+ !»); cprintf(«i! Bin !Hex! !XX! ! 00000000! Управление: !»); cprintf(«!+ +—+ ! — !»); cprintf(«!!0 0 0 0! 0 ! ! Al! ESC - Выход !»); cprintf(«!!0 0 0 1! 1 ! ! ! SPACE - Инверсия кода !»); cprintf(«!!0 0 1 0! 2 ! ! ! 1...8 - Инверс.разр.7...0 !»); cprintf(«ii6 0 1 1! 3 ! ! ! F5 - Код=55 !»); cprintf(«!!0 1 0 0! 4 ! ! ! Dl ! ! F6 Код=АА !»); cprintf(«!!0 1 0 1! 5 ! ! ! F7 - Kofl=FF !»); cprintf(«!!0 1 1 0! 6 ! ! А31! F8 - Код=00 !»); cprintf(«!!0 1 1 1! 7 ! ! — !»); cprintf(«!!l 0 0 0! 8 ! ! — !»); cprintf(«!!l 0 0 1! 9 ! ! CI! !»); cprintf(«!|l 0 1 0! A ! ! ! !»); cprintf(«!!l 0 1 1! В ! ! ! >); cprintf(«!!l 1 0 0! С ! ! C18! !»); cprintf(«!jl 1 0 1! D ! !»); cprintf(«!!l 1 1 0! E ! !»); cprintf(«!!l 1 1 1! F ! !»); cprintf («! + АвторЮ.Д.Вальпа!») ; cprintf(« »); 1
20. Плата диагностики POST 371 Рис. 20.10. Окно программы pd-test Из него видно, как пользоваться программой, и в нем же приведено соответ- ствие кодов единичных индикаторов шестнадцатеричным кодам POST. Кроме программы pd-test мной была написана еще одна программа для тестирования платы диагностики под управлением операционной системы Windows 98. Окно этой программы под названием post, показано на Рис 20.11. Рис. 20.11. Окно программы post Назначение этой программы не изменилось, но интерфейс пользователя стал приятнее. Данная программа включает в себя меню команд и кнопки управления, которые можно активизировать с помощью мыши. Назначение всех органов управления программы поясняется соответствующими названиями и подсказками. После проверки платы диагностики ею можно пользоваться как отладочным инструментом.
372 Глава 3. Тестовые устройства и программы 21. Эмулятор интерфейса ISA В настоящее время компьютеры IBM PC стали самыми массовыми. Многие адаптеры для этих компьютеров подключаются через интерфейс (шину) ISA. Поэтому при ремонте таких адаптеров или отладке адаптеров собственной разработки необходимо устройство, позволяющее эмулировать интерфейс ISA. Именно такое устройство описывается здесь. Разработанный мной эмулятор интерфейса ISA состоит из распространенных недорогих деталей и несложный в изготовлении. Данный эмулятор позволяет вручную формировать в статическом режиме сигналы обращения к 16-разрядным устройствам памяти или к устройствам ввода-вывода по любому адресу. Интерфейс ISA подробно описан в технической литературе и в сети Интернет. Принципиальная электрическая схема эмулятора приведена на Рис. 21.1. Принцип работы эмулятора основан на формировании сигналов адреса и данных и «бездребезговых» сигналов сброса, записи или чтения памяти или устройств ввода-вывода. Сигналы адреса АО—А15 устанавливаются с помощью переключателей SA1—SA3. При замыкании какого-либо контакта в этой группе переключателей на соответствующей ему адресной линии устанавливается уровень логического нуля. В разомкнутом положении контакта переключателя на данной линии будет присутствовать уровень логической единицы. Аналогично формируется сигнал AEN. Сигналы данных DO—D15 для записи выставляются с помощью переключателей SA4 и SA5. Светодиоды HL1—HL16 отображают установленные для записи и считываемые из адаптера данные. Светящийся светодиод означает, что данный разряд равен логическому нулю, а несветящийся — логической единице. Сигнал сброса RES формируется при нажатии кнопки SB5 и устанавливается на шину активным уровнем логической единицы. Сигналы записи и чтения памяти -MEMW, -MEMR и устройств ввода-вывода -IOW, -IOR формируются при нажатии кнопки SB1—SB4 соответственно. Факт формирования этих сигналов индицируется соответственно светодиодами HL17—HL21. В схеме можно использовать следующие элементы. Микросхемы D1, D2 типа К555 АП6 или их аналоги. Микросхемы D3—D5 — типа К555 ЛАЗ или аналогичные. Переключатели предпочтительнее всего применить типа DIP-переключателей импортного производства в силу их высокой надежности. Кнопки SB1—SB5—типаКМЫ. Светодиоды—любые типа АЛС307АМ, БМ или импортные с током свечения не более 5 мА.
Рис 21.1. Принципиальная электрическая схема эмулятора 21. Эмулятор интерфейса ISA 373
374 Глава 3. Тестовые устройства и программы Резисторные сборки RN1—RN6 — типа НР1-4-9М или импортные аналоги сопротивлением 1 кОм. Конденсатор С1 — типа К50-35 или любой электролитический на 47 мкФ 6,3 В. Конденсаторы С2—С7 — типа КМ или любые керамические емкостью ОД мкФ. Разъем XI — розетка SLOT-98 стандартного интерфейса ISA. Разъем питания Х2—типа ВН-10 или любой другой с необходимым количеством контактов. Можно также применить вместо Х2 одиночные гнезда или клеммы. Вся схема эмулятора может быть выполнена на макетной плате монтажным соединением. При желании можно изготовить и печатную плату, разводка которой не составляет труда. Я рекомендую после изготовления эмулятора нанести на органы управления и контроля соответствующие надписи для удобства работы. Надписи можно нанести с помощью наклеек, которые распечатываются с помощью принтера на липкой бумаге и наклеиваются со стороны надписи скотчем для защиты от влаги и грязи. Эмулятор не нуждается в отладке и при правильно собранной схеме сразу начинает работать после включения. Для проверки его работы достаточно убедиться в формировании всех сигналов на разъеме XI при переключении соответствующих переключателей и кнопок. При проверке адаптера с шиной ISA поступайте следующим образом. Отключите питание от эмулятора. Вставьте в разъем XI испытываемый адаптер. Установите адрес известной вам области памяти или регистра ввода-вывода адаптера и включите питание. Теперь при нажатии кнопки SB5 будет сформирован сигнал сброса для адаптера. А при нажатии кнопки SB2 или SB4 будет сформирован сигнал чтения регистра ввода-вывода или памяти соответственно. При этом на индикаторах HL1—HL16 будет видно прочитанное слово в двоичном виде. Аналогично можно записать в адаптер произвольные данные, выставляемые переключателями SA4, SA5. Таким образом, можно будет проследить прохождение сигналов от разъема к микросхемам адаптера, читать и записывать в нужные области памяти или ввода-вывода данные и найти причину неисправности последнего. Литература 1. Гук М. Аппаратные средства IBM PC. Энциклопедия. — СПб.: Питер Ком, 1998. —816 с.
22. Эмулятор ПЗУ 375 22. Эмулятор ПЗУ При разработке и отладке программного обеспечения для микропроцессорных устройств приходится неоднократно вносить изменения в программу и наблюдать результат ее работы в реальном масштабе времени. Хорошо, если отлаживаемое устройство имеет возможность быстрой и многократной загрузки программы. Однако на практике приходится довольно часто иметь дело с автономными устройствами, например контроллерами, у которых память программ расположена в отдельной микросхеме — постоянном запоминающем устройстве (ПЗУ). Мало того, что запись и стирание таких микросхем довольно длительный процесс с множеством стыковочных операций, к тому же микросхема ПЗУ может быть однократно программируемой. В таком случае не обойтись без вспомогательного устройства, например эмулятора ПЗУ, способного разрешить данную проблему. Именно такое устройство и предлагается здесь вниманию читателей. При разработке данного эмулятора ПЗУ я руководствовался целью создать недорогое, простое в отладке и повторении устройство и в то же время решающее большинство задач, описанных выше. В результате проведенной разработки, получился эмулятор со следующими характеристиками: • Объем эмулируемой памяти — от 0 до 32 Кбайт. • Разрядность эмулируемой памяти — один байт. • Типы эмулируемых микросхем ПЗУ — 27С16 (К573РФ2), 27С64 (К573РФ4),27С256идр. • Время доступа по чтению — не более 70 не. • Ток потребления — не более 250 мА. • Габариты — не более 90x60x20 мм. В качестве основного элемента эмулятора ПЗУ используется статическое оперативное запоминающее устройство (ОЗУ), которое позволяет неограниченное число раз перезаписывать информацию и хранить ее при наличии питания. Доступ к данному ОЗУ возможен со стороны компьютера, в котором подготавливается и хранится программа, и со стороны отлаживаемого микропроцессорного устройства во время его работы. В качестве интерфейса для загрузки программ из компьютера в эмулятор был выбран стандартный параллельный интерфейс принтера LPT. Структурная схема эмулятора приведена на Рис. 22.1. Эмулятор подключается с одной стороны к компьютеру чбрез параллельный порт LPT, а с другой стороны к отлаживаемому устройству, например контроллеру, вместо ПЗУ. Питание на эмулятор подается от
376 Глава 3. Тестовые устройства и программы отлаживаемого устройства через цепи питания эмулируемой микросхемы ПЗУ. Через параллельный порт в эмулятор загружается программа. Во время загрузки эмулятор формирует сигнал сброса для контроллера, поэтому последний находится в состоянии останова и не мешает процессу загрузки программы. После завершения загрузки программы сигнал сброса автоматически снимается, и контроллер стартует с новой загруженной программой, хранимой в эмуляторе ПЗУ. Таким образом, процедура замены программы осуществляется за пару секунд и не требует никаких ручных операций по многократной стыковке, стиранию и программированию микросхем. Рис, 22.1. Структурная схема эмулятора После отладки программы окончательный ее вариант записывается в штатную микросхему ПЗУ отлаживаемого устройства, и на этом процесс отладки завершается. Применение данного эмулятора позволяет сократить время отладки программы во много раз, что очень важно при решении большинства задач по программированию. Принципиальная электрическая схема эмулятора приведена на Рис. 22.2. В Табл. 22.1 приведен перечень элементов эмулятора. Большинство элементов допускает прямую замену отечественными аналогами. Конденсаторы С1—С7 и СЮ — любые керамические. Резисторы — типа МЛТ или С2-22 мощностью не более 0,125 Вт. В эмуляторе допускается применить конденсаторы и резисторы для поверхностного монтажа и планарные микросхемы. В этом случае плата получится с минимальными размерами.
22 Эмулятор ПЗУ 377 Таблица 22.1. Элементы эмулятора Позиционное обозначение Наименование Количество Примечание 1 Конденсаторы керамические С1 С2—С7, СЮ 2200 пФ 0,1 мкФ | Конденсаторы электролитические С8 С9 10 мкФ 6,3 В 100мкФ6,ЗВ 1 Светодиоды HL1 HL2 L-934HC L-934GD Красный Зеленый 1 Микросхемы D1 D2 D3, D4 D5—D8 D9 D10, D11 SN74LS14 SN74ALS32 CD4520 SN74ALS257 62256 SN74ALS244 2 4 1 2 КР1533ТЛ2 КР1533ЛЛ1 КР1561ИЕ10 КР1533КП11А КР1533АП5 | Резисторы 0,125 Вт Rl—R3, RIO—R12 R4—R9 1кОм ЮкОм 6 6 Набор резисторов RN1, RN2 VD1 VT1—VT3 10A103J (НР1-4-9М-0Д25 Вт-10 кОм) ДиодКД522 Транзистор КТ315 2 1 3 Соединители XI Х2 ХЗ Вилка DBR-25M Вилка ВН-34 Розетка PBS-2 1 1 1 Если возникнут проблемы с приобретением микросхемы ОЗУ 62256, можно установить вместо нее отечественную микросхему памяти с меньшим объемом, например К537РУ17 объемом 8 Кбайт или К537РУ10 объемом 2 Кбайт. Естественно, при этом уменьшится объем эмулируемой памяти. Схема эмулятора при этом не изменится. Нужно только подключить выводы примененной микросхемы ОЗУ в соответствии с назначением сигналов. Назначение выводов микросхем ОЗУ приведено на Рис. 223.
Рис 222. Принципиальная электрическая схема 378 Глава 3. Тестовые устройства и программы
22. Эмулятор ПЗУ 379 Аналогично можно увеличить объем эмулируемой памяти до нескольких мегабайт. Для этого надо применить микросхему ОЗУ с большим объемом памяти и добавить в схему эмулятора счетчики CD4520 с мультиплексорами SN74ALS257. Добавление одного такого счетчика и двух мультиплексоров позволяет увеличить адресное пространство эмулятора на 8 разрядов, т. е. до 4 Мбайт! Рис. 223. Назначение выводов микросхем ОЗУ Помимо основных сигналов, необходимых для эмуляции ПЗУ, эмулятор формирует два сигнала сброса: один из них имеет положительную, а другой отрицательную полярность. Сигналы формируются по схеме «открытый эмиттер» и «открытый коллектор» соответственно. Это сделано специально для того, чтобы можно было управлять сбросом отлаживаемого устройства с любым входом сброса. Кроме того, допускается параллельное подключение любого из этих сигналов к кнопке сброса. Эмулятор собирается на небольшой печатной плате с двумя разъемами, расположенными на противоположных сторонах платы, и двухконтактным разъемом сигналов сброса. К компьютеру эмулятор подключается с помощью стандартного кабеля-удлинителя LPT. Этот кабель имеет с одной стороны розетку DB-25F, а с другой стороны вилку DB-25M, соединенные между собой одноименными контактами. Такой кабель легко изготовить самостоятельно по чертежу, приведенному на Рис. 22.4. Назначение цепей этого кабеля приведено в Табл. 22.2.
380 Глава 3. Тестовые устройства и программы Рис 22.4. Кабель-удлинитель LPT Таблица 122. Назначение цепей кабеля С противоположной стороны эмулятор подключается к отлаживаемому устройству с помощью кабеля-переходника. Цепи соединений такого кабеля- переходника, для эмуляции микросхемы 27С256, приведены в Табл. 223.
22. Эмулятор ПЗУ 381 Таблица 223. Цепи соединений кабеля-переходника Кабель-переходник проще всего изготовить из легкодоступного кабеля для компьютерного 3,5-дюймового дисковода. Этот кабель уже содержит три розетки IDC-34 на шлейфе (ленточный кабель). Необходимо лишь разрезать этот кабель на фрагменты длиной по 100 мм, оставляя разъем на
382 Глава 3. Тестовые устройства и программы краю каждого из них. С другой стороны к такому фрагменту припаивается вилка ПЗУ на необходимое число контактов. Такую вилку можно изготовить из неисправной микросхемы ПЗУ с ультрафиолетовым стиранием. В этой микросхеме вскрывается кварцевое окно и тщательно удаляются все проводники, подходящие к кристаллу. После чего микросхема превращается в обыкновенный разъем. Проводники шлейфа аккуратно припаиваются непосредственно к месту крепления выводов к корпусу обработанной микросхемы-разъема. Можно придумать и другие способы изготовления кабеля-переходника. Важно лишь, чтобы выводы разъема стыкуемого вместо ПЗУ не повредили его панельку излишней толщиной, а длина проводников от разъема до эмулятора была бы не более 100—150 мм. Поскольку эмулируемые микросхемы ПЗУ могут быть разного типа и с разным количеством выводов или конфигурацией корпуса, необходимо иметь кабель-переходник для конкретного типа микросхемы, которую вы будете эмулировать. Такой кабель легко изготовить по аналогии с приведенным выше, руководствуясь назначением контактов разъема эмулятора, приведенным на его схеме. Назначение контактов любой микросхемы ПЗУ можно найти в справочнике по микросхемам. Программа для загрузки отлаживаемых программ в эмулятор написана на языке программирования C++. Исходный текст программы приведен ниже. Она снабжена достаточным количеством комментариев для того, чтобы в ней можно было легко разобраться. Текст программы загрузки // Программа lpt_load.exe загружает бинарный файл в эмулятор ROM // через первый доступный порт LPT // // Автор:О.Д.Вальпа //==================================================„=========з====== // Подключение библиотек #include <stdio.h> #include <conio.h> #include <bios.h> #include <stdlib.h> • #include <dos.h> // Описание констант #define NSLIN 0x08 // Разряд SLIN регистра управления LPT #define NSTB 0x01 // Разряд STB регистра управления LPT #define ESC 0x011b // Скан-код клавиши ESC #define TOUT 1000 // Тайм-аут
22. Эмулятор ПЗУ 383 #define MASK 0x00 // Маска инверсии загружаемого байта int main(int argc, char **argv, char **envp) { register int i; register char **p; unsigned int far *b; int c, n=0; FILE *file_inp; int ba=0,al,a2,a3,key=0,nlpt=l; unsigned char RSR, WCR; // Определение доступных портов LPT b = (unsigned int*) MK_FP@, 0x408); al = *b; b = (unsigned int*) MK_FP@, 0x40A); a2 = *b; b = (unsigned int*) MK_FP@, 0x40C); a3 = *b; // Вывод сообщения при отсутствии доступных портов LPT if((al==0) && (а2==0) && (а3==0)) { printf(«\nHeT ни одного доступного порта LPT в данном компьютерен») ; printf(«Нажмите любую клавишу для выхода...\п»); getcharO; exit(l);} // Выбор первого доступного порта LPT ba = al; if(ba == 0) {ba = а2; nlpt=2;} if(ba == 0) {ba = a3; nlpt=3;} if(argc == 1) { printf(«\nIIporpaMMa lpt_load.exe загружает входной бинарный файл»); printf(«\ne эмулятор, через первый доступный порт LPT»); printf(«\nIlpHMep использования программы: lpt_load.exe [имя загружаемого файла]»); printf(«\n\nBBewiTe имя загружаемого файла (выход - Ctrl+Break):»); scanf(«%s»,argv[l]); } while ((file_inp=fopen (argv[l] ,»rb»))==NULL) { printf(«\nHe могу открыть файл с таким именем !!!»); printf(«\n\nBBewiTe имя загружаемого файла (выход - Ctrl+Break):»); scanf («%s»,argv[l]) ; } // Отобразить входные аргументы при отладке for(i=0;i<argc;i++) {} // printf(«arg%i=%s\n»,i,argv[i]); // Отобразить переменные среды при отладке for(p=envp;*p! = (char*H;p++) {} // printf(«%s\n»,*p);
384 Глава 3. Тестовые устройства и программы WCR=0x0C;//00001100 // 76543210 Регистр CR Режим-запись // IIIIIII+- -STB -1=строб акт. 0=строб пассив. // III|||+ AULF -1=CR+LF 0=CR // III11+ INIT 1=работа 0=сброс принтера // 1111+ SLIN -1=разрешить 0=запретить вывод на печать // N1+ EIRQ 1=разрешить 0=запретить прерывания от принтера // 11+ DIR * 1=ввод LPT 0=вывод LPT // |+ х // + х outportb(ba+2,WCR); // Регистр управления LPT в исходное состояние outportb(ba+2,WCRANSLIN); // Инвертировать сигнал -SLIN // Главный цикл программы do { if(bioskeyd)) key = bioskey(O); else key=0; // Проверка нажатия клавиши // Прочитать регистр статуса порта LPT RSR=inportb(ba+l); // 76543210 Регистр SR Режим-чтение // IIIIIII+- TIM 1=тайм-аут 0=норма // 111111+-- 0 // IIIII+— PIRQ * 1=исходное 0=есть прерывание // 1111+ ERR 1=норма 0=ошибка // 111+ SLCT 1=подключен 0=автон.реж. // 11+ РЕ 1=нет бумаги 0=есть бумага // |+ дек i=He готов 0=готов к печати следующего символа // + BUSY -1=свободен 0=принтер занят (автон.реж. или ошибка) // printf(«RSR0=%x «,RSR); // Вывод для отладки if((c=getc(file_inp))==EOF) break; // Чтение и проверка окончания файла // Запись в регистр данных порта LPT информации с инверсией байта маской outportb(ba,cAMASK); outportb(ba+2,WCRANSLINANSTB); // Установить строб i=0; RSR=inportb(ba+l); // printf(«RSRl=%x «,RSR); // Вывод для отладки while((RSR & 0x80I=0x0) {RSR=inportb(ba+D; if(++i>=TOUT) break;} . if(i>=TOUT) { outportb(ba+2,WCR); // Регистр управления LPT в исходное состояние printf(«\nK порту LPT%x ничего не подключено\п»,п1р1); printf(«iim* неисправно устройство - нет сигнала BUZY\n»,nlpt); printf(«Нажмите ENTER для продолжения...\n»,nipt); getcharO; getc(stdin); exit(l); } i=0; outportb(ba+2,WCRANSLIN);// Снять строб RSR=inportb(ba+l)?
22. Эмулятор ПЗУ 385 // printf(«RSR2=lx «;RSR); // Вывод для отладки while((RSR & 0x80I = 0x80) {RSR=inportb(ba+D; if(++i>=TOUT) break;} if(i>=TOUT) { outportb(ba+2;WCR); // Регистр управления LPT в исходное состояние printf(«\nK порту LPT%x ничего не подключено\п», nipt) ; printf(«win неисправно устройство - нет сигнала BUZY\n»,nlpt); printf(«Нажмите ENTER для продол жения...\п», nipt); getcharO; getc(stdin); exit(l); } ++n; // printf(«n=%x c=%x\n»,n,c); //getcharO; } while(key != ESC); // Выполнять пока не нажата клавиша ESC outportb(ba+2;WCR); // Регистр управления LPT в исходное состояние рг1^г(«\пЗагружено %d байт через порт LPT%d\n»,n,nlpt); return 0; } После запуска программы на экране монитора выводится подсказка о назначении программы и способе ее использования. Программа автоматически определяет доступные порты LPT на компьютере и загружается в эмулятор через первый доступный порт. После загрузки она выводит сообщение о результате загрузки и о количестве загруженных в эмулятор байт. Если эмулятор не подключен к компьютеру, или неисправен, или отсутствует питание, программа выдаст соответствующее сообщение. Порядок работы с эмулятором следующий. Вначале необходимо обесточить все оборудование и подключить вместо ПЗУ отлаживаемого устройства эмулятор. Сигнал RES или -RES, в зависимости от логики управления устройства, подключается к входу сброса устройства. С другой стороны эмулятор подключается к компьютеру. После подготовки отлаживаемой программы на компьютере в двоичном (бинарном) формате включается отлаживаемое устройство, и сразу же загружается программа. При этом на эмуляторе загорится светодиод «ПИТАНИЕ». Во время загрузки программы на эмуляторе загорается светодиод «ЗАПИСЬ», сигнализируя о процессе загрузки. По окончании загрузки светодиод гаснет, и сигнал сброса автоматически дезактивируется. Отлаживаемое устройство стартует с программой, загруженной в эмулятор.
386 Глава 3. Тестовые устройства и программы 23. Тестирование LPT-порта Важную роль в «жизни» компьютера IBM PC играет параллельный LPT- порт. К нему можно подключать не только принтер, но и ZIP-накопитель, программатор, эмулятор, защитные ключи и другие внешние устройства. Несмотря на свою простоту, этот порт является весьма универсальным и быстродействующим устройством. Программа, которую я предлагаю вниманию читателей, позволит оценить эти преимущества в полной мере. Первоначально программа предназначалась для тестирования LPT- порта. Но на поверке оказалось, что с ее помощью очень удобно отлаживать новые устройства, подключаемые к LPT-порту, а также отыскивать неисправности при ремонте различных цифровых устройств. Кроме того, эта программа является прекрасным учебным пособием для начинающих программистов и схемотехников. Называется программа test-Ipt. Она написана на языке программирования C++. При запуске программы на экране монитора появляется окно работы программы, приведенное на Рис. 23.1. Рис. 23.1. Окно работы программы В центре этого окна изображен разъем LPT-порта с назначением контактов и отображением логического уровня сигнала на каждом из них. Описание сигналов разъема DB-25F параллельного порта LPT приведено в Табл. 23.1.
23. Тестирование LPT-порта 387 Таблица 23.1. Сигналы разъема DB-25F параллельного порта LPT Вывод 1 2—9 10 11 12 13 14 15 16 17 18—25 Направление ол 0A) I* I I I ол I ол ол GND Регистр -CR0 DRx SR6 -SR7 SR5 SR4 -CR1 SR3 CR2 -CR3 Название -Strob DataO—7 -Acknowledge Busy Paper end Select -AutoLF -Error -Init -Select In Ground Назначение Строб данных (по низкому уровню) Линии данных 0—7 Импульс подтверждения приема байта Принтер занят при высоком уровне сигнала Конец бумаги в принтере Принтер включен Автоматич. перевод строки после возврата каретки Ошибка: конец бумаги, OFF — режим или др. ошибка Инициализация принтера Выбор принтера Общий провод Условные обозначения. ОД— выходные линии, состояние которых можно считать из соответствующих регистров; O(I) — выходные линии, состояние которых можно считать, задав направление вывода; I — входные линии; признак инверсии; DR — регистр данных (доступны запись/чтение); SR — регистр состояния (доступно только чтение); CR — регистр управления (доступны запись/чтение). В регистрах, доступных по записи, можно произвольно менять информацию, при этом состояние порта автоматически будет подчиняться действиям пользователя программы, и логические уровни на разъеме будут также изменяться. Выбор регистра по записи производится клавишей TAB. Таким образом, можно управлять LPT-портом в статическом режиме и отлаживать внешние устройства, подключенные к нему. Поскольку некоторые разряды регистров инвертируются в самом компьютере, в программу введена маска инверсии данных разрядов при чтении и записи для устранения путаницы. Поэтому данные регистре обозначены со знаком апострофа, например SR\ В нижней части окна программы находятся строки помощи. При нажатии клавиши F10 можно вызвать до пяти экранов справочной информации для LPT-порта. В них содержится информация о назначении сигналов порта, соответствии их контактам разъема, описаны функции прерывания порта, алгоритм вывода символа на печать, адреса и назначение всех регистров порта и другая полезная информация. Клавиши Fl—F3 позволяют выбрать номер используемого LPT-порта от 1 до 3 при их наличии в компьютере. В противном случае будет выдано сообщение о недоступности соответствующего LPT-порта, и выбор не будет произведен.
388 Глава 3. Тестовые устройства и программы Исходный текст программы приведен ниже. Программа содержит множество комментариев, позволяющих понять структуру программы и назначение всех операторов, используемых в ней. Текст программы test-lpt ////////////////////////////////////////////////////////////////////// // Программа test-lpt позволяет тестировать порт LPT в режиме диалога // // Автор: О.Д.Вальпа // Версия: 1.1 ////////////////////////////////////////////////////////////////////// // Подключение библиотек #include <stdio.h> #include <conio.h> #include <bios.h> #include <stdlib.h> #include <dos.h> // Скан коды клавиш #define ESC 0x011b // ESC #define ENTER OxlcOd // ENTER #define UP 0x4800 // Стрелка вверх #define DOWN 0x5000 // Стрелка вниз #define LEFT 0x4B00 // Стрелка влево #define RIGT 0x4D00 // Стрелка вправо #define TAB 0x0f09 // Табуляция #define SPACE 0x3920 // Пробел #define Kl 0x0231 // 1 #define K2 0x0332 // 2 #define КЗ 0x0433 // 3 #define K4 0x0534 • // 4 #define K5 0x0635 // 5 #define Кб 0x0736 // 6 #define K7 0x0837 // 7 #define K8 0x0938 // 8 #define K9 0x0a39 // 9 #define КО ОхОЬЗО // 0 #define KA 0xle61 // a #define KB 0x3062 // b #define КС 0х2е63 // с #define KD 0x2064 // d #define KE 0x1265 // e idefine KF 0x2166 // f #define KF1 0x3b00 // Fl #define KF2 ОхЗсОО // F2 #define KF3 0x3d00 // F3 #define KF4 0x3e00 // F4 #define KF5 0x3f00 // F5 #define KF6 0x4000 // F6 #define KF7 0x4100 // F7
23. Тестирование LPT-порта 389 tdefine KF8 0x4200 // F8 tdefine KF9 0x4300 // F9 #define KF10 0x4400 // F10 tdefine KSF1 0x5400 // Shift+Fl #define KSF2 0x5500 // Shift+F2 #define KSF3 0x5600 // Shift+F3 tdefine KSF4 0x5700 // Shift+F4 #define KSF5 0x5800 // Shift+F5 #define KSF6 0x5900 // Shift+F6 #define KSF7 0x5A00 // Shift+F7 tdefine KSF8 0x5B00 // Shift+F8 #define KS 0xlf73 // Key s tdefine KG 0x2267 // Key g #define Kit 0x4b00 // left tdefine Krt 0x4d00 // right tdefine Kdn 0x5000 // down tdefine Kup 0x4800 // up // Координаты вывода tdefine XAR 12 // Адрес tdefine YAR 2 // Адрес tdefine XP 49 // LPT tdefine YP 1 // LPT tdefine XE 61 // Доспупны LPT tdefine YE 1 // Доспупны LPT tdefine XRDR 12 // Регистр DR чтение tdefine XRSR 31 // Регистр SR чтение tdefine XRCR 50 // Регистр CR чтение tdefine YR 4 // Регистр чтение tdefine XWDR 11 // Регистр DR запись tdefine XWCR 22 // Регистр CR запись tdefine YW 5 // Регистр запись tdefine XDBU 23 // Разъем DB-25 верх tdefine YDBU 17 // Разъем DB-25 верх tdefine XDBD 24 // Разъем DB-25 низ tdefine YDBD 18 // Разъем DB-25 низ tdefine Y_DR 3 // Рамка DR tdefine X_DR 10 // Рамка DR tdefine Y_CR 3 // Рамка CR tdefine X_CR 48 // Рамка CR tdefine XER 3 // Сообщение об ошибке tdefine YER 1 // Сообщение об ошибке // Цвета tdefine C_FON LIGHTGRAY // Фон tdefine C_HELP LIGHTGREEN // Текст заголовка помощи tdefine C_0 LIGHTGREEN // Нулевые разряды tdefine C_l LIGHTBLUE // Единичные разряды // Описание функций void instr(int); // Функция вывод инструкции void clrscreen(void); // Функция очистки экрана void clrkursor (void); // Функция скрытия курсора
390 Глава 3. Тестовые устройства и программы void setkursor (void); // Функция восст. курсора void defc (int); // Функция назначения цвета текста void seldr (void); // Функция выбора регистра DR void selcr (void); // Функция выбора регистра CR void types (int); // Функция вывода сообщения void hlptxt(int); // Функция вывода помощь //########################## Начало программы ######################## int main (void) { // Описание переменных unsigned int far *b; unsigned char RDR,RCR,RSR,WDR=0x55,WCR=0x07,DB[26]; int ba=0,al,a2,a3,key=0,i,nlpt=l,z,mode=0,gs=0;gd=0,mask=0; // Определение доступных портов LPT b = (unsigned int*) MK_FP@, 0x408); al = *b; b = (unsigned int*) MK_FP@, 0x40A); a2 = *b; b = (unsigned int*) MK_FP@, 0x40C); a3 = *b; // Вывод сообщения при отсутствии доступных портов LPT if((al==0) && (а2==0) && (а3==0)) { printf(«\nHeT ни одного порта LPTAn»); printf («Нажмите ENTER.. An»); getcharO; clrscreenO; exit(l);} // Выбор первого доступного порта LPT ba = al; if(ba == 0) {ba = a2; nlpt=2;} if(ba == 0) {ba = a3; nlpt=3;} instr(mode); // Вывод инструкции программы clrkursorO; // Скрыть курсор // Главный цикл программы while(key != ESC) // Выполнять пока не нажата клавиша ESC { if(bioskeyd)) key = bioskey(O); else key=0; // Вывод доступных портов LPT text color (YELLOW) ; gotoxy(XP,YP); cprintf(«%l.lX»,nlpt); gotoxy(XE,YE); if(al == 0 ) cprintf(« «); else cprintf(«LPTl «); if(a2 == 0 ) cprintf(« «); else cprintf(«LPT2 «); if(a3 == 0 ) cprintf(« «); else cprintf(«LPT3 «); // Прочитать регистры порта LPT RDR=inportb (ba+0); RSR=inportb (ba+l) A0x80; RCR=inportb (ba+2) ЛГ2Л8; // и вывести на экран textcolor(WHITE); gotoxy(XAR,YAR); cprintf(«DR=%2.2Xh Adr=%3.3Xh «,RDR,ba+0);
23. Тестирование LPT-порта 391 cprintf («SR'=%2.2Xh Adr=%3.3Xh «,RSR,ba+D; cprintf («CR'=%2.2Xh Adr=%3.3Xh»,RCR,ba+2); gotoxy(XRDR,YR); for(i=7;i>=0;i—) {z=(RDR»i)&l; defc(z); cprintf(«%1.IX «,z);} gotOxy(XRSR;YR); for(i=7;i>=0;i~) {z=(RSR»i)&l; defc(z); cprintf(«%1.IX «,z);} gotOxy(XRCR,YR); for(i=7;i>=0;i—) {z=(RCR»i)&l; defc(z); cprintf(«%1.IX «,z);} // Запись в регистр данных порта LPT информации if(gd==0 && mask==0) outportb(ba+0,WDR); if(gd==l && mask==0) outportb(ba+0,WDR++); // Вывод на экран содержимого геристров DR gotoxy(XRDR,YW); for(i=7;i>=0;i—) {z=(WDR»i)&l; defc(z); cprintf(«%l.lX «,z);} if(gs ==0) outportb(ba+2,WCRA0xb); if(gs ==1) { mask=maskAl; outportb(ba+2,(WCRA0xb)Amask);} // Вывод на экран содержимого геристров CR gotoxy(XRCR,YW); for (i=7; i>=0; i—) .{z=(WCR»i)&l; defc(z); cprintf(«%l.lX «,z);} // Вычислить уровни сигналов на контактах разъема DB-25 DB[1]=RCR & 1; for(i=0;i<=7;i++) DB[i+2] = (RDR»i) & 1; DB[10] = (RSR»6) & 1; DB[11] = (RSR»7) & 1; DB[12] = (RSR»5) & 1; DB[13] = (RSR»4) & 1; DB[14] = (RCR»1) & 1; DB[15] = (RSR»3) & 1; DB[16] = (RCR»2) & 1; DB[17] = (RCR»3) & 1; for(i=18;i<=25;i++) DB[i]=0; // и вывести на экран gotoxy(XDBU,YDBU); for(i=13;i>=l;i—) {z=DB[i]; defc(z); cprintf(«%l.lX-»#z);} gotoxy(XDBD,YDBD); for(i=25;i>=14;i~) {z=DB[i]; defc(z); cprintf(«U.lX-»,z);} // Обработка нажатой клавиши switch(key) { case Kl: WDR=((WDR«4)&OxfO) I 0x01; break; case K2: WDR=((WDR«4)&0xf0) I 0x02; break; case КЗ: WDR=((WDR«4)&0xf0) I 0x03;
392 Глава 3. Тестовые устройства и программы break; case K4: WDR=((WDR«4)&0xf0) I 0x04; break; case K5: WDR=((WDR«4)&0xf0) I 0x05; break; case Кб: WDR=((WDR«4)&0xf0) I 0x06; break; case K7: WDR=((WDR«4)&0xf0) I 0x07; break; case K8: WDR=((WDR«4)&0xf0) I 0x08; break; case K9: WDR=((WDR«4)&0xf0) I 0x09; break; case KA: WDR=((WDR«4)&0xf0) I OxOA; break; case KB: WDR=((WDR«4)&0xf0) I OxOB; break; case КС: WDR=((WDR«4)&0xf0) I OxOC; break; case KD: WDR=((WDR«4)&0xf0) I OxOD; break; case KE: WDR=((WDR«4)&0xf0) I OxOE; break; case KF: WDR=((WDR«4)&0xf0) I OxOF; break; case Kup: WDR++; break; case Kdn: WDR-; break; case Kit: WDR=WDR«1; break; case Krt: WDR=WDR»1; break; case KSF1: if(mode==0) WDR=WDRA0x80? else WCR=WCRA0x80;
23. Тестирование LPT-порта 393 break; case KSF2: if(mode==0) WDR=WDRA0x40; else WCR=WCRA0x40; break; case KSF3: if(mode==0) WDR=WDRA0x20; else WCR=WCRA0x20; break; case KSF4: if(mode==0) WDR=WDRAOxlO; else WCR=WCRAOxlO; break; case KSF5: if(mode==0) WDR=WDRA0x08; else WCR=WCRA0x08; break; case KSF6: if(mode==0) WDR=WDRA0x04; else WCR=WCRA0x04; break; case KSF7: if(mode==0) WDR=WDRA0x02; else WCR=WCRA0x02; break; case KSF8: if(mode==0) WDR=WDRA0x01; else WCR=WCRA0x01; break; case KF1: if(al!=0) {ba=al; nlpt=l; types@);} else types A); break; case KF2: if(a2!=0) {ba=a2; nlpt=2; types(O);} else typesB); break; case KF3: if(a3!=0) {ba=a3; nlpt=3; types@);} else types C) ; break; case KF5: if(mode==0) WDR=0x55; else WCR=0x55; break; case KF6: if(mode==0) WDR=0xAA; else WCR=OxAA; break; case KF7: if(mode==0) WDR=0xFF; else WCR=OxFF; break; case KF8: if(mode==0) WDR=0; else WCR=0; break; case KF9: mask=0; if(gs==0) gs=l; else gs=0; break; case KG: if(gd==0) gd=l; else gd=0;
394 Глава 3. Тестовые устройства и программы break; case KF10: hlptxt(mode); break; case SPACE: if(mode==0) WDR=WDRAOxFF; else WCR=WCRAOxFF; break; case TAB: if(mode==0) {mode=l; selcrO;} else {mode=0; seldr();} breaks- default: break; } } clrscreenO; // Очистить экран setkursorO; // Восстановить курсор return 0; } //====r===========^ Функция очистки экрана =========================== void clrscreen( void ) { textbackground(BLACK); textcolor(C_FON); system («els»); } //================:* Функция скрытия курсора ========================== void clrkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs.x.ex = OxOfOO; int86@xl0, &reg?, &regs); } ;/================* Функция восстановления курсора =================== void setkursor ( void ) { union REGS regs; regs.x.ax = 0x0100; regs. x. ex = 0x0708; int86@xl0, &regs, &regs); } //================i Функция назначения цвета текста ================== void defc (int colt) { textcolor (BLACK); if(colt==0) textcolor(C_0); if(colt==l) textcolor(C_l); } //================s: Функция выбора регистра DR ======================= void seldr (void) { textcolor (BLACK);
23. Тестирование LPT-порта 395 gotoxy(X_CR,Y_CR+0); cprintf(« 7 6 5 4 3 2 10 «); gotoxy(X_CR;Y_CR+l); cprintf(« «); gotoxy(X_CR,Y_CR+2); cprintf(« «); gotoxy(X_CR;Y_CR+3); cprintf(« x x * о о о «); textcolor (WHITE); gotoxy(X_DR,Y_DR+0); cprintf(« 7 6 5 4 3 2 10 «); gotoxy(X_DR,Y_DR+l); cprintf(« «); gotoxy(X_DR,Y_DR+2); cprintf(« «); gotoxy(X_DR,Y_DR+3); cprintf(« «); } //================= функция выбора регистра CR ======================= void selcr (void) { textcolor (BLACK) ; gotoxy(X_DR,Y_DR+0); cprintf(« 7 6 5 4 3 2 10 «); gotOxy(X_DR,Y_DR+l); cprintf(« «); gotoxy(X_DR,Y_DR+2); cprintf(« «); gotoxy(X_DR,Y_DR+3); cprintf(« «); textcolor(WHITE); gotoxy(X_CR;Y_CR+0); cprintf(« 7 6 5 4 3 2 10 «); gotoxy(X^CR;Y_CR+l); cprintf(« «); gotoxy(X_CR;Y_CR+2); cprintf(« «); gotoxy(X_CR,Y_CR+3); cprintf(« x x * о о о «); } //==============rr= функция вывода сообщения ========================= void types (int s) { if(s==0) {gotoxy(XER,YER); textcolor(C.FON); cprintf(« «);} else{ gotoxy(XER,YER); textcolor(RED+BLINK) ; cprintf(«IlopT LPT%1.1X не доступен»^);} } //=========r======= функция вывода инструкции ======================== void instr(int m) { textbackground(LIGHTGRAY); text color (BLACK); cprintf(«\r\n»); cprintf(« Диагностика порта:LPT Доступны:LPT1 LPT2 LPT3 «); cprintf(« Регистр: DR=xxh Adr=xxxh SR'=xxh Adr=xxxh CR'=xxh Adr=xxxh «); cprintf(« Разряд : 7 6 5 4 3 2 1 0 7 6 5 4 3 2 10 7 6 5 4 3 2 10 «); cprintf(« Чтение : xxxxxxxx xxxxxxxx xxxxxxxx о:инверсия «); cprintf(« Запись : xxxxxxxx xxxxxxxx х:резерв «); cprintf(« о *xx xx* ooo *:для PS/2 «); cprintf(« DDDDDDDD .:не доступ. «); cprintf(« 7 6 5 4 3 2 10 «); cprintf(« BUSY PIRQ DIR -STB «); cprintf(« -ACK -ERR EIRQ -AULF «); cprintf(« PE SLCT -SLIN -INIT «); cprintf(« «); cprintf(« -ACK > ( SR6) DDDDDDDD (-CR0) >-STB «); cprintf(« BUSY > (-SR7) 7 6 5 4 3 2 10 «); cprintf(« PE > ( SR5) «); cprintf(« SLCT > ( SR4) Разъем DB-25F /розетка/ «);
396 Глава 3. Тестовые устройства и программы cprintf(« 13 ооооооооооооо 01 (вид со стороны стыковки) «); cprintf(« '25 о о о о о о о о о о о о 14 «); cprintf(« (-CR1) >-AULF «); cprintf(« GND ( SR3) <-ERR «); cprintf(« Версия 1.1 ( CR2) >-INIT «); cprintf(« Автор:О.Д.Вальпа (-CR3) >-SLIN «); cprintf(« ESC=Bbixofl Fl-F3=Bbi6op LPT1-LPT3 F5=55 F6=AA F7=FF F8=0 Р9=режим Р10=Помощь «); cprintf(« ТАВ=выбор БРАСЕ=инверсия ShiftF1...8=pa3pHfl ShiftF9=cynep О...Р=данные «); if(m==0) seldr(); else selcrO; } //================= функция вывода помощь ============================ void hlptxt(int m) { textcolor(C_HELP); cprintf («\r\n»); cprintf(« ESC-выход ENTER-дальше ОКНО ПОМОЩИ 1 ИЗ 5 «); textcolor(BLACK); cprintf(« Описание сигналов разъема DB-25F параллельного порта LPT «); cprintf(« «); cprintf(« Вывод Напр Per. Имя Назначение «); cprintf(« «); cprintf(« 1 0/1 -CRO -Strob Строб данных (по низкому уровню) «); cprintf (« 2-9 0A) DRx DataO-7 Линии данных 0-7 «); cprintf(« 10 I* SR6 -Acknowledge Импульс подтверждения приема байта «); cprintf(« 11 I -SR7 Busy Принтер занят при высоком уровне сигнала «); cprintf(« 12 I SR5 Paper end Конец бумаги в принтере «); cprintf(« 13 I SR4 Select Принтер включен «); cprintf(« 14 0/1 -CR1 -AutoLF Автоматич. перевод строки после возврата каретки «); cprintf(« 15 I SR3 -Error Ошибка:конец бумаги, OFF-режим или др.ошибка «); cprintf(« 16 0/1 CR2 -Init Инициализация принтера «); cprintf(« 17 0/1 -CR3 -Select In Выбор принтера «); cprintf(« 18-25 GND Ground Общий провод «); cprintf(« «); cprintf(« 0/1 выходные линии, состояние которых можно считать из соотв. регистров «); cprintf(« 0A) выходные линии, состояние которых можно считать задав направление вывода «); cprintf(« I входные линии «); cprintf(« - признак инверсии «); cprintf(« DR регистр данных (доступны запись/чтение) «); cprintf(« SR регистр состояния (доступно только чтение) «); cprintf(« CR регистр управления (доступны запись/чтение) «); while(!bioskey(l)H if(bioskey@)==ESC){ clrscreenO; instr(m); return;} textcolor(C_HELP); cprintf(«\r\n») ; cprintf(« ESC-выход ENTER-дальше ОКНО ПОМОЩИ 2 ИЗ 5 «); textcolor (BLACK); cprintf (« «); cprintf (« Карта адресов портов LPT «); cprintf (« «); cprintf (« Адрес Содержимое Стандартное Вектор Адрес Содержимое «); cprintf (« памяти значение прерывания памяти «); cprintf (« «); cprintf(« 0000:0408h Адрес LPT1 0378h IRQ7=0Fh 0000:0478h Тайм-аут LPT1 «); cprintf (« 0000:040Ah Адрес LPT2 0278h IRQ5=0Dh 0000:0479h Тайм-аут LPT2 «); cprintf (« 0000:040Ch Адрес LPT3 03BCh 0000:047Ah Тайм-аут LPT3 «); cprintf (« «);
23. Тестирование LPT-порта 397 cprintf(« «); cprintf(« Карта адресов регистров LPT «); cprintf(« «); cprintf(« Смещение относительно Режим Регистр «); cprintf(« базового адреса LPT обращения порта LPT «); cprintf(« «); cprintf(« +0 Запись DR «); cprintf(« +0 Чтение DR «); cprintf(« +1 Запись - «); cprintf(« +1 Чтение SR «); cprintf(« +2 Запись CR «); cprintf(« +2 Чтение CR «); cprintf(« «); while(!bioskey(l)){} if(bioskey@)==ESC){ clrscreenO; instr(m); return;} textcolor(C_HELP); cprintf(«\r\n») ; cprintf(« ESC-выход ENTER-дальше ОКНО ПОМОЩИ З ИЗ 5 «); textcolor(BLACK); cprintf (« Назначение разрядов регистров LPT «); cprintf (« 76543210 Регистр SR Режим-чтение «); cprintf (« I I I I I I I +- TIM 1=тайм-аут 0=норма «); cprintf(« МММ +— 0 «); cprintf (« M M I + PIRQ * 1=исходное 0=есть прерывание «); cprintf (« MM + ERR 1=норма 0=ошибка «); cprintf(« I I I + SLCT 1=подключен 0=автон.реж. «); cprintf(« I I + РЕ 1=нет бумаги 0=есть бумага «); cprintf(« I + ACK 1=не готов 0=готов к печати следующего символа «); cprintf (« + BUSY -1=свободен 0=принтер занят (автон.реж. или ошибка) «); cprintf (« «); cprintf (« 76543210 Регистр CR Режим-запись «); cprintf (« М М М М- -STB -1=строб акт. 0=строб пассив. «); cprintf (« I II М I + AULF -1=CR+LF 0=CR «); cprintf(« М М I + INIT 1=работа 0=сброс принтера «); cprintf (« ММ + SLIN -1=разрешить 0=запретить вывод на печать «); cprintf{« I I I + EIRQ 1=разрешить 0=запретить прерывания от принтера «); cprintf (« I I + DIR * 1=ввод LPT 0=вывод LPT «); cprintf(« I + х «); cprintf (« + х «); cprintf (« «); cprintf (« * - только для PS/2 «); cprintf(« - - признак инверсии бита «); while(!bioskey(l)H if(bioskey@)==ESC){ clrscreenO; instr(m); return;} textcolor(C_HELP); cprintf(«\r\n»); cprintf (« ESC-выход ENTER-дальше ОКНО ПОМОЩИ 4 ИЗ 5 «); textcolor(BLACK); cprintf (« «); cprintf (« ОПИСАНИЕ ПРОГРАММНОГО ПРЕРЫВАНИЯ INT17h (AH=HOMEP ФУНКЦИИ) «); cprintf (« «); cprintf(« Функция: О - печать символа «); cprintf(« Вход : AH=0, ^=символ, DX=HOMep порта @=LPT1, 1=LPT2 или 2=LPT3) «); cprintf(« Выход: АН=статус порта «); cprintf (« «); cprintf(« Функция: 1 - инициализация порта «);
398 Глава 3. Тестовые устройства и программы cprintf(« Вход : АН=1, АЬ=пустоу БХ=номер порта @=LPT1, 1=LPT2 или 2=LPT3) «); cprintf(« Выход: АН=статус порта «); cprintf(« «); cprintf(« Функция: 2 - чтение статуса порта «); cprintf(« Вход : АН=2, АЬ=пусто, ЭХ=номер порта @=LPT1, 1=LPT2 или 2=LPT3) «); cprintf (« Выход: АН=статус порта A в разряде) «); cprintf(« 0 - тайм-аут «); cprintf(« 1-х «); cprintf(« 2-х «); cprintf(« 3 - ошибка «); cprintf(« 4 - принтер выбран «); cprintf(« 5 - конец бумаги «); cprintf(« б - подтверждение «); cprintf(« 7 - принтер не занят «); cprintf(« «); while(!bioskey(l)){} if(bioskey@)"ESC){ clrscreenO; instr(m); return;} textcolor(C_HELP); cprintf(«\r\n») ; cprintf(« ESC-выход ENTER-дальше ОКНО ПОМОЩИ 5 ИЗ 5 «); textcolor(BLACK); cprintf (« «); cprintf (« ПОСЛЕДОВАТЕЛЬНОСТЬ ДЕЙСТВИЙ ДЛЯ ВЫВОДА НА ПЕЧАТЬ ОДНОГО СИМВОЛА «); cprintf(« «); cprintf (« - вывести передаваемый байт в регистр данных; «); cprintf (« «); cprintf (« - в цикле проверять состояние принтера до установки бита 7 «); cprintf(« регистра состояния (здесь возможно использование таймаута); «); cprintf (« «); cprintf (« - проверить биты 3-5 регистра состояния на наличие ошибки; «); cprintf(« «); cprintf (« - установить и сразу же сбросить нулевой бит регистра «); cprintf (« управления, для этого подходит следующая последовательность «); cprintf(« команд: «); cprintf(« «); cprintf (« mov dx,37Ah ;адрес регистра управления «); cprintf(« mov al,00001101b установить биты 0,2 и 3 «); cprintf (« out dx,al ; вывести команду «); cprintf(« xor al,l ;сбросить бит 0 «); cprintf(« out dx,al ;повторно вывести команду «); cprintf(« «); cprintf(« - далее можно прочитать и запрограммировать регистр «); cprintf(« состояния и перейти к печати следуюего символа. «); cprintf(« «); while (!bioskey(l)){) clrscreenO; instr(m); } С остальными режимами работы программы читатели смогут познакомиться самостоятельно после ее запуска. Эту программу и ее исходный текст можно скопировать с компакт-диска. Надеюсь, что эта программа поможет тем, кто ее будет использовать при отладке различных устройств.
24. Тестирование СОМ-порта 399 24. Тестирование СОМ-порта В предыдущем разделе рассказывалось о тестировании параллельного порта компьютера. Этот раздел позволит научиться тому, как проверить не менее важный в «жизни» компьютера последовательный СОМ-порт. Последовательный СОМ-порт компьютера является одним из самых распространенных интерфейсов связи компьютера с внешним миром. К нему можно подключить мышь, принтер, другой компьютер, модем, цифровой фотоаппарат, программатор и др. устройства. Не смотря на появление портов нового поколения USB, СОМ-порт до сих пор уверенно присутствует в самых последних моделях компьютеров, и стандартная конфигурация компьютера содержит как минимум один такой порт. Большим подспорьем данный порт оказывается в практике разработчиков, поскольку позволяет легко подключаться к разрабатываемым микропроцессорным устройствам. Подавляющее большинство выпускаемых в настоящее время микропроцессоров и микроконтроллеров имеют встроенный последовательный интерфейс UART, полностью совместимый по формату данных с СОМ-портом. Как и многие интерфейсы, данный порт подвержен опасности выхода из строя в результате некорректных действий пользователя. Причиной неисправности может послужить разряд статического электричества или высокая разность потенциалов между компьютером и подключаемым к нему через СОМ-порт устройством. Опасность пробоя возрастает особенно в зимний период, когда воздух становится сухим от мороза. Другой причиной может быть неграмотное соединение двух компьютеров через СОМ-порт, имеющих разный потенциал на корпусе относительно земли. В результате перечисленных неблагоприятных воздействий порт перестает нормально функционировать, но все же поддается «лечению». Обычно, как правило, выходит из строя буферная микросхема, обеспечивающая преобразование ТТЛ-уровней сигналов в сигналы стандарта RS-232, которые должны находиться в диапазоне от -3...-25 В до +3...+25 В. С помощью предлагаемой мной программы и простого пробника можно легко произвести диагностику порта и приступить к его лечению. Ведь бывает очень обидно, когда, измучившись в поисках причины неработоспособности внешних устройств, оказывается, что неисправен был порт самого компьютера. Кроме того, эта программа позволяет убедиться в исправности порта, когда драйвер порта некорректно себя ведет. Это достигается тем, что
400 Глава 3. Тестовые устройства и программы обращения к порту из предлагаемой программы производятся с использованием стандартных функций Windows, так называемых API. Как правило, в современных компьютерах присутствует два СОМ-пор- та, которые выведены на тыльную сторону компьютера и заканчиваются 9-контактными разъемами-вилками типа DB-9M. Предыдущие модели компьютеров имели в своем составе СОМ-порты с 25-контактным разъемами-вилками типа DB-25M. СОМ-порты компьютера имеют сигналы, назначение которых представлено в Табл. 24.1. Таблица 24.1. Назначение сигналов СОМ-порта Контакт -О) 3B) 2C) 7D) 8E) 6F) 5G) 1(8) 4B0) 9 B2) Сигнал PG TD RD RTS CTS DSR SG DCD DTR RI Направление - Выход Вход Выход Вход Вход - Вход Выход Вход Название Protect Ground Transmit Data Receive Data Request to Send Clear to Send Data Set Ready Signal Ground Data Carrier Detect Data Terminal Ready Ring Indicator Назначение Защитная земля Передаваемые данные Принимаемые данные Запрос на передачу Готовность к приему Данные готовы Сигнальная земля Обнаружена несущая данных Готовность терминала Индикатор вызова Примечание. В скобках приведен номер контакта для 25-контактного разъема, без скобок — для 9-контактного. Подробнее с СОМ-портом можно познакомиться в специальной литературе. Для проверки работоспособности порта необходимо убедиться в исправности всех выходных и входных цепей сигналов, присутствующих на его разъеме, а также в способности микросхемы, обслуживающей порт, передавать и принимать данные. Предлагаемая программа и простейшая схема тестирования позволяют выполнить эту процедуру. Программа написана на языке программирования C++ в среде разработки Visual C++ и работает под управлением операционных систем Windows 9X/Me/NT/2000/XP и т. п. После запуска программа производит поиск имеющихся в компьютере СОМ-портов и выбирает для работы первый найденный по порядку порт. Если порты в компьютере не обнаружены, будет выдано соответствующее сообщение, и программа завершит свою работу. В процессе работы программы можно выбрать другой доступный компьютеру порт для тестирования.
24. Тестирование СОМ-порта 401 Изменить параметры настройки порта можно стандартными средствами по пути: мой компьютер -> Свойства -> Устройства -» Порты СОМ и LPT -> Последовательный порт -> Свойства -> Настройка порта. После запуска программы на экране монитора появиться окно, приведенное на Рис. 24.1. Рис. 24.1. Окно работы программы В центре окна программы изображены разъемы компьютера с назначением контактов и сигналов СОМ-порта. Для удобства тестирования приводятся два рисунка: для 9- и 25-контактного разъема соответственно. Номера контактов разъемов, их тип и назначение сигналов соответствуют стандартным и общепринятым для данных портов сигналам. В дальнейшем при работе программы контакты разъемов будут окрашены в красный или зеленый цвет, что соответствует положительному или отрицательному потенциалу на них соответственно. Ниже разъемов присутствуют две программные кнопки для сигналов RTS и DTR соответственно. Щелкая левой клавишей мышки по этим кнопкам, можно менять потенциал соответствующих выходных сигналов порта на противоположный потенциал. Данные операции будут сопровождаться автоматической сменой цветов на экране и потенциалов на контактах разъема.
402 Глава 3. Тестовые устройства и программы Третья программная кнопка TD предназначена для начала передачи данных через порт: Содержимое передаваемых данных представлено в поле «ПЕРЕДАЧА» и может быть изменено после щелчка левой кнопкой мыши по этому полю или с помощью кнопок, расположенных в меню программы. Принимаемые из СОМ-порта данные отображаются в поле «ПРИЕМ». Для проверки работоспособности порта можно воспользоваться обычным тестером и контролировать поочередно тестируемые сигналы. Но это не совсем удобно, тем более что разъемы расположены на тыльной стороне компьютера, контакты представляют собой штырьки, а не гнезда, и возможно случайное замыкание сигналов друг с другом. Поэтому я предлагаю использовать для проверки небольшое и очень простое устройство под названием «пробник». Схема этого устройства приведена на Рис. 24.2. Рис 242. Схема пробника Из схемы пробника следует, что все сигналы объединены в три разные группы. В каждой из групп присутствует только один выходной сигнал и от одного до трех входных сигналов. Пробник состоит из одного разъема-розетки типа DB-9F и нескольких светодиодов и резисторов, распаянных на небольшой макетной плате. Разъем припаивается к шлейфу длиной около метра, второй конец которого припаивается к плате с установленными светодиодами и резисторами. Пробник можно после подключения положить на стол рядом с пользователем и обеспечить
24. Тестирование СОМ-порта 403 удобство наблюдения за процессом тестирования порта. Состояние любого сигнала видно по светящемуся светодиоду. Цвет светящегося светодиода указывает полярность сигнала. Сравнивая эти сигналы с отображаемыми сигналами в программе, можно легко определить неисправную линию. Цепи передатчика и приемника порта замыкаются пробником между собой. Поэтому передаваемые данные будут приниматься этим же портом. Сравнивая передаваемые и принятые данные, можно проверить исправность приемопередатчика. Исполняемый код программы состоит из одного файла testrs.exe и не требует предварительной установки на компьютер. Программу можно скопировать с сайта издательства или с компакт-диска для данной книги. С целью уменьшения размера данного файла программа транслировалась в режиме Shared DLL, т. е. стандартные библиотечные файлы DLL не включались в тело программы, а используются после запуска программы из доступного системного каталога C:\WINDOWS\SYSTEM. Программа testrs использует следующие стандартные библиотечные файлы: MFC42.DLL, KERNEL32.DLL, GDI32.DLL, USER32.DLL и MSVCRT. DLL. Поэтому в случае, если программа выдаст сообщение об отсутствии некоторых из перечисленных библиотечных файлов DLL, необходимо поместить их в указанный выше каталог. Эти файлы являются стандартными и устанавливаются самой операционной системой Windows9X. Их можно также найти в Интернете, например, по адресу www.ya.ru. В дальнейшем эти файлы еще много раз пригодятся вам, поскольку большинство программ транслируется без включения их в тело программы с целью уменьшения своего размера. Литература 1. ГукМ. Аппаратные средства IBM PC. Энциклопедия. — СПб.: ПитерКом, 1998.
404 Глава 3. Тестовые устройства и программы 25. Автоматизированный фильтр-удлинитель сетевого питания Здесь говорится о том, как просто можно решить проблему автоматического включения и отключения монитора и других периферийных устройств компьютера с помощью простого электронного устройства. Современные компьютеры с источниками питания типа АТХ обладают одним существенным недостатком — отсутствием на системном блоке «транзитного» разъема сетевого питания для монитора, который включается и отключается вместе с системным блоком компьютера. Более ранние модели компьютеров комплектовались источниками питания типа AT, в которых имелся такой дополнительный разъем питания. Правда, у этих моделей применялся механический выключатель питания и отсутствовало автоматическое отключение компьютера. Но даже одной розетки, как правило, недостаточно, если вместе с компьютером нужно включать и отключать несколько устройств. К ним относятся такие устройства как монитор, принтер, сканер, источник питания для активных колонок, источник питания внешнего модема, настольная лампа и т. п. Причем источник бесперебойного питания (UPS) не решает данной проблемы полностью, поскольку имеет специфичные трехполюсные розетки, к которым невозможно подключить любые периферийные устройства без специального переходника. К тому же его мощность ограничена. Многие устройства не требуют бесперебойного питания, и их можно включать непосредственно в питающую сеть. Выпускаемые отечественные и импортные фильтры-удлинители сетевого питания, часто имеющие название «Pilot», или простые удлинители сетевого питания частично снимают данную проблему, но они не способны автоматически отключать от сети подключенные к ним устройства при парковке компьютера. А человек часто просто забывает их отключить вручную. Оказывается, данную проблему можно довольно просто решить с помощью самого компьютера и нескольких электронных компонентов. Необходимо лишь доработать покупной фильтр-удлинитель сетевого питания, сделав его активным устройством, питающим все розетки, кроме одной, только при включении компьютера. Одна неотключаемая автоматически розетка будет использоваться для питания самого компьютера или его источника бесперебойного питания. Пример включения такого автоматизированного фильтра-удлинителя сетевого питания показан на Рис. 25.1.
25. Автоматизированный удлиннитель сетевого питания 405 Рис. 25.1. Пример включения автоматизированного фильтра-удлинителя сетевого питания Суть доработки сетевого фильтра заключается в том, что в него встраивается специальный блок для управления розетками самого фильтра, использующий в качестве управляющего сигнала потенциал, формируемый в компьютере. В качестве такого потенциала можно использовать безопасное низковольтное напряжение плюс 5 В, имеющееся на нескольких интерфейсах компьютера. Например, можно использовать питание, взятое от интерфейса USB. Учитывая то, что таких интерфейсов у современных компьютеров становится все больше, этот вариант более предпочтителен. Тем более, что данный интерфейс можно будет использовать по своему прямому назначению, обеспечив лишь его транзит через сетевой фильтр. Ток, отбираемый от 5-вольтового источника интерфейса для управления коммутируемыми розетками сетевого фильтра, будет незначительным (несколько миллиампер) и практически не повлияет на нагрузочную способность данного интерфейса. В компьютерах, которые не имеют интерфейса USB, можно использовать питание, взятое от интерфейса игрового порта. Как правило, такие интерфейсы присутствуют на всех звуковых картах и даже на интегрированных материнских платах компьютеров. Наконец, для самых простых компьютеров, не имеющих ни одного из перечисленных интерфейсов, можно использовать питание клавиатуры, которая присутствует абсолютно у всех компьютеров. В этом случае клавиатуру можно запитать через транзитные разъемы, установленные в сетевой фильтр, или использовать для этого отдельный переходник для клавиатуры, который имеет ответвление напряжения питания 5 В самой клавиатуры и продается самостоятельно в большинстве компьютерных магазинов.
406 Глава 3. Тестовые устройства и программы Итак, рассмотрим схему автоматизированного фильтра-удлинителя сетевого питания.'Она представлена на Рис. 25.2. На схеме условно изображен корпус фильтра-удлинителя со шнуром питания XS, шестью розетками XS1—XS6, выключателем SA1 и элементами фильтра в виде блока А2, состоящего из дросселей LI, L2 и конденсаторов CI, С2. Все эти элементы и фильтр входят в состав покупного фильтра-удлинителя. Транзитные разъемы XI и ХО вместе с блоком управления А1 являются элементами доработки сетевого фильтра- удлинителя. Розетка XS1, включенная непосредственно после фильтра сетевого питания, является неуправляемой. В нее включается системный блок компьютера или UPS. Остальные розетки XS2—XS6 питаются от фазного провода F сети 220 В через блок управления А1. Рис. 25.2 Схема автоматизированного фильтра- удлинителя сетевого питания Согласно схемы, после включения компьютера, напряжение питания 5 В будет присутствовать на входном транзитном разъеме XI. Оно появляется при включении компьютера и обеспечивает протекание тока через токоограничивающий резистор R1, открывая при этом оптрон U1. Последний, в свою очередь, открывает семистор VS1 с помощью ограничительного резистора R2. Таким образом, розетки XS2—XS6 оказываются запитанными сетевым напряжением питания 220 В сразу же после включения компьютера и отключаются автоматически после его выключения. Как уже отмечалось, в качестве управляющего напряжения могут быть использованы различные интерфейсы. Поэтому транзитные разъемы XI и ХО должны соответствовать типу разъема используемого интерфейса. В Табл. 25.1 приведены типы разъемов для разных интерфейсов и назначение цепей контактам этих разъемов соответственно.
25 Автоматизированный удлиннитель сетевого питания 407 Таблица 25.1. Типы разъемов для разных интерфейсов и назначение их цепей Интерфейс USB Игровой порт Клавиатура AT Клавиатура AT PS2 Тип разъема XI Вилка USB B-4 Вилка DB-15M Вилка DIN41524M Вилка Mini DIN-6M хо Розетка USB A-4 Розетка DB-15F Розетка DIN41524F Розетка Mini DIN-6F Контакт 1 2 3 4 1, 8,9,15 2 3 4,5,12 6 7 10 11 13 14 1 2 3 4 5 1 2,6 3 4 5 Цепь I +5В +Data -Data GND +5В А Кнопка 1 А Координата X GND А Координата Y | А Кнопка 2 В Кнопка 1 1 В Координата X | В Координата Y | В Кнопка 2 | Clock Data | NC GND +5B Data 1 NC GND +5 В Clock 1 Входной разъем XI должен быть вилкой, поскольку его контакты не находятся под напряжением в отсоединенном состоянии, и при этом отсутствует опасность короткого замыкания его контактов. Выходной разъем ХО должен быть розеткой в силу вышеуказанной причины. Детали, из которых состоит блок управления, недефицитные и недорогие. В данном варианте схемы использовались элементы, приведенные в Табл. 25.2. Они допускают прямую замену на однотипные по характеристикам элементы. При использовании приведенных элементов блок управления позволяет коммутировать нагрузку до 6 кВт. Чего вполне достаточно для всего набора периферийных устройств с большим запасом.
408 Глава 3. Тестовые устройства и программы Таблица 252. Перечень элементов Позиционное обозначение Наименование Количество Примечание Резисторы R1 R2 VT1 VS1 С2-23-0Д25-620 Ом С2-23-0Д25-360 Ом Оптосемистор МОС3020М Семистор ВТ138 1 1 1 1 МЛТ-0,125 МЛТ-0,125 МОС3021М ВТ152 Все элементы схемы управления можно установить и распаять на небольшой макетной плате или разработать и изготовить для них одностороннюю печатную плату. Распаянный блок управления вместе с транзитными разъемами размещается в корпусе фильтра-удлинителя. Кроме того, в корпус фильтра- удлинителя можно встроить узел грозозащиты для модема, тем более, что в удлинителе уже имеется цепь заземления для снятия грозовых разрядов (цепь N). Тогда устройство будет выполнять еще одну очень полезную функцию. Таким образом, самый простой и недорогой фильтр-удлинитель можно превратить в очень полезный автоматизированный электронный фильтр- удлинитель сетевого питания.
ПРИЛОЖЕНИЯ Приложение 1 Система команд микроконтроллеров MCS-51 Команда I ACALL <ад эес И бит> I ADD A, < байт-источник > I ADDC А, < байт-источник> I AJMP < адрес 11 бит> 1 ANL <байт назначения >, <байт источника> ANL С, <байт источника > CJNE <байт назначения >, < байт- источник >, < смещение > CLRA CLR<bit> CPLA CPL<bit> DAA DEC<6aftT> DIVAB DJNZ <байт>, < смещение > INC <байт> INCDPTR JB <bit>, <метка> JBC <bit>, < метка > JC < метка > JMP@A+DPTR JNB <bit>, < метка > JNC < метка > JNZ < метка > Описание Абсолютный вызов подпрограммы Сложение Сложение с переносом Абсолютный переход Логическое «И» Логическое «И» для переменных-битов 1 Сравнение и переход, если не равно Сброс аккумулятора 1 Сброс бита 1 Инверсия аккумулятора 1 Инверсия бита 1 Десятичная коррекция аккумулятора для 1 сложения Декремент 1 Деление 1 Декремент и переход, если не равно нулю 1 Инкремент 1 Инкремент указателя данных 1 Переход, если бит установлен 1 Переход, если бит установлен и сброс 1 этого бита | Переход, если перенос установлен Косвенный переход | Переход, если бит не установлен | Переход, если перенос не установлен | Переход, если содержимое аккумулятора 1 не равно нулю _„*__J
410 Приложения Команда JZ < метка > LCALL <addrl6> LJMP <addr!6> MOV < байт назначения >, <байт источника> MOV < бит назначения >, <бит источника> MOV DPTR,#datal6 MOVCA,@A+(<R16>) MOVX <байт приемника >, <байт источника> MULAB NOP ORL < байт назначения >, <байт источника > ORL С, <бит источника > POP <direct> PUSH <direct> RET RETI RLA RLCA RRA RRCA SETB <bit> SJMP < метка > SUBB А, <байт источника > SWAP A XCH А, <байт> XCHD A,@R1 XRL < байт назначения >, <байт источника> Описание Переход, если содержимое аккумулятора равно О Длинный вызов Длинный переход Переслать переменную-байт Переслать бит данных Загрузить указатель данных 16-битовой константой Переслать байт из памяти программ Переслать во внешнюю память (из внешней памяти) данных Умножение Нет операции Логическое «ИЛИ» для байтов Логическое «ИЛИ» для битов Чтение из стека Запись в стек Возврат из подпрограммы Возврат из прерывания Сдвиг содержимого аккумулятора влево Сдвиг содержимого аккумулятора влево через флаг переноса Сдвиг содержимого аккумулятора вправо Сдвиг содержимого аккумулятора вправо через флаг переноса Установка бита Короткий переход Вычитание с заемом Обмен тетрадами внутри аккумулятора Обмен содержимого аккумулятора с переменной-байтом Обмен тетрадой Логическое «ИСКЛЮЧАЮЩЕЕ ИЛИ» для байт
Приложения 411 Приложение 2 Система команд микроконтроллеров AVR Команда | ADD | ADIW | AND ANDI ASR BCLR BLD BRBC BRBS BRCC BRCS BREQ BRGE BRHC BRHS BRID BRIE BRLO BRLT BRMI BRNE BRPL BRSH BRTC BRTS BRVC BRVS BSET BST CALL CBI CBR CLC CLH Описание Сложить без переноса Сложить непосредственное значение со словом Выполнить логическое AND Выполнить логическое AND с непосредственным значением Арифметически сдвинуть вправо Очистить флаг Загрузить Т флаг в бит регистра Перейти, если бит в регистре статуса очищен Перейти, если бит в регистре статуса установлен Перейти, если флаг переноса очищен Перейти, если флаг переноса установлен Перейти, если равно Перейти, если больше или равно (с учетом знака) Перейти, если флаг полупереноса очищен Перейти, если флаг полупереноса установлен Перейти, если глобальное прерывание запрещено Перейти, если глобальное прерывание разрешено Перейти, если меньше (без знака) Перейти, если меньше чем (со знаком) Перейти, если минус Перейти, если не равно Перейти, если плюс Перейти, если равно или больше (без знака) Перейти, если флаг Т очищен Перейти, если флаг Т установлен Перейти, если переполнение очищено Перейти, если переполнение установлено Установить флаг Переписать бит из регистра во флаг Т Выполнить длинный вызов подпрограммы Очистить бит в регистре I/O Очистить биты в регистре Очистить флаг переноса Очистить флаг полупереноса
412 Приложения Команда | CLI | CLN | CLR | CLS | CLT | CLV | CLZ СОМ СР | СРС | CPI | CPSE | DEC EOR | ICALL IJMP IN INC JMP LD Rd,X LD Rd,X+ LD Rd,-X LDI LDS LPM LSL LSR MOV MUL NEG NOP OR ORI OUT POP Описание Очистить флаг глобального прерывания Очистить флаг отрицательного значения Очистить регистр Очистить флаг знака Очистить флаг Т Очистить флаг переполнения Очистить флаг нулевого значения Выполнить дополнение до единицы Сравнить Сравнить с учетом переноса Сравнить с константой Сравнить и пропустить если равно Декрементировать Выполнить исключающее OR Вызвать подпрограмму косвенно Перейти косвенно Загрузить данные из порта I/O в регистр Инкрементировать Перейти Загрузить косвенно Загрузить косвенно инкрементировав впоследствии Загрузить косвенно декрементировав предварительно Загрузить непосредственное значение Загрузить непосредственно из СОЗУ Загрузить байт памяти программ Логически сдвинуть влево Логически сдвинуть вправо Копировать регистр Перемножить Выполнить дополнение до двух Выполнить холостую команду Выполнить логическое OR Выполнить логическое OR с непосредственным значением Записать данные из регистра в порт I/O Загрузить регистр из стека
Приложения 413 Команда | PUSH I RCALL I RET | RETI | RJMP | ROL I ROR SBC SBCI SBI SBIC SBIS SBIW SBR SBRC SBRS SEC SEH SEI SEN SER SES SET SEV SEZ SLEEP ST X,Rr ST Y,Rr ST Z,Rr STS SUB SUBI SWAP TST WDR Описание i Поместить регистр в стек Вызвать подпрограмму относительно Вернуться из подпрограммы Вернуться из прерывания Перейти относительно ] Сдвинуть влево через перенос Сдвинуть вправо через перенос Вычесть с переносом Вычесть непосредственное значение с переносом Установить бит в регистр I/O Пропустить если бит очищен в регистре I/O Пропустить если бит установлен в регистре I/O Вычесть непосредственное значение из слова Установить биты в регистре Пропустить если бит в регистре очищен Пропустить если бит в регистре установлен Установить флаг переноса Установить флаг полупереноса Установить флаг глобального прерывания Установить флаг отрицательного значения Установить все биты регистра Установить флаг знака Установить флаг Т Установить флаг переполнения Установить флаг нулевого значения Установить режим SLEEP Записать косвенно Записать косвенно из регистра в ОЗУ с использованием индекса Y Записать косвенно из регистра в ОЗУ с использованием индекса Z Загрузить непосредственно в ОЗУ Вычесть без переноса Вычесть непосредственное значение Поменять нибблы местами Проверить на ноль или минус Сбросить сторожевой таймер
414 Приложения Приложение 3 Система команд PIC микроконтроллеров семейства PIC16F84 Команда CALL k CLRWDT GOTO к RETLW к RETFIE RETURN SLEEP BCF f,b BSFf,b BTFSC f,b BTFSS f,b ADDWF f,d ANDWF f,d CLRF f CLRW COMF f,d DECF f,d DECFSZf,d INCF f,d INCFSZf,d IORWF f,d MOVF f,d MOVWF f NOP RLF f,d RRF f,d SUBWF f,d SWAPF f,d XORWF f,d ADDLW к ANDLW к IORLW к SUBLW к MOVLW к XORLW к OPTION TRIS f Описание Вызов подпрограммы Сброс Watchdog (сторожевого таймера) Переход по адресу Возврат из подпрограммы с загрузкой константы в W Возврат из прерывания. Возврат из подпрограммы. Переход в эежим SLEEP Сброс бита в регистре f Установка бита в регистре f Пропустить команду, если бит равен нулю Пропустить команду, если бит равен единице Сложение W с f Логическое И W и f Сброс регистра f Сброс регистра W Инверсия регистра f Декремент регистра f Декремент f, пропустить команду, если 0 Инкремент регистра f Инкремент f, пропустить команду, если 0 Логическое ИЛИ W и f Пересылка регистра f Пересылка W в f Холостая команда Сдвиг f влево через перенос Сдвиг f вправо через перенос Вычитание W из f Обмен местами тетрад в f Исключающее ИЛИ W и f Сложение константы с W Логическое И константы и W Логическое ИЛИ константы и W Вычитание W из константы. Пересылка константы в W Исключающее ИЛИ константы и W Загрузка W в OPTION регистр Загрузка TRIS регистра
Приложения 415 Приложение 4 Описание компакт-диска к книге Book\Razdell Файлы схем, прошивок и программ для первого раздела книги Book\Razdel2 Файлы схем, прошивок и программ для второго раздела книги Book\Razdel3 Файлы схем, прошивок и программ для третьего раздела книги Internet Адреса полезных страниц в Интернет Video Учебные видеофайлы Примечания: 1. Каталог Book содержит в себе подкаталоги с именами соответствующими нумерации разделов в книге и назначению файлов. 2. Подкаталоги с именем PCAD4_5 включают в себя файлы схем и топологий печатных плат, созданных в системе автоматизированного проектирования (САПР) PCAD 4.5. 3. Подкаталоги с именем PCAD2002 включают в себя файлы схем и топологий печатных плат, созданных в САПР PCAD 2002. 4. Подкаталоги с именем PLIS включают в себя файлы схем, прошивок и назначения выводов для программируемых логических интегральных схем (ПЛИС), созданных в САПР XILINX. 5. Подкаталоги с именем PROG включают в себя исполняемые файлы программ и исходные тексты программ.
УМНЫЕ КНИГИ «Дока-букс» — динамично развивающаяся компания, занимающаяся распространением технической литературы в России и ближнем зарубежье. Фирма основана группой компаний «Симметрон» на базе книготоргового отдела Издательского дома «Додэка-XXI» в начале 2006 г. и является эксклюзивным представителем данного издательства. В ассортименте «Дока-букс» книги более чем 60-ти издательств. Приглашаем к сотрудничеству книготорговые комании и издательства. Россия, Москва 105318, а/я 70 http//:www.dokabooks.m - Интернет магазин По вопросам преобретения обращаться по Тел./факс: +7 D95) 366-2429, 366-0922, 366-8145 E-mail: books@dodeca.ru