Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Управление таймером через порты ввода-вывода

Для своих нужд программы могут использовать канал 2 (если им не нужен динамик) и канал 4 (если присутствует второй таймер). При необходимости можно перепрограммировать и канал 0, но затем надо будет вернуть его в исходное состояние, чтобы BIOS и DOS могли продолжать работу.

 

В пространстве портов ввода-вывода для таймера выделена область от 40h до 5Fh:

порт 40h — канал 0 (генерирует IRQ0)

порт 41h — канал 1 (поддерживает обновление памяти)

порт 42h — канал 2 (управляет динамиком)

порт 43h — управляющий регистр первого таймера

порты 44h – 47h — второй таймер компьютеров с шиной MicroChannel

порты 48h – 4Bh — второй таймер компьютеров с шиной EISA

Управление таймером осуществляется путем вывода байта в управляющий порт(43h для первого таймера).

 

Назначение бит в этом байте:

 

7-6 5-4 3-1  
      Бит 0: формат счетчика 0 — двоичное 16-битное число (0000 – FFFFh) 1 — двоично-десятичное число (0000 – 9999)
Биты 3-1: режим работы канала 000: прерывание IRQ0 при достижении нуля 001: ждущий мультивибратор 010: генератор импульсов 011: генератор прямоугольных импульсов (основной режим) 100: программно запускаемый одновибратор 101: аппаратно запускаемый одновибратор
Биты 5 – 4: 00 — зафиксировать текущее значение счетчика для чтения (в этом случае биты 3 – 0 не используются) 01 — чтение/запись только младшего байта 10 — чтение/запись только старшего байта 11 — чтение/запись сначала младшего, а потом старшего байта
Биты 7 – 6: если не 11 — это номер канала, который будет программироваться: 00,01,10 = канал 0,1,2

 

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

1. Вывести в регистр 43h команду (для канала 2) 10110110h, то есть установить режим 3 для канала 2, и при чтении/записи будет пересылаться сначала младшее слово, а потом старшее.

2. Послать младший байт начального значения счетчика в порт выбранного канала (42h для канала 2).

3. Послать старший байт начального значения счетчика в этот же порт.

 

Например:

 

mov al, 0B6h ; B6h = 10110110b (10 11 011 0 – канал 2, запись 2 байт, режим 3, двоичное число)

out 43h, al ; Вывести команду в порт 43h

mov al, 0FFh ; Задать в al значение FFh (впрочем, можно задать любое другое)

out 42h, al ; Вывести в порт 42h (канал 2) младший байт, равный FFh

out 42h, al ; Вывести в порт 42h (канал 2) старший байт, равный FFh (итого FFFFh)

 

После этого таймер немедленно начнет уменьшать введенное число от начального значения к нулю со скоростью 1 193 180 раз в секунду (четверть скорости процессора 8088). Каждый раз, когда это число достигает нуля, оно снова возвращается к начальному значению. Кроме того, при достижении счетчиком нуля канал 0 вызывает прерывание IRQO, а канал 2, если включен динамик, посылает ему начало следующей прямоугольной волны, заставляя его работать на установленной частоте. Начальное значение счетчика для канала 0 по умолчанию составляет 0FFFFh (65 535), то есть максимально возможное. Поэтому точная частота вызова прерывания IRQ0 равна 1 193 180/65 536 = 18,20648 раза в секунду.

 

Если биты 7 – 6 равны 11, считается, что байт, посылаемый в порт 43h, — команда чтения счетчиков. Её формат отличается от команды программирования канала:

 

7-6 5-4 3-1  
      Бит 0: резерв (должен быть 0)
Биты 3-1: команда относится к каналам 3–1 (001 – 0-й канал, 010 – 1-й, 011 – 0-й + 1-й и т.п.)
Биты 5 – 4: режим чтения 00: сначала состояние канала/потом значение счетчика 01: значение счетчика 10: состояние канала
Биты 7 – 6: 11 (код команды чтения счетчиков)

 

Если этой командой запрашивается состояние каналов, новые команды будут игнорироваться, пока не прочтется состояние из всех каналов, которые были заказаны битами 3 – 1.

Состояние и значение счетчика данного канала получают чтением из порта, соответствующего требуемому каналу.

 

Формат байта состояния имеет следующий вид:

бит 7: состояние входа OUTx на момент выполнения команды чтения счетчиков. Так как в режиме 3 счетчик уменьшается на 2 за каждый цикл, состояние этого бита, замороженное командой фиксации текущего значения счетчика, укажет, в каком полуцикле находился таймер

бит 6: 1/0 — состояние счетчика не загружено/загружено (используется в режимах 1 и 5, а также после команды фиксации текущего значения)

биты 5 – 0: совпадают с битами 5 – 0 последней команды, посланной в порт 43h

 

Чтобы прочитать текущее значение счетчика, надо:

1. Послать в порт 43h команду фиксации значения счетчика для выбранного канала (биты 5 – 4 равны 00h).

2. Послать в порт 43h команду перепрограммирования канала без изменения режима его работы, если нужно изменить способ чтения/записи (обычно не требуется).

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

4. Прочитать из того же порта старший байт.


<== предыдущая страница | следующая страница ==>
Задача: Создать программу, работающую с системным таймером через порты ввода-вывода | Управление динамиком

Дата добавления: 2015-07-26; просмотров: 182; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.