Está en la página 1de 5

UNIVERSIDAD Técnicas Digitales II

TECNOLÓGICA Año 2004


NACIONAL
Trabajo Práctico Nro 6 Puerto Serie UART 8250 J.T.P. Ing. Steiner Guillermo.
Email:gsteiner@scdt.frc.utn.edu.ar

Trabajo Práctico Nro 6 Puerto Serie UART 8250


Introducción
La UART 8250 y un modelo mas reciente el 16550 son dispositivos de comunicación serial utilizados por la PC.
En las PC actuales las UART está incluidas dentro de un CI de propósitos más generales, pero conserva los registros
y la configuración de la antigua 16550.
Cuando se quiere realizar una comunicación con algún dispositivo u otra PC a través de la UART, se podra realizar
mediante dos vias
• Utilizar los servicios de interrupción de la BIOS o DOS como por ejemplo la Int14h
• Directamente programar la UART dado que ella se encuentra mapeada en las I/O de la PC.
A su vez, podemos atender por interrupciones el envío y recepción de bytes o mediante un polling, es decir estar
constantemente leyendo el estado del puerto para saber cuando podemos enviar un nuevo dato o recibir uno que
acaba de llegar.
El ejemplo siguiente utiliza la programación directa a la UART para evitar las restricciones que impone la BIOS
como por ejemplo la velocidad, que en la BIOS es de un máximo de 9600 baudios, además utilizamos el sistema de
polling para leer o escribir los datos.

Registros del 8250


Esta tabla muestra los registros que disponemos en el 8250 a excepción del FRC que es para el 16550.
Para poder direccionar los 12 registros u 11 (dependiendo del modelo de UART), mediante solo 3 líneas (A0-A2), se
debe hacer uso de un cuarto bit, que ya no es mas un bit de direccionamiento por hardware, sino un bit denominado
DLAB que se encuentra en el registro LCR.
Otra forma de cambiar el registro al que se accede es mediante la señal de lectura y escritura, por ejemplo vemos
que el registro 0h es el registro de recepción si lo leemos pero en cambio es el registro de transmisión si escribimos
en el.
Con estas particularidades, podemos armar el mapa de registro, agregando un nuevo bit de direccionamiento DLAB,
y diferenciando el modo de acceso ( escritura o lectura )

Offset A2 A1 A0 DLAB Modo Nom Descripción


0 0 0 0 0 R RBR Receiver Buffer Register (Registro buffer de recepción)
0 0 0 0 0 W THR Transmitter Holding Register (Registro de retención de transm.)
1 0 0 1 0 R/W IER Interrupt Enable Register (Registro de habilitación de interrup.)
0 0 0 0 1 R/W DLL Divisor Latch LSB (Divisor de velocidad, parte baja)
1 0 0 1 1 R/W DLM Divisor latch MSB (Divisor de velocidad, parte alta)
2 0 1 0 X R IIR Interrupt Identification Register (Reg.de identif.de interrup)
2 0 1 0 X W FCR FIFO Control Register(Registro de control FIFO)-SOLO 16550-0
3 0 1 1 X R/W LCR Line Control Register (Registro de control de línea)
4 1 0 0 X R/W MCR MODEM Control Register (Registro de control del modem)
5 1 0 1 X R/W LSR Line Status Register (Registro de estado de la línea)
6 1 1 0 X R/W MSR ModemStatus Register (Registro de estado del modem)
7 1 1 1 X R/W SCR Scratch Register (Registro residual)
Los registros que tienen indicado una X en DLAB, significa que pueden se accedido sin tener en cuenta el valor de
este bit.

La configuración de todos los registros, pueden ser vistos en diferentes bibliografías, aquí se detallan unicamente,
los necesarios para configurar a la UART en modo polling.

1
UNIVERSIDAD Técnicas Digitales II
TECNOLÓGICA Año 2004
NACIONAL
Trabajo Práctico Nro 6 Puerto Serie UART 8250 J.T.P. Ing. Steiner Guillermo.
Email:gsteiner@scdt.frc.utn.edu.ar

Registro LCR
Registro de Control de formato de carácter.
7 6 5 4 3 2 1 0
Stick
DLAB B.Ctrl EPS PEN STB WLS1 WLS0
Parity

