Передовица » Макулатура » Журналы » Радиолюбитель ваш компьютер 2/99

Радиолюбитель ваш компьютер 2/99. Белоруссия.

Н. АКЕЛЬЕВ, г. Волгоград

Подключение мыши к любительскому компьютеру

В данной статье на примере ПЭВМ "Агат-7" рассматривается подключение импортного манипулятора мышь (Serial Mouse), совместимого с MICROSOFT MOUSE, к любительскому или бытовому компьютеру.

Как работает импортный манипулятор мышь для IBM РС/ХТ, можно узнать из литературы [1]. Мы рассмотрим работу мыши, предназначенной для IВМ РС/АТ (мышь для IВМ РS2 работает так же, но имеет другую конструкцию разъема). Манипулятор подключается к компьютеру через разъем последовательного интерфейса RS232 (на рис.1 показана ответная часть разъема), в котором используются 4 контакта. Контакт 7 - сигнал RTS (Request To Send - запрос на передачу). Через него мышь при активном сигнале RTS получает положительное напряжение питания (+5...10 В согласно требованиям интерфейса); Контакт 3- сигнал TXD (Transmit Data - передаваемые данные). Через него при отсутствии передаваемых данных мышь получает отрицательное напряжение питания (-5... 10 В); Контакт 2 - сигнал RXD (Recieve Data - принимаемые данные). Через него мышь передает в последовательном коде информацию о перемещениях и нажатии кнопок. Сигнал является биполярным с уровнями напряжений +(5... 10) В. Логическому "0" соответствует положительный уровень, логической "1" - отрицательный; Контакт 5 - GND (Ground - схемная "земля").

Данные по линии RXD передаются со скоростью 1200 Бод (бит в секунду). Каждое передаваемое слово состоит из 10 бит: один стартовый бит, восемь информационных и один стоповый бит. Контроль четности отсутствует. Вначале передается младший информационный разряд, затем - старший. Для примера на рис.2 изображена передача байта 07Н. При каждом изменении состояния <мыши> (нажатии/отпускании кнопки или перемещении) передается слово из трех байт информации.

Структура данного слова и назначение каждого разряда показано на Рис.3. Старший (седьмой) разряд всегда имеет значение логической "1" в первом байте и значение логического "0" во втором и третьем байтах. Шестой и пятый разряды первого байта содержат информацию о состоянии кнопок мыши. Нажатой кнопке соответствует значение логической "1", отпущенной - логического "0". Четвертый разряд первого байта в случае использования трехкнопочной мыши содержит информацию о состоянии третьей (средней) кнопки. При использовании двухкнопочной мыши данный разряд отведен под величину перемещения по оси Y. Кроме того, величина смещения по оси Y отражается во втором и третьем разрядах первого байта (старшая часть) и в разрядах с нулевого по шестой третьего байта (младшая часть). Величина перемещения по оси X отражается в нулевом и первом разрядах первого байта и в разрядах с нулевого по шестой второго.

Дело в том, что скорость передачи по последовательному каналу относительно небольшая, а разрешение современных манипуляторов высокое (до 400 шагов на дюйм, т.е. до 16 шагов на миллиметр). Поэтому за время передачи трех байт информации мышь может сделать несколько шагов по той или иной оси координат, что численно отражается в указанных разрядах передаваемых байтов. Микросхема, встроенная в мышь, довольно "интеллектуальна". Она передает информацию о перемещении в виде числа, непосредственно подготовленного для суммирования со счетчиком позиции в программе. Положительным перемещениям соответствуют числа в прямом коде, а отрицательным - в обратном дополнительном. Например, при положительном перемещении на 3 шага по оси X передается число 003Н, а при перемещении в противоположном направлении на те же 3 шага - число 1FDН. Однако, как видно из Рис.3, полное число оказывается разбросанным по разрядам двух байтов, и чтобы его действительно прибавить к счетчику позиции, эти разряды надо "вырезать" и скомпоновать.

Последнее, что следует сказать о работе мыши на уровне сигналов, это то, что после включения питания для запуска работы ее схемы необходимо произвести "сброс". Это делается кратковременным изменением полярности сигнала TXD. Конкретно для этого надо через последовательный порт по линии TXD передать константу ООН.

