Міністерство освіти і науки Російської федерації
Федеральне Агентство з освіти
ГОУ ВПО Московський Державний Відкритий університет
Чебоксарский інститут (філія)
Кафедра інформаційних технологій та програмування
Курсова робота
З дисципліни: В«Обчислювальні машини, системи та мережіВ»
Програмований периферійний інтерфейс. Генерація звуку з забороною і без заборони переривань.
Виконав студент:
Ванюшин А.А
Спеціальність: 220201
Форма навчання: денна
Навчальний шифр: 607026
Керівник:
Серолапкін А.В.
2008
Зміст
1. Постановка завдання
2. Пояснення
3. Код програми
4. Висновок
5. Список літератури
1. Постановка завдань
Генерація звуку. І обробка переривань.
генерація звук система програма
2. Пояснення
Установка і читання таймера.
Всі IBM PC використовують мікросхему таймера 8253 (або 8254) для узгодження імпульсів від мікросхеми системних годин. Число циклів системних годин перетвориться в один
імпульс, а послідовність цих імпульсів підраховується для визначення часу, або вони можуть бути послані на гучномовець комп'ютера для генерації звуку певної частоти. Мікросхема 8253 має три ідентичних незалежних канали, кожний з яких може програмуватися.
Мікросхема 8253 працює незалежно від процесора. Процесор програмує мікросхему і потім звертається до інших справ. Таким чином 8253 діє як годинник реального часу - Вона вважає свої імпульси незалежно від того, що відбувається в комп'ютері.
Однак, максимальний програмований інтервал становить приблизно 1/12 секунди. Для підрахунку інтервалів часу в годинник і хвилини потрібні якісь інші засоби. Саме з цієї причини імпульси від нульового каналу мікросхеми таймера накопичуються в змінної, що знаходиться в області даних BIOS. Цей процес показаний на рис. 2-1. Це нагромадження зазвичай називається підрахунком часу доби. 18.2 рази в секунду вихід каналу 0 обробляється апаратним перериванням (перериванням таймера), яке ненадовго зупиняє процесор і збільшує лічильник часу доби.
Число 0 відповідає полночи 12:00; коли лічильник досягає значення еквівалентного 24 годинам, він скидається на нуль. Інший час протягом доби легко визначається діленням показника лічильника на 18.2 для кожної секунди. Лічильник часу доби використовується в більшості операцій, пов'язаних з часом.
Програмування мікросхеми таймера 8253/8254.
Кожен з трьох каналів мікросхеми таймера 8253 (8254 для AT) складається з трьох регістрів. Доступ до кожній групі з трьох регістрів здійснюється через один порт; номери портів від 40H до 42H відповідають каналам 0 - 2. Порт пов'язаний з 8-бітним регістром вводу/виводу, який посилає і приймає дані для цього каналу. Kогда канал запрограмований, то через цей порт надсилається двухбайтного значення, молодший байт спочатку. Це число передається в 16-бітний регістр засувки (latch register), який зберігає це число і з якого копія міститься в 16-бітний регістр лічильника. В регістрі лічильника число зменшується на одиницю кожного разу, коли імпульс від системних годин пропускається через канал. Kогда значення цього числа досягає нуля, то канал видає вихідний сигнал і потім нова копія вмісту регістра засувки пересувається в регістр лічильника, після чого процес повторюється. Чим менше число в регістрі лічильника, тим швидше ритм. Всі три канали завжди активні: процесор не включає і не вимикає їх. Поточне значення будь-якого з регістрів лічильника може бути прочитане в будь-який момент часу, не впливаючи на рахунок.
Кожен канал має дві вхідні і одну вихідну лінії. Вихідна лінія виводить імпульси, що виникають у результаті підрахунку. Hазначеніе цих сигналів варіюється в залежності від типу IBM PC:
Установка/читання часу
При старті MS DOS запрошує у користувача поточний час. Введене значення поміщається в 4 байта, що зберігають лічильник часу доби (починаючи з 0040:006 C, молодший байт зберігається першим). Hо спочатку воно перетворюється на форму, в якій підраховується час доби, тобто час перетворюється на число вісімнадцятого часток секунди, що минули з півночі. Це число постійно оновлюється 18.2 разів у секунду перериванням таймера. Коли з'являється черговий запит на час, то поточне значення лічильника часу доби перетвориться назад в звичний формат годинник-хвилини-секунди. Якщо при старті не було введено значення, то лічильник встановлюється в нуль, наче зараз опівночі. Kомпьютер забезпечені мікросхемою календаря-годин можуть автоматично встановлювати лічильник часу доби.
Установка/читання дати.
При включенні комп'ютера MS DOS запитує в користувача поточні дату і час. Час записується в області даних BIOS. Дата же міститься в змінної в COMMAND.COM. Вона зберігається в форматі трьох послідовних байтів, які містять відповідно день місяця, номер місяця і номер року, починаючи з 0, де 0 відповідає 1980 році. У відмінності від лічильника часу доби, адреса дати в пам'яті змінюється з зміною версії DOS і становищем у пам'яті COMMAND.COM. З цієї причини для отримання дати завжди треба використовувати готові утиліти Бейсіка або MS DOS, а не звертатися до цієї змінної безпосередньо.
Машини, обладнані мікросхемою календаря-годин, автоматично встановлюють час і дату за допомогою спеціальної програми (зазвичай запускається при старті через файл AUTOEXEC.BAT). Kак отримати доступ до мікросхеми календаря-годин, див [2.1.4]. Відзначимо також, що коли лічильник часу доби BIOS переходить через відмітку 24 годин, MS DOS змінює дату.
3. Код програми .
.286
. MODEL TINY
. CODE
ORG 100h
Begin:
jmp start
DATASEG
PPI_PORT EQU 061h
ON EQU 03
OFF EQU 0FCh
MOD_PORT EQU 43h
FRQ_PORT EQU 42h
TIMERSET EQU 0B6h
PLRE EQU 5; Кількість повторів
NUM EQU 16; кількість нот
Music dw 131,5,262,5,294,5,330,5,350,5,392,5,440,5,491,5; перший мелодія
dw 491,5,440,5,392,5,350,5,330,5,294,5,262,5,131,5; друга
dw 262,5,491,5,262,5,491,5,262,5,491,5,262,5,491,5; 3-ая
dw 491,3,294,3,294,3,330,3,294,3,350,3,491,3,491,3; четвертий
Message db 'nevernj', 13,10, '$'
Message1 db 'The program have already been loaded. Unload y/n? $ '
Message2 db 'The program was loaded $'
Message3 db 10,13, 'The program was unloaded $'
atime dw 3 DUP (0)
time dw 3 DUP (0)
filename db 'time.dat', 0; Ім'я файлу з даними
timeinfo db 50 DUP (?); Час з файлу
cmdinfo db 50 DUP (?); Командний рядок
oldintoff dw? ; Зсув старого обробника переривання 1Ch
oldintseg dw? ; Сегмент старого обробника переривання 1Ch
oldintoff7 dw? ; Зсув старого обробника переривання 7h
oldintseg7 dw? ; Сегмент старого обробника переривання 7h
count db 0
musn db 1; Номер воспроизводимой мелодії
Play PROC; Відтворення музики
; Включимо Speaker
in al, PPI_PORT
or al, ON
out PPI_PORT, al
mov [Count], 0
R_play:
inc [Count]
xor ax, ax
mov al, cs: [musn]
dec ax
mov bx, 28
mul bx
mov si, ax
mov di, 00
LoopM:
mov ax, cs: word ptr Music [si]
push ax
mov ax, TIMERSET
out MOD_PORT, ax
pop ax
push ax
and ax, 0FFh
out FRQ_PORT, a...