ЛАБОРАТОРНАЯ РАБОТА

Программирование звучания встроенного динамика

Цель работы.

В этой работе необходимо изучить некоторые функциональные возможности микросхемы программируемого таймера-счетчика 8253 и микросхемы программируемого периферийного (параллельного) интерфейса 8255, связанные с работой встроенного в компьютер динамика.

Задание на выполнение.

Написать программу на ассемблере МП 8086, проигрывающую заданную мелодию. А) Нотный стан одной октавы со звуками одинаковой длительности. Б) Несколько нот различной длительности.

Технические детали.

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

Блок-схема, описывающая взаимодействие таймера и встроенного динамика

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

  1. 0,1 - программируемый одновибратор;
  2. 2,3 - делитель частоты;
  3. 4,5 - счетчик событий;

Режимы устанавливаются программным способом, то есть командами в программе, которая намеревается использовать таймер. Каждый канал имеет два входа, обозначеных на схеме как CLK и GATE, и один выход. На вход CLK подаются импульсы, которые преобразуются каналом разными способами, в зависимости от режима. Вход GATE –блокирующий. Если на нем высокое напряжение, что эквивалентно 1, импульсы на входе CLK каналом воспринимаются, в противном случае этот вход заблокирован. Каждый канал имеет два регистра: регистр-задвижку и регистр-счетчик. Регистры-счетчики работают на вычитание до 0 при поступлении импульса на CLK. Регистр-задвижка содержит начальное значение регистра-счетчика. С точки зрения компьютера регистры-задвижки являются однобайтовыми портами с адресами 40h, 41h и 42h, запись данных в которые осуществляется с помощью команды out. Программирование режимов каналов осуществляется записью байта в порт 43h (управляющее слово) согласно данным, приведенным в таблице.

Таблица. Значения битов в управляющем слове.

Биты Функция Значение
0 Тип счетчика 0-двоичный счетчик
1-двоично-десятичный счетчик BCD
1 - 3 Номера режимов Значение битов Режим
0 0
1 1
2, 6 2
3, 7 3
4 4
5 5
4 - 5 Тип операции 0 - копирование счетчика (для снятия в регистр-задвижку показаний).
1 - младший байт.
2 - старший байт.
3 - Сначала младший затем старший.
6 - 7 Номер канала

При выполнении задания нас будет интересовать канал 2, настроенный на работу в 3-м режиме. Это режим деления частоты. В процессе уменьшения регистра-счетчика до достижения половинного значения от начального, выходная линия включена (высокий уровень), а затем отключена (низкий уровень). При достижении 0-го значения счетчик автоматически перезагружается начальным значением. Таким образом, на выходе канала 2 появится периодическая последовательность прямоугольных импульсов, период которой будет больше периода входного сигнала на входе CLK в число раз, равному числу, хранящемуся в регистре-задвижке. То есть произойдет деление частоты в заданное число раз.

Основная последовательность шагов.

  1. Разблокировать (разрешить) работу 2 канала и динамика, установить 0 и 1 биты 61Н порта в 1. (Другие биты 61Н не должны быть изменены).
    IN
    AL, 61H
    OR
    AL, 00000011B
    OUT
    61H, AL ; Открытие «ворот»
  2. Записать в командный регистр (43Н) байт слова состояния, настраивающий второй канал на 3-й режим.
    MOV
    AL, 10110110B
    OUT
    43H, AL
  3. Занести значение счетчика в (42Н) порт.
    MOV
    AX, 1000 ; Делитель частоты таймера 1,193 МГц. (В качестве примера делитель взят равным 1000).
    OUT
    42H, AL ; Сначала младший байт регистра задвижки.
    MOV
    AL, AH
    OUT
    42H, AL ; Затем старший байт регистра задвижки.

Частоты нот основной октавы (Гц).

Эти частоты нужны для определения коэффициентов деления основной частоты 1,19318 МГц системных часов.

До 261,7
До-диез 277,2
Ре 293,7
Ре-диез 311,1
Ми 329,6
Фа 349,2
Фа-диез 370,0
Соль 392,0
Соль-диез 415,3
Ля 440,0
Ля-диез 466,2
Си 493,9

Задание длительности звучания ноты.

После того, как через порт 42H загружено значение делителя частоты, динамик начинает звучать. Его звучание на заданной частоте продолжается до тех пор, пока не будет загружено новое значение делителя, либо не заблокированы соответствующие входы через порт 61H. В первом случае динамик начинает звучать на новой частоте, а во втором звук полностью исчезает.

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

Предлагаемый к применению в лабораторной работе способ основан на подсчете числа импульсов, называемых тиками, следующих с выхода канала 0. Они появляются 18,2 раз в секунду и каждый тик вызывает прерывание INT 8. По умолчанию системный обработчик прерывания 8 пустой. Величина 18,2 постоянна для всех компьютеров. Одновременно в специальной области памяти BIOS, счетчике тиков, с начала суток идет подсчет количества тиков. При наступлении полночи эта счетчик сбрасывается в 0. Размер счетчика составляет 4 байта. Его можно считать программным способом в любой момент времени, а также изменить.

Для считывания области, хранящей текущее количество поступивших тиков, используется функция 0 программного прерывания 1AH, то есть команды

MOV
AH, 0
INT
1AH

После выполнения этих команд в регистре CX находится старшая половина счетчика, а врегистре DX - младшая.

Пример программы, проигрывающей одну октаву нотного стана.

;================================================
;PROGRAMM TO PERFORM A SOUND BY USING CHIP 8253.
;================================================
DOSSEG
.MODEL
SMALL
.STACK
100H
.DATA
FREQ
DW
8E8H, 7EFH, 711H, 6ADH, 5F1H, 549H, 4B7H, 473H ; ТАБЛИЦА ЧАСТОТ
CNTR
DB
0 ; СЧЕТЧИК НОТ
W
DW
0 ; РАБОЧАЯ
PORT_B
EQU
61H
COM_REG
EQU
43H
COUNTER2
EQU
42H
.CODE
;================================================
; ПРОЦЕДУРА ПОДДЕРЖАНИЯ ДЛИТЕЛЬНОСТИ ЗВУЧАНИЯ.
; ЗАДЕРЖКА В РЕГИСТРЕ AH.
;================================================
DELAY
PROC
PUSH
DX
PUSH
BX
MOV
BL, AH
MOV
BH, 0
PUSH
AX
MOV
AH, 0
INT
1AH ; ВЫБОРКА В РЕГИСТРЫ CX,DX ВРЕМЕНИ ИЗ ОБЛАСТИ BIOS
MOV
W, DX
ADD
W, BX ; В W - МОМЕНТ ОКОНЧАНИЯ
ST_SQU1:
INT
1AH
CMP
DX, W ; КОНЕЦ ЗВУЧАНИЯ ?
JNE
ST_SQU1
POP
AX
POP
BX
POP
DX
RET
DELAY
ENDP
;================================================
; MAIN PROGRAM.
;================================================
START:
MOV
AX, @DATA
MOV
DS, AX
MOV
AH, 0;--CLEAR SCREEN---
MOV
AL, 3
INT
10H
IN
AL, PORT_B
OR
AL, 00000011B
OUT
PORT_B,AL ; РАЗРЕШЕНИЕ ДИНАМИКА И ТАЙМЕРА
MOV
SI, 0; СЧЕТЧИК НОТ В МЕЛОДИИ
MOV
AL, 10110110B; УСТАНОВКА ДЛЯ КАНАЛА 2
OUT
COM_REG, AL; 3 РЕЖИМ, ЗАГРУЗКА В СЧЕТЧИК ДВУХ БАЙТ
MOV
CNTR, 8
MOV
BX, OFFSET FREQ
NEXT1:
MOV
DX, [BX]; В DX - ЧАСТОТА ИСПОЛНЯЕМОЙ НОТЫ
MOV
AL, DL; ЗАГРУЗКА МЛАДШЕГО И СТАРШЕГО БАЙТА СЧЕТЧИКА
OUT
COUNTER2, AL
MOV
AL, DH
OUT
COUNTER2, AL
MOV
AH, 10 ; ДЛИТЕЛЬНОСТЬ ПРОИГРЫША В ТИКАХ (~55 МС * 10)
CALL
DELAY
ADD
BX, 2 ; СЛЕДУЮЩАЯ НОТА
SUB
CNTR, 1
JNE
NEXT1
NO_MORE:
IN
AL, PORT_B; ВОССТАНОВЛЕНИЕ ПЕРВОНАЧАЛЬНОГО СОСТОЯНИЯ
AND
AL, 11111100B
OUT
61H, AL
MOV
AH, 4CH
INT
21H ; QUIT TO DOS
END
START