Обробка переривань таймера

При ініціалізації BIOS встановлює свій обробник для переривання таймера. Цей оброблювач кожен раз збільшує на одиницю поточне значення 4-байтовой змінної, що розташовується в області даних BIOS за адресою 0000: 046Ch - лічильник таймера. Якщо цей лічильник переповниться через те що пройшло більше 24 годин з моменту запуску таймера, в осередок 0000: 0470h заноситься значення 1.

Деякі інші дії, що виконується стандартним обробником переривання таймера - контроль за роботою двигунів НГМД. Якщо після останнього звернення до НГМД пройшло більше 2 секунд, обробник переривання вимикає двигун. Осередок з адресою 0000: 0440h містить час, що залишився до вимкнення двигуна. Це час постійно зменшується оброблювачем переривання таймера. Коли воно стає дорівнює 0, двигун НГМД відключається.

Остання дія, яке виконує обробник переривання таймера - виклик переривання INT 1Ch. Після ініціалізації системи вектор INT 1Ch вказує на команду IRET, тобто обробник переривання INT 1Ch нічого не робить. Програма може встановити власний обробник цього переривання для того щоб виконувати будь-які періодичні дії.

Необхідно відзначити, що переривання INT 1Ch викликається обробником переривання INT 8h до скидання контролера переривання, тому під час виконання переривання INT 1Ch все апаратні переривання заборонені. Зокрема, заборонені переривання від клавіатури.

Оброблювач переривання INT 1Ch повинен закінчуватися командою IRET. Якщо ж ви готуєте власний обробник для переривання INT 8h, перед завершенням його роботи необхідно скинути контролер переривань. Це можна зробити, наприклад, так:


mov al, 20h
out 20h, al

Таймер зазвичай реалізується на мікросхемі Intel 8253 (для комп'ютерів IBM PC і IBM PC / XT) або 8254 (для комп'ютерів IBM PC / AT і IBM PS / 2), а також на аналогах цих мікросхем. Наступний розділ книги присвячено опису мікросхеми 8254.

Ми не будемо детально розповідати про всі можливості мікросхем 8253 і 8254, так як зазвичай використовуються тільки кілька режимів роботи (а найчастіше один
Режими роботи таймера

Можливі шість режимів роботи таймера. Вони поділяються на три типи:

· Режими 0, 4 - одноразове виконання функцій.

· Режими 1, 5 - робота з перезапуском.

· Режими 2, 3 - робота з автозавантаженням
Режим однократного виконання функцій

У режимі однократного виконання функцій перед початком рахунку вміст регістра констант перерахунку CR переписується в регістр лічильника CE по сигналу CLOCK, якщо сигнал GATE встановлений в 1. Надалі вміст регістра CE зменшується в міру приходу імпульсів CLOCK. Процес рахунку можна призупинити, якщо подати на вхід GATE рівень логічного 0. Якщо потім на вхід GATE подати 1, рахунок буде продовжений далі. Для повторення виконання функції необхідна нова завантаження регістра CR, тобто повторне програмування таймера.
Робота з перезапуском

При роботі з перезапуском не потрібно повторного програмування таймера для виконання тієї ж функції. По фронту сигналу GATE значення константи з регістра CR знову переписується в регістр CE, навіть якщо поточна операція не була завершена.
режим автозавантаження

У режимі автозавантаження регістр CR автоматично переписується в регістр CE після завершення рахунку. Сигнал на виході OUT з'являється тільки при наявності на вході GATE рівня логічної 1. Цей режим використовується для створення програмованих імпульсних генераторів і генераторів прямокутних імпульсів (меандру).
канали таймера

У соверменних комп'ютерах задіяні всі три канали таймера.
Канал 0

Канал 0 використовується в системному годиннику часу доби (не слід плутати з годинником реального часу, реалізованими на інший мікросхемі). Цей канал працює в режимі 3 і використовується як генератор імпульсів з частотою приблизно 18,2 Гц. Саме ці імпульси викликають апаратне переривання INT 8h.
Канал 1

Канал 1 використовується для регенерації вмісту динамічної пам'яті комп'ютера. Вихід каналу OUT використовується для запиту до каналу прямого доступу DMA, який і виконує оновлення вмісту пам'яті. Вам не слід перепрограмувати цей канал, так як це може привести до порушень в роботі основної оперативної пам'яті комп'ютера.
Канал 2

Канал 2 підключений до гучномовцю комп'ютера і може бути використаний для генерації різних звуків або музики, або як генератор випадкових чисел. Канал використовує режим Програмування таймера на рівні портів

Для чого вам може знадобитися перепрограмування каналів таймера?

Якщо вам треба підвищити точність вимірювання часу, що виконується за допомогою каналу 0 таймера, ви можете збільшити частоту генеруючих цим каналом імпульсів (стандартно 18,2 Гц). Після закінчення вимірювань режим роботи каналу необхідно відновити для правильної роботи системи.

Канал 2, підключений до гучномовцю, ви можете використовувати для генерації різних звуків або музики, про що ми розповімо трохи пізніше. Цей же канал стане в нагоді і для генерації випадкових чисел.

Таймером відповідають чотири порти введення / виводу з наступними адресами:

· 40h - канал 0;

· 41h - канал 1;

· 42h - канал 2;

· 43h - керуючий регістр
#include <stdio.h>

#include <conio.h>

int main()

{

unsigned i;

printf("\n\nКанал 0\n-------\n");

outp(0x43, 0xe2);

printf("\nСлово состояния канала: %02.2X",

inp(0x40));

outp(0x43, 0x00);

i = inp(0x40);

i = (inp(0x40) << 8) + i;

printf("\nРегистр счетчика: %04.4X",i);

printf("\n\nКанал 1\n-------\n");

outp(0x43, 0xe4);

printf("\: %02.2X",inp(0x41));

outp(0x43, 0x40);

i = inp(0x41);

i = (inp(0x41) << 8) + i;

printf("\nРегистр счетчика: %04.4X",i);

printf("\n\nКанал 2\n-------\n");

outp(0x43, 0xe8);

printf("\: %02.2X",inp(0x42));

outp(0x43, 0x80);

i = inp(0x42);

i = (inp(0x42) << 8) + i;

printf("\n: %04.4X",i);

return 0;

Обробка переривань таймера - student2.ru

Обробка переривань таймера - student2.ru

Наши рекомендации