Средства BIOS для работы с таймером




MOV al, 20h

 

OUT 20h, al

 

 

Механизм обработки прерывания таймера поясняет рисунок:

 

 

Обработчик INT 8h

Увеличение счетчика по адресу: 046Сh, проверка его на перепол-нение
Проверка времени последнего обращения к НГДМ, если оно больше 2 секунд, выключение двигателя НГДМ
Вызов прерывания INT 1Ch
Сброс контроллера прерывания
IRET

 
 

 

 

Выполнение действий, определен-ных в программе

 

 

IRET

 

Таймер обычно реализуется на микросхеме і8254 (отечественный аналог К 1810 ВИ 54).

 

 

2. Регистровая организация и режимы работы

Микросхемы таймера 8254.

 

Таймер і8254 состоит из трех независимых каналов, или счетчиков. Каждый канал содержит регистры:

n состояния канала RS (8 разрядов);

n управляющего слова RSW (8 разрядов);

n буферный регистр OL (16 разрядов);

n регистр счетчика СЕ (16 разрядов);

n регистр констант пересчета (16 разрядов);

Каналы таймера подключаются к внешним устройствам при помощи трех линий:

GATE - управляющий вход;

CLOCK - вход тактовой частоты;

OUT - выход таймера.

 

Регистр счетчика СЕ работает в режиме вычитания. Его содержимое уменьшается по заднему фронту сигнала CLOCK при условии, что на вход GATE установлен уровень логической 1. В зависимости от режима работы таймера при достижении счетчиком СЕ нуля тем или иным образом доступен выходной сигнал OUT.

Буферный регистр OL предназначен для запоминания текущего содержимого регистра счетчика СЕ без остановки процесса счета. После запоминания буферный регистр доступен программе для чтения.

Регистр констант пересчета CR может загружаться в регистр счетчика, если это требуется в текущем режиме работы таймера.

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

Упрощенная схема взаимодействия регистров канала приведена на рисунке.

Возможны шесть режимов работы счетчика:

n режимы 0,4 - однократное выполнение функции;

n режимы 1,5 - работа с перезапуском;

n режимы 2,3 - работа с автозагрузкой.

 

  Управляющая логика канала
  CE

       
 
  CR
 
   
GATE CLOCK OUT


 
 


 

 

  OL

 

 

Рис.2. Схема взаимодействия регистров канала

 

В режиме однократного выполнения функций перед началом счета содержимое регистра констант пересчетов CR переписывается в регистр счетчика CE по сигналу CLOCK, если сигнал GATE установлен в 1. В дальнейшем содержимое регистра CE уменьшается по мере прихода импульсов CLOCK. Процесс счета можно приостановить, если подать на вход GATE уровень логического 0. Если затем на вход GATE подать 1, счет будет продолжен дальше. Для повторения выполнения функции необходима новая загрузка регистра CR, т.е. повторное программирование таймера.

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

В режиме автозагрузки регистр CR автоматически переписывается в регистр CE после завершения счета. Сигнал на выходе OUT появляется только при наличии на входе GATE уровня логической 1. Этот режим используется для создания программируемых импульсных генераторов и генераторов прямоугольных импульсов (меандра).

В компьютере IBM PC задействованы все три канала таймера.

 

Канал 0 используется в системных часах времени суток (не путать с часами реального времени, реализованными на другой микросхеме). Этот канал работает в режиме 3 и используется как генератор импульсов с частотой примерно 18,2Гц. Именно эти импульсы вызывают аппаратное прерывание INT 8h.

Канал 1 используется для регенерации содержимого динамической памяти компьютера. Выход канала OUT используется для запроса к каналу прямого доступа DMA, который и выполняет обновление содержимого памяти. (Этот канал лучше не трогать, т.к. это может привести к нарушениям в работе основной оперативной памяти компьютера).

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

 

 

CLOCK 2   OUT 2 GATE 2
&

1,9318 Мгц

порт 061 бит 0

           
   
   
 
 
 


Порт 061 бит 1

 

Рис.3. Схема управления звуком

 

3. Программирование таймеров на уровне портов

 

Системному таймеру отведено четыре порта ввода/вывода, имеющих адреса 40h, 41h, 42h, 43h,. Эти порты задействованы слудующим образом:

043 h - управляющий регистр

040 h - канал 0 или счетчик 0 - системные часы (генерация IRQ 0 каждые 54,936 мс=18,206Гц), режим 3, LSB/MSB, Binary, счетчик = 0 (соответствует 65536).

041 h - канал 1 или счетчик 1 - регенерация памяти (логика регенерации для АТ). Режим 2, LSB, Binary, счетчик = 12 h (18).

042 h - канал 2 или счетчик 2 - генератор звука. Вход GATE от бита 0 порта В і8255 (XT) (061 h). Режим 3, LSB/MSB, Binary.

 

Формат управляющего регистра:

7 6 5 4 3 2 1 0

             

SC RW M BCD

где:

поле SC, биты 7-6 выбор счетчика 0, 1,2:

00 - канал 0 (счетчик 0);

01 - канал 1 (счетчик 1);

10 - канал 2 (счетчик 2);

11 - код команды RBC (чтение состояния счетчика).

поле RW, биты 5-4 режим обращения:

00 - код команды CLC (заполнить CE или защелка текущего значения);

01 - чтение/запись только младшего байта (LSB);

10 - чтение/запись только старшего байта (MSB);

11 - LSB/MSB, чтение/запись сначала младшего, затем старшего байта.

 

поле М, биты 3-1 определяет режим работы микросхемы і8254 (режим счетчика):

000 - прерывание от таймера (режим 0);

001 - программируемый ждущий мультивибратор (одновибратор), (режим 1);

х10 - программируемый генератор импульсов (частоты), (режим 2);

x11 – генератор меандра (генератор прямоугольных импульсов), (режим 3);

100 - программно-запускаемый одновибратор (счетчик событий с разрешением), (режим 4);

101 - аппаратно-запускаемый одновибратор (счетчик событий с перезапуском), (режим 5).

поле BCD, бит 0 вид счета:

0 - двоичный счет (Bin);

1 - двоично-десятичный счет (BCD).

 

Поскольку в компьютере в каналах 0 и 2 используется режим 3, рассмотрим его подробнее.

 

Поле RW, как отмечалось, определяет способ загрузки констант через однобайтный порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистра счетчика CE (рис.2) в буферном регистре OL с целью чтения его программой.

 

Код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC (биты 7,6), поля М и BCD при этом не используются. Поле SC определяет номер канала, для которого предназначено управляющее слово.

 

 

Формат команды RBC (чтения слова состояния канала):

 

7 6 5 4 3 2 1 0

               

биты:

0 = 0

 

1 = 1 - выбор канала 0

 
 


2 = 1 - выбор канала 1

 
 


3 = 1 - выбор канала 2

 
 


STAT: 0 - читать состояние каналов;

1 - не читать состояние каналов;

CNT: 0 - запомнить текущее содержи-

мое СЕ;

1 - не запомнить ---- // ----;

код команды RBC = 11

 

С помощью команды RBC можно выполнять операции чтения состояния каналов либо запоминание регистра счетчика СЕ каналов. Можно выполнять эти операции как для отдельных каналов, так и для всех одновременно (установка битов 1-3 в 1).

Формат слова состояния канала напоминает формат регистра управляющего слова, исключая два старших разряда 7 и 6.

 

7 6 5 4 3 2 1 0

               

BCD: 0 - двоичный счет;

1 - двоично-десятичный

счет;

поле М

 
 


поле RW

 
 


FN: флаг перезагрузки констант;

 
 


OUT: состояние выхода OUT

 

Разряд FN используется в основном в режимах 1 и 5 для определения, произошла ли загрузка констант из регистра CR в регистр счетчика СЕ.

Разряд OUT позволяет определить состояние выходной линии канала OUT в момент выполнения команды RBC.

Для программирования канала таймера необходимо выполнить следующую последовательность действий:

n вывести в порт управляющего регистра с адресом 43 h управляющее слово;

n требуемое значение счетчика посылается в порт канала (адреса 40 h, 41h, 42h), причем вначале вводится младший, а затем старший байт значения счетчика.

 

Сразу после этого канал таймера начинает выполнять требуемую функцию.

Для чтения текущего содержимого счетчика СЕ необходимо выполнить следующее:

 

n вывести в порт управляющего регистра код команды CLC (команда запоминания содержимого регистра СЕ);

n вывести в порт управляющего регистра код команды запуска на чтение/запись в регистры канала (поле RW должно содержать 11);

n двумя последовательными командами ввода из порта нужного канала ввести младший и старший байты текущего состояния счетчика СЕ.

 

Пример: Программа, отображающая слово состояния и содержимое счетчика для всех трех каналов таймера:

 

# include <stdio.h>

# include <conio.h>

main () {

unsigned i;

printf (“\n\n канал 0

“\n -----------”

“\n”);

// читаем слово состояния канала,

// команда 0хе2=1100010В

outp (0x43, 0xe2);

printf (“\ n Слово состояния канала: % 02.2Х”,

inp (0x40));

// читаем текущее состояние регистра счетчика

// канала. Для этого вначале выдаем команду CLC

// для канала 0. Код этой команды 0х00

i=inp (0x40);

i=(inp (0x40)<<8)+i;

printf (“\n Регистр счетчика: % 04.4x,” i);

// Повторяем те же действия для 1 и 2 каналов

printf (“\n\n Канал 1

“\n -------------”

“\n”);

outp (0x43, 0xe4);

printf (“\n Слово состояния канала: %2.2Х”, inp(0x41));

outp (0x43,0x40);

i=inp (0x41);

i=(inp(0x41)<<8)+i;

printf (“\n Регистр счетчика: %4.4Х ”, i);

printf (“\n\n Канал 2

“\n-------------”);

outp (0x43,xe8);

printf (“\n Слово состояния канала: % 02.2х”, inp (0x42));

outp (0x43,0x80);

i=inp (0x42);

i=(inp(0x42)<<8)+i;

printf (“\n Регитр счетчика: %4.4 x”,i);

exit (o);

}

Средства BIOS для работы с таймером

Для работы с каналом 0 таймера BIOS содержит две функции, реализуемые через прерывание INT 1`Ah:

 

Функция 00 h - чтение содержимого счетчика таймера:

На входе: АН = 00 h;

На выходе: CX = старший байт счетчика;

DX = младший байт счетчика;

AL = 0, если c момента перезагрузки таймера прошло более 24 часов.

 

Функция 01 h - изменение содержимого счетчика таймера:

На входе: AH = 01h;

CX = старший байт счетчика;

DX = младший байт счетчика;

На выходе: Не используется

 

Функцию чтения таймера можно использовать для организации программной задержки. Так как работа таймера не зависит от производительности процессора, быстродействие системы не будет влиять на формируемую задержку. Точность формирования задержки определяется частотой обновления счетчика таймера (18,2 Гц).

Пример функции для формирования задержек с помощью таймера:

 

/**

* Name tm_delay

* Title Формирование задержки по таймеру

Descr Эта функция формирует задержку, используя системный таймер



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: