Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук - Программирование микросхемы таймера 8253/8254

ОГЛАВЛЕНИЕ

     2.1.1 Программирование микросхемы таймера 8253/8254.

   Каждый  из трех каналов микросхемы таймера 8253 (8254 для  AT)
состоит из трех регистров. Доступ к каждой группе из трех регист-
ров  осуществляется через один порт; номера портов от 40H до  42H
соответствуют каналам 0 -  2.  Порт  связан  с 8-битным регистром
ввода/вывода, который посылает и принимает данные для этого кана-
ла.  Когда канал  запрограммирован, то через этот порт посылается
двухбайтное значение, младший байт сначала.  Это число передается
в 16-битный регистр задвижки (latch register), который хранит это
число и из которого копия помещается в 16-битный регистр  счетчи-
ка. В регистре счетчика число  уменьшается на единицу каждый раз,
когда импульс от системных часов пропускается через канал.  Когда
значение этого числа  достигает  нуля,  то  канал выдает выходной
сигнал и затем новая копия содержимого регистра задвижки передви-
гается в регистр счетчика,  после  чего процесс повторяется.  Чем
меньше число в регистре счетчика, тем быстрее ритм. Все три кана-
ла всегда активны: процессор не включает и не выключает их. Теку-
щее  значение любого из регистров счетчика может быть прочитано в
любой момент времени, не влияя на счет.
   Каждый канал имеет две входные и одну выходную линии. Выходная
линия выводит импульсы, возникающие в результате подсчета. Назна-
чение этих сигналов варьируется в зависимости от типа IBM PC:

   Канал 0 используется системными часами времени суток. Он уста-
навливается BIOS при  старте  таким  образом, что выдает импульсы
приблизительно  18.2 раза в секунду.  4-байтный счетчик этих  им-
пульсов хранится в памяти по адресу  0040:006C (младший байт хра-
нится первым).  Каждый импульс инициирует прерывание таймера (но-
мер 8) и именно это  прерывание  увеличивает  показание счетчика.
Это  аппаратное  прерывание, поэтому оно  обрабатывается  всегда,
независимо от того, чем  занят  процессор,  если только разрешены
аппаратные прерывания (см. обсуждение в [1.2.2]).  Выходная линия
используется также для синхронизации некоторых дисковых операций,
поэтому если Вы изменили ее значение, то Вам необходимо восстано-
вить первоначальное значение перед обращением к диску.

   Канал  1  управляет обновлением памяти на всех  машинах  кроме
PCjr, поэтому его лучше не  трогать.  Выходная линия этого канала
связана  с микросхемой прямого доступа к памяти [5.4.2] и ее  им-
пульс заставляет  микросхему  DMA  обновить  всю память.  На PCjr
канал  1 служит для преобразования входных данных с клавиатуры из
последовательной в параллельную форму. PCjr не использует микрос-
хему  прямого  доступа к памяти, поэтому когда  он  вместо  этого
прогоняет данные через процессор, то прерывание от таймера забло-
кировано.  Канал 1 используется для подсчета заблокированных  им-
пульсов часов времени  суток,  с  тем  чтобы  можно было обновить
значение счетчика после завершения дисковых операций.

   Канал  2 связан с громкоговорителем компьютера и он производит
простые прямоугольные импульсы для  генерации звука. Программисты
имеют  больший контроль над вторым каналом, чем  над  остальными.
Простые звуки могут  генерироваться  одновременно с другими прог-
раммными операциями, а более сложные звуковые эффекты могут  быть
достигнуты за счет использования  процессора.  Канал 2 может быть
отсоединен  от громкоговорителя и использоваться для  синхрониза-
ции. Наконец, выходная линия канала 2 связана с динамиком компью-
тера.   Однако динамик не будет генерировать звук до тех пор пока
не сделаны определенные установки микросхемы интерфейса с перифе-
рией 8255.
   Две  входные линии для каждого канала состоят из линии  часов,
которая передает сигнал от  микросхемы  системных  часов и линии,
называемой  воротами (gate), которая включает и выключает  сигнал
от часов. Ворота всегда открыты для сигналов часов по каналам 0 и
1.  Но они могут быть закрытыми для канала 2, что позволяет неко-
торые специальные манипуляции со звуком. Ворота закрываются уста-
новкой  младшего  бита порта с адресом 61H, который является  ре-
гистром микросхемы 8255; сброс этого бита снова открывает ворота.
Эта микросхема обсуждается в  [1.1.1].  Отметим что - как и выход
канала  2 - бит 1 порта 61H связан с динамиком и также может  ис-
поьзоваться для генерации звука. На рис.  2-2 приведена диаграмма
микросхемы таймера 8253.
   Микросхема  таймера может использоваться  непосредственно  для
временных операций, но это  редко  бывает  удобным.  Ввод с часов
производится  1.19318  миллионов раз в секунду (даже на  AT,  где
системные часы идут быстрее, микросхема таймера получает сигнал с
частотой  1.19 Мгц).  Поскольку максимальное число, которое может
храниться в 16 битах, равно  65535  и поскольку это число делится
на  частоту импульсов от часов, равную 18.2, то максимальный воз-
можный интервал между импульсами равен приблизительно 1/12 секун-
ды.   Поэтому  большинство временных операций используют  счетчик
времени суток BIOS. Для подсчета времени читается значение време-
ни  суток и сравнивается с некоторым ранее запомненным  значением
для определения числа  импульсов,  прошедших с того момента. Спе-
циальный способ, описанный в [2.1.7], позволяет испоьзовать счет-
чик времени суток для операций в реальном времени.
   8253 предоставляет разработчикам оборудования 6 режимов работы
для  каждого канала.  Программисты обычно ограничиваются  третьим
режимом, как для канала 0 при  синхронизации,  так и для канала 2
для синхронизации или генерации звука.  В этом режиме, как только
регистр задвижки получает число, он  немедленно загружает копию в
регистр  счетчика.  Когда значение в счетчике достигает нуля  ре-
гистр задвижки мгновенно перезагружает  счетчик и т.д.  В течение
половины отсчета выходная линия включена, а в течение половины  -
выключена. В результате  получаются  прямоугольные волны, которые
одинаково пригодны как для генерации звука, так и для подсчета.
   8-битный командный регистр управляет способом загрузки чисел в
канал.  Адрес порта для этого регистра равен 43H.  Командному ре-
гистру передается байт, который говорит какой канал  программиро-
вать, в каком режиме, а также один или оба байта регистра задвиж-
ки  должны быть переданы.  Он показывает также будет ли  число  в
двоичной или BCD (двоичнокодированной десятичной) форме. Значение
битов этого регистра таково:

   бит   0    если 0, двоичные данные, иначе BCD
       3-1    номер режима, 1 - 5 (000 - 101)
       5-4    тип операции:
                00 = передать значение счетчика в задвижку
                01 = читать/писать только старший байт
                10 = читать/писать только младший байт
                11 = читать/писать старший байт, потом младший
       7-6    номер программируемого канала, 0 - 2 (00 -10)

   Короче  говоря, для программирования микросхемы 8253 надо  вы-
полнить три основных  шага.  После  того как третий шаг завершен,
запрограммированный  канал немедленно начинает функционировать по
новой программе.

   1.  Послать в  командный  регистр  (43H)  байт, представляющий
цепочку  битов,  которые  выбирают канал,  статус  чтения/записи,
режим операции и форму представления чисел.
   2.  Для канала 2 надо разрешить сигнал от часов, установив в 1
бит 0 порта с адресом 61H. (Когда бит 1 этого регистра установлен
в 1, то канал 2 управляет динамиком.  Сбросьте его в 0 для опера-
ций синхронизации.)
   3. Вычислите значение счетчика  от 0 до 65535, поместите его в
AX,  и  пошлите сначала младший, а затем старший  байт в  регистр
ввода/вывода канала (40H - 42H).

   Каналы микросхемы 8253 работают всегда.  По этой причине прог-
раммы всегда должны восстанавливать начальные установки регистров
8253 перед завершением. В частности, если при завершении програм-
мы  генерируется звук, то он будет продолжаться даже после  того,
как MS DOS получит управление и загрузит другую программу. Имейте
это ввиду при написании процедуры выхода по Ctrl-Break [3.2.8].

   Низкий уровень.


   В  данном примере канал 0 программируется на другое  значение,
чем установлено BIOS  при  старте.  Причина  изменения  установки
состоит в том, чтобы изменить интервал изменения счетчика времени
суток на большую величину, чем  18.2  раза в секунду. Частота об-
новления  счетчика  изменяется, скажем, на 1000 раз в секунду,  с
целью проведения точных лабораторных измерений. Значение задвижки
должно  быть 1193 (1193180 тактов в секунду / 10000).  Как читать
текущее значение регистра  счетчика  см. в примере [2.1.8]. Перед
дисковыми  операциями оригинальное значение задвижки должно  быть
восстановлено, поскольку канал  0  используется для синхронизации
дисковых операций.  Максимально возможное значение - 65535 тактов
часов между импульсами от канала - может быть достигнуто засылкой
0 в регистр  задвижки  (0  немедленно  превращается  в  65535 при
уменьшении на единицу.

;---установка регистров ввода/вывода
COMMAND_REG  EQU   43H         ;адрес командного регистра
CHANNEL_0    EQU   40H         ;адрес канала 0
             MOV   AL,00110110B   ;установка битов для канала 2
             OUT   COMMAND_REG,AL ;засылка в командный регистр
;---посылка счетчика в задвижку
             MOV   AX,1193     ;счетчик для 100 импульсов/сек.
             OUT   CHANNEL_2,AL   ;посылка младшего байта
             MOV   AL,AH       ;готовим для посылки старший байт
             OUT   CHANNEL_2,AL   ;посылка старшего байта