Selección de Longitud
Bit de Stop = 0 1 bit Stop / 1 2 o 1,5
Paridad
Break Ctrl = 1 inhibe salida de SOUT
DLAB = 1 accede a divisores de latch
Selección de Longitud

WLS1 WLS0 Longitud


0 0 5 Bits
0 1 6 Bits
1 0 7 Bits
1 1 8 Bits

Paridad
1 Æ Habilita Paridad
PEN =
0 Æ No hay bit de paridad
Sick Parity = 1 Æ fuerza a el bit de paridad con el valor de EPS
1 Æ Paridad par
EPS =
0 Æ Paridad impar

Registros DLM + DLL


Selecciona la velocidad de transmisión.
Dos registro de 8 bits forman una palabra de 16 bits en la cual se carga el divisor de frecuencia para configurar la
velocidad del canal.

Ecuación para calcular DLM y DLL Tabla de DLM y DLL


frec. osc. baudios resultado hex DLM DLL
= valor para DLM y DLL 50 2304 0900h 9 0
16 x baudios 110 1047 0417h 4 23
El valor resultante se dividirá en dos bytes cargándose 150 768 0300h 3 0
el byte mas significativo en DLM y el menos 300 384 0180h 1 128
significativo en DLL. 1200 96 0060h 0 96
2400 48 0030h 0 48
Ejemplo de los valores de DLM y DLL para 9600 4800 24 0018h 0 24
baudios 9600 12 000Ch 0 12
14400 8 0008h 0 8
1843200 19200 6 0006h 0 6
= 12 DLM = 0 y DLL = 12
16 x 9600 28800 4 0004h 0 4
38400 3 0003h 0 3
57600 2 0002h 0 2
115200 1 0001h 0 1

2
UNIVERSIDAD Técnicas Digitales II
TECNOLÓGICA Año 2004
NACIONAL
Trabajo Práctico Nro 6 Puerto Serie UART 8250 J.T.P. Ing. Steiner Guillermo.
Email:gsteiner@scdt.frc.utn.edu.ar

Registro LSR
Registro de Estado de la Línea

7 6 5 4 3 2 1 0

0 TEMT THRE BI FE PE OE DR

• DR Data Ready: Hay un carácter para ser leído, una vez que se lee el dato este bit se pone de 0.
• OE Overrun Error: Llegó un nuevo carácter y sobrescribió el anterior que no había sido leído.
• PE Parity Error: Error de paridad.
• FE Framing Error: El carácter que llegó no posee los bit de stop correctos.
• BI Break Interrupt: La entrada de datos se mantiene en bajo por mas tiempo que la longitud de un
carácter.
• THRE Transmitter Holding Register Empty: se activa cuando la UART está lista para recibir un nuevo
caracter a transmitir.
• TEMT Transmitter Empty: se activa cuando ya no posee ningún bit para enviar.

Programa Ejemplo

Definición de Constantes
Para el ejemplo crearemos una constante, la misma indica donde comienza en el mapa de memoria de la PC el
direccionamiento de la UART, en este caso utilizamos el COM1 que usualmente se encuentra en la dirección 3f8h

COM1 EQU 3f8h


COM2 EQU 2f8h
COM3 EQU 3e8h
COM4 EQU 2e8h

Inicializar Puerto
Este procedimiento inicializa el puerto de comunicaciones para permitir su uso posterior.
El puerto será configurado para que transmita y reciba a 9600 baudio, 8 bits de datos, sin paridad y un bit de stop
(9600,8,N,1)

ini_puerto PROC NEAR USES ax dx

mov al,83h ; (Reg LCR)


mov dx,COM1+3 ; DLAB = 1 -> acceso a registro de velocidad
out dx,al ; WLS1,WLS0 = 11 -> 8 bits de datos
; Bit 5-3 = 000 -> sin paridad
; STB = 0 -> un bit de stop

mov al,12 ; (Reg DLL)


mov dx,COM1 ; DLL = 12 -> 9600 bits por segundo
out dx,al
xor al,al ; poner a cero al

mov dx,COM1+1 ; (Reg DLM)


out dx,al ; DLM = 0 -> 9600 bit por segundo

mov al,3 ; (Reg LCR)


mov dx,COM1+3 ; DLAB = 0 -> acceso a buffer de comunic
out dx,al ; WLS1,WLS0 = 11 -> 8 bits de datos
; Bit 5-3 = 000 -> sin paridad
; STB = 0 -> un bit de stop
ret
ini_puerto ENDP

