Цель работы.
В этой работе необходимо изучить некоторые функциональные возможности микросхемы программируемого таймера-счетчика 8253 и микросхемы программируемого периферийного (параллельного) интерфейса 8255, связанные с работой встроенного в компьютер динамика.
Задание на выполнение.
Написать программу на ассемблере МП 8086, проигрывающую заданную мелодию. А) Нотный стан одной октавы со звуками одинаковой длительности. Б) Несколько нот различной длительности.
Технические детали.
Блок схема, поясняющая взаимодействие отдельных компонент компьютера, имеющих отношение к данной работе, представлена на рисунке ниже.
Микросхема программируемого таймера имеет три независимые части, - три канала. Каждый из каналов может функционировать в шести режимах:
Режимы устанавливаются программным способом, то есть командами в программе, которая намеревается использовать таймер. Каждый канал имеет два входа, обозначеных на схеме как 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,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, то есть команды
После выполнения этих команд в регистре CX находится старшая половина счетчика, а врегистре DX - младшая.
Пример программы, проигрывающей одну октаву нотного стана.