www.aeom.ho.ua Розробили: проф. Сидоренко В.В., викл. Дóренський О.П., 2006-2011
ЛАБОPАТОPНА PОБОТА № 2
ТЕМА: Програмування інтервального таймера в IBM PC.
МЕТА: Набути навичок з програмування мікросхеми і8253/і8254, використання інтервального таймера на платі IBM PC / АТ для розв’язку інженерних задач та розробки системних функцій.
Короткі теоретичнi вiдомостi
Сучасні комп’ютери оснащено двома підсистемами таймерів, які паралельно відраховують поточний час. Один таймер розміщено у мікросхемі з низьким споживання енергії (КМОП-мікросхема), яка після вимкнення живлення комп’ютера продовжує функціонувати, отримуючи енергію від вбудованого у комп’ютер аккумулятора (батареї). Цей таймер, як правило, називають годинником реального часу (RTC), більш детально з який познайомимось у лабораторній роботі №3. Інший таймер, реалізований мікросхемою і8253 (вітчизняний аналог – КР580ВН53, в AT – і8254), який надалі будемо називати інтервальним (іноді в літературі – системним), працює, як і решта вузлів комп’ютера, тільки коли ПК увімкнений. Його канал 0 генерує сигнали з частотою приблизно 18,206 Гц, яка викликає апаратні переривання рівня 0 (вектор 08h). Обробник даного переривання, який входить у систему BIOS, з кожним перериванням інкрементує вміст 4-байтної чарунки за адресою 40h:6Ch, яка розміщена у області даних BIOS і називається таймером BIOS або системним таймером. В процесі початкового завантаження комп’ютера програма BIOS чатає показники RTC (години, хвилини та секунди) і, перетворивши їх в кількість секунд від початку поточної доби, множить отриману велечину на 18,206, щоб отримати поточний час, виражене у кількості тактів системного таймера. Ця величина записується у чарунку пам’яті за адресою 40h:6Ch, яка у подальшому інкрементується, що є паралельним з RTC відліком часу системи, поки комп’ютер увімкнений. Саме з цієї чарунки пам’яті системні функції читають поточний час.
Інтервальний 3-канальний таймер, який, як правило, входить до складу багатофункціональної мікросхеми програмованого периферійного контролера, забезпечує в ІВМ РС три функції: відлік системного часу, керування регенерацією динамічної пам’яті та генерація звука в динаміку комп’ютера (таблиця 2.1). В останній процедурі приймає участь один з портів периферійного контролера (порт 61h). На рисунку 2.1 наведено спрощену схему взаємодії цих вузлів.
Таблиця 2.1 – Призначення каналів системного таймера в IBM PC
Канал
Призначення
Режим роботи
0
системний годинник (IRQ0)
3, лічильник = 0 (65536)
1
запит для каналу 0 DMA
2, лічильник=18
2
генерація звуку
задається прикладною програмою
Підсистема таймера працює незалежно від процесора (паралельно з ним) від власного генератора, який генерує сигнали з частотою 1,19318 МГц, тобто кожний такт має тpивалiсть 0,84 мксек. До складу таймера входять буфер шини даних, схема управлiння введенням-виведенням та три незалежних канали, кожний з яких мiстить регiстр режиму, схему управлiння каналом, буфер та 16-розрядний лiчильник. Фіксатори каналів (регістри константи перерахунку) адресуються через порти 40h, 41h, 42h відповідно (дуже легко запам’ятати адреси: порт 40h – канал 0, порт 41h – канал 1, порт 42h – канал 2), 43h – порт керуючого слова (таблиця 2.1).
Таблиця 2.2 – Адреси портів системного таймера та їх призначення
Адреса
Операція
Призначення
40h
Запис
Завантаження лiчильника каналу 0
Читання
Читання лiчильника каналу 0
41h
Запис
Завантаження лiчильника каналу 1
Читання
Читання лiчильника каналу 1
42h
Запис
Завантаження лiчильника каналу 2
Читання
Читання лiчильника каналу 2
43h
Запис
Запис керуючого слова системного таймера
Програмування всіх каналів таймера здійснюється однаково: в регістр команд (порт 43h) записується керуюче слово, формат якого наведено на рисунку 2.1, потім у фіксатор завантажується константа перерахунку (один або два байти) і відразу після чого канал починає роботу.
Під час увімкнення комп’ютера у регістр константи перерахунку канала 0 системного таймера BIOS записує максимально можливе число 65535 (FFFFh, 65536 декрементів), в результаті чого сигнали на виході OUT0 генеруються з частотою 18,2 Гц (, тобто кожнi 55 мсек). Дані сигнали, як вже відмічалось вище, поступають на IRQ0 контролера переривань, викликаючи переривання 08h, яке обробляється підпрограмою BIOS і здійснює відлік поточного часу (шляхом інкременту таймера BIOS – чарунки пам’яті за адресою 40h:6Ch).
Переривання від канала 0 можна використовувати для часової синхронізації програми (наприклад, для періодичного виведення на екран певної інформації).
Канал 1 таймера налаштований BIOS для регенерації динамічної пам’яті, тому його перепрограмування може призвести до порушення даного процесу і втрати даних ОЗП.
Вхiд GATE каналiв 0 та 1 завжди мають високий рiвень, тому pахунок на цих каналах дозволяється завжди.
Вихід канал 2 зв’язаний з динаміком та використовується для генерації звука (рисунок 2.1). Вхiд GATE каналу 2 кеpується бiтом 0 порту PB iнтерфейса 8255, який зв’язаний з портом 61h.
Рисунок 2.1 – Формат керуючого слова таймера (порт 43h)
На вхiд звукогенератора надходить логiчне "i" двох сигналiв: виходу OUT 2-го каналу таймера та змiсту бiта 1 порта РВ iнтерфейса 8255. Тому найпростiший спосiб генерацiї звука полягає в програмуваннi канала 2 системного таймера таким чином, щоб вiн генерував прямокутний iмпульс вказаної частоти, що належить звуковому дiапазону від 20 Гц до 20 КГц. Змінюючи вміст регістра констати перерахунку (фіксатора), можна змінювати частоту сигналів, які поступають на динамік, від 18,2 Гц до 1,19 МГц (реально для збудження звука можна використовувати частоти не вище 10КГц). Для цього необхiдно викоpистовувати режим 3 з вiдповiдним початковим значенням лiчильника. Якщо потiм встановити бiти 0 та 1 порта РВ, то iмпульс почне надходити на вхiд звукогенератора (бiт 0 – вхiд GATE канала 2, що дозволяє pахунок, а бiт 1 – дозвiл видачi OUT на вхiд звукогенератора). Для вимкнення звуку достатньо скинути бiти 0-1 в РВ. Перевага цього методу полягає в тому, що, запустивши генерацiю звуку, ЦП може виконувати iншi дiї. Значення лiчильника каналу 2 обчислюється за формулою
, (1)
де n – значення константи перерахунку (фіксатора),
F – тактова частота генератора системного таймера (1193181 Гц),
f – вихідна частота канала (частота OUT).
Таблиця 2.3 – Частоти для генерації звуків відповідних нот
До
До#
Ре
Ре#
Мі
Фа
Фа#
Соль
Соль#
Ля
Ля#
Сі
Октава
1
2
3
4
5
6
7
8
9
10
11
12
Контроктава
33
35
37
39
41
44
46
49
52
55
58
62
13
14
15
16
17
18
19
20
21
22
23
24
Велика
65
69
73
78
82
87
92
98
104
110
117
123
25
26
27
28
29
30
31
32
33
34
35
36
Мала
131
139
147
156
165
175
185
196
208
220
233
247
37
38
39
40
41
42
43
44
45
46
47
48
Перша
262
277
294
311
330
349
370
392
415
440
466
494
49
50
51
52
53
54
55
56
57
58
59
60
Друга
523
554
587
622
659
698
740
784
831
880
932
988
61
62
63
64
65
66
67
68
69
70
71
72
Третя
1047
1109
1175
1245
1319
1397
1480
1568
1661
1760
1865
1976
73
74
75
76
77
78
79
80
81
82
83
84
Четверта
2093
2217
2349
2489
2637
2794
2960
3136
3322
3520
3729
3951
Дpугий спосiб генерацiї звука полягає в тому, щоб генерувати звуковi iмпульси не виходом таймера, а встановленням та скидом бiта 1 в регiстрi РВ. Для кеpування затpимкою можна викоpистовувати програмний цикл.
Рисунок 2.2 – Елементи комп’ютера, які приймають участь у генерації звука
Розглянемо приклад. В лістингу 2.1 наведено лістинг програми, яка перепрограмовує системний таймер (канал 0) таким чином, що відлік системного часу прискорюється в десять разів.
Лістинг 2.1 – Програмування системного таймера: прискорення системного часу у 10 разів шляхом збільшення частоти OUT0 з частоти 18,206 Гц до 182,06 Гц
#include <stdio.h>
#include <dos.h>
int main (void)
{
printf("ПРОГРАМА ПРИСКОРЕННЯ У 10 РАЗІВ СИСТЕМНОГО ЧАСУ.");
outportb(0x43,0x36); //запис керуючого слова (00110110b)
outportb(0x40,0x99); //запис молодшого байту константи 1999h
outportb(0x40,0x19); //запис старшого байту константи 1999h
printf("\nКАНАЛ 0 СИСТЕМНОГО ТАЙМЕРА ПЕРЕПРОГРАМОВАНО.");
return 0;
}
Для того, щоб прискорити відлік системного часу у 10 разів необхідно у 10 разів частіше викликати обробник 08h (IRQ0), який виконує інкремент таймера BIOS. Відповідно, треба збільшити вихідну частоту канала 0 в 10 разів, тобто до частоти 182,067 Гц (у нормальному відліку, як відомо, вона рівна 18,2067 Гц). Після цього час прискориться в 10 разів.
За допомогою формули (1) обчислимо необхідну константу перерахунку для вихідної частоти OUT 182 Гц:
.
Отже, записавши керуюче слово 00110111B (канал 0; завантаження молодшого, потім старшого байту; режим 3; двійковий відлік), завантаживши у регістр-фіксатор константу перерахунку, за допомогою, наприклад, Norton Commander можна спостерігати, що системний час прискорився у 10 разів (прискорилось блимання “:”). Тобто а саме 1 хв системного часу проходить за 6 с реального.
ЗАВДАННЯ
Розробити блок-схему алгоритма та програму, яка виконує наступні функції:
Перепрограмовує інтервальний таймер таким чином, щоб хід системного часу прискорився у 12N разів, де N – номер студента у списку журнала академгрупи.
За допомогою канала 2 інтервального таймера визначає час виконання 5N ітерацій циклу for (int i=0; i<=5*N; i++) printf("%5d | ", i); (визначити кількість CLK), де N – номер студента у списку журнала академгрупи.
Виведення стану лiчильника каналу 0 кожнi 3 секунди до натиснення користувачем клавіші Esc.
За допомогою системного динаміка генерує сигнал тривалістю N секунд, де N – номер студента у списку журнала академгрупи.
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ
Призначення і функції інтервального таймера у комп’ютері. На базі якої мікросхеми його реалізовано в IBM PC? Основні характеристики мікросхеми.
Яке основне пpизначення TI в обчислювальній системі?
Яку роль відіграє ТІ у формуванні системного часу в IBM PC?
З якою тактовою частотою працює кварцовий генератор? Де він знаходиться?
Скільки режимів роботи таймера? Їх основні характеристики й особливості.
Пpизначення каналiв інтервального таймеpа в IBM PC АТ.
Який обробник BIOS в IBM PC оброблює збудження виходу канала 0?
За допомогою якого переривання від канала 0 можна організувати часову синхронізацію програми?
Яким чином відбувається генеpацiя звуку в IBM PC?
Чому читання комірки за адресою 40h:6Ch (046Ch) за допомогою дебагера кожного разу дає різні значення?
ПРИКЛАД ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ №2
МЕТА: Набути навичок у програмуванні мікросхеми і8253/і8254, використання інтерваль-ного таймера на платі IBM PC АТ для вирішення прикладних задач і системних функцій.
ЗАВДАННЯ
Написати програму, яка перепрограмовує канал 2 інтервального таймера на режим роботи 0 з константою перерахунку 3000.
Написати програму, яка шляхом перепрограмування відповідного канала інтервального таймера прискорює хід системного часу у 10 разів.
ВИКОНАННЯ
1. Для перепрограмування канала 2 системного таймера на режим 0 і константу перерахунку 3000 необхідно: записати керуюче слово 10110000 (B0h); так як 3000 – двобайтове (BB8h), записати спочатку молодший B8h, потім старший байт константи – 0Bh.
Блок-схема алгоритму
Лістинг програми
#include <stdio.h>
#include <conio.h>
int main (void)
{
outportb(0x43,0xB0);
outportb(0x40,0xB8);
outportb(0x40,0x0B);
printf("Канал 2 системного таймера успішно перепрограмовано.\n");
return 0;
}
2. Відповідно до рисунку 2.2, для прискорення ходу системного часу у 10 разів, необхідно перепрограмувати канал 0 інтервального таймера (який відповідає за ведення системного часу за допомогою виклику переривання 08h) таким чином, щоб збільшити у 10 разів вихідну частоту OUT0, тобто становила 182,06 Гц (18,206(10=182,06). Таким чином, необхідно обчислити контанту перерахунку n для цієї частоти:
,
де F – тактова частота генератора системного таймера (1193181 Гц), f – вихідна частота канала (частота OUT).
.
Блок-схема алгоритму
Лістинг програми
#include <stdio.h>
#include <dos.h>
int main (void)
{
outportb(0x43,0x36); //кер. слово
outportb(0x40,0x99); //молодний байт
outportb(0x40,0x19); //старший байт
printf("Системний час прискорено в 10 разів.\n");
return 0;
}
Перевірити результат роботи програми 2 можна, наприклад, за допомогою оболонки VC або FAR, у яких у правому верхньому кутку виводиться системний час. Після запуску програми 2 має пришвидчитись хід годинника (рисунок 2.3).
Рисунок 2.3