3
UNIVERSIDAD Técnicas Digitales II
TECNOLÓGICA Año 2004
NACIONAL
Trabajo Práctico Nro 6 Puerto Serie UART 8250 J.T.P. Ing. Steiner Guillermo.
Email:gsteiner@scdt.frc.utn.edu.ar

Lectura de Puerto
Este procedimiento verifica si existe algún dato en el buffer de recepción en caso de haberlo lo lee y devuelve el
dato en AL, indicando el estado del proceso en el carry.
Carry = 0 Æ no hay dato nuevo
Carry = 1 Æ dato nuevo almacenado en AL

leer_dato PROC NEAR USES dx

mov dx,COM1+5 ; (Reg LSR)


in al,dx ; si DR=1 dato a leer
and al,1 ; si DR=0 buffer vacío
jz no_hay_dato

mov dx,COM1 ;(Reg RBR)


in al,dx ; leer RBR y guardarlo en AL
stc ; Hay dato: Puesta a uno del carry
ret
no_hay_dato:
clc ;No hay dato: Pone a cero el carry
ret
leer_dato ENDP

Escribir en el Puerto
Este procedimiento verifica si buffer de transmisión está vació, en caso de estarlo transmite el dato guardado en AL,
indicando el estado del proceso en el carry.
Carry = 0 Æ no se pudo enviar el dato
Carry = 1 Æ el dato fue enviado

enviar_dato PROC NEAR USES ax dx bx


mov bl,al
mov dx,COM1+5 ;(reg LSR)
in al,dx ;si THRE(bit 5)=1 reg. de transmisión vació
and al,20h ;si THR = 0 el reg de transm no esta libre
jz THR_ocupado

mov dx,COM1 ;(reg THR) enviar a THR lo almacenado en AL


mov al,bl
out dx,al

slc ;se envió AL: Puesta a uno del carry.


ret
THR_ocupado:
clc ;no se envió AL: Puesta a cero del carry
ret
enviar_dato ENDP

4
UNIVERSIDAD Técnicas Digitales II
TECNOLÓGICA Año 2004
NACIONAL
Trabajo Práctico Nro 6 Puerto Serie UART 8250 J.T.P. Ing. Steiner Guillermo.
Email:gsteiner@scdt.frc.utn.edu.ar

Cable null MODEM

Tabla para DB9 y DB25

Descripción U M Nom DB9 DB25


Carrier Detect Å CD 1 8
Receive Data Å RD 2 3
Transmit Data Æ TD 3 2
Signal Ground - SG 5 7
Data Terminal Ready Avisa a el MODEM que la UART esta lista Æ DTR 4 20
para conectarse.
Data Set Ready (la contraparte de DTR) Avisa a la UART que el Å DSR 6 6
MODEM esta listo para conectarse.
Request to Send esta línea informa al MODEM que la UART esta Æ RTS 7 4
lista para intercambiar datos.
Clear to Send ( la contraparte de RTS ) esta línea informa a la UART Å CTS 8 5
que el MODEM esta listo para intercambiar datos.
Ring Indicator Å RI 9 22

Conexión NULL MODEM para DB9


Opción con 5 o con solo 3 cables

1 - CD 4 - DTR 1 - CD 4 - DTR
6 - DSR 6 - DSR 6 - DSR 6 - DSR
4 - DTR 1 - CD 4 - DTR 1 - CD
2 - RD 3 - TD 2 - RD 3 - TD
3 - TD 2 - RD 3 - TD 2 - RD
5 - SG 5 - SG 5 - SG 5 - SG
7 - RTS 7 - RTS 7 - RTS 7 - RTS
8 - CTS 8 - CTS 8 - CTS 8 - CTS
9 - RI 9 - RI 9 - RI 9 - RI

Práctico a Desarrollar

Ejercicio Nro 1
Desarrollar un software que mediante un cable serial se comuniquen a otra maquina con igual software, y realice
entre ellas una comunicación de tipo chat, donde los datos ingresados desde el teclado se reproduzcan
automáticamente en la otra pantalla y viceversa, la pantalla de cada PC estará dividida en dos mitades o ventanas,
donde los datos ingresados por el teclado se mostrarán en una y en la otra se mostrarán los datos enviados por la otra
PC

También podría gustarte