- •Передмова
- •Intel 430lx
- •Intel 430nx
- •Intel 430fx
- •Intel 430hx
- •Intel 430vx
- •Intel 430tx
- •Intel 440lx agPset
- •Intel 440ex
- •Intel 440bx agPset
- •Intel 450gx/kx
- •Intel 440fx
- •Заняття 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 main(void){ int Frac; char k;
clrscr(); //Очищення екрана
printf("\nНатискайтеe клавіші та слухайте звуки!!!." "\nДля завершення роботи натисніть — Esc" "\n");
while ((c=getch()) != 27) { //27 = ESC — вихід з програми Frac = k * 100; //встановлюємо коеф. рахунку //(ASCII-код символу * 100 //для формування частоти звуку
}
}
Одним із найбільш розповсюджених застосувань таймера є відтворення музики. Таймер дозволяє відтворювати музику у фоновому режимі, тобто під час роботи програми може лунати музика.
Мелодія (одноголоса), як відомо, складається з нот, розділених або нерозділених паузами. При звучанні мелодії необхідно для кожної ноти програмувати відповідним чином канал 2 таймера та вмикати гучномовець (за допомогою порту 61h) на визначений час, що дорівнює тривалості ноти. Далі програма повинна вимкнути динамік та витримати паузу, якщо необхідно перед звучанням наступної ноти.
Основна ідея полягає у використанні функції 00h переривання lAh, яка дозволяє зчитувати показники лічильника каналу 0 і на підставі цих показників Ваша програма формує затримку, що дорівнює тривалості ноти, вибраної з масиву, який містить мелодію. Частоту звучання ноти задає канал 2 таймера. Коефіцієнти перерахунку задаються в масиві частот.
Перевага використання таймера для звучання мелодії — незалежність констант, що використовуються для програмування каналу таймера від продуктивності системи, але за умови, що Ви будете використовувати таймер і для організації затримок при виконанні мелодії.
Для визначення значення, яке повинне бути записане в регістр-лічильник каналу 2 таймера, треба розділити 1193180 на потрібну частоту в герцах.
Розглянемо функцію, призначену для генерації на гучномовці тону заданої частоти та тривалості:
#include <stdio.h>
#include <conio.h>
Void tm_sound(int freq, int time) {
int cnt, i;
//Задаємо режим каналу 2 таймера
out(0x43, 0xb6);
//Обчислюємо затримку для завантаження в регістр //лічильника таймера
cnt = 1193180L / freq;
asm{
//Завантажуємо регістр лічильника таймера — спо-//чатку молодший, далі старший байт
push ax
mov ax, cnt
out 0x42, al
mov al, ah
out 0x42, al
//Вмикаємо гучномовець. Сигнал з виходу OUT 2 кана-//лу 2 таймера тепер буде проходити на вхід гучномовця.
in al, 0x61
or al, 00000011b
out
POP
0x61, al ax
}
//Виконуємо затримку (див. заняття 3)
tm_delay(time);
//Вимикаємо гучномовець asm{
push ax
in al, 0x61
and al, 11111100b
out 0x61, al
pop ax
}
Якщо підготувати для цієї функції таблиці частот та тривалостей, то можна з її допомогою виконувати прості мелодії. У наступному прикладі ми так і зробили:
//melodyl.c #include <dos.h>
//Масив частот для мелодії (ноти) int mary[] ={
330, 294, 262, 294, 330, 330, 330,
294, 294, 294, 330, 392, 392,
330, 294, 262, 294, 330, 330, 330, 330,
294, 294, 330, 294, 262, 0
}
//Масив тривалостей нот
int del[] ={
5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 5, 10,
5 5 5 5 5 5 5
5, 5, 5, 5, 20
//Затримка для формування тривалості звучання ноти
