Помогите измерить сопротивление на Игровом (GAME) порту

Тема в разделе "WASM.ELECTRONICS", создана пользователем _mel, 25 дек 2006.

  1. _mel

    _mel New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2006
    Сообщения:
    6
    Необходимо программно измерить сопротивление на игровом порту...
    Возможно у кого-нибудь есть подобный код?
    В гугле и т.п. искал, но увы, рабочего и подходящего - ничего не нашел :dntknw:

    Буду очень благодарен
    Спасибо!....
     
  2. Solo

    Solo New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    131
    лет 10 назад информацию об этом было легко найти. Как сейчас, не знаю.
    если я ничего не путаю, то там нужно было поднять сигнал на каком-то выводе, а после этого мерять время, которое пройдет до появления сигнала на каком-то другом выводе.
    В терминах обращений к портам - чего-то послать в порт, а потом все время читать, пока прочитанный результат не будет чему-то равен (по маске).
    Все эти манипуляции связаны были с тем, что в джойстике для каждой оси ставился переменный резистор и конденсатор, который заряжался через этот резистр. Время заряда конденсатора как раз и определялось сопротивлением резистора, а значит и его положением.
     
  3. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    _mel хреновенько искал. Вот тебе Предновогодний подарочек :)
    Вот те ресурс солидный, там еще много, что есть рядом, проштудируй...
    http://www.epanorama.net/documents/joystick/pc_joystick.html#introduction
    +
    даю рабочий код (очень вылизанный, реальный и рабочий на машинах разного поколения) плюс оптимизЁный под малый расход процессорного времени (ни таймера ни прерывания у этой гадости нет!...Делаем выводы!)
    Код (Text):
    1. DetectGamePort:
    2.  
    3.     mov     dx, 0x201           ; адрес GAME порта
    4.     in      al, dx          ; читаем GAME порт
    5.     cmp     al, 0xFF        ; он читается как отсутствующий ?
    6.      je     @gmret
    7.     out     dx, al          ; сброс порта, стартуем измерители координат
    8.     mov     [fs:iGAMEp.CntMaxLevel], 10 ; некое начальное значение границы циклов измерения
    9.                     ; минимальный цикл для возможности детекта подключения GAME манипулятора "на ходу"
    10.     mov     [fs:iGAMEp.CntCycleMeasure], 16   ; запомнить как текущее значение счетчмка циклов измерения
    11.     xor     bx, bx          ; обнулить координату - Ax
    12.     xor     bp, bp          ; обнулить координату - Ay
    13.     xor     si, si          ; обнулить координату - Bx
    14.     xor     di, di          ; обнулить координату - By
    15.     mov     cx, 0x50F           ; CX максимально-возможное значение счетчика циклов измерения для грантированного обнаружения подключенного GAME манипулятора (наличия координат)
    16.     push    cx
    17. @readGamePort:
    18.     in      al, dx          ; чтение GAME порта
    19.     test    al, 1           ; координата - Ax измерена ?
    20.      jz     @cnbit2         ; Да, переход к анализу следующего бита (координаты)
    21.     inc     bx              ; увеличить координату Ax на один шаг
    22. @cnbit2:
    23.     test    al, 2           ; координата - Ay измерена ?
    24.      jz     @cnbit3         ; Да, переход к анализу следующего бита (координаты)
    25.     inc     bp              ; увеличить координату Ay на один шаг
    26. @cnbit3:
    27.     test    al, 4           ; координата - Bx измерена ?
    28.      jz     @cnbit4         ; Да, переход к анализу следующего бита (координаты)
    29.     inc     si              ; увеличить координату Bx на один шаг
    30. @cnbit4:
    31.     test    al, 8           ; координата - By измерена ?
    32.      jz     @cnbitLow           ; Да, переход к анализу следующего бита (координаты)
    33.     inc     di              ; увеличить координату By на один шаг
    34. @cnbitLow:
    35.     and     al, 0xF         ; все координаты измерены GAME портом ?
    36.     loopnew @readGamePort       ; Если нет и счетчик циклов измерения не вычерпан, то повтор (продолжение измерения)
    37.     mov     [fs:iGAMEp.StatButton], al
    38.     pop     ax
    39.  
    40.     cmp     ax, bx          ; значение замера в BX равно предельному ?
    41.      jne    @obhbx          ; Нет, значит по координате есть реальное измерениеа, обходим по метке
    42.     mov     bx, 8           ; Да, значит установим самый минимум для дальнейшего мажоритирования измерений с помощию BX
    43. @obhbx:
    44.     cmp     ax, bp          ; по Ay есть реальное измерение ?
    45.      je     @nwkrBP         ; Нет, обходим по метке
    46.     cmp     bx, bp          ; замер Ay больше чем Ax ?
    47.     cmovc   bx, bp          ; если да, то в BX теперь координата Ay вместо Ax, как большая
    48. @nwkrBP:
    49.     cmp     ax, si          ; по Bx есть реальное измерение ?
    50.      je     @nwkrSI         ; Нет, обходим по метке
    51.     cmp     bx, si          ; замер SI больше ?
    52.     cmovc   bx, si          ; если да, то в BX теперь координата Bx из SI, как большая
    53. @nwkrSI:
    54.     cmp     ax, di          ; по By есть реальное измерение ?
    55.      je     @nwkrDI         ; Нет, обходим по метке
    56.     cmp     bx, di          ; замер DI больше ?
    57.     cmovc   bx, di          ; если да, то в BX теперь координата By из DI, как большая
    58. @nwkrDI:                ; теперь в BX наверняка самое максимальное значение измерений
    59.     cmp     bx, 0x510           ; это значение уже слишком велико для системы, чтобы его принять как новую границу ?
    60.      jnc    @gmret          ; Да, обходим по метке
    61.     cmp     bx, [fs:iGAMEp.CntMaxLevel]     ; это значение превышает граничное значение максимума ?
    62.      jc     @gmret          ; Нет, обходим по метке
    63.     add     bx, 8           ; увеличим полученный максимум на 8 для наличия некого запаса до границы максимума
    64.     mov     [fs:iGAMEp.CntMaxLevel], bx    ; сохраним новый порог максимума измерителей
    65.     add     bx, 8           ; дополнительно увеличим значение для рабочего счетчика циклов измерений
    66.     mov     [fs:iGAMEp.CntCycleMeasure], bx  ; сохраним значение рабочего счетчика циклов измерений
    67.     mov     [fs:iGAMEp.FlagGAMEp], bl  ; записать что либо > 0 как флаг наличия устройства
    68. @gmret:    RET
     
  4. _mel

    _mel New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2006
    Сообщения:
    6
    VaStaNi
    Огромнейшее спасибо :) ... действительно предновогодний подарочек

    Ну не то что бы хреновенько, я искал на русских сайтах, а про буржуйские как-то забыл :) хотя логичнее было там поискать .... очевидно у логики новый год начался раньше :)

    Спасибо огромное и за ресурс, и за материал!
    С новым годом!