Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сист. таймер.rtf
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
242.21 Кб
Скачать

4. Средства bios для работы с таймером

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

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

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

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

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

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

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

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

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

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

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

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

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

/**

* Name tm_delay

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

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

Proto void tm_delay (int ticks)

Params int ticrs - величина задержки в тиках таймера (за 1 сек таймер тикает 18,2 раза).

Return ничего

Sample tm_samp 1.c

**/

# include <dos.h>

# include <conio.h>

void tm_delay (int ticks) {

- asm {

Push si

mov si, ticks

mov ah, 0

int 1ah

mov bx, dx

add bx, si

delay_loop;

int 1ah

cmp dx, bx

jne delay_loop

pop si

}

}

Функция использует только одно слово регистра таймера, что позволяет формировать задержки длительностью до 65536 тиков таймера.

Пример программы, демонстрирующей 10 секундную задержку (приблизительно):

# include <stdio.h>

# include “sysp.h”

main ( ) {

printf (“\n Для выполнения программной задержки примерно”

\n на 10 секунд нажмите любую клавишу.”);

getch ( );

printf (“\n Время пошло...”);

tm_gelay (18*10);

printf (“\n Готово!”);

exit (0);

}

BIOS IBM AT содержит еще две фукнции для работы с таймером: 83h и 86h, реализуемые через прерывание INT 15h.

Функция 83h позволяет запустить таймер на счет, указав адрес некоторого байта в оперативной памяти. Программа, запустившая таймер, сразу после запуска получает управление. По истечении времени, заданного при запуске таймера, функция устанавливает старший байт указанного байта в единицу, сигнализируя таким образом программе о завершении указанного временного интервала. Прогамма не может также отменить работу таймера в этом режиме.

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

Формат вызова функции 83h, прерывания INT 15h:

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

AL = код подфункции;

0 - установить интервал, запустить таймер;

1 - отменить работу таймера;

CX = старший байт времени работы счетчика, задается в микросекундах;

ES:BX = адрес байта, в котором по истечении интервала времени старший

бит будет установлен в единицу.

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

Функция 86h предназначена для формирования задержек. Она позволяет определить время задержки в микросекундах, что удобно для многих задач. Во время задержки разрешены прерывания. Формат вызова фугкции:

На входе: АН = 86h

СХ = старший байт времени задержки, задается в мкс;

DX = младший байт времени задержки

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