Для управления обменом данными через интерфейс RS232 предназначена микросхема 580ВВ51. В ПЭВМ "АГАТ-7"[4] такая микросхема расположена на интерфейсной плате. На Рис.4 представлен фрагмент схемы интерфейсной ячейки ПЭВМ "АГАТ-7", относящийся к последовательному порту. Жирными линиями на схеме показана доработка платы, которую надо произвести, а крестиками помечены связи, которые необходимо удалить. Доработка сводится к установке дополнительного разъема ХЗ типа РП15-9 (или импортного - DB9(М)), и переключению на него входа и выхода последовательного порта. Тем самым полностью освобождается под принтер штатный разъем Х2. Аппаратное формирование сигнала RTS в ПЭВМ "АГАТ-7" не предусмотрено, поэтому на контакт 7 разъема ХЗ просто подается напряжение от источника +12 В через резистор R18. Кроме того, сигнал RXRDY с контакта 14 микросхемы DD10 желательно через диод VDЗ подать на контакт А22 системной шины (сигнал запроса маскируемого прерывания -IRQ), проинвертировав его на свободном элементе платы DD4.6. Это позволяет программе обрабатывать данные, поступающие от мыши в режиме маскируемых прерываний. Единичное состояние сигнала RXRDY свидетельствует о том, что микросхема DD10 (580ВВ51) приняла очередное слово по последовательному интерфейсу. После считывания байта процессором этот сигнал сбрасывается до приема очередного слова. Работа по прерываниям используется в приводимой ниже демонстрационной программе. Однако работу с манипулятором мышь можно организовать и через опрос состояния последовательного порта. Для этого надо опрашивать его состояние с частотой не менее 120 Гц. С этой целью можно использовать ту же подпрограмму, что и для обработки прерывания, заменив в строке 69 команду возврата RTI на команду RTS.

Рассмотрим принципы работы микросхемы КР580ВВ51, относящиеся к данному случаю. При включении питания ПЭВМ вырабатывается сигнал RESET (СБРОС), которым микросхема переводится в состояние ожидания прихода байта режима. В случае нахождения интерфейсной ячейки в пятом разъеме ПЭВМ "АГАТ" (стандартное положение) байт инициализации передается по адресу 0C09Н и имеет значение 4FН. Состояние 01В разрядов 7 и 6 означает один стоповый бит; состояние 00В разрядов 5 и 4 означает отсутствие контроля четности; состояние 11В разрядов 3 и 2 означает восемь бит в информационной части слова; состояние 11В разрядов 1 и 0 задает коэффициент деления для внутреннего делителя микросхемы 1:64. Этот коэффициент показывает, во сколько раз надо разделить тактовую частоту на контактах 9 (ТхС) и 25 (RxС) для получения требуемой частоты обмена. Сигнал F1 в ПЭВМ "АГАТ" имеет частоту 1 МГц, счетчик DD7 делит ее на 13. Нетрудно подсчитать, что для получения частоты 1200 Гц результат надо еще разделить на 64. После установки режима по тому же адресу 0C0DН в микросхему передается байт команды, имеющий значение 05Н. Единичные разряды в этом байте означают разрешение приема и передачи. На этом инициализация микросхемы закончена, она готова к приему и передаче данных. В дальнейшем байты, поступающие в микросхему по адресу 0C0DН, воспринимаются ею как команды, но если поступила команда со значением 40Н, то происходит внутренний сброс, и микросхема переходит в состояние ожидания байта режима.

Считывание принятых байтов и выдача байтов на передачу производятся по адресу 0C08Н. По адресу 0C09Н из микросхемы считывается слово состояния. Первый разряд слова состояния соответствует сигналу RXRDY на контакте 14 микросхемы, описанному выше. "1" в разряде 4 соответствует сигналу ошибки переполнения ОЕ, возникающей если программа не считала байт информации до прихода следующего. Ошибки не останавливают работу микросхемы и не анализируются в приводимой ниже демонстрационной программе. Если же такой контроль понадобится, то надо сначала сбрасывать разряды ошибок в слове состояния. Для этого по адресу 0C09Н надо записать байт команды с логической "1" в 4-м разряде. Но значение байта должно быть не10Н, а 15Н, чтобы не сбросить режимы чтения/записи. Более подробно с работой микросхемы можно познакомиться в литературе[2].

