24/05/2018, 20:32

Truy xuất trực tiếp thông qua cổng

Các cổng nối tiếp trong máy tính được đánh số là COM1, COM2, COM3, COM4 với các địa chỉ như sau: Giao tiếp nối tiếp trong máy tính sử dụng vi mạch UART với các thanh ghi cho trong bảng sau: ...

Các cổng nối tiếp trong máy tính được đánh số là COM1, COM2, COM3, COM4 với các địa chỉ như sau:

Giao tiếp nối tiếp trong máy tính sử dụng vi mạch UART với các thanh ghi cho trong bảng sau:

Các thanh ghi này có thể truy xuất trực tiếp kết hợp với địa chỉ cổng (ví dụ như thanh ghi cho phép ngắt của COM1 có địa chỉ là BACOM1 + 1 = 3F9h.

  • IIR (Interrupt Identification):

IIR xác định mức ưu tiên và nguồn gốc của yêu cầu ngắt mà UART đang chờ phục vụ. Khi cần xử lý ngắt, CPU thực hiện đọc các bit tương ứng để xác định nguồn gốc của ngắt. Định dạng của IIR như sau:

  • IER (Interrupt Enable Register):

IER cho phép hay cấm các nguyên nhân ngắt khác nhau (1: cho phép, 0: cầm ngắt)

  • MCR (Modem Control Register):

  • MSR (Modem Status Register):

  • LSR (Line Status Register):

FIE: FIFO Error - sai trong FIFO

TSRE: Transmitter Shift Register Empty - thanh ghi dịch rỗng (=1 khi đã phát 1 ký tự và bị xoá khi có 1 ký tự chuyển đến từ THR.

THRE: Transmitter Holding Register Empty (=1 khi có 1 ký tự đã chuyển từ THR -TSR và bị xoá khi CPU đưa ký tự tới THR).

BI: Break Interrupt (=1 khicó sự gián đoạn khi truyền, nghĩa là tồn tại mức logic 0 trong khoảng thời gian dài hơn khoảng thời gian truyền 1 byte và bị xoá khi CPU đọc LSR)

FE: Frame Error (=1 khi có lỗi khung truyền và bị xoá khi CPU đọc LSR) PE: Parity Error (=1 khi có lỗi parity và bị xoá khi CPU đọc LSR)

OE: Overrun Error (=1 khi có lỗi thu đè, nghĩa là CPU không đọc kịp dữ liệu làm cho quá trình ghi chồng lên RBR xảy ra và bị xoá khi CPU đọc LSR)

RxDR: Receiver Data Ready (=1 khi đã nhận 1 ký tự và đưa vào RBR và bị xoá khi CPU đọc RBR).

  • LCR (Line Control Register):

DLAB (Divisor Latch Access Bit) = 0: truy xuất RBR, THR, IER, = 1 cho phép đặt bộ chia tần trong UART để cho phép đạt tốc độ truyền mong muốn.

UART dùng dao động thạch anh với tần số 1.8432 MHz đưa qua bộ chia 16 thành tần số 115,200 Hz. Khi đó, tuỳ theo giá trị trong BRDL và BRDH, ta sẽ có tốc độ mong muốn. Ví dụ như đường truyền có tốc độ truyền 2,400 bps có giá trị chia 115,200 / 2,400 = 48d = 0030h → BRDL = 30h, BRDH = 00h.

Một số giá trị thông dụng xác định tốc độ truyền cho như sau:

SBCB (Set Break Control Bit) =1: cho phép truyền tín hiệu Break (=0) trong khoảng thời gian lớn hơn một khung

PS (Parity Select):

STB (Stop Bit) = 0: 1 bit stop, =1: 1.5 bit stop (khi dùng 5 bit dữ liệu) hay 2 bit stop (khi dùng 6, 7, 8 bit dữ liệu).

WLS (Word Length Select):

Một ví dụ khi lập trình trực tiếp trên cổng như sau:

.MODEL SMALL 

.STACK 100h .DATA 

Com1 EQU 3F8h

Com_int EQU 08h

Buffer DB 251 DUP(?)

Bufferin DB 0

Bufferout DB 0

Char DB ?

Seg_com DW ? 

Off_com DW ?

Mask_int DB ?

Msg DB 'Press any key to exit$’

.CODE 

Main PROC 

MOV AX,@DATA MOV DS,AX 

MOV AH,35h 

MOV AL,Com_int 

INT 21h

MOV Seg_com,ES   

MOV Off_com,BX

PUSH DS

MOV BX,CS

MOV DS,BX

LEA DX,Com_ISR MOV AH,35h

MOV AL,Com_int

INT 21h

POP DS

MOV DX,Com1+3 MOV AL,80h

OUT DX,AL

MOV DX,Com1

MOV AL,0Ch

OUT DX,AL

MOV DX,Com1+1

MOV AL,00h

OUT DX,AL

MOV DX,Com1+3

MOV AL,03h

OUT DX,AL

MOV DX,Com1+4

MOV AL,03h

OUT DX,AL

MOV DX,21h

IN AL,DX

MOV Mask_int,AL

AND AL,0EFh

OUT DX,AL

MOV AL,01h

MOV DX,Com1+1

OUT DX,AL

MOV AH,09h

LEA Dx,Msg

INT  21h

Lap:

MOV AH,0Bh

INT 21h

CMP AL,0FFh

JE Exit

MOV AL,bufferin

CMP AL,bufferout

JE Lap

MOV AL,buffer[bufferout] 

MOV char,AL 

INC bufferout 

MOV AL,bufferout CMP AL,251 

JNE Next 

MOV bufferout,0 Next:

MOV DL,char

MOV AH,02h

INT 21h

MOV AL,char

MOV DX,Com1

OUT DX,AL

JMP Lap

Exit:

MOV AL,Mask_int

OUT 21h,AL

MOV DX,Off_com

MOV BX,Seg_com

MOV DS,BX

MOV AH,35h

MOV AL,Com_int

INT 21h

MOV AH,4Ch

INT 21h

Main ENDP

Com_ISR PROC

MOV DX,Com1+5

IN AL,DX

AND AL,1

JZ exit_ISR

MOV DX,Com1

IN AL,DX

MOV buffer[bufferin],AL

INC bufferin

MOV AL,bufferin

CMP AL,251

JNE Exit_ISR

MOV bufferin,0

Exit_ISR:

MOV AL,20h  
;Báo cho PIC kết thúc ngắt

OUT 20h,AL

IRET 

Com_ISR ENDP

END Main
0