Прізвище:
Ім'я:
Група:
Варіант: 5
Кафедра САПРДисципліна: Системне програмування
Перевірив:
ЗВІТ
до лабораторної роботи № 2
на тему “Програмування системного таймера”
Мета роботи: Вивчення і дослідження режимів роботи системного таймера.Теоретичні відомості:
Встановлення і читання таймера
Більшість IBM PC використовують мікросхему таймера 8253 для узгодження імпульсів від мікросхеми системних годинників. Число циклів системних годинників перетворюється в один імпульс, а послідовність цих імпульсів підраховується для визначеного часу, або вони можуть бути подані на гучномовець комп’ютера для генерації звука певної частоти. Мікросхема має три ідентичних незалежних канали, кожний з яких може програмуватися.
Мікросхеми 8253 працюють незалежно від процесора. Сучасні процесори співіснують з вбудованими в них таймерами. Фактично, процесор програмує мікросхему і потім повертається до виконання інших операцій. Таким чином 8253 діє як годинник реального часу – вона рахує свої імпульси незалежно від того, що відбувається в комп’ютері.
Однак, максимальний програмований інтервал складає приблизно 1/12 секунди. Для підрахунку інтервалів часу в години і хвилини потрібно, щоб імпульси від нульового каналу мікросхеми таймера накопичувалися в змінній, яка знаходиться в області даних BIOS. Це накопичення називають підрахунком часу доби. 18,2 рази в секунду вихід каналу 0 обробляється апаратним перериванням (перериванням таймера), який ненадовго зупиняє процесор і збільшує лічильник часу доби. Число 0 відповідає опівночі 24 годинам; коли лічильник досягає значення еквівалентного 24 годинам, він спрацьовує на 0. Лічильник часу доби використовується в більшості операцій, які зв’язані з часом.
Програмування мікросхеми таймера 8253
Для програмування мікросхеми 8253 потрібно виконати три основні кроки.
1. послати в командний регістр (43н) байт; який визначає послідовність бітів, які визначають канал, статус читання, запису, режим операції і форму представлення чисел.
2. для каналу “2” потрібно дозволити сигнал від годинника, встановивши в 1 біт 0 порту з адресом 61н.
3. визначити значення лічильника від 0 до 65535 і помістити його в регістрах (спочатку молодший, а потім старший байт) і переслати його в регістр вводу-виводу каналу (40н-42н).
Генерація звуку за допомогою мікросхеми таймера.
Частоти музичних нот першої і другої октави
октава
ноти
до
до#
ре
ре#
мі
фа
фа#
соль
соль#
ля
ля#
сі
до
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
Тривалість музичних нот
№ п/п
нота
Умовне позначення
Тривалість нотив секундах
1
Ціла
/
4
2
Половинна
/
2
3
Четвертна
/
1
4
Одна восьма
/
1/2
Текст програми:
DSEG SEGMENT
BEAT DB 6,4,8,6,4,8,4,4,4,4,4,8,8,6,4,8,6,4,8,4,4,4,4,4,8,8 ;тривалість нот
FREQUENCY DW 1353, 1521, 1521, 1353, 1709, 1709, 1353, 1521, 1521, 1809, 2280, 1353, 1709,1353, 1521, 1521, 1353, 1709, 1709, 1353, 1521, 1521, 1809, 2280, 1353, 1709
MELODY DB 1,3,5,6,8,6,5,3,13,1,3,0FFH; номер частоти нот
DSEG ENDS
SSEG SEGMENT STACK
db 256 dup(0)
SSEG ENDS
CSEG SEGMENT
assume cs:CSEG,ds:DSEG
start: mov ax,DSEG
mov ds,ax ;---ініціалізація
PORT_B EQU 61H
COMMAND_REG EQU 43H
LATCH2 EQU 42H
IN AL,PORT_B ;отримуємо поточний статус
OR AL,00000011B ;надаємо доступ динаміку та таймеру
OUT PORT_B,AL ;замінюємо байт
MOV SI,0 ;ініціалізуємо вказаівник
MOV AL,0B6H ;установка для канала 2
OUT COMMAND_REG,AL ;надсилаємо у командний регістр
;---дивимось ноту , отримуємо її частоту і розміщуємо в каналі 2
NEXT_NOTE:
LEA BX,MELODY ;берем зміщення для мелодії
MOV AL,[BX][SI] ;берем код n-ої ноти рядка
CMP AL,0FFH ;перевірка на кінець строки
JE NO_MORE ;якщо кінець,то на вихід
CBW ;переводимо у слово
;---получение частоты
MOV BX,OFFSET FREQUENCY ;зміщення таблиці частот
DEC AX ;починаємо відрахунок з 0
SHL AX,1 ;множимо на 2
MOV DI,AX ;адресуємо через DI
MOV DX,[BX][DI] ;отримуємо частоту з таблиці
;починаємо виконання нот
MOV AL,DL ;готуємо молодший байт частоти
OUT LATCH2,AL ;надсилаємо його
MOV AL,DH ;готуємо старший байт частоти
OUT LATCH2,AL ;надсилаємо його
;---створення циклу затримки
MOV AH,0 ;номер функції читання лічильника
INT 1AH ;отримуємо значення лічильника
MOV BX,OFFSET BEAT ;зміщення таблиці довжини
MOV CL,[BX][SI] ;беремо довжину чергової ноти
MOV CH,0
MOV BX,DX ;беремо молодше слово лічильника
ADD BX,CX ;визначаємо момент закінчення
STILL_SOUND:
INT 1AH ;беремо значення лічильника
CMP DX,BX ;порівнюємо з закінченням
JNE STILL_SOUND ;продовжуємо звук
INC SI ;переходимо до наступної ноти
JMP NEXT_NOTE ;
;---завершення
NO_MORE:
IN AL,PORT_B ;отримуємо статус порта B
AND AL,0FCH ;вимикаємо динамік
OUT 61H,AL ;замінюємо байт
MOV AX,4C00H
INT 21H
CSEG ENDS
END START
Висновки: Під час виконання даної лабораторної роботи я отримала навички роботи з таймером та запустив власну мелодію. Також закріпила вивчений протягом лекцій матеріал.