Ниже приведен текст простейшей демонстрационной программы, которая показывает реакцию на перемещения мыши и нажатие кнопок. На экран выводится состояние трех байт: ВКМ1, ВКМХ и ВКМY. Первый из них изменяется при нажатии кнопок, второй и третий - при перемещениях по осям X и У соответственно. В ПЭВМ "АГАТ" применяется микропроцессор 6502 [3], имеющий систему команд, отличную от КР580ВМ80 или Z80, наиболее привычных для любителей, но отличия направлены в сторону упрощения. Поэтому, при желании можно разобраться в работе программы. Поясним только назначение константы D (строки 86, 87). Чувствительность в 16 точек на миллиметр для ПЭВМ "АГАТ" явно неуместна. Вполне достаточно двух точек на миллиметр, то есть в 8 раз меньше. В константе D задается количество разрядов, которые надо "отбросить" в принятой величине перемещения, прежде чем сложить ее со счетчиком позиции. В данном случае это 3 разряда (D=3). Но программа позволяет варьировать величину D от 1 до 8. Значение "отброшенных" разрядов не теряется, а суммируется отдельно и запоминается в ячейках BUF+1 и BUF+2 (строки 23, 24 и 42, 43). Признак переноса этой суммы учитывается при сложении со счетчиком позиции. Конфигурация байта ВКМ1, формируемая в строках 58...62 и 70...75, выбрана из соображений эмуляции аналогичного байта, формируемого манипулятором УВК-01. Это сделано потому, что только путем эмуляции можно заставить работать с нештатной мышью готовый графический редактор MOUSEGRAF-3.0 [4]. Описываемая программно-аппаратная система разрабатывалась с целью встраивания в этот графический редактор, рассчитанный на работу с ныне крайне дефицитными и имеющими ряд недостатков манипуляторами отечественного производства УВК-01 и ММ8031. Реализовать эту задачу удалось полностью, но только через опрос состояния последовательного порта. Через прерывания сделать это не получилось. Помешала некорректная работа таймерных прерываний по линии IRQ в ПЭВМ "АГАТ-7" (конструкторская ошибка).

Функционирование описанной демонстрационной программы и графического редактора совместно с доработанной интерфейсной ячейкой было проверено на двухкнопочной мыши MITSUMI и на трехкнопочных DEFENDER и GENIUS EASY. Для сохранения универсальности и некоторого упрощения игнорируется четвертый бит первого байта, то есть реакция на нажатие средней кнопки трехкнопочной мыши не предусмотрена.

1    ;
2    ORG$2000
3    JMP INITMOUS ; ПЕРЕЙТИ К ИНИЦИАЛИЗАЦИИ МЫШИ
4    ; ОБРАБОТКА ДАННЫХ ОТ МЫШИ ПО ПРЕРЫВАНИЮ
5   ODM:
6    PHA         ; СОХРАНЕНИЕ РЕГИСТРОВ В СТЕКЕ
7    TXA
8    PHA
9    TYA
10   PHA
11   LDX NR      ; АДРЕС РАЗЪЕМА МЫШИ
12   LDA $C089,X ; СЧИТАТЬ СЛОВО СОСТОЯНИЯ
13   AND #$02    ; ПРИНЯТ БАЙТ ОТ МЫШИ?
14   BEQ ODM1    ; НЕТ -> ВЫХОД ИЗ П/П
15   LDA $c088,X ; СЧИТАТЬ БАЙТ
16   BPL ODM6    ; СТАРШИЙ РАЗРЯД=0? ДА -> ODM6
17   JMP ODM2    ; НЕТ -> ODM2 ПРИНЯТ ПЕРВЫЙ БАЙТ
18  ODM6:
19   BIT SCB     ; ПРОВЕРКА БАЙТА-ПЕРЕКЛЮЧАТЕЛЯ
20   BPL ODM7    ; СТАРШИЙ РАЗРЯД=0? ДА ->ODM7
21   JSR ODM10   ; НЕТ -> ПРИНЯТ ВТОРОЙ БАЙТ
22   CLC         ; ГАШЕНИЕ ПРИЗНАКА ПЕРЕНОСА
23   ADC BUF+1   ; СЛОЖИТЬ ОСТАТОК И
24   STA BUF+1   ; ЗАПОМНИТЬ В BUF+1
25   PHP         ; ЗАПОМНИТЬ ПРИЗНАК ПЕРЕНОСА
26   LDA BUF     ; ВЫРЕЗАЮТСЯ СТАРШИЕ
27   ASL A       ; РАЗРЯДЫ СМЕЩЕНИЯ ПО Y И X
28   ASL A       ; ИЗ ПЕРВОГО БАЙТА
29   ASL A
30   STA BUF     ; ЗАПОМИНАЮТСЯ В BUF. ВЫРЕЗАЮТСЯ  
31   JSR ODM12   ; И СДВИГАЮТСЯ С УЧЕТОМ ЗНАКА
32   ORA BUF+3   ; ПРИСТЫКОВЫВАЮТСЯ К ПРИНЯТЫМ
33   PLP         ; ПРИБАВИТЬ ШАГИ ПО X
34   ADC BKMX    ; К СЧЕТЧИКУ X И ЗАПОМНИТЬ
35   STA BKMX    ; В СЧЕТЧИКЕ РЕЗУЛЬТАТ
36   LDA #$00    ; СТАРШИЙ РАЗРЯД БАЙТА-
37   STA SCB     ; ПЕРЕКЛЮЧАТЕЛЬ СДЕЛАТЬ РАВНЫМ 0
38   JMP ODM1    ; ВЫЙТИ ИЗ П/П
39  ODM 7:
40   JSR ODM10   ; ПРИНЯТ ТРЕТИЙ БАЙТ
41   CLC         ; (ПОДГОТОВКА СЛОЖЕНИЯ)
42   ADC BUF+2   ; СЛОЖИТЬ ОСТАТОК И 
43   STA BUF+2   ; ЗАПОМНИТЬ В BUF+2
44   PHP         ; ЗАПОМНИТЬ ПРИЗНАК ПЕРЕНОСА
45   LDA BUF     ; ВЫРЕЗАЮТСЯ СТАРШИЕ РАЗРЯДЫ
46   AND #$C0    ; СМЕЩЕНИЕ ПО Y ИЗ ПЕРВОГО
47   JSR ODM12+2 ; БАЙТА, СДВИГАЮТСЯ И ПРИ-
48   ORA BUF+3   ; СТЫКОВЫВАЮТСЯ К ПРИНЯТЫМ
49   PLP         ; ПРИБАВИТЬ ШАГИ ПО Y
50   ADC BKMY    ; К СЧЕТЧИКУ Y И ЗАПОМНИТЬ
51   STA BKMY    ; В СЧЕТЧИКЕ РЕЗУЛЬТАТ 
52   JMP ODM1    ; ВЫЙТИ ИЗ П/П
53  ODM2:
54   ASL A ; СДВИГОМ ВЛЕВО УДАЛИТЬ СТАРШИЙ РАЗРЯД
55   STA BUF     ; ЗАПОМНИТЬ РЕЗУЛЬТАТ В BUF
56   LDS #$80    ; СДЕЛАТЬ СТАРШИЙ РАЗРЯД БАЙТА-
57   STA SСB     ; ПЕРЕКЛЮЧАТЕЛЯ РАВНЫМ 1
58   LDA #$CF    ; ЗА ИСХОДНОЕ ЗНАЧЕНИЕ BKM1 ПРИНЯТЬ $CF
59   BIT DUF     ; ПРОВЕРКА РАЗРЯДОВ В BUF
60   BMI ODM4    ; НАЖАТА ЛЕВАЯ КНОПКА -> ODM4
61   BVS ODM5    ; НАЖАТА ПРАВАЯ КНОПКА -> ODM5
62   STA BKM1    ; ЗАПОМНИТЬ ПРИЗНАКИ НАЖАТИЯ КНОПОК
63  ODM1:
64   PLA
65   TAY         ; ВОССТАНОВЛЕНИЕ РЕГИСТРОВ
66   PLA         ; ИЗ СТЕКА
67   TAX
68   PLA
69   RTI         ; ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ
70  ODM4:
71   AND #$7F    ; ПРИЗНАК НАЖАТИЯ ЛЕВОЙ КНОПКИ
72   JMP ODM1-5
73  ODM5:
74   AND #$BF    ; ПРИЗНАК НАЖАТИЯ ПРАВОЙ КНОПКИ
75   JMP ODM1-3
76  SCB:
77   DFB $00     ; БАЙТ-ПЕРЕКЛЮЧАТЕЛЬ
78  BUF:
79   DFB $00.$00.$00.$00.$00  ; РАБОЧИЕ ЯЧЕЙКИ
80  BKM1:
81   DFB $CF     ; ИНФОРМАЦИЯ О НАЖАТЫХ КНОПКАХ
82  BKMX:
83   DFB $00     ; СЧЕТЧИК КООРДИНАТ X
84  BMKY:
85   DFB $00     ; СЧЕТЧИК КООРДИНАТ Y
86  D:
87   DFB $03     ; КОЛИЧЕСТВО ОТБРАСЫВАЕМЫХ РАЗРЯДОВ
88  NR:
89   DFB $50     ; НОМЕР РАЗЪЕМА ИНТЕРФЕЙСНОЙ ЯЧЕЙКИ 
90  ODM10:
91   STA BUF+3   ; ЗАПОМНИТЬ ПРИНЯТЫЙ БАЙТ В BUF+3
92   LDA #$00    ; ИСХОДНОЕ ЗНАЧЕНИЕ ОСТАТКА = 0
93   LDY D	 ; ЗАГРУЗИТЬ В РЕГИСТР Y КОНСТАНТУ D
94   ODM11:
95   LSR BUF+3	 ; ЛИШНИЕ РАЗРЯДЫ ИЗ BUF+3 СДВИГОМ
96   ROR А	 ; ВПРАВО ВДВИГАЮТСЯ В РЕГИСТР А
97   DEY	 ; ИЗ СОДЕРЖИМОГО РЕГИСТРА Y ВЫЧЕСТЬ 1
98   BNE ODM11	 ; ЕСЛИ В РЕГИСТРЕ Y НЕ 0 ->ODM11
99   RTS	 ; ВЫХОД ИЗ П/П
100 ODM12:
101  ASL А	 ; СМЕЩЕНИЕ 2-Х ЗНАЧАЩИХ РАЗРЯДОВ В
102  ASL А	 ; СТАРШИЕ РАЗРЯДЫ БАЙТА
103  STA BUF+4   ; ЗАПОМНИТЬ РЕЗУЛЬТАТ В BUF+4
104  LDY D	 ; УЧЕСТЬ КОЛИЧЕСТВО ОТБРАСЫВАЕМЫХ
105 ODM14:
106  DEY	 ; РАЗРЯДОВ
107  BEQ ODM13
108  CLS         ; СТАРШИЙ ЗНАКОВЫЙ РАЗРЯД
109  BIT BUF+4	 ; СОХРАНЯЕТСЯ В СТАРШЕМ
110  BPL *+3	 ; РАЗРЯДЕ БАЙТА
111  SEC	 ; ПРИ СДВИГЕ ВПРАВО И РАСПРОСТРА-
112  ROR BUF+4	 ; НЯЕТСЯ НА ОСВОБОЖДАЕМЫЕ РАЗРЯДЫ
113  JMP ODM14
114 ODM13:
115  LDA BYF+4   ; РЕЗУЛЬТАТ В РЕГИСТРЕ А
116  RTS	 ; ВОЗВРАТ ИЗ ПОДПРОГРАММЫ
117  ; ИНИЦИАЛИЗАЦИЯ МЫШИ
118 INITMOUS:
119  SEI	 ; ЗАПРЕТ ПРЕРЫВАНИЙ
120  LDX NR	 ; АДРЕС РАЗЪЕМА
121  LDA #$4E	 ; ОДИН СТОПОВЫЙ БИТ, НЕТ КОНТРОЛЯ
                 ; ЧЕТНОСТИ
122  STA $C089,X ; СЛОВО 8 БИТ, ДЕЛЕНИЕ	1:64
123  LDA #$05	 ; РАЗРЕШЕНЫ ЗАПИСЬ И СЧИТЫВАНИЕ
124  STA $C089	 ; X
125  STA $C200	 ; ПОДГОТОВКА К ПРЕРЫВАНИЯМ IRQ
126  LDA #>ODM	 ; УСТАНОВИТЬ УКАЗАТЕЛЬ
127  STA $FFFE	 ; ВЕКТОРА ПРЕРЫВАНИЯ
128  LDA #<0DM	 ; IRQ НА П/П 0DM
129  STA $FFFF
130  STA $C220
131  LDA #$00	 ; ЗАПУСК СХЕМЫ МЫШИ
132  STA $C088,X
133  CLI	 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ
134  ; ДЕМОНСТРАЦИОННАЯ ЧАСТЬ
135  STA $C78A	 ; УСТАНОВКА ЭКРАННОГО РЕЖИМА АЦР64
136 DEMO:
137  LDA BKM1    ; ЗАПИСЬ БАЙТА СОСТОЯНИЯ КНОПОК
138  STA $1000
139  LDA BKMX	 ; И СЧЕТЧИКОВ ПОЗИЦИИ ПО X
140  STA $1001
141  LDA BKMY	 ; И ПО Y В НАЧАЛО ЭКРАННОЙ
142  STA $1002	 ; ОБЛАСТИ
143  JMP DEMO	 ; ЗАЦИКЛИТЬ ЭТУ ПРОЦЕДУРУ

Литература
1. Долгий А. "Мышь": что внутри и чем питается? - Радио, 1996, N9, С.28-30.
2. Микропроцессоры: Справочное пособие для разработчика судовой РЭА/Под ред. Ю.А.Овечкина. - Л.: Судостроение, 1987.
3. Мымрин. Конструкция, применение, программирование и ремонт ПЭВМ "АГАТ". - М.: Машиностроение, 1990.
4. Акельев Н. Ввод контуров рисунков с помощью "мыши". - Радио, 1998, N1, С.28.

Автор статьи передал сайту agatcomp свой архив с ГМД. И теперь модифицированная версия редактора, описанная здесь, добавлена на страничку MOUSEGRAF.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *