www.aeom.ho.ua
ЛАБОPАТОPНА PОБОТА №6
ТЕМА: Програмування послідовного порту передачі даних в ІВМ РС.
МЕТА: Набути навичок з програмування асинхронного адаптера, організації передачі і прийому даних за допомогою послідовного інтерфейсу.
Короткі теоретичнi вiдомостi
Послідовна передача даних означає, що дані передаються з використанням єдиної лінії. При цьому біти байта даних передається по черзі з використанням одного дроту. Для синхронізації групі бітів звичайно передує спеціальний стартовий біт, після групи бітів слідують біт перевірки на парність і один або два стопові біти. Іноді біт перевірки на парність може, бути відсутнім.
Стартовий біт сигналізує про початок передачі даних. Далі передаються біти даних, спочатку молодші, потім старші. Якщо використовується біт парності P, то передається і він. Біт парності має таке значення, щоб в пакеті бітів загальна кількість одиниць (або нулів) була парна або непарна.
В самому кінці передаються один або два стопових біти STOP, завершують передачу байта. Потім рівень лінії передачі знову встановлюється в 1 до приходу наступного стартового біта.
Використання парності, стартових і стопових бітів визначають протокол передачі даних. Очевидно, що передавач і приймач даних повинен використовувати один і той же протокол, інакше зв'язок буде неможливим.
Інша важлива характеристика - швидкість передачі даних. Вона також повинна бути однаковою для передавача і приймача.
Швидкість передачі даних звичайно вимірюється в бодах. Боди - це кількість бітів, що передаються за секунду. При цьому враховуються і старт/стопові біти, а також біт парності.
Іноді використовується інший термін – біти за секунду (bps). Тут мається на увазі ефективна швидкість передачі даних, без урахування службових бітів.
Порти асинхронного адаптера
На етапі ініціалізації системи модуль POST BIOS тестує наявні асинхронні адаптери і ініціалізує перші два. Їх базові адреси розташовуються в області даних BIOS починаючи з адреси 0000:0400h.
Перший адаптер COM1 має базову адресу 3F8h і займає діапазон адрес від 3F8h до 3FFh. Другий адаптер COM2 має базову адресу 2F8h і займає адреси 2F8h...2FFh.
Асинхронні адаптери можуть генерувати переривання:
– COM1 - IRQ4 (відповідає INT 0Ch)
– COM2 - IRQ3 (відповідає INT 0Bh)
Розглянемо призначення окремих бітів цих портів.
Порт 3F8h. Цей порт відповідає регістру передаваємих даних. Для пере-дачі в порт 3F8h необхідно записати передаваємий байт даних. Після прийому даних від зовнішнього пристрою вони можуть бути прочитані з цього порту.
Залежно від стану старшого біта управляючого слова, що виводиться в управляючий регістр з адресою 3FBh, призначення порту 3F8h може змінюватися. Якщо цей біт рівний 0, порт використовується для запису передаваємих даних. Якщо ж біт рівний 1, порт використовується для виводу значення молодшого байта дільника частоти тактового генератора. Змінюючи вміст дільника, можна змінювати швидкість передачі даних. Старший байт дільника записується в порт 3F9h.
Залежність швидкості передачі даних від значення дільника частоти представлено в наступній таблиці:
Дільник
Швидкість передачі, бод
1040
110
768
150
384
300
198
600
96
1200
48
2400
Дільник
Швидкість передачі, бод
24
4800
12
9600
6
19200
3
38400
2
57600
1
115200
Порт 3FAh. Регістр ідентифікації переривання. Прочитавши його вміст, програма може визначити причину переривання.
Формат регістра:
D7 D6 D5 D4 D3 D2 D1 D0
1 – немає переривань, що очікують обслуговування
00 – переривання по ліній стану приймача, виникає при переповненні приймача, помилках парності або формату даних або при стані “BREAK”. Скидається після читання стану лінії з порту 3FDh
01 – Дані прийняті і доступні для читання. Скидається після читання даних з потру 3FDh
10 – Буфер передавача пустий. Скидається при записі нових даних у регістр даних передавача, порт 3F8h
11 – Стан модему. Встановлюється при зміні стану вхідних ліній CTS, RI, DCD, DSR. Скидається після читання стану модему з порту 3Feh
Повинні бути рівні 0
Порт 3FCh. Регістр керування модемом. Керує станом вихідних ліній DTR, RTS, ліній, специфічних для модемів OUT1 та OUT2, ля запуску діагностики сполучених разом замкнутих вході і виході асинхронного адаптера.
Формат регістра:
D7 D6 D5 D4 D3 D2 D1 D0
Лінія DTR
Лінія RTS
Лінія OUT1 (запасна)
Лінія OUT2 (запасна)
Запуск діагностики при вході асинхронного адаптера, замкнутого на його вихід
Повинні дорівнювати 0
Порт 3FBh. Регістр керування. Доступний по записі і читанню
Формат регістра:
D7 D6 D5 D4 D3 D2 D1 D0
Довжина слова у бітах:
00 – 5 біт
01 – 6 біт
10 – 7 біт
11 – 8 біт
Кількість стопових біт:
1 – 1 біт
0 – 2 біта
Парність:
х0 – контроль на парність не використовується
01 – контроль на непарність
11 – контроль на парність
Фіксування парності. При встановленні цього біта біт парності завжди приймає значення 0 (якщо біти 3-4 рівні 11) або 1 (якщо біти 3-4 рівні 01)
Встановлення паузи. Визиває вивід строки нулів у якості сигнала “BREAK” для підключеного пристрою
1 – порти 3F8h та 3F9h використовуються для загрузки дільника частоти тактового генератора.
0 – порти використовуються як звичайно
Порт 3F9h. Порт використовується або як регістр управління перериваннями від асинхронного адаптера або (після виводу в порт 3F9h байта із встановленим в 1 старшим бітом) для виводу значення старшого байта дільника частоти тактового генератора.
В режимі регістра управління перериваннями порт має наступний формат:
D7 D6 D5 D4 D3 D2 D1 D0
1 – дозвіл переривання при готовності приймаємих даних
1 – дозвіл переривання після передачі байта (коливихідний буфер передачі пустий)
1 – дозвіл переривання при виявленні стану “BREAK” або по помилці
1 – дозвіл переривання по зміні стану вхідних ліній на роз’ємі
RS-232-C (CTS, DSR, RI, DCD)
Не використовуються, повинні бути рівні 0
Порт 3FDh. Регістр стану лінії
D7 D6 D5 D4 D3 D2 D1 D0
Дані отримані і готові для читання, скидається при читанні даних
Помилка переповнення. Був прийнятий новий байт даних, а попередній ще не був зчитаний програмою. Попередній байт втрачено
Помилка парності, скидається після читання стану лінії
Помилка синхронізації
Виявлено запит на переривання передачі “BREAK” – довгий рядок нулів
Регістр зберігання передавача пустий, у нього можна записувати новий байт для передачі
Регістр зсуву передавача пустий. Цей регістр отримує дані із регістру зберігання і перетворює їх у послідовний вид для передачі
Таймаут (пристрій не зв’язаний з комп’ютером)
Порт 3FEh. Регістр стану модему
D7 D6 D5 D4 D3 D2 D1 D0
Лінія CTS змінила стан
Лінія DSR змінила стан
Лінія RI змінила стан
Лінія DCD змінила стан
Стан лінії CTS
Стан лінії DSR
Стан лінії RI
Стан лінії DCD
Функції BIOS для обслуговування асинхронних адаптерів
COM1 і COM2
Ці функції доступні через переривання INT14h.
Перша функція призначена для ініціалізації портів асинхронного адаптера
На вході: AH = 00h;
DX = номер порту: 0 - COM1, 1 - COM2;
AL = параметри ініціалізації.
На виході: AH = Стан порту асинхронного адаптера;
AL = стан модему.
Для передачі байта використовується наступна функція:
На вході: AH = 01h;
DX = номер порту: 0 - COM1, 1 - COM2;
AL = передаваємий байт.
На виході: AL зберігається;
AH = стан порту асинхронного адаптера,
Якщо біт 7 регистру AH встановлений в 1,
Виникла помилка.
Функція 02h призначена для приймання байта:
На вході: AH = 02h;
DX = номер порту: 0 - COM1, 1 - COM2.
На виході: AL = прийнятий байт;
AH = стан порту асинхронного адаптера,
Якщо регістр AH не дорівнює 0,
Виникла помилка.
Стан порту асинхронного адаптера можна визначити за допомогою функції 03h:
На вході: AH = 03h;
DX = номер порту: 0 - COM1, 1 - COM2.
На виході: AH = стан порту асинхронного адаптера
AL = стан модему.
Ініціалізація асинхронного адаптера
Перше, що повинна зробити програма, що працює з асинхронним адаптером - встановити протокол обміну і швидкість передачі даних. Після завантаження операційної системи для асинхронних адаптерів встановлюється швидкість 2400 бод, не виконується перевірка на парність, використовуються один стоповий біт і восьмибітова довжина передаваного символу. Ви можете змінити цей режим командою MS-DOS MODE.
Виконавши введення з порту 3FBh, програма може отримати поточний режим адаптера. Для установки нового режиму змініть потрібні вам поля і запишіть новий байт режиму за адресою 3FBh.
Якщо треба задати нове значення швидкості обміну даними, перед записом байта режиму встановите старший біт цього байта в 1. Потім послідовно двома командами виводу завантажите дільник частоти тактового генератора. Молодший байт запишіть в порт 3F8h, старший - в порт 3F9h.
Перед початком роботи необхідно також ініціалізувати регістр управління перериваннями (порт 3F9h), навіть якщо у вашій програмі не використовуються переривання від асинхронного адаптера. Якщо переривання вам не потрібні, запишіть в цей порт значення 0.
На цьому ініціалізацію можна вважати закінченою.
Приклад програмування СОМ
/* налаштування поpту COM1 на pоботу */
outportb(0x3f8,0x80); /* пiдготовка до завантаження швидкостi */
outportb(0x3f8,0x60); /* швидкiсть прийому-пеpедачi в 1200 бод */
outportb(0x3f9,0x00); /* старший байт подiлювача частоти */
outportb(0x3fB,0x03); /* бiтiв даних = 8
стоп-бiтiв = 1
тип паpностi невикоpистовуеться
поpти 2F8h i 2F9h в звичайному pежимi */
outportb(0x3fC,0x00); /* модем не викоpистовуеться */
outportb(0x3f9,0x00); /* забоpона всих пеpеpивань */
do
{
/*Передавач*/
if(kbhit())
{
ch=getch();
if(ch==13) printf("\n\r"); else printf("%c",ch);
do
{
outportb(0x3F8,ch); /* занесення символу в поpт для пеpедачi */
}
while((inport(0x3FD) & 0x20)==0);
delay(100); /* затpимка, якщо буфеp пустий */
if((inport(0x3FD) & 0x10)==1)
printf("Обнаружен обрыв линии"); /* пеpевipка на обpив лiнii */
}
}
while(ch!=27); /* Вихiд з програми по натисненнi ESC */
}
/* налаштування поpту СОМ2 на pоботу */
outportb(0x2f8,0x80); /* пiдготовка до завантаження швидкостi */
outportb(0x2f8,0x60); /* швидкiсть прийому-пеpедачi в 1200 бод */
outportb(0x2f9,0x00); /* старший байт подiлювача частоти */
outportb(0x2fB,0x03); /* бiтiв даних = 8
стоп-бiтiв = 1
тип паpностi невикоpистовуеться
поpти 2F8h i 2F9h в звичайному pежимi */
outportb(0x2fC,0x00); /* модем не викоpистовуеться */
outportb(0x2f9,0x00); /* забоpона всих пеpеpивань */
do
{ /*Приймач*/
if(((inport(0x2FD))&1)!=0) /* пеpевipка на пpийнятi данi */
{
ch=inportb(0x2F8); /* читання пpийнятого бiту */
if(ch==13) printf("\n\r");
else printf("%c",ch);
outport(0x2FD,0x20); /* пiдготовка для пpийому слiдуючого символу */
}
}
while(ch!=27); /* Вихiд з програми по натисненнi ESC */
}
ЗАВДАННЯ
Розробити блок-схеми алгоритмів та програмне забезпечення (за допомогою функцій BIOS):
Програма-передавач передає через СОМ-порт рядок символів – ПІБ студента.
Програма-приймач читає з СОМ-порту отриманий від ПК1 рядок символів та виводить його на екран.
Розробити блок-схеми алгоритмів та програмне забезпечення обміну інформацією між двома ПК через СОМ-порт:
Варіант 1. З клавіатури ПК1 користувач вводить рядок символів, який передається через СОМ-порт та виводиться на екран ПК2; програми завершують роботу після введення користувачем Esc на ПК2 або о 17:00 год. на ПК1.
Варіант 2. Виведення на екран ПК2 дати виготовлення BIOS ПК1 у повному форматі (наприклад, “18 травня 2014 року”).
Варіант 3. Встановлення таймера ОС ПК1 на час, введений користувачем ПК2.
Варіант 4. Виведення на екран ПК2 системного часу ПК1 (таймера ОС) до натиснення користувачем Enter на ПК2.
Варіант 5. Програмування канала N інтервального таймера ПК1 у режимі M та з константою перерахунку C, де N, M і C вводяться користувачем ПК2.
Варіант 6. Виведення користувачу ПК1 повідомлення про те, чи співпадає системний час ПК1 з системним часом ПК2.
Варіант 7. Встановлення реального часу (RTC) ПК1 на час, введений користувачем з клавіатури ПК2.
Варіант 8. Виведення на екран ПК2 значення байтів 0-9 годинника реального часу (RTC) ПК1.
Варіант 9. Отримання через СОМ-порт та виведення на екран ПК1 вмісту текстового файлу, який зберігається на ПК2.
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ
Що таке асинхронний адаптер, яке його призначення ОбС?
Дайте визначення послідовній передачі даних. Чим вона відрізняється від паралельної?
Визначте призначення стартового, стопового бітів та біту парності.
В яких одиницях вимірюється швидкість передачі даних?
Яка базова адреса розміщення асинхронного адаптера?
Які переривання генерують асинхронні порти COM1-COM4?
Призначення порту 3F8h.
Призначення порту 3F9h.
Призначення порту 3FBh.
Які функції використовуються при роботі з асинхронним адаптером? Через яке переривання вони доступні?
Сформулюйте порядок ініціалізації послідовного адаптера.