Поиск по базе сайта:
Тема : Програмування інтервального таймера в ibm pc icon

Тема : Програмування інтервального таймера в ibm pc




Скачати 161.67 Kb.
НазваТема : Програмування інтервального таймера в ibm pc
Дата конвертації25.10.2014
Розмір161.67 Kb.
ТипДокументи

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

#include
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 с реального.

ЗАВДАННЯ

Розробити блок-схему алгоритма та програму, яка виконує наступні функції:

  1. Перепрограмовує інтервальний таймер таким чином, щоб хід системного часу прискорився у 12N разів, де N – номер студента у списку журнала академгрупи.

  2. За допомогою канала 2 інтервального таймера визначає час виконання 5N ітерацій циклу for (int i=0; i<=5*N; i++) printf("%5d | ", i); (визначити кількість CLK), де N – номер студента у списку журнала академгрупи.

  3. Виведення стану лiчильника каналу 0 кожнi 3 секунди до натиснення користувачем клавіші Esc.

  4. За допомогою системного динаміка генерує сигнал тривалістю N секунд, де N – номер студента у списку журнала академгрупи.
^

ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ


  1. Призначення і функції інтервального таймера у комп’ютері. На базі якої мікросхеми його реалізовано в IBM PC? Основні характеристики мікросхеми.

  2. Яке основне пpизначення TI в обчислювальній системі?

  3. Яку роль відіграє ТІ у формуванні системного часу в IBM PC?

  4. З якою тактовою частотою працює кварцовий генератор? Де він знаходиться?

  5. Скільки режимів роботи таймера? Їх основні характеристики й особливості.

  6. Пpизначення каналiв інтервального таймеpа в IBM PC АТ.

  7. Який обробник BIOS в IBM PC оброблює збудження виходу канала 0?

  8. За допомогою якого переривання від канала 0 можна організувати часову синхронізацію програми?

  9. Яким чином відбувається генеpацiя звуку в IBM PC?

  10. Чому читання комірки за адресою 40h:6Ch (046Ch) за допомогою дебагера кожного разу дає різні значення?



^ ПРИКЛАД ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ №2


МЕТА: Набути навичок у програмуванні мікросхеми і8253/і8254, використання інтерваль-ного таймера на платі IBM PC АТ для вирішення прикладних задач і системних функцій.
ЗАВДАННЯ

  1. Написати програму, яка перепрограмовує канал 2 інтервального таймера на режим роботи 0 з константою перерахунку 3000.

  2. Написати програму, яка шляхом перепрограмування відповідного канала інтервального таймера прискорює хід системного часу у 10 разів.


ВИКОНАННЯ

1. Для перепрограмування канала 2 системного таймера на режим 0 і константу перерахунку 3000 необхідно: записати керуюче слово 10110000 (B0h); так як 3000 – двобайтове (BB8h), записати спочатку молодший B8h, потім старший байт константи – 0Bh.


^ Блок-схема алгоритму



Лістинг програми

#include

#include
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

#include
int main (void)

{

outportb(0x43,0x36); //кер. слово

outportb(0x40,0x99); //молодний байт

outportb(0x40,0x19); //старший байт

printf("Системний час прискорено в 10 разів.\n");

return 0;

}

Перевірити результат роботи програми 2 можна, наприклад, за допомогою оболонки VC або FAR, у яких у правому верхньому кутку виводиться системний час. Після запуску програми 2 має пришвидчитись хід годинника (рисунок 2.3).

Системний годинник


Р
Запуск програми 2
исунок 2.3



www.aeom.ho.ua




Схожі:




База даних захищена авторським правом ©lib.exdat.com
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації