Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
uart.doc
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
216.58 Кб
Скачать

2.9. Посилка/отримання даних за допомогою комунікаційного переривання

Ретельно продумана комунікаційна програма має занадто багато обов'язків, щоб присвятити себе цілком введенню/виведенню. Поступаючі дані повинні аналізуватися, дані, що передаються повинні збиратися, а великі блоки даних можуть записуватися на диск або прочитуватися з нього. Комунікаційне переривання дозволяє програмі не тратити на введення/виведення більше часу, ніж він того вимагає. Наприклад, після установки переривання управління передається процедурі передачі даних тільки в тому випадку, якщо регістр зберігання передавача пустий, і повертається програмі, як тільки посланий байт даних, дозволяючи їй продовжувати свою роботу доти, поки регістр зберігання передавача не буде знов готовий.

IBM PC відводить два апаратних переривання для комунікаційних каналів, номери 3 (СОМ1) і 4 (COM2). Зазначимо, що у PCjr вбудований модем має номер 3, а СОМ1 - номер 4. Мікросхема UART 8250 допускає 4 класи переривань для кожного каналу, використовуючи наступні двійкові кодові числа:

00 зміна в регістрі статусу модему

01 регістр зберігання передавача пустий

10 отримані дані

11 помилка прийому, або отримана умова перерви

Ці коди містяться в бітах 2-1 регістра ідентифікації переривання, адреса порту якого на 2 більша, ніж базова адреса комунікаційного адаптера, що використовується. Біт 0 цього регістра встановлюється при виникненні переривання, а інші біти не використовуються і завжди рівні 0.

Щоб вибрати одне або більше переривань, треба запрограмувати регістр дозволу переривання, адреса якого на 1 більша базової адреси. Значення його бітів можуть бути такими:

біт 0 1 = переривання при отриманні даних

1 1 = переривання, коли регістр зберігання передавача пустий

2 1 = переривання при помилці прийому даних

3 1= переривання при зміні регістра статусу модему

7-4 не використовуються, завжди 0

Коли одна з цих подій відбувається, ініціюється апаратне переривання, виникаюче в мікросхемі обробки переривань 8259 по каналу 3 для СОМ1 і по каналу 4 для COM2. Процедура обробки переривань передає управління тому коду, на який вказує відповідний вектор переривання. Оскільки це апаратне переривання, то воно може бути масковане. Пам'ятайте, що процедура обробки переривання повинна завершуватися стандартним кодом виходу з апаратного переривання MOV AL, 20H/OUT 20H, AL. На рис. 2 показане комунікаційне переривання.

Одночасно можливе будь-яке число типів переривання. Але якщо дозволений більш ніж один тип, процедура обробки переривання повинна сама визначати, який з типів переривання стався, перевіряючи регістр ідентифікації переривання. Одночасно можуть відбуватися більш ніж одне переривання, тому біт 0 регістра ідентифікації повідомляє про те, що поступило ще одне переривання. Коли два або більше перериваннь поступають в один і той же момент, то вони обробляються в порядку, вказаному в приведеній нижче таблиці. Додаткові переривання повинні бути оброблені до завершення процедури обробки переривання. Умови попередніх переривань "відміняються" за допомогою дій, що пропонуються в правому стовпці наступної таблиці:

Код

Тип

Дії для сбросу

11

помилка або перерва

читання регістру статусу лінії

10

отримані дані

читання регістру приймача даних

01

передавач готовий

виведення символа в регістр зберігання передавача

00

зміна статусу модему

читання регістра статусу модему

Рис. 2. Комунікаційне переривання

Приведемо загальну форму програми, що обробляє комунікаційні переривання:

;установка вектора комунікаційного перериванні

PUSH DS ;зберігаємо DS

MOV DX,OFFSET IOIN ; DS:DX вказують на процедуру

MOV AX, SEG IOIN

MOV DS,AX

MOV AL,0BH ;номер вектора для СОМ1

MOV AH,25H ;функція зміни вектора

INT 21H ;міняємо вектор переривання

;ініціалізація регістра дозволу переривання (СОМ1)

MOV AX,40H ;DS вказує на дані BIOS

MOV DS,AX

MOV DX,DS:[0] ;отримуємо базову адресу СОМ1

INC DX ;вказуємо на регістр дозволи

MOV AL,3 ;переривань і дозволяємо переривання

OUT DX, AL ;прийому і передачі

POP DS ;відновлюємо регістр

;процедура обробки переривання - спочатку визначаємо його тип

IOIN PROC FAR

NEXIN: MOV DX, BASADR ;базова адреса

INC DX ;вказуємо на регістр ідентифікації

INC DX ;переривання

IN AL,DX ;читаємо його значення

TEST AL,10B ;це переривання передавача?

JNZ TRANSMIT ;якщо так, то на передачу

RECEIVE: ;інакше - на прийом

JMP SHORT ANOT ;перевіряємо, чи немає іншого переривання

TRANSMIT: ;починаємо процедуру передачі символа

; перед виходом перевіряємо, чи немає іншого переривання

ANOT: MOV DX, BASADR ;базова адреса

INC DX ;вказуємо на регістр ідентифікації

INC DX ;переривання

IN AL,DX ;читаємо його значення

TEST AL,1 ;перевіряємо біт 1

JNZ NEXT_INT ;якщо він встановлений, то на початок

MOV AL,20H ;иначе, код завершення апаратного

OUT 20H,AL ;перериванні

IRET

IO_INT ENDP

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]