
- •Мета роботи
- •Короткі теоретичні відомості
- •2.1. Зовнішні інтерфейси еом
- •2.2. Режими адаптера паралельного інтерфейсу
- •2.3. Сигнали адаптера паралельного інтерфейсу
- •2.4. Організація вводу/виводу для паралельного інтерфейсу
- •2.5. Реалізація обміну інформацією між еом за допомогою паралельного інтерфесу в режимі тетради
2.4. Організація вводу/виводу для паралельного інтерфейсу
Всі режими стандарту 1284 забезпечують організацію вводу/виводу даних з використанням “рукопотискання”. Протокол “рукопотискання” в інтерфейсі передбачає, що прийом кожної зміни сигналу керування адаптера підтверджується зміною відповідного сигналу стану контроллера і навпаки. Це дає можливість периферійним пристроям керувати часом, потрібним для виконання операції вводу/виводу (синхронізація вводу/виводу), а також формувати цикл стійкої прийомопередачі незалежно від довжини кабеля, яка впливає на час встановлення сигналів.
Реалізація “рукопотискання” забезпечується циклічним виконанням такої послідовності кроків:
Байт, що виводиться, заноситься в регістр даних адаптера.
Перевіряється стан принтера (сигнал Busy) і після встановлення сигналу “Принтер вільний” адаптером встановлюється активне значення сигналу стробу, яке дозволяє прийом нового байта даних контроллером принтера.
По закінченню прийому байта, контроллером встановлюється відповідне значення сигналу Ask (прийом байта завершений), прийом якого відтверджується адаптером скиданням активного значення сигналу стробу.
Після чого адаптер переходить до першого кроку для виводу нового байта даних.
При реалізації такого протоколу синхронний ввід/вивід здійснюється під керуванням центрального процесора, який є ініціатором обміну. При низькій швидкодії периферійних пристроїв це приводить до нераціонального використання процесорного часу (процесор простоює, очікуючи завершення роботи периферійного пристрою). Для усунення цього недоліку використовується асинхронний ввід/вивід в режимі переривання. При цьому процесор ініціює вивід першого байта і переходить до виконання якої-небудь іншої задачі (наприклад обчислення нових значень). По завершенню обробки прийнятого байта контроллер периферійного пристрою встановлює активне значення сигналу Ask, яке викликає апаратне переривання процесора. Процесор переходить у підпрограму обробки переривань і формує сигнали для виводу наступного байта. Таким чином у цьому режимі ініціатором обміну (крім першого байта) є периферійний пристрій.
2.5. Реалізація обміну інформацією між еом за допомогою паралельного інтерфесу в режимі тетради
При вирішенні багатьох задач виникає необхідність забезпечення двонаправленого обміну інформацією з використанням паралельного інтерфейсу. В даній лабораторній роботі розглядається варіант організації двонаправленого обміну між ПЕОМ з використанням паралельного інтерфейсу в режимі тетради. Для цього використовується кабельне з’єднання роз’ємів паралельного інтерфейсу у відповідності з рис.1. При передачі, байт, що виводиться заноситься потетрадно в молодші розряди регістру даних (D0-D3), а прийом тетрад забезпечується входами інтерфейсу, які забезпечують отримання слова стану (Ask, Paper,Select, Error). Передача байта здійснюється півбайтами з використаннням мультиплексування. Сигнали Strobe та Busy використовуються для керування обміном. Прийомопередача здійснюється в напівдуплексному режимі (одна ПЕОМ передає, інша приймає, а потім вони міняються). Фрагмент програми, який ілюструє можливий варіант реалізації передачі даних, приведений на рис. 2.
D7 D6 D5 D4
D3 D2 D1 D0
D3 D2 D1 D0
Ask
Paper
Select
Error
Strobe
Busy
Рис. 1. Кабельне з’єднання роз’ємів паралельного інтерфейсу для режиму тетради.
mov si,0
mov ax,40h ; занесення адреси LPT1 в регістр dx
mov es,ax
mov dx,es:[8]
c1: mov al,buf[si]
out dx,al ; занесення байта в регістр даних
inc dx
inc dx
mov al,13 ; формування строба (вивід керуючого слова)
out dx,al
dec al
out dx,al
dec dx ; ввід і аналіз слова стану
c2: in al,dx
test al,01000b
jz error
test al,80h
jz c2
inc si
dec dx
jmp c1
Рис.2. Фрагмент програми передачі даних.
LPTsend.asm:
title LPTsend
.286
sseg segment stack
db 256 dup(?)
sseg ends
dseg segment
w db ?
file db 'C:\test.txt',0
handle dw ?
fsize dw ?
csize dw 0
dseg ends
cseg segment
assume ss:sseg,cs:cseg,ds:dseg
start: jmp main
main: mov ax,dseg
mov ds,ax
call open_file
call send_size
call send_file
call close_file
mov ax,4C00h
int 21h
;---------------------------------------------------------------------
;**********************************************
open_file proc near
pusha
mov ax,3D00h
lea dx,file
int 21h
mov handle,ax
mov ax,4202h
mov bx,handle
mov cx,0
mov dx,0
int 21h
mov fsize,ax
mov ax,4200h
mov dx,cx
int 21h
popa
ret
open_file endp
;***********************************************
close_file proc near
push ax
push bx
mov ah,3Eh
mov bx,handle
int 21h
pop bx
pop ax
ret
close_file endp
;***********************************************
send_size proc near
pusha
mov ax,fsize
mov w,ah
call send_byte
mov w,al
call send_byte
popa
ret
send_size endp
;***********************************************
send_file proc near
pusha
next:
mov ah,3Fh
mov bx,handle
mov cx,1
mov dx,offset w
int 21h
call send_byte
mov bx,csize
add ax,bx
mov csize,ax
mov ax,csize
mov bx,fsize
cmp ax,bx
jz ex
jmp next
ex:
popa
ret
send_file endp
;***********************************************
send_byte proc near
;w - byte for send
pusha
call init
;----Ставимо строб 0-----
mc: inc dx
inc dx
mov ax,0
out dx,ax
;---------------ПЕРШІ 4 БІТИ--------------------
;----Встановлюємо перші 4 біти----
dec dx
dec dx
mov ah,0
mov al,w
out dx,al
;----Встановлюмо строб----
inc dx
inc dx
mov ax,13
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c1: in ax,dx
test ax,10000000b
jz c1
;----Знімаємо строб----
inc dx
mov ax,0
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c2: in ax,dx
test ax,10000000b
jnz c2
;-----------------НАСТУПНІ 4 БІТИ-------------
;----Встановлюємо наступні 4 біти----
dec dx
shr w,1
shr w,1
shr w,1
shr w,1
mov ah,0
mov al,w
out dx,al
;----Встановлюмо строб----
inc dx
inc dx
mov ax,13
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c3: in ax,dx
test ax,10000000b
jz c3
;----Знімаємо строб----
inc dx
mov ax,0
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c4: in ax,dx
test ax,10000000b
jnz c4
dec dx
popa
ret
send_byte endp
;**********************************************
init proc near
mov ax,40h
mov es,ax
mov dx,es:[8]
ret
init endp
;***********************************************
;-----------------------------------------------------------------------
cseg ends
end start
LPTget:
title LPTget
.286
sseg segment stack
db 256 dup(?)
sseg ends
dseg segment
w db ?
lpt1 dw ?
file db 'c:\test.txt',0
handle dw ?
csize dw 0
fsize dw ?
dseg ends
cseg segment
assume ss:sseg,cs:cseg,ds:dseg
start: jmp main
main:
mov ax,dseg
mov ds,ax
call init
call create_file
call get_size
call get_file
call close_file
mov ax,4c00h
int 21h
;----------------------------------------------------------------------------
;***************************************************
init proc near
push ax
push dx
mov ax,40h
mov es,ax
mov dx,es:[8]
mov lpt1,dx
pop dx
pop ax
ret
init endp
;***************************************************
create_file proc near
pusha
mov ah,5Bh
xor cx,cx
lea dx,file
int 21h
mov handle,ax
popa
ret
create_file endp
;***************************************************
get_size proc near
pusha
call get_byte
mov bh,w
call get_byte
mov bl,w
mov fsize,bx
popa
ret
get_size endp
;***************************************************
get_file proc near
pusha
next: call get_byte
mov ah,40h
mov bx,handle
mov cx,1
mov dx,offset w
int 21h
mov w,0
mov ax,csize
inc ax
mov csize,ax
mov bx,fsize
mov ax,csize
cmp ax,bx
jz ex
jmp next
ex:
popa
ret
get_file endp
;***************************************************
get_byte proc near
;w - get byte
pusha
;----Ставимо строб 0-----
mc: mov dx,lpt1
inc dx
inc dx
mov ax,0
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c1: in al,dx
test al,10000000b
jz c1
;----Зчитуємо перші 4 біти----
shr al,1
shr al,1
shr al,1
and al,1111b
mov w,al
;----Встановлюмо строб----
inc dx
mov ax,13
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c2: in ax,dx
test ax,10000000b
jnz c2
;----Знімаємо строб----
inc dx
mov ax,0
out dx,ax
;-----------------------------НАСТУПНІ 4 БІТИ-------------
;----Зациклюємося поки не отримаємо строб----
dec dx
c3: in ax,dx
test ax,10000000b
jz c3
;----Зчитуємо наступні 4 біти----
shl al,1
and al,11110000b
add w,al
;----Встановлюмо строб----
inc dx
mov ax,13
out dx,ax
;----Зациклюємося поки не отримаємо строб----
dec dx
c4: in ax,dx
test ax,10000000b
jnz c4
;----Знімаємо строб----
inc dx
mov ax,0
out dx,ax
popa
ret
get_byte endp
;***************************************************
close_file proc near
push ax
push bx
mov ah,3Eh
mov bx,handle
int 21h
pop bx
pop ax
ret
close_file endp
;***************************************************
;----------------------------------------------------------------------------
cseg ends
end start
Висновок. На цій лабораторній я ознайомився з основами організації обміну інформацією між ЕОМ і отримав практичнi навики програмування вводу-виводу через паралельний інтерфейс.