МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт про виконання лабораторної роботи №9
на тему: “ Програмування системного таймера ”
з курсу: “ Комп’ютери та мікропроцесорні системи ”
Виконав
студент групи КН-3
Перевірив
Львів - 2006
МЕТА РОБОТИ
Мета роботи – вивчення і дослідження режимів роботи системного таймера.
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,a.l ; тепер динамік виключений
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
Текст програми
(мелодія Jingle Bells)
sseg segment stack
db 256 dup(?)
sseg ends
dseg segment
pausa1 dw 0
pausa2 dw 0
dseg ends
cseg segment
assume ss:sseg,cs:cseg,ds:dseg
start: jmp main
main: mov ax,dseg ;Занести базову адресу сегм. даних в ds
mov ds,ax
mov bh,11h ;Молодший байт ноти
mov bl,07h ;Старший байт ноти
mov pausa1,00003h ;Перше слово паузи
mov pausa2,0d090h ;Друге слово паузи
call proc1 ;Відтворити ноту на динаміку
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00007h
mov pausa2,0a120h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00007h
mov pausa2,0a120h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0f1h
mov bl,05h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0e8h
mov bl,08h
mov pausa1,00005h
mov pausa2,0b8d8h
call proc1
call proc2
mov bh,0efh
mov bl,07h
mov pausa1,00001h
mov pausa2,0e848h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,0000fh
mov pausa2,04240h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00005h
mov pausa2,0b8d8h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00001h
mov pausa2,0e848h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00001h
mov pausa2,0e848h
call proc1
call proc2
mov bh,11h
mov bl,07h
mov pausa1,00001h
mov pausa2,0e848h
call proc1
call proc2
mov bh,0f1h
mov bl,05h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0f1h
mov bl,05h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0ach
mov bl,06h
mov pausa1,00003h
mov pausa2,0d090h
call proc1
call proc2
mov bh,0e8h
mov bl,08h
mov pausa1,0000fh
mov pausa2,04240h
call proc1
call proc2
mov ax,4c00h
int 21h
proc1 proc near
mov al,10110110b ;->(10)Вибираємо канал (42н)2, який керує динаміком,(11)читання\запис
out 43h,al ;молод.-старш байта і(011) режим роботи каналу, генерація імпульсів, (0) лічильник-16-ти бітний
mov al,bh ;Перша половина ноти
out 42h,al
mov al,bl ;Друга половина ноти
out 42h,al
in al,61h
or al,00000011b ;Включити динамік
out 61h,al
mov cx,pausa1 ;Перша половина паузи
mov dx,pausa2 ;Друга половина паузи
mov ah,86h
int 15h ;Пауза
in al,61h
and al,11111100b ;Виключити динамік
out 61h,al
ret
proc1 endp
proc2 proc near
mov al,10110110b ;->(10)Вибираємо канал (42н)2, який керує динаміком,(11)читання\запис
out 43h,al ;молод.-старш байта і(011) режим роботи каналу, генерація імпульсів, (0) лічильник-16-ти бітний
mov al,00h ;Перша половина ноти
out 42h,al
mov al,00h ;Друга половина ноти
out 42h,al
in al,61h
mov cx,00000 ;Перша половина паузи
mov dx,0f424h ;Друга половина паузи
mov ah,86h
int 15h ;Пауза
in al,61h
and al,11111100b ;Виключити динамік
out 61h,al
ret
proc2 endp
cseg ends
end start
Висновки
У процесі виконання даної роботи я ознайомився з системним таймером і за допомогою мікросхеми таймера 8253 запрограмував режим його роботи для відтворення звуку.