МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
Лабораторна робота №7
“ПРОГРАМУВАННЯ СИСТЕМНОГО ТАЙМЕРА”
Виконав:
Ст.гр.КН-24 Перевірив: Колесник К.К.
Львів 2007
МЕТА РОБОТИ
Мета роботи – вивчення і дослідження режимів роботи системного таймера.
2. Короткі теоретичні відомості
2.1. Встановлення і читання таймера.
Більшість IBM PC використовують мікросхему таймера 8253 для узгодження імпульсів від мікросхеми системних годинників. Число циклів системних годинників перетворюється в один імпульс, а послідовність цих імпульсів підраховується для визначеного часу, або вони можуть бути подані на гучномовець комп’ютера для генерації звука певної частоти. Мікросхема має три ідентичних незалежних канали, кожний з яких може програмуватися.
Мікросхеми 8253 працюють незалежно від процесора. Сучасні процесори співіснують з вбудованими в них таймерами. Фактично, процесор програмує мікросхему і потім повертається до виконання інших операцій. Таким чином 8253 діє як годинник реального часу – вона рахує свої імпульси незалежно від того, що відбувається в комп’ютері. Однак, максимальний програмований інтервал складає приблизно 1/12 секунди. Для підрахунку інтервалів часу в години і хвилини потрібно, щоб імпульси від нульового каналу мікросхеми таймера накопичувалися в змінній, яка знаходиться в області даних BIOS. Це накопичення називають підрахунком часу доби. 18,2 рази в секунду вихід каналу 0 обробляється апаратним перериванням (перериванням таймера), який ненадовго зупиняє процесор і збільшує лічильник часу доби. Число 0 відповідає опівночі 24 годинам; коли лічильник досягає значення еквівалентного 24 годинам, він спрацьовує на 0. Лічильник часу доби використовується в більшості операцій, які зв’язані з часом.
2.2. Програмування мікросхеми таймера 8253.
Кожний з трьох каналів мікросхеми таймера 8253 складається з трьох регістрів. Доступ до кожної групи з трьох регістрів відбувається завдяки одному порту; номера портів від 40Н до 42Н відповідають каналам “0” – “2”. Порт зв’язаний з 8-бітним регістром вводу–виводу, який посилає і приймає данні для цього каналу. Коли канал запрограмований, то через цей порт посилається двохбайтне значення, молодший байт на початку. Це число передається в 16-бітний регістр засуву, який зберігає це число і з якого копія розміщується в 16-бітний регістр лічильника. В регістрі лічильника число зменшується на одиницю кожний раз, коли імпульс від системного годинника пропускається через канал. Коли значення цього числа досягає нуля, то канал видає вихідний сигнал і потім нова копія вмістимого регістру засуву переміщується в регістр лічильника. Після чого процес повторюється. Чим менше число в регістрі лічильника, тим швидше ритм. Всі три канали завжди активні: процесор не включає і не виключає їх. Поточне значення любого із регістрів лічильника може бути прочитане в будь-який момент часу, не впливаючи на лічбу.
Кожний канал має дві вхідні і одну вихідну лінії. Вхідна лінія виводить імпульси, які виникають в результаті підрахунку. Призначення цих сигналів коливається в залежності від типу IBM PC:
Канал “0” використовується системним годинником часу доби. Він встановлюється BIOS на початку старту таким чином, що видає імпульси наближено 18.2 рази в секунду. 4-байтний лічильник цих імпульсів зберігається в пам’яті по адресу 0040:006С (молодший байт зберігається першим). Кожний імпульс ініціює переривання таймера (номер 0) і саме переривання збільшує покази лічильника. Це апаратне переривання, тому воно обробляється завжди, незалежно від того , чим зайнятий процесор. Вихідна лінія використовується також для синхронізації деяких дискових операцій, тому якщо змінено її значення, то Вам необхідно встановити початкове значення перед зверненням до диску (враховуючи те, що канал “0” використовується для системних функцій операційної системи перепрограмовувати його не рекомендується – для цього найкраще використовувати канал “2”).
Канал “1” керує оновленням пам’яті на всіх машинах, крім PCjr, тому його краще не чіпати. Вихідна лінія цього каналу зв’язана з мікросхемою прямого доступу до пам’яті і її імпульс заставляє мікросхему DMA обновити всю пам’ять. На PCjr канал “1” служить для перетворення вхідних даних з клавіатури із послідовної в паралельну форму. PCjr не використовує мікросхему прямого доступу до пам’яті, тому переривання від таймера заблоковано, коли він замість цього проводить дані через процесор. Канал “1” використовується для підрахунку заблокованих імпульсів годин часу доби, для того щоб можна було відновити значення лічильника після завершення дискових операцій.
Канал “2” зв’язаний з гучномовцем комп’ютера і він може формувати прості прямокутні імпульси для генерації звуку. Цей канал найбільш придатний для перепрограмування і використання в прикладних програмах. Прості звуки можуть генеруватися одночасно з іншими програмними операціями, а більш складні звукові ефекти можуть бути досягнуті за рахунок використання процесора. Канал “2” може бути від’єднаним від гучномовця і використовуватися для синхронізації. Вихідна лінія каналу “2” зв’язана з динаміком комп’ютера. Однак динамік не буде генерувати звук до тих пір поки не зроблено певні установки мікросхеми інтерфейсу з периферією 8255.
Дві вхідні лінії для кожного каналу складається з лінії годинника, як передає сигнал від мікросхеми системного годинника і лінії, що керує ключем, який вмикає і вимикає сигнал від годинника. Для каналів “0” та “1” ключ завжди ввімкнутий. Для каналу “2” він може бути відкритим або закритим, що дозволяє маніпулювати зі звуком. Ключ вмикається встановленням молодшого біта порту з адресом 61Н, який є регістром мікросхеми 8255; скидання цього біта розмикає ключ.
Мікросхема таймера може використовуватися безпосередньо для часових операцій, але це рідко буває зручним. Імпульси з годинника подаються 1,19318 млн. раз в секунду. Оскільки максимальне число, яке може зберігатися в 16 бітах, рівне 65535 і частота імпульсів від годинника ділиться на це число (що дає в результаті 18,2 імп./сек), то максимальний можливий інтервал між імпульсами рівний приблизно 1/12 секунди. Тому більшість часових операцій використовують лічильник часу BIOS. Для підрахунку часу читається значення часу доби і зрівнюється з деякими раніше запам’ятованими значеннями для визначення числа імпульсів, які пройшли з того моменту.
Мікросхема 8253 надає розробникам обладнання 6 режимів роботи для кожного каналу. Програмісти звичайно обмежуються третім режимом, як для каналу 0 при синхронізації, так і для каналу 2 для синхронізації чи генерації звуку. В цьому режимі, як тільки регістр засуву отримує число, він завантажує копію в регістр лічильника. Коли значення в лічильнику досягає нуля регістр засуву перезавантажує лічильник і т.д. На протязі половини відліку вихідна лінія включена, а на протязі іншої половини – виключена. В результаті отримуються прямокутні імпульси, які однаково придатні як для генерації звуку, та і для підрахунку.
Восьмибітний командний регістр керує способом завантаження чисел в канал. Адрес порту для цього регістру рівний 43. В цей регістр записується байт який визначає який канал програмувати і який режим встановлювати, а також один чи два байта значення лічильника повинні бути передані. Він також визначає форму запису цього числа – двійкову чи двійково-десяткову (ВСD).
Для програмування мікросхеми 8253 потрібно виконати три основні кроки.
Послати в командний регістр (43Н) байт; який визначає послідовність бітів, які визначають канал, статус читання(запису, режим операції і форму представлення чисел.
Для каналу “2” потрібно дозволити сигнал від годинника, встановивши в 1 біт 0 порту з адресом 61Н.
Визначити значення лічильника від 0 до 65535 і помістити його в регістр АХ
(спочатку молодший, а потім старший байт) і переслати його в регістр вводу-виводу каналу (40Н-42Н).
Після того як третій крок завершений, запрограмований канал негайно починає функціонувати за новою програмою.
Значення бітів цього регістру такі:
2.3. Генерація звуку за допомогою мікросхеми таймера.
Комп’ютер має можливість генерувати звук за допомогою вбудованого динаміка з постійним магнітом. Можна вибрати один з двох способів управління динаміком чи використати обидва в комбінації: 1) використання біта 1 порту 21Н для активізації мікросхеми Intel 8255 (програмований периферійний інтерфейс) (PPI); 2) використання тригера програмованого інтервального таймера Intel 8353-5 (PIT). Таймер PPI управляє тригером2 через біт 0 порту 61Н.
Канал 2 системного таймера керує динаміком комп'ютера, генеруючи при цьому прямокутні імпульси з частотою, яка рівна 1 193 180/початкове_значення_лічильника. Під час програмування динаміка початкове значення лічильника таймера є дільником частоти, тобто динамік працює з частотою, яка рівна 1 193 180/дільник герців. Після програмування каналу 2 таймера треба ще включити сам динамік - це робиться шляхом установки біт 0 і 1 порту 61h в 1. Біт 0 фактично дозволяє роботу цього каналу таймера, а біт 1 включає динамік.
Приклад програми для відтворення музичної ноти на динаміку наведено нижче. Частота ноти “до”, яка генерується на динаміку, вибрано з таблиці 1, а її тривалість з таблиці 2.
; Програма відтворення звуку з частотою 261 Hz (нота "до" середньої октави)
; тривалістю 1/2 секунди на динаміку
beep proc near
mov al,10110110b ; канал 2, режим 3
out 43h,al
mov al,ODh ; молодший байт дільника частоти 11DOh
out 42h,al
mov al,11h ; старший байт дільника частоти
out 42h,al
in al,61h ; поточнстан стан порту 61h у AL
or al,00000011b ; встановити біти 0 і 1 в 1
out 61h,al ; тепер динамік включений
mov cx,0007h ; старше слово числа мікросекунд паузи
mov dx,OA120h ; молодше слово числа мікросекунд паузи
mov ah,86h ; функція 86h
int 15h ; пауза
in al,61h
and al,11111100b ; покласти нулі на молодші два біти
out 61h,al ; тепер динамік виключений
ret beep endp
Таблиця 1
Частоти музичних нот першої і другої октави
Окта-ва
Ноти
до
до#
ре
ре#
мі
фа
фа#
соль
соль#
ля
ля#
сі
до
1
261,83
277,18
293,66
311,13
329,63
349,23
369,99
392
415,30
440
456,16
493,88
523,25
2
523,25
554,37
587,33
622,25
659,26
698,46
739,99
783,99
830,61
880
932,33
987,77
1046,5
Таблиця 2
Тривалість музичних нот
№ п/п
Нота
Умовне позначення
Тривалість нотив секундах
1
ціла
4
2
половинна
2
3
четвертна
1
4
одна восьма
1/2
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Опишіть принцип роботи системного таймера.
Вкажіть характерні режими роботи таймера.
Наведіть приклади можливого застосування різних режимів роботи таймера.
Як здійснюється програмування таймера? Проілюструйте прикладом.
Як здійснюється генерація звуку за допомогою таймера?
4. ЛАБОРАТОРНЕ ЗАВДАННЯ
Ознайомтеся з принципом роботи і методами програмування таймера.
Визначити параметри для програмування нот і їх тривалостей (для формування затримок використайте таймерні функції BIOS).
Розробити алгоритм і написати на Асемблері програму або підпрограму для відтворення мелодій, заданих масивами нот і тривалостей.
5. ОФОРМЛЕННЯ ЗВІТУ
Мета роботи і короткі теоретичні відомості.
Визначені значення параметрів для програмування нот та їх тривалостей.
Роздрук масивів нот та тривалостей для програмування мелодії.
Роздрук тексту програми з поясненнями.
Висновки.
Текс програми
title music
dseg segment
masnote db 0a2h,0eh,0a5h,0dh,3eh,0bh,0a5h,0dh,0a2h,0eh,47h,09h,8eh,0fh,0bdh,11h,47h,09h,0bdh,11h,79h,0ah,47h,09h,0bdh,11h,0ah,47h,8eh,0fh,0bdh,11h,47h,09h,79h,0ah,0a2h,0eh
maspause dw 0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch,0012h,34dch
;8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,0012h,34dch,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,0012h,34dch,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h,8b96h,024h
dseg ends
sseg segment stack
db 256 dup(?)
sseg ends
cseg segment
assume cs:cseg,ss:sseg,ds:dseg
start: jmp main
main: mov ax,dseg
mov ds,ax
mov si,offset masnote
mov di,offset maspause
mov cx,19
l1: mov al,10110110b
out 43h,al
mov al,[si]
out 42h,al
mov al,[si+1]
out 42h,al
in al,61h
or al,00000011b
out 61h,al
push cx
mov cx,0007h;8b96h
mov dx,0a120h;024h
mov ah,86h
int 15h
in al,61h
and al,11111100b
out 61h,al
mov cx,0007h;[di]
mov dx,0a120h;[di+2]
mov ah,86h
int 15h
add si,2
add di,4
pop cx
loop l1
mov AX,4C00h
int 21h
cseg ends
end start