Аппаратное обеспечение IBM PC



         

Таймер и музыка - часть 2


Можно также комбинировать эти два способа, получая разнообразные звуковые эффекты.

Для проигрывания мелодии в фоновом режиме можно предложить следующий способ, основанный на использовании периодического прерывания от канала 0 таймера.

Основная идея заключается в использовании прерывания 1Ch, которое вырабатывается таймером с частотой примерно 18,2 Гц. Ваш обработчик этого прерывания осуществляет контроль за выборкой нот из массива, содержащего мелодию, и программирование микросхемы 8254. Например, один раз в полсекунды обработчик проверяет, не пора ли прекратить звучание одной ноты и начать проигрывание следующей ноты. Если пора, он выключает громкоговоритель и перепрограммирует канал 8254 на новую частоту, соответствующую следующей ноте.

Основное преимущество использования таймера для проигрывания мелодии - независимость констант, используемых для программирования канала таймера от производительности системы. Ваша мелодия будет звучать одинаково и на медленной IBM XT и на Super-AT с процессором 80486, но при условии, что вы будете использовать таймер и для организации задержек при исполнении мелодии.

Для определения значения, которое должно быть записано в регистр счетчика канала 2 таймера, надо разделить 1193180 на требуемую частоту в герцах.

Мы подготовили функцию, предназначенную для генерации на громкоговорителе тона заданной частоты и длительности:

/** *.Name tm_sound *.Title Формирование тона заданной длительности * *.Descr Эта функция предназначена для генерации * на громкоговорителе тона заданной * длительности и частоты. * *.Proto void tm_sound(int freq, int time); * *.Params int freq - частота в герцах; * int time - длительность в тиках * таймера (за одну секунду таймер * тикает 18.2 раза). * *.Return Ничего * *.Sample play.c **/

#include <stdio.h> #include <conio.h> #include "sysp.h"

void tm_sound(int freq, int time) {

int cnt, i;

// Задаем режим канала 2 таймера

outp(0x43, 0xb6);

// Вычисляем задержку для загрузки в // регистр счетчика таймера




Содержание  Назад  Вперед