КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Программирование таймера и динамика
Генерацию звука через системный динамик ЭВМ реализуют, как правило, одним из двух способов – программированием порта РВ интерфейса 8255 вручную или при помощи программируемого таймера 8253. Рассмотрим оба способа. Для задания временных интервалов и формирования сигналов с различными временными параметрами в ЭВМ PC/XT/АТ применяется программируемый таймер 8253 (отечественный аналог КР580ВН53), в AT – 8254. В состав таймера входят: буфер шины данных, схема управления вводом-выводом и три независимых канала, каждый из которых содержит регистр режима, схему управления каналом, буфер и 16-разрядный счетчик. Программирование канала осуществляется путем вывода управляющих слов в регистр режима каналов и начального значения в его счетчики. Каждый канал имеет управляющий вход GATE и выход OUT и может работать в одном из следующих шести режимов:
Режим 0 (прерывание терминального счета). Режим 1 (ждущий мультивибратор). Режим 2 (генератор частоты). Режим 3 (генератор меандра). Режим 4 (счетчик событий). Режим 5 (счетчик событий с автозагрузкой).
В ЭВМ PC таймер имеет базовый адрес 40h и следующие программируемые регистры:
Существует два способа чтения текущего значения счетчика канала. 1. Чтение с остановом счетчика. Для обеспечения стабильных показаний необходимо приостановить работу канала либо подачей сигнала низкого уровня на вход GATE (кроме режима 1), либо блокированием тактовых импульсов. 2. Чтение «на лету». Для считывания счетчика без остановки процесса счета используется посылка в порт 43h управляющего слова в режиме «защелкивания». Это управляющее слово фиксирует текущее значение счетчика и дает возможность считать его младший байт, а затем старший байт. В IBM PC каналы таймера 8253 имеют следующее назначение:
Тактовая частота каждого канала равна 1, 19318 МГц, т. е. каждый такт имеет длительность 0, 84 мсек. Вход GATE каналов 0 и 1 всегда имеют высокий уровень, поэтому счет на этих каналах разрешен всегда. Вход GATE канала 2 управляется битом 0 порта РВ интерфейса 8255, связанного с портом 61h. При начальной загрузке BIOS инициализирует канал 0 для работы в режиме 3 со счетчиком 0 (т. е. 65536 декрементов на цикл счета). Поэтому частота системных часов равна 1, 19 МГц/65536 = 18.2 Гц. Прерывание IRQ0, связанное с вектором Int 8, происходит также 18, 2 раз в секунду, т. е. каждые 55 мсек. Перепрограммирование канала 0, ведет к следующим последствиям: • BIOS теряет возможность отслеживать текущее время и дату; • нарушается работа с гибкими дисками, так как включение и выключение их двигателей отсчитывается по текущему времени. Канал 1 работает в режиме 2 со счетчиком 18, поэтому регенерация динамической памяти происходит каждые 18 м/сек. Перепрограммировать его нельзя, так как это приведет к потере данных в ОЗУ. Канал 2 используется для генерации звука следующим образом. Так как на вход звукогенератора поступает логическое «И» двух сигналов: выхода OUT 2 – го канала таймера и содержимого бита 1 порта РВ интерфейса 8255, то поэтому простейший способ генерации звука состоит в программировании канала 2 таймера так, чтобы он выдавал прямоугольный импульс заданной частоты, лежащий в звуковом диапазоне (20 Гц – 20 КГц). Для этого следует использовать режим таймера 3 с подходящим начальным значением счетчика. Если затем установить биты 0 и 1 порта РВ, то импульс начнет поступать на вход звукогенератора (бит 0 – это вход GATE канала 2, разрешающий счет, а бит 1 – разрешение выдачи выхода OUT на вход звукогенератора). Для выключения звука достаточно сбросить биты 0 – 1 в РВ. Преимущество этого метода состоит в том, что, запустив генерацию звука, ЦП может выполнять другие действия. Значение счетчика 2 – го канала вычисляется по формуле n=1193181/f=1234DDh/f (1193181 – тактовая частота таймера в Гц, f – требуемая частота звука). Второй способ генерации звука состоит в том, чтобы генерировать звуковые импульсы не выходом таймера, а установкой и сбросом бита 1 в регистре РВ, например, по следующей схеме: Программа генерации звука; Вход: N= количество импульсов; FREQ= длительность импульса.
In al, 61h;портРВ and al, not mov al, not;сброс бита О dx, N Repeat: or al, 2 out 61h, al;установить бит 1 mov cx, FREQ Wait_On: loop Wait_On and al, not 2;сбросить бит 1 out 61h, al mov cx, FREQ Wait_Off: loop Wait_Off dec dx jnz Repeat
Программирование этого способа основано на следующих формулах. Если N = Tf; FREQ = t/(34f). Константа 34 объясняется тем, что длительность каждого из циклов Wait_on и Wait_off приблизительно равна (17сх) машинных тактов. Неудобство этого метода состоит в том, что ЦП полностью занят генерацией звука – любое прерывание испортит временную диаграмму звукового сигнала. Однако он обеспечивает точную подстройку частоты и позволяет создавать несимметричные импульсы варьированием задержек в циклах Wait on и Wait off. 1. Пример программирования динамика компьютера. В следующей задаче требуется продемонстрировать возможности аппаратных средств ЭВМ для генерации звука через системный динамик, используя порты программируемого таймера 42h и 43h, а также порта РВ микросхемы интерфейса 8255. По заданию, необходимо написать программу, генерирующую звуковые сигналы по нажатию клавиш клавиатуры и прекращающую генерацию звука после их отпускания. Выход из программы по клавише Escape. Частота сигналов должна быть пропорциональна сканкодам клавиш. 2. Описание фрагментов программы. Программа генерации звука состоит из двух подпрограмм: включение звука (программирование таймера), выключение звука (сброс битов 0 – 1 порта интерфейса 8255) и цикла сканирования порта клавиатуры. 1. Подпрограмма генерации звука (Sound). Работает следующим образом: на вход подпрограммы поступает скан-код нажатой клавиши, значение которого умножается на 20 с целью получить значение счетчика, таким образом, чтобы генерирование сигналов происходило в звуковом диапазоне. Далее устанавливается 0 – 1 порта 61h (бит 0 – вход GATE канала 2, разрешающий счет, бит 1 – разрешение выдачи выхода OUT на вход звукогенератора). Далее формируется управляющее слово таймера, программирующее его работу по каналу 2 в режиме 3, после занесения управляющего слова таймера в порт 43h, туда же побайтно заносится значение счетчика. После этого начинается генерация звука. 2. Подпрограмма выключения звука (No_Sound). Для выключения звука сбрасываются(обнуляются) биты 0 – 1 порта 61h, что запрещает подачу сигнала на вход звукогенератора и закрывает вход GATE канала 2. 3. Цикл сканирования порта клавиатуры. В цикле сканирования порта клавиатуры происходит считывание скан-кода клавиши по порту 61h, сравнение его со скан-кодом клавиши ESC. При положительном результате сравнения происходит выход из программы. При отрицательном – происходит сравнение старшего бита скан-кода для определения, нажата ли еще клавиша или уже отпущена.
Code segment ORG 100H assume CS: Code Begin: in al, 61h or al, 40h out 61h, al; Установка запрета Cycle:;клавиатурного прерывания in al, 60h клавиши (РА) cmp al, 01;считывание сканкода клавиши je Quit test al, 1OOOOOOOb;"Это Escape?";"Да", - на;выход jnz Unpressed ;"Клавиша отпущена call Sound;"Да", - выключить звук jmp Cycl;"Нет", - включить звук Unpressed: call No_Sound;Отключаем звук (на всякий jmp Cycle Quit:;Процедура выхода call No Sound;Разрешение клавиатурного ;цикл опроса клавиатуры in al, 61h;Процедура отключения прерывания and al, not 40h out 61h, al;порт РВ ret;сброс битов 0-1 No Sound proc near
push ax in al, 61h and al, not 3 out 61h, al pop ax ret No_Sound endp
Sound proc near push ax push bx push dx xor ah, ah;Процедура включения звука mov dl, 2Oh;получить значение счетчика в mul dl;приемлемом диапазоне частот mov bx, ax;счетчик таймера in al, 61h;порт РВ or al, 3 out 61h, al;установить бит 0-1 mov al, OOOOlOllb;управляющее слово таймера: mov dx, 43h;канал 2, режим 3. out dx, al dec dx mov al, bl;вывод в регистр режима Done: Sound code out dx, al mov al, bh out dx, al pop dx pop bx pop ax ret endp ends END Begin
Дата добавления: 2014-01-06; Просмотров: 2190; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |