Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга. Гуржій. 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.53 Mб
Скачать

Заняття 3. Системні засоби програмного доступу до ресурсів таймера

Тема заняття

> Програмні засоби базової системи вводу/виводу та MS-DOS, призначені для роботи з таймером.

Мета заняття

Вивчити призначення функцій переривання INT lAh BIOS.

Навчитись використовувати функції OOh та Olh переривання INT lAh BIOS у прикладних задачах для фор­ мування часових затримок.

Вивчити призначення функцій переривання INT 15h BIOS.

Навчитись використовувати функції переривання INT 15h BIOS у прикладних задачах для формування часових затримок.

Вивчити призначення функцій 2Ah, 2Bh, 2Ch, 2Dh переривання INT 21h MS-DOS.

Навчитись використовувати функції 2Ah 2Bh, 2Ch, 2Dh переривання INT 21h для отримання поточної дати, встановлення дати, визначення поточного часу, встанов­ лення часу.

Засоби BIOS для роботи з таймером

Для роботи з таймером (точніше, для роботи з каналом 0 таймера) BIOS має дві функції переривання INT lAh. Вони дозволяють прочитати поточний вміст лічильника та змінити його. Функція OOh призначена для читання вмісту лічильника таймера:

На вході: AH = OOh

На виході: СХ = старше слово лічильника;

DX = молодше слово лічильника;

AL = 0, якщо з моменту перезапуску таймера

пройшло більше 24 годин.

Змінити вміст лічильника таймера можна за допомо­гою функції Olh.

На вході: AH = Olh

СХ = старше слово лічильника;

DX = молодше слово лічильника; На виході: Не використовуються.

Функцію читання таймера можна використовувати для організації програмної затримки. Оскільки робота таймера не залежить від продуктивності процесора, швидкодія системи не буде впливати на затримку, що формується. Але слід враховувати, що точність формування затримки ви­значається частотою оновлення лічильника таймера (18,2 Гц) та може виявитись недостатньою для деяких додатків. Ми підготували функцію для формування затримок за допомо­гою таймера:

#include <stdio.h>

#include <conio.h>

