Програмування інтервального таймера в IBM PC.

Інформація про навчальний заклад

ВУЗ:
Інші
Інститут:
О
Факультет:
РТ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2011
Тип роботи:
Лабораторна робота
Предмет:
Архітектура комп’ютерів та комп’ютерних систем

Частина тексту файла (без зображень, графіків і формул):

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
Антиботан аватар за замовчуванням

14.05.2018 21:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!