
- •Передмова
- •Intel 430lx
- •Intel 430nx
- •Intel 430fx
- •Intel 430hx
- •Intel 430vx
- •Intel 430tx
- •Intel 450gx/kx
- •Intel 440fx
- •Intel 440lx agPset
- •Intel 440ex
- •Intel 440bx agPset
- •Заняття 1. Поняття про систему переривання пеом
- •Принципи організації системи переривання програм
- •Слово стану процесора (програми)
- •Характеристики системи переривання
- •Організація переходу до перериваючої програми та пріоритетне обслуговування запитів переривання
- •Процедура переривання з опитуванням джерел (прапорців) переривання
- •Програмно-керований пріоритет перериваючих програм
- •Методи використання механізму переривань
- •Класи переривань пеом
- •Призначення контролера апаратних переривань пеом
- •Опис основних елементів і8259а
- •Стани програмованого контролера переривань
- •Заняття 5. Керування режимами роботи пкп
- •Void main (void){
- •Int mask;
- •Заняття 6. Керування пріоритетами переривань
- •Install proc near
- •Заняття 8. Особливості практичного використання апаратних та програмних переривань
- •Volatile long ticks;
- •Void main(void) {
- •Void _interrupt _far timer(void) {
- •Int8 proc near cli
- •Int09 proc near
- •Розділ 3. Підсистема таймера та годинника реального часу
- •Заняття 3. Системні засоби програмного доступу до ресурсів таймера
- •Void tm_delay(int ticks) {
- •Void main (void){
- •Void main(void){
- •Заняття 4. Приклади використання функціональних можливостей таймера в прикладних задачах
- •Void main(void){ int Frac; char k;
- •Void tm_sound(int freq, int time) {
- •Void tm_delay(int ticks) {
- •Void tm_sound(int freq, int time){
- •Void main(){
- •Void main() { int I,j; clrscr();
- •Заняття 5. Архітектура та принципи функціонування годинника реального часу
Void tm_delay(int ticks) {
asm {
push si
mov si, ticks
mov ah, О
int lah
mov bx, dx
add bx, si
}
delay_loop:
asm {
int lah
cmp dx, bx
jne delay_loop
pop si
}
}
//Функція формування частоти звучання ноти
Void tm_sound(int freq, int time){
unsigned long cnt;
outp(0x43,0xb6);
cnt = (unsigned int)(1193180L / freq);
asm{
push ax
mov ax, cnt
out 0x42, al
mov al, ah
out 0x42, al
in al, 0x6
or al, 00000011b
out 0x61, al
pop ax
}
}
//Програма виконує просту мелодію
Void main(){
int і;
for (i=0 ;mary[i] != 0 ;i++)
tm_sound(mary[i] , del[i]); }
Запускайте цю програму та слухайте, як вона працює!
Для підготовки таблиць частот за нотами Вам допоможуть підручники з елементарної теорії музики та наступна таблиця, в якій наведені частоти для другої октави в герцах. Для інших октав при зниженні або підвищенні тону значення частот треба множити (при підвищенні тону) або ділити (при зниженні тону) на 2.
До |
До-дієз |
Ре |
Ре- дієз |
Мі |
Фа |
Фа-дієз |
Соль |
Соль- дієз |
Ля-дієз |
Ля |
Сі |
261,7 |
277,2 |
293,7 |
311,1 |
329,6 |
349,2 |
370,0 |
392,0 |
415,3 |
440,0 |
466,2 |
493,9 |
Генерація випадкових чисел
Останнє, що ми зробимо з таймером,— навчимося отримувати від нього випадкові числа. Для генерації випадкових чисел краще використовувати канал 2 в режимі 3. У регістр лічильника каналу ми занесемо значення, що дорівнює діапазону потрібних нам випадкових чисел. Наприклад, якщо ми запишемо в регістр число 80 та запустимо канал таймера, отримані випадкові числа будуть лежати в діапазоні від 0 до 79.
Пропонуємо для розгляду функцію rnd_set(), що призначена для початкової ініціалізації генератора випадкових чисел, в якості якого будемо використовувати лічильник другого каналу таймера:
//random.c #include <dos.h>
/* Функція rndset встановлює канал 2 таймера для використання в якості генератора випадкових чисел, параметр bound визначає верхню межу діапазону (0—bound)*/
void rnd_set(int bound) {
//Встановлюємо режим 3 для другого каналу таймера outp(0x43, 0xb6); ;
//Завантажуємо регістр лічильника таймера — спочатку молодший, далі старший байт
outp(0x42, bound & OxOOff);
outp(0x42, (bound & OxffOO) » 8);
// Дозволяємо роботу каналу outp(0x61, іпр(Охбі) І 1);
і = іпр(0х42);
і = (іпр(0х42) « 8) + і;
return(i);
Void main() { int I,j; clrscr();
rnd_set(100); //Задаємо діапазон чисел ( 0 - bond = 100) for (i=l;i<40;i++) { //Задаємо кількість //випадкових чисел
printf(« % d»,rnd_getO); //Видаємо числа на екран getchar();
Функцію ініціалізації rnd_set() каналу 2 таймера використовуємо для формування заданої кількості псевдо-випадкових чисел у заданому діапазоні з виводом їх на екран дисплея.
//randoml.c #include <dos.h>
//Функція rnd_set з попереднього прикладу "random.с" void rnd_set(int bound) { outp(0x43, 0xb6); outp(0x42, bound & OxOOff); outp(0x42, (bound & OxffOO) » 8); outp(0x61, іпр(Охбі) | 1);
/*Функція rndget формує та видає на екран послідовність
випадкових чисел у діапазоні (0-bond)*/ int rnd_get(void) { int і;
//Видаємо команду CLC для заскакування поточного //значення регістра каналу 2 таймера outp(0x43, 0x86);
//Читаємо молодший та старший байти лічильника
Розглянена програма формування послідовностей випадкових чисел може бути використана при моделюванні багатьох випадкових процесів та функцій.
Практикум Лабораторна робота 2
Тема роботи
Використання функціональних можливостей таймера для генерації звукових сигналів, відтворення музики та формування послідовності випадкових чисел.
Мета роботи
Навчитись розробляти алгоритми програм, що відтворюють звукові сигнали.
Зрозуміти та засвоїти принципи розробки про грамних модулів, що відтворюють звуки.
Дослідити програми, що відтворюють фрагменти музичних творів та навчитись їх розробляти.
Навчитись розробляти алгоритми програм, що фор мують послідовності випадкових чисел.
Зрозуміти та засвоїти принципи розробки про грамних модулів, що формують послідовності випадкових чисел.
Дослідити програми, що формують послідовності псевдовипадкових чисел та навчитись їх розробляти.
Вимоги
Для виконання роботи потрібні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування таймера, а також знання та навички програмування каналів таймера та портів 60h та 61h.
На вінчестері комп'ютера повинне бути встановлене середовище програмування Borland C++ V3.01 у каталозі ВС.
Вправа 1
Дослідіть програму Ьір.с, що формує звукові сигнали пропорційні скен-коду натисненої клавіші клавіатури. Визначіть, у якому режимі працює канал 2 таймера.
За текстом програми нарисуйте схему алгоритму.
На вінчестері створіть каталог TIME.
За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог TIME.
Виконайте настройку програми та запустіть її на виконання.
Змініть коефіцієнт пропорційності k спочатку в більший, а далі в менший бік та виконайте пункт 5. Зробіть висновки про Ваші спостереження та розробіть пропозиції з перетворення клавіатури ПК у клавіатуру ФОНО.
Вправа 2
Вивчіть структуру програми (tm_sound) формування частоти та тривалості звуку, що видається на динамік. Виясніть, які функціональні можливості таймера вико ристовуються та якими засобами реалізовано керування три валістю звучання? З якою точністю задається тривалість?
Дослідіть програму (melodyl.c) та відновіть схему алгоритму. Вкажіть місця програми, які треба змінити для програвання іншої мелодії.
За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог TIME.
Виконайте настройку програми та запустіть її на виконання.
5. Змініть програму так, щоб можна було точніше фор мувати тривалості нот. Виконайте пункти 3 та 4. Зробіть висновки про результати Ваших експериментів.
6. Найбільш допитливим пропонується розробити пропозиції по реалізації програмним способом багатоголо сих музичних творів.
Вправа З
Вивчіть та дослідіть структуру програми randoml.c, що призначена для формування послідовності псевдовипад- кових чисел у заданому діапазоні уявлення.
Відновіть схему алгоритму програми, в якій виділіть модуль ініціалізації таймера, задання діапазону уявлення та кількості чисел, а також модуль друку результату.
Для більшої наочності зображення псевдовипад- кових чисел змініть програму так, щоб числа відображу вались на екрані у вигляді стовпчастої діаграми.
Розробіть програму, в якій діапазон зображення чисел можна було б задавати з екрана дисплея в діалоговому режимі.
Найвідчайдушніші і ті, що намагаються опанувати «вищий пілотаж» керування таймером спробуйте об'єднати можливості програми melodyl.c та randoml.c для формування «космічної» мелодії з випадковою частотою послідовності нот та випадковою їх тривалістю. Рекомендація: обмежтесь частотою в межах трьох октав та тривалістю нот від 1 цілої до 1/16.
Питання для самоконтролю знань
Чому часові затримки, сформовані з використанням таймера, не залежать від продуктивності комп'ютера?
Який порт використовується для керуванням лі чильником таймера та видавання сигналів на динамік?
Який розряд порту 61h дозволяє рахунок каналу 2 таймера?
4. Який розряд порту 61h дозволяє проходження вихідного сигналу OUT 2 на динамік?
5. З якою точністю визначається тривалість ноти в роз глянених прикладах програм?. Назвіть переривання BIOS та його функцію, яка дозволяє зчитувати показники лічильника каналу 0 таймера.
Вкажіть модуль формування затримки для керування тривалістю ноти в програмі, що виконує просту мелодію. Що треба змінити в цій програмі, щоб виконувати іншу мелодію?
У програмі формування послідовності випадкових чисел вкажіть модуль ініціалізації каналу таймера, роз шифруйте режим.
Резюме
Таймер використовується для формування часових інтервалів, що не залежать від продуктивності комп'ютера; видавання звукових сигналів; відтворення музики; формування послідовності псевдовипадкових чисел.
Для формування частоти звучання ноти необхідно в лічильник каналу 2 таймера записати відповідний коефіцієнт перерахунку. Перед цим необхідно заборонити видавання сигналу на динамік. Тривалість звучання ноти формується модулем підрахунку тіків каналу 0. Керування видаванням сигналів на динамік здійснюється бітами 0 та 1 порту 61h.
Таймер використовується в прикладних програмах для формування послідовності випадкових чисел у заданому діапазоні. З цією метою краще використовувати канал 2 в режимі 3.
Ваш наступний крок
Тепер, коли Ви вивчили принципи організації, функціонування і програмного керування підсистемою таймера, Вам значно легше буде розібратись із можливостями ще однієї підсистеми служби часу комп'ютера — годинником реального часу. Ця підсистема не менш важлива та цікава в розумінні використання її можливостей у прикладних програмах.
До вивчення підсистеми годинника реального часу Ви приступите у наступному занятті.