Void tm_delay(int ticks) {

asm {

push si ; Збереження в стеку вмісту регістра si

mov si, ticks ;Помістити змінну ticks у регістр si mov ah, OOh ; Занести код функції OOh переривання ;INT 1A в регістр ah

int lah ;Викликати оброблювач переривання

;INT 1A

mov bx, dx ;Переписати молодше слово лічильника ; із регістра dx у bx

add bx, si ;Додати вміст регістрів bx, si

}

delay_loop: ;Відмітка переходу для організації циклу

;затримки asm { int lah ;Викликати оброблювач переривання

;INT 1A cmp dx, bx ;Порівняти поточне значення лічильни-

;ка із заданим jne delay_loop ;Якщо немає, йти на позначку циклу

;затримки pop si ;Інакше, відновити вміст регістра si

{

{

Функція використовує тільки одне слово регістра тай­мера, що дозволяє формувати затримки тривалістю до 65536 тіків таймера. Наведена нижче програма демонструє вико­ристання функції для генерації приблизно (65536 : 18) сек затримки:

Void main (void){

int n; //Змінна п типу int

char c = 'y'; //Змінна с = "у" типу char

while (c != 'n'){ //Цикл поки змінна с не дорівнює п

clrscr(); //Очистити екран

prmtf("BBefliTb час затримки в секундах - "); //Вивід на екран

scanf("%d", &n); //Ввід часу затримки в секундах

tm_delay(n*18); //Передача у функцію затримки часу в тіках

printf("\nroTOBo!!!, хочете ще (Y/N)"); // Вивід на екран с = getch(); //Очікування натискання клавіш "Y"

//або "N" }

BIOS комп'ютерів IBM PC AT містить ще дві цікаві функції для роботи з таймером: 83h та 86h переривання INT 15h. Функція 83h дозволяє запустити таймер на рахунок, вказавши адресу деякого байта в оперативній пам'яті. Програма, що запустила таймер, зразу після запуску отримує керування. Після закінчення часу, заданого при запуску таймера, функція встановлює старший біт вказаного байта на одиницю, сигналізуючи таким чином програмі про завершення вказаного часового інтервалу. Функція 83h також може відмінити роботу таймера в цьому режимі. Вказану функцію зручно використовувати для організації виконання будь-яких дій паралельно з відліком часу, наприклад, можна обмежити час для вводу пароля.

Наведемо формат виклику функції 83h перери­вання INT 15h:

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

AL = код підфункції:

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

1 — відмінити роботу таймера; СХ = старше слово часу роботи лічильника, задається в мікросекундах; DX = молодше слово лічильника; ES:BX = адреса байта, в якому після закінчення інтервалу часу старший біт буде встановлено на одиницю; На виході: не використовуються.

Функція 86h спеціально призначена для формування затримок. Вона дозволяє визначити час затримки в мікро­секундах, що зручно для багатьох задач. Під час виконан­ня затримки дозволені переривання. Формат виклику функції:

На вході: AH = 86h;

СХ = старше слово часу затримки, задається в мікросекундах;

DX = молодше слово часу затримки; На виході: не використовуються.

Засоби MSDOS для роботи з таймером

MS-DOS використовує чотири функції переривання INT 21h для роботи з системним таймером. Ці функції дозволяють дізнатись та встановити поточну дату та час. MS-DOS версії 3.30 та більш пізніх версій при встановленні часу та дати змінюють також показники годинника реального часу.

Для отримання поточної дати використовується функ­ція 2Ah:

На вході: AH = 2Ah;

На виході: DL = день (0...31);

DH = місяць (1...12); СХ = рік (1980...2099);

AL = номер дня тижня: 0 — неділя; 1 — понеді­лок; 2 — вівторок; ... 6 — субота.

Зверніть увагу на те, що функція повертає номер дня тижня, який вона обчислює на основі дати.

Для встановлення дати використовуйте функцію 2Bh:

На вході: AH = 2Bh;

DL = день(0...31); DH = місяць (1...12); CX = рік (1980...2099);

На виході: AL = 0, якщо встановлення виконано правильно; AL = FFh, якщо при встановленні були задані неправильні параметри

Для того, щоб визначити поточний час, можна скорис­татись функцією 2Ch:

На вході: AH = 2Ch;

На виході: СН = години (0...24);

CL = хвилини (0...59);

DH = секунди (0...59);

DL = соті долі секунди (0...99).

Точність часу, отриманого за допомогою цієї функції, визна­чається таймером (час поновлюється 18,2 рази за секунду).

Для встановлення часу можна використовувати функцію 2Dh:

На вході: AH = 2Dh;

СН = години (0...24);

CL = хвилини (0...59);

DH = секунди (0...59);

DL = соті долі секунди (0...99); На виході: AL = 0, якщо встановлення виконано правильно;

AL = FFh, якщо при встановленні були задані

неправильні параметри.

MS-DOS надає функції перетворення показників лічильника часу доби між годинами-хвилинами-секундами з точністю до 1/100 сек, але оскільки лічильник часу доби поновлюється з частотою 18.2 Гц (приблизно в 5 разів меншою), то показник сотих долей секунд дуже приблиз­ний. Тому для підвищення точності необхідно збільшити частоту каналу 0 та написати процедуру декодування показників лічильника часу доби, що відповідає зміненій частоті.

Практикум

Лабораторна робота 1

Тема роботи

Формування часових інтервалів з використанням таймера

Мета роботи

Навчитись розробляти основні компоненти про­грами, що формує часові затримки.

Навчитись формувати керуючі слова та коефіцієнти перерахунку.

Зрозуміти та засвоїти, якими параметрами визна­чається точність задання часових інтервалів.

Навчитись змінювати точність, з якою формується тривалість затримки.

Вивчити призначення та навчитись використову­вати функцію 00h (читання стану лічильника таймера 0) переривання INT lAh BIOS.

Вимоги

Для виконання роботи потрібні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування таймера, а та­кож знання призначення та способів використання оброб­лювача переривання INT lAh BIOS та INT 15h.

На вінчестері комп'ютера повинне бути встановлене сере­довище програмування Borland C++ V3.01 в каталозі ВС.

Вправа 1

1. Вам пропонується дослідити програму, яка формує часовий інтервал, що задається користувачем з точністю до 55 млсек.

2. На вінчестері створіть каталог TIME.

3. За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми формування часового інтервалу та запишіть його в каталог TIME.

4. Виконайте настройку програми та запустіть її на виконання.

5. За допомогою секундоміра Вашого годинника спро­буйте проконтролювати точність відліку часу програмною затримкою.

Вправа 2

Змініть програму таким чином, щоб точність форму­вання інтервалу часу була в межах однієї млсек. Для цього:

1. Обчисліть відповідний коефіцієнт перерахунку для нульового каналу таймера за формулою: (0.84 мкс) * Ксч= =(1 млсек) * 1000 та запишіть його в шістнадцятковому форматі.

2. Сформуйте керуюче слово для режиму 3; тип рахун­ку — двійковий; спосіб запису коефіцієнта перерахунку — молодший байт, старший байт; канал — 0.

3. Напишіть модуль перепрограмування каналу 0 таймера та помістіть його у відповідне місце програми затримки.

4. У кінці програми передбачте відновлення поперед­нього режиму роботи каналу 0 таймера.

5. Виконайте настройку програми та запустіть її на виконання.

Вправа З

1. Дослідіть програму формування часового інтервалу, що використовує функцію 86h переривання INT 15h. Текст програми:

#include <stdio.h>

#include <conio.h>

#include <dos.h>