Головна > Комп'ютери > Периферія >
МИША І ЯК З НЕЮ БОРОТИСЯ

		       МИША І ЯК З НЕЮ БОРОТИСЯ

	                                       Всім тим, хто бере участь
	                                       в мишачій метушні. ;)

  (c)        Alexey Kulentsov, 2:5020/216.6@fidonet
  RealName:  Алєксєй Кулєнцов
  Version    1.08 from 17-10-96 16:18

  Якщо Вам щось не сподобалося в даному файлі або є що додати, не
полінуйтеся написати мені про це, будь-ласка.

  A. Что таке "миша"?

  Q. На протязі всього цього файла під мишею буде матися на увазі
     двомірний аналоговий маніпулятор, що підключається до персонального
     комп'ютера через послідовний порт, відповідний стандарту
     RS-232 і оснащений двома- тьома кнопками на верхній кришці.  З цим
     можна посперечатися, але все інші диджитайзери тут опущені, як інший
     різновид пристроїв. Амінь.


      Короткий опис функціонування з висоти пташиного польоту.

  Як було вказано вище, миша підключається до стандартного порту RS-232.
Таким чином, для передачі даних в комп'ютер використовуються стандартні
протоколи. Але є ще проблема живлення миші. Цю проблему вирішили, зажививши
мишу від невживаних сигнальних ланцюгів. А остільки допустимий струм для
цих ланцюгів невеликий, миша повинна бути економічним пристроєм.

  Коли Ви натискаєте або відпускаєте кнопку на миші або рухаєте її,
мікросхема, що стоїть в миші, обробляє цю подію і посилає в комп'ютер
пачку байтів з інформацією про подію. Прихід байтів викликає в комп'ютері
апаратні переривання (IRQ3 або IRQ4), які обробляються драйвером миші. Про
те, як програмувати послідовний порт і обробляти переривання,
дивись TechHelp. Драйвер миші "складає" цю інформацію в свої внутрішні
змінні і в залежності від режиму може виконувати додаткову роботу - як
правило, переміщувати мишачий курсор. Програма, яка знає, що таке
миша і горить бажанням скористатися нею, може зробити це через
стандартний інтерфейс на перериванні 33h. Про цей інтерфейс дивись,
наприклад, TechHelp або Interrupt List.


		     Опис протоколу посилок миші.

  Для активізації миші необхідно повісити обробник на відповідне
апаратне переривання, розмаскувати це переривання і встановити в порту
біти живлення миші. Обробник апаратного переривання зобов'язаний, крім
обробки приходячих від миші даних, також відновлювати в порту біти
живлення. Ці біти встановлюються в порту базова_адреса+4, який
називається Modem Control Register. Мені відомі миші, для живлення яких
треба видавати в цей порт число 8, число 0Bh, а також мишу, яка в
залежності від цього числа міняє свій режим роботи (0B-MS, 08-PC). Драйвер
TRUEDOX забезпечує це перемикання по функціях A0 (PC mouse) і A1 (MS
mouse).

  Є два поширених протоколи обміну.

  1. Microsoft Mouse.
  Протокол обміну наступний: 1200,N71.
  Забезпечує інформацію про 2 клавіші.
  По кожній події видається пачка з 3 байт:
      =T=======================
      1¦ -  1 LB RB Y7 Y6 X7 X6
      2¦ -  0 X5 X4 X3 X2 X1 X0
      3¦ -  0 Y5 Y4 Y3 Y2 Y1 Y0

  LB, RB - стан клавіш, натиснена клавіша = 1. Інші значащі біти - відносне
переміщення в додатковому коді з часу останньої посилки.
  Визначити наявність миші можна таким чином: в порт xFC записати
число 8, почекати, а потім знову 0Bh. На запис числа 0Bh миша реагує
посилкою одного або декількох байтів, серед яких обов'язково повинен
бути байт 4Dh (буква 'M' в таблиці ASCII).

  2. PC Mouse System
  Протокол обміну наступний: 1200,N81
  Забезпечує інформацію про 3 клавіші.
  По кожній події видається пачка з 5 байт:
      =T=======================
      1¦ 1  0  0  0  0 LB MB RB
      2¦X7 X6 X5 X4 X3 X2 X1 X0
      3¦Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
      4¦X7 X6 X5 X4 X3 X2 X1 X0
      5¦Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

  LB, MB, RB - стан клавіш, натиснена клавіша = 0. Інші значащі біти-
відносне переміщення з часу останньої посилки в
додатковому коді в двох частинах, які треба додавати. Можливо,
це пов'язано з тим, щоб не використовувати X7 і Y7, щоб не перетинатися
з першим ключовим байтом. Спосіб визначення наявності миші в цьому
режимі мені невідомий.

  Сучасні миші можуть перемикатися між цими двома протоколами.
Це може робитися трьома способами:
  1. По натисненій середній кнопці в момент ініціалізації миші.
  2. Перемикачем MS-PC.
  3. Комбінацією напруг на живлячих пінах СОМ-порту.
Бувають миші, в яких перемикач передбачений по схемі, але для економії 
не впаяний і в корпусі немає під нього отвору. Це можна перевірити, 
розібравши мишу і пошукавши монтажне місце під перемикач.
Бувають миші з регулюванням чуттєвості в вигляді повзунка. Бувають миші
без шарика, які переміщуються по спеціальному майданчику. Бувають миші 
без проводу до комп'ютера. Різні бувають миші!

  В додатку "A" Ви знайдете програму, що дозволяє подивитися на це і
заодно ілюструючу, як зробити свій обробник переривання.


			       Експерименти

  В ході експериментів по виявленню присутності миші програмним шляхом
виявилося, що кожна миша має індивідуальність, не відстаючи в цьому
від однойменного звіра. Це в тому, що стосується реакції на перемикання
живлячих пінів і посилки миші байтів.

  HQA2VTEAK3 (Model 3): живленням перемикається режим роботи. При
перемиканні PC -> MS повертає 4D, при переході назад реакції немає. Але
іноді при PC -> MS після байта 4D повертає ще пакет типу 40 00 01, а
при переході MS -> PC починає генерувати нульові байти доти,  поки не
станеться подія- натиснення на кнопку або рух миші. Якщо під час
генерації нулів перемкнути порт назад, перед 4D додатково пробігає
байт типу FF. На байти, що посилаються, ця миша не реагує.

  E6Q5J8MOUSEX11: Тільки MS режим. Три кнопки, але середня працює як
права. На дію 8 -> 0B в порту xFC реагує одним байтом- 4D.
Байти, які посилаються комп'ютером, повертає зворотно (ехо).

  ITEUEC19604966 (Artec): є перемикач MS-PC. В режимі MS реагує
на 8 -> 0B трьома байтами: 4D 00 00. Крім того, при перемиканні
перемикача PC -> MS повертає 4D 00 00, а MS -> PC - 4D 00 00 00 00. 
На байти, що посилаються, не реагує.

  17X-HM-A-B: З перемикачем MS - PC. На перехід 8 -> 0B реагує байтом
4D. Крім того, при перемиканні PC -> MS посилає 4D, а при MS -> PC
посилає два байти: 4D 4D. На байти, що посилаються, реакція цікава: на 00
повертає 00 4D. На інші реагує або числом (40 або 70 або 78, 7E, 7F), або 
числом і пакетом з трьох байт або навіть двома. Наприклад: 01 4C 01 3F.

  IYPTS: MS-PC, чіп HM8350A. На 8->0B реагує байтом 4D. На перемикання
MS->PC найчастіше посилає 00, PC->MS - 00 4D 4D. Але часто замість цього
шле різну муть. При натисненні середньої клавіші в режимі MS посилає пачку
байт з поточним станом. На байти, що посилаються, не реагує.

 FSUGMZA7 (Genius MouseOne, model Serial 3B): MS-PC. На ініціалізацію
реагує нестійко, часто видає замість 4D байт 4F. В режимі MS при
переході B->8 видає 7F, зворотно- 4F 4F 4F 4F 4F 4F. В режимі PC B->8
видає 7F, зворотно- 4C 4C 4C 4C 4C 4C.  Байти, що посилаються, повертає.
Перемикання кнопки MS->PC видає 4С 4С 4С 4С 4С 4С,  зворотно- 4F 4F 4F
4F 4F 4F.

 IOWCM-290F (JEC): MS-PC. При ініціалізації в MS режимі видає 4D, в РС-
мовчить. При перемиканні MS<->PC видає 00 а потім трьох- або
п'ятибайтову (в залежності від встановленого режиму) посилку з поточним
станом. В режимі MS при натисненні середньої кнопки видає посилку з
поточним станом. На байти, що посилаються, відповідає деяким хитрим
чином. Або нічого, або байт, або байт і посилка. Ось початок
таблиці: байт, що посилається,  байт, що повертається, S означає посилку.
 г==T=====T==T=====T==T=====T========¬
 ¦ 0¦00 S ¦ 8¦00 S ¦10¦00 S ¦18 66   ¦
 ¦ 1¦40 S ¦ 9¦7C   ¦11¦7C   ¦19 --   ¦
 ¦ 2¦60 S ¦ A¦7C   ¦12¦7C   ¦        ¦
 ¦ 3¦78   ¦ B¦7E   ¦13¦--   ¦ more.. ¦
 ¦ 4¦60 S ¦ C¦7C   ¦14¦7C   ¦        ¦
 ¦ 5¦78   ¦ D¦--   ¦15¦--   ¦        ¦
 ¦ 6¦7C   ¦ E¦--   ¦16¦--   ¦        ¦
 ¦ 7¦7E   ¦ F¦--   ¦17¦--   ¦        ¦
 L==¦=====¦==¦=====¦==¦=====¦========-

E6QMOUSE X31: MS-PC, чіп Z-8350. Режим РС включається, якщо в момент подачі
живлення натиснена середня кнопка. Механічна. В роботі відповідає
стандарту. На будь-який посланий байт ініціалізується і повертає 4D.

FSUGMZC7 (Genius EasyMouse), чіп Genius K030302B: MS-PC. При ініціалізації
в MS режимі видає 4D і іноді посилку, в режимі PC - 6D і іноді посилку.
Поведінка при перемиканні кнопки MS-PC така ж, як і у FSUGMZA7: пачки
по шість 4F або 4C. На байти, що посилаються, реагує одним байтом,
корелюучим з посилкою, і знову ж пачкою з шести 4F/4C.

  Все це можна з'ясувати за допомогою програми з додатку A. Якщо Ви також
отримали цікаві результати, напишіть мені.


		     Коротка допомога по ремонту миші.

  У всіх прикладах передбачається, що карта портів справна, і
несправність криється в миші.

 Q. Миша стала погано переміщуватися по обох або одному з напрямів.
    Можливо переміщення тільки праворуч, наприклад.

 A. Спочатку відкрийте кришку знизу і витягніть шарик. Подивіться на ролики,
    яких торкається шарик. Якщо на них налипнув бруд, прочистіть їх,
    використовуючи шило, скріпку або що-небудь подібне в якості інструмента.
    Більше за все забруднюються миші з металевими роликами.
    Менше за все- миші з тонкими пластмасовими роликами. Перевірте, як
    рухається курсор. Якщо прочищення не дало результатів, від'єднайте мишу
    від комп'ютера і розберіть. Використовуючи омметр, продзвоніть чотири проводи
    в хвості миші, похитуючи роз'єм в миші і перегинаючи хвіст поруч з мишею
    і поруч з роз'ємом, який включається в ком-порт. При виявленні слабого
    контакту усунути (див. наступний пункт). Якщо з хвостом все гаразд, 
    знайдіть на платі миші резистор, через який живляться світлодіоди миші.
    (Передбачається, що миша на світлодіодах, якщо ж вона на щітках,
    засоби вичерпуються їх прочищенням). Його опір треба
    підібрати, як правило, зменшити.  Можна його випаяти, заміряти
    опір і впаяти в два рази менший резистор.  Можна також просто
    припаяти паралельно йому резистор опором приблизно один кілоом.
    Як правило, цього досить.  Якщо попередні дії нічого не
    змінили і миша все одно не працює, візьміть шило і покрутіть
    непрацююче коліщатко в обидві сторони, торкаючись шилом до тих ніжок
    фотодіодів непрацюючої пари, які йдуть до головної мікросхеми. Якщо
    при торканні одного з фотодіодів миша раптом відреагує на обертання
    ролика, це означає, що відповідний йому світлодіод сів і його треба
    міняти. На цьому поломки, що зустрічалися мені, вичерпуються.

 Q. Драйвер взагалі не бачить мишу.

 A. Перевірте правильність установок драйвера і правильність підключення
    миші. Якщо Ви впевнені, що все правильно, від'єднайте мишу від
    комп'ютера і розберіть її. Продзвоніть омметром провода в хвості миші і
    знайдіть, який з них обірвався. Як правило, обриви трапляються в тому
    місці, де кабель виходить з миші. Причому зазвичай зламаний оранжевий
    провід. (Хто мені пояснить цю загадку?%-) В цьому випадку обрив можна
    виявити і так, потягнувши окремо за кожний з проводів кабеля з
    боку миші.  Ізоляція на проводах неміцна, і потрібний провід вилізе
    з кабеля. Як виправити це без укорочения кабеля: візьміть ніж або
    краще скальпель і починайте обережно різати зовнішню оболонку кабеля
    вздовж до місця обриву і далі приблизно на 8 мм, щоб мати доступ до
    іншого кінця обірваного проводу. Спаяйте обірваний провід і засуньте
    проводи зворотно в оболонку. Можна обмотати її після цього нитками або
    ізострічкою, але загалом це не потрібно, розріз навіть непомітний. Якщо
    всі проводи цілі, а миша не працює, можливо, полетів кварц. Крім
    того, іноді замість кварцу ставлять конденсатор.

 Q. Курсор поводиться дивно: переміщається по кутах екрана, відображає
    постійно натиснену клавішу.

 A. Ето відбувається через невідповідність протоколів миші і драйвера.
    Перевірте перемикач MS-PC на миші, а також установки драйвера.

 Q. Стала погано натискатися одна з кнопок.

 A. Кнопки зазвичай не ремонтуються. Раджу знайти нову кнопку або
    поміняти її місцем з середньою кнопкою, яка використовується менше,  
    якщо вона є. Правда, можливо, кнопка просто засмітилася. В цьому випадку
    може допомогти занурення кнопки в спирт з подальшим натисканням
    аж до висихання.


		Додаток A. Пpогpамма тестування миші.
- - - - - - - - - - - - - - - - moutest.c - - - - - - - - - - - - - - - -
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>

#ifndef MY_TYPE
#define MY_TYPE 1
typedef unsigned char  byte;
typedef unsigned int   word;
typedef unsigned long dword;
#endif

#define F1		0x3B00
#define F2		0x3C00
#define F3		0x3D00
#define F4		0x3E00
#define F5		0x3F00
#define F6		0x4000
#define F7		0x4100
#define Escape 		0x011B
#define Enter 		0x1C0D

#define VERSION "1.3"

word	baseport;		/* Базова адреса COM-порта */
word	intnum;			/* Номер його переривання */
word	port3FC=0xB;

#define MBSIZE 32
byte	mbuffer[MBSIZE+1];
byte	*mbhead=mbuffer,*mbtail=mbuffer;

void FIbyte(byte b)
{	byte *tmp=mbtail+1;
	if(tmp>=mbuffer+MBSIZE) tmp=mbuffer;
	if(tmp!=mbhead)
	{	*mbtail=b;mbtail=tmp;
	}
}
byte FObyte(void)
{	byte *tmp;
	if((tmp=mbhead)==mbtail) return 0xFF;
	if(++mbhead>=mbuffer+MBSIZE) mbhead=mbuffer;
	return *tmp;
}

/* Обробник апаратного переривання */
void interrupt newhrd(void)
{	/* Взяти байт від миші і засунути в чергу */
	FIbyte(inportb(baseport));
	/* Відновити живлення миші */
	outportb(baseport+4,port3FC);
	/* Кінець переривання */
	outport(0x20,0x20);
}

main(int argc,char **argv)
{	int		i;
	void interrupt (*oldint)(void);
	byte		intmask;

	cprintf("Mouse tester V"VERSION" Copyright (c) by Alexey Kulentsov, 
                                                        2:5020/216.6\r\n");
	if(argc<2)
	{	cprintf("Syntax: moutest <port_number>\r\n"
			"Keys:    F1 - Clear screen\r\n"
			"         F2 - Microsoft mode\r\n"
			"         F3 - PC Mouse System mode\r\n"
			"         F4 - Custom values to ports xFB,xFC\r\n"
			"         F5 -    0xB -> to port xFC\r\n"
			"         F6 -      8 -> to port xFC\r\n"
			"      Enter - Send byte to mouse\r\n"
			);
		_exit(1);
	}
	_AX=0;__int__(0x33);
	if(_AX==0xFFFF)
	{	cprintf("Mouse driver present- remove and try again.\r\n");
		_exit(3);
	}
	i=(*argv[1])-'0';
	if(i<1 || i>2)
	{	cprintf("Incorrect port number (only 1 or 2 need).\r\n");
		_exit(2);
	}
	if(i==1)
	{	baseport=0x3F8;
		intnum=0xC;
		intmask=0x10;
	}else
	{	baseport=0x2F8;
		intnum=0xB;
		intmask=0x8;
	}

	/* Встановити обробник апаратного переривання */
	oldint=getvect(intnum);
	setvect(intnum,newhrd);

	/* Проініціалізувати PIC 8259-1 */
	i=inportb(0x21)&~intmask;
	delay(1);
	outportb(0x21,(byte)i);
	delay(1);
	/* Перевірити наявність порту в адреснім просторі */
	if(inportb(baseport+1)&0xF8)
	{	cprintf("Error - No port present?\r\n");
		_exit(4);
	}

	/* Ставимо параметри порту */
	outportb(baseport+3,0x80);
	outport(baseport,0x60);	/* 1200 */
	delay(1);
	outportb(baseport+3,2); /* N71  ( L..ppsbb)  */
	delay(1);
	outportb(baseport+1,0);
	delay(1);
	outportb(baseport+4,1); /* Set DTR, /RTS for power */
	/* На всякий випадок */
	delay(100);
	/* Встановити DTR, RTS, OUT для живлення миші */
	outportb(baseport+4,port3FC);
	/* Переривання тільки по прийому байтів */
	outportb(baseport+1,1);

	clrscr();
redr:
	while(mbhead!=mbtail)
		cprintf("%02X  ",FObyte());
in:
	if(!bioskey(1)) goto redr;
	switch(bioskey(0))
	{ case Escape:	goto quit;
	  case F1:	clrscr();
			cprintf("F2·MS mode (N71), F3·PC mode (N81), F4·custom mode, 
                                                                 F5·0xB, F6·8\r\n");
			break;
	  case F2:	outportb(baseport+3,2); /* ( L..ppsbb)  */
			break;
	  case F3:	outportb(baseport+3,3); /* ( L..ppsbb)  */
			break;
	  case F4:	cprintf("\r\nEnter new xFC value, xFB value:");
			cscanf("%x %x",&port3FC,&i);
			outportb(baseport+3,i); /* ( L..ppsbb)  */
			outportb(baseport+4,port3FC);
			break;
	  case F5:	port3FC=0xB;outportb(baseport+4,port3FC);
			break;
	  case F6:	port3FC=0x8;outportb(baseport+4,port3FC);
			break;
	  case Enter:	cprintf("Send byte: ");
			cscanf("%x",&i);outportb(baseport,i);cprintf("\r\n");
			break;
	}
	goto redr;
quit:
	/* Заборонити переривання від порту */
	outportb(baseport+1,0);
	/* Заборонити обробку переривання в контролері */
	outportb(0x21,inportb(0x21)|intmask);
	/* Повернути вектор на місце */
	setvect(intnum,oldint);
	return 0;
}

=============================================================
Переклад - Olexandr Slobodyan, 20.III.2002



Украинская Баннерная Сеть

Головна  Алфавітний індекс  Довідка  Додати FAQ  E-mail
Новини  Пошук по сайту

Copyright © 2001 - 2002 Olexandr Slobodyan.
Сайт создан в системе uCoz