Раздел: Документация
0 ... 12 13 14 15 16 17 18 ... 105 каждые 55 мс. Разрешается применять только третий счетчик, так как первые два уже используются операционной системой компьютера. Следующая функция на языке ТР6 позволяет измерить временной интервал. Переменная х указывает, по какому аналоговому входу он будет определяться. Функция port($201): =0 выполняет операцию записи в игровой порт для запуска одновибратора. Сразу после этого считывается значение счетчика 8253 и полученный результат присваивается переменной Tiroel. Потом в цикле постоянно проверяется, когда соответствующий бит регистра станет равным нулю. Как только это произойдет, значение счетчика снова считывается и присваивается переменной Time2. Затем вычисляется временной интервал. Данная функция использует процедуру init 8253 и функцию Read 8253. Первая записывает число 255 в старший и младший разряды счетчика 3 и настраивает его как независимый счетчик, вторая считывает старший и младший байты счетчика 3. (•-Библиотека ресурсов № А16 (получение длительности периода одновибратора).-*) Function interval game port(x:integer):integer; (*x выбирает AX(x=1), AY(x=2), BX(x=3), BY(x=4).*) var timel,time2,dummy:integer; Procedure init 8253; («Настройка 8253.*) begin («Управляющее слово = Ьбп = 10110110b: 10= выбор счетчика 2; 11= сначала чтение/запись младшего байта, затем старшего; 011 = режим 3; 0 = шестнадцатибитовый двоичный счет.*) port($43) port($42) port($43) port($61) port($43) end; =$Ь6;(«Запись управляющего слова в управляющий регистр 8253.*) =255;(«-Загрузка младшего байта.*) =255:(«Загрузка старшего байта.*) =port($61)or 1;(«Выключение внутреннего динамика.*) =$80:(*80h - команда фиксации для счетчика 3.*) Function read 8253:integer; («Считывание младшего и старшего байтов счетчика.*) var low byte,high byte:byte; begin low byte:=port($42); high byte:=port($43); read 8253:=low byte+256»high byte; end: var i: integer; begin init 8253; for i;=1 to 100 do i:=i; i:=0; dummy:=bit weight(x); port($201):=0; timei:=read 8253; repeat i:=i+l until (port($201) and dummy=0) or (i>=5000); time2:=read 8253; interval game port:=time2-time1; if i>=5000 then interval game port:=0; end; А вот как выглядит эта функция, написанная на языке Turbo Pascal для Windows: (•-Библиотека ресурсов № А14 (чтение регистра игрового порта).-*) Function read game port(bitx:integer):integer: export; (•Адрес игрового порта: 201h Bitx выбирает состояние АХ, AY, ВХ, BY, ВА1, ВА2, ВВ1 и ВВ2.*) var mput byte byte; begin mput byte:=port($201); read game port:=round((mput byte and bit weight(bitx))/bit weight(bitx)); end; (•-Библиотека ресурсов № A15 (запись в регистр игрового порта).-*) Function write game port:integer; export; («Вводит 0 в игровой порт для запуска мультивибратора.») begin port($201) :=0; end, (•-Библиотека ресурсов № А16 (получение длительности периода одновибратора).-*) Function interval game port(x:integer):integer; export; (•x выбирает AX(x=1), AY(x=2), BX(x=3), BY(x=4).*) var timel,time2.dummy:integer, Procedure imt 8253, (•Настройка 8253.•) begin (* Управляющее слово = b6h = 10110110b 10= выбор счетчика 2; 11= сначала чтение/запись младшего байта, затем старшего; 011 = режим 3; 0 = шестнадцатибитовый двоичный счет.*) port($43 port($42 port($43 port($61 port($43 end; =255 =255 (*3ап.ись управляющего слова в управляющий регистр 8253.*) (•Загрузка младшего байта.*) ("Загрузка старшего байта.*) port($6l) or 1; (*Выключение динамика.*) $80;(*80h - команда фиксации для счетчика 3.*) Function read 8253:integer; («Считывание младшего и старшего байтов счетчика.*) var low byte,high byte: byte; begin lowjyte =port($42), high byte =port($43), read 8253 =low byte+256»high byte, end, var l integer, begin imt 8253, for l =1 to 10 do l =i, l =0, dummy =bit weight(x), port($201) =0, tirael =read 8253, repeat l =1+1 until (port($201) and dummy=0) or (i>=10000), time2 =read 8253, interval game port =time2-time1 if i>=10000 then interval game port =0, end, 0 ... 12 13 14 15 16 17 18 ... 105
|