
- •Програмування послідовного інтерфейсу
- •Затверджено на засіданні кафедри
- •Рецензент Каркульовський в.І., канд. Техн.Наук.,доц.
- •Мета роботи
- •Короткі теоретичні відомості
- •2.1. Доступ до послідовного порту
- •2.2. Програмування мікросхеми uart 8250
- •2.3. Ініціалізація послідовного порту
- •2.4. Установка поточного комунікаційного порту
- •2.5. Визначення статусу комунікаційного порту
- •2.6. Ініціалізація і управління модемом
- •2.7. Передача даних
- •2.8. Отримання даних
- •2.9. Посилка/отримання даних за допомогою комунікаційного переривання
- •Контрольні запитання
- •Лабораторне завдання
- •Оформлення звіту
- •6. Лiтература
2.3. Ініціалізація послідовного порту
При ініціалізації ( "відкритті") порту комунікації встановлюються всі його параметри. Ці параметри включають в себе довжину слова, число стоп-бітів, установку парності і швидкість обміну. Довжина слова - це число бітів, яке утворює основну одиницю даних. Хоч зазвичай працюють з порціями по 8 біт, але для стандартних файлів ASCII (в яких всі символи мають коди, що не перевищують ASCII 128) досить 7 біт, а для передачі числових даних - всього 4 біт.
Середній рівень
Функція 0 переривання 14Н BIOS ініціалізує порт комунікації. У DX повинен знаходитися номер комунікаційного каналу (COM1 = 0, COM2 = 1). У AL повинен міститися байт, що ініціалізує дані, значення бітів якого може бути наступним:
біти 1-0 довжина слова. 10 = 7 біт, 11 = 8 біт
2 число стоп-бітів. 0 = 1, 1 =2
4-3 парність. 00 або 10 = немає, 01 = непарн., 11 = парн.
7-5 швидкість обміну.
000 = 110 бод
001 = 150 бод
010 = 300 бод
011 = 600 бод
100 = 1200 бод
101 = 2400 бод
110 = 4800 бод
111 = 9600 бод
У даному прикладі порт ініціалізується зі словом, рівним 8 бітам, одним стоп-бітом і парною парністю. Швидкість обміну -1200 бод.
; присвоюємо значення параметрів змінним
MOV WORDLENGTH,00000011В ;довжина слова 8 біт
MOV STOPBITS, 00000000B ;1 стоп-біт
MOV PARITY, 00011000В ;парна парність
MOV BAUDRATE,10000000В ;швидкість 1200 бод
;ініціалізувати СОМ1
MOV AL,0 ;очищаємо AL
OR AL,WORDLENGTH ;встановлюємо потрібні біти
OR AL,STOPBITS
OR AL,PARITY
OR AL,BAUDRATE
MOV AH, 0 ;функція ініціалізації порту
MOV DX, 0 ;вибераємо СОМ1
INT 14H ;ініціалізувати порт
Низький рівень
Незалежно від того, займаємося ми вводом або виводом, як мінімум, 4 регістри мікросхеми 8250 повинні бути ініціалізованими для операцій обміну. Це регістри дільника швидкості обміну, регістр контролю лінії і регістр дозволу переривання.
Ініціалізація швидкості обміну. Дільник швидкості обміну – це число, на яке треба розділити частоту системних годин (1190000 Гц), щоб отримати бажану швидкість обміну. Наприклад, для швидкості обміну 1200 бод дільник швидкості обміну повинен бути рівний 96, оскільки 1190000/96 приблизно дорівнює 1200. Чим більший дільник, тим менша швидкість обміну. Швидкість обміну 300 бод і менше вимагає двобайтового числа для дільника. Старший байт посилається в 3F9H (або 2F9H), а молодший - в 3F8H (2F8H). У обох випадках біт 7 регістра управління лінії повинен бути встановлений в 1 перед засиланням значення, в іншому випадку за цими двома адресами значення будуть адресовані в інші регістри . Ось деякі значення, необхідні для звичайних швидкостей обміну:
Швидкість обміну |
3F9H |
3F8H |
110 |
04H |
17H |
300 |
01H |
80H |
600 |
00H |
C0H |
1200 |
00H |
60H |
1800 |
00H |
40H |
2400 |
00H |
30H |
3600 |
00H |
20H |
4800 |
00H |
18H |
9600 |
00H |
0CH |
Завжди встановлюйте регістри швидкості обміну першими, оскільки вони єдині, які вимагають установки біта 7 в регістрі контролю лінії. Після цього треба змінити вміст регістра контролю лінії, скидаючи біт 7, щоб всі інші доступи до регістрів були правильними. Оскільки регістр контролю лінії є регістром тільки для запису, то немає способу повернути біт 7 назад в 1 без одночасної установки всіх інших бітів цього регістра. Зазначимо, що PCjr використовує інших дільників, опис яких ви можете знайти в технічному керівництві.
Ініціалізація регістра контролю лінії. Значення бітів регістра контролю лінії, адреса порту якого рівна 3FBH (або 2FBH), можуть бути наступними:
бити 1-0 довжина символа: 00 = 5 біт, 01=6 біт, 10=7 біт, 11=8 біт
2 число стоп-бітів: 0 = 1, 1 = 1,5, якщо довжина символів рівна п'яти, інакше - 2
3 парність: 1 = генерується біт парності, 0 = немає
4 тип парності: 0 = непарна, 1 = парна
5 фіксація парності: примушує біт парності завжди бути 0 або 1.
0 = відмінена
1 = завжди 1, якщо біт 3 = 1 & біт 4=0
або 1 = завжди 0, якщо біт 3 = 1 & біт 4 = 1 або
1 = немає парності, якщо біт 3 = 0
установка перерви: Викликає виведення строки нулів як сигнал віддаленої станції.
0 = заборонено, 1 = перерва
7 міняє адреси портів інших регістрів
Зазвичай биті 5-7 скинені в 0. Інші описують значення, що визначаються протоколом обміну.
Регістр дозволу переривання. Навіть якщо ви не використовуєте переривання, все одно треба зробити запис в регістр дозволу переривання, щоб бути упевненим, що переривання заборонені. Просто вмістіть в цей регістр 0. Регистр ідентифікації переривання можна ігнорувати.
Ініціалізація інших регістрів пов'язана з модемами. Ясно, що модеми потрібні тільки для зв'язку з віддаленими пристроями, а не для управління сусідніми, такими, як послідовний принтер. У [5] пояснено, як ініціалізувати регістр контролю модему.
У наступному прикладі з області даних BIOS береться базова адреса СОМ1, після чого різні регістри ініціалізуються для швидкості обміну 1200 бод, семибітових даних, парної парності і одного стоп-біта.
;отримуємо базову адресу СОМ1
MOV AX, 40H ;ES вказує на область даних BIOS
MOV ES, AX
MOV DX, ES:[0] ;отримуємо базову адресу СОМ 1
; ініціалізувати регістри дільника швидкості обміну на 1200 бод
ADD DX, 3 ;вказуємо на регістр контролю лінії
MOV AL, 10000000В ;встановлюємо біт 7
OUT DX, AL ;посилаємо байт
DEC DX ;вказуємо на старший байт дільника
DEC DX ;швидкості обміну
MOV AL, 0 ;старший байт для 1200 бод
OUT DX, AL ;посилаємо старший байт для 1200 бод
DEC DX ;вказуємо на молодший байт дільника
MOV AL, 60H ;молодший байт дільника для 1200 бод
OUT DX, AL ;посилаємо молодший байт
;ініціалізувати регістр контролю лінії
MOV AL, 0 ;обнулюємо AL
OR AL, 10B ;довжина даних 7 біт
OR AL, 000B ;1 стоп-біт
OR AL,1000B ;генерується біт парності
OR AL,10000B ;парна парність
ADD DX, 3 ;вказуємо на регістр контролю лінії
OUT DX, AL ;посилаємо значення ініціалізації
;ініціалізувати регістр дозволу переривання
DEC DX ;вказуємо на регістр дозволу
DEC DX ;переривання
MOV AL, 0 ;забороняємо переривання
OUT DX, AL ;посилаємо байт