Методические указания по лабораторным работам по курсу «Аппаратные средства компьютерных систем», страница 28

В таймер перед началом работы необходимо загрузить управляющее слово (CW) и константу пересчета. Загрузка CW должна предшествовать загрузке констант. Формат CW приведен в табл. 4.1, а его загрузка в 8-битовый регистр управляющего слова осуществляется командой OUT. Управляющее слово загружается в тот канал таймера, номер которого указан в самом слове CW.

Перед началом работы таймера константа пересчета, содержащаяся в 16-битном регистре константы пересчета (CR), перегружается в счетчик (CE).

Таким образом, для программирования таймера необходимо выполнить следующие шаги:

1.   Загрузить CW в соответствии с табл. 4.1.

2.   При генерации звука с использованием таймера разрешить его работу, установив в 1 бит 0 порта с адресом 61h.

3.   Вычислить значение счетчика от 0 до 65535 и занести сначала младший, а затем старший байт в регистр счетчика через регистр ввода-вывода канала.

По окончании третьего шага запрограммированный канал начинает функционировать по новой программе.

Следует знать, что таймер работает постоянно. Поэтому, если программы пользователя изменяют значения его регистров, то перед своим завершением они всегда должны восстанавливать начальные значения этих регистров. В противном случае, например при генерации звука, он будет звучать даже после того, как операционная система получит управление и загрузит другую программу.

Программный способ генерации звука состоит во включении и выключении с заданной частотой бита 1 порта 61h. При этом следует отключить канал таймера от динамика. Между двумя переключениями добавляется пустой цикл, т.к. если программа переключает бит 1 очень быстро, то частота будет слишком высокой для восприятия. На рисунке 4.2 приведен фрагмент такой программы.

cycles DW 1000

frequency DW 300

       CLI              ;Запрет прерываний

       MOV   DX, cycles ;Длительность тона - в DX

       IN    AL, 61H    ;Получаем значение из порта 61H

       AND   AL, 11111110B ;Отключаем динамик от таймера

next:  OR    AL, 00000010B ;Включаем динамик

       OUT   61H, AL    ;Посылаем команду в порт 61Н

       MOV   CX, frequency ;Задержка на пол-цикла

first: LOOP  first

       AND   AL, 11111101B ;Выключаем динамик