Ingenieria InIormatica Campus Ourense- Universidad de Vigo
Prctica 2 SOFTWARE DE COMUNICACIN ENTRE 2 PC's A TRAVS DE PUERTO SERIE
1. Objetivo:
Se plantea como objetivo la creacion de un soItware de comunicaciones entre dos PC's a traves de puerto serie, utilizandose interrupciones en recepcion, y ejecucion de programa en transmision. Para simplicidad de la practica no estableceran protocolos de control de errores.
Se estableceran dos Iases de realizacion, de Iorma que se puedan cumplir los objetivos de al menos la primera de ellas.
El soItware de comunicaciones sera un sistema de telegraIia instantanea, de Iorma que tanto en transmision como en recepcion se este ejecutando el programa, y cuando se reciba un mensaje este aparezca en una 'ventana del receptor y en otra ventana se pueda estar escribiendo lo que se desea transmitir.
2. Arquitectura del Sistema
Arquitectura de la comunicacion
REGISTRO DE INTERRUPCIONES (PIC) Registros PIC1: 0x20,0x21 Registros PIC2: 0xA0, 0xA1 UART 8250 Direccin de memoria0x3F8, 0x2F8, 0x3E8, 0x2E8 Varios registros: Puerto+0,+1,+2,+3,+4,+5,+6,+7 MEMORIA 0x0c (puntero a rutina de interrupcin IRQ3) 0x20 (datos) 0x21 (mascara) IRQ x RS232. Interfaz puerto serie RX TX RX TX
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo
- UART 8250 (Controlador de Puerto Serie)
Habitualmente se dispone de hasta 4 puertos serie (COM1-COM4) pero solo 2 interrupciones. Estos puertos serie tienen una direccion de memoria base, a la que hay que sumar el desplazamiento relativo del numero de registro a ser accedido, por ejemplo:
El puerto COM1 tiene asignada la direccion base 0x3F8, y su registro LCR esta en la direccion base 3, por tanto se accede a el en la direccion 0x3FB, como se describira mas adelante.
El 8250 dispone de 11 registros (uno mas el 16550) pero solo 3 lineas de direccion para seleccionarlos. Lo que permita distinguir unos de otros sera, aparte de las lineas de direcciones, el sentido del acceso (en lectura o escritura) y el valor de un bit de uno de los registros: el bit DLAB del registro LCR, que es el bit 7 de dicho registro.
Se puede ver la Iorma de acceso a cada uno de los 11 registros de la siguiente Iorma:
A2 A1 A0 DLAB MODO NOMBRE SIGNIFICADO 0 0 0 0 R RBR Receiver BuIIer Register (Registro buIIer de recepcion) 0 0 0 1 R/W DLL Divisor Latch LSB (Divisor de velocidad, parte baja 0 0 0 0 W THR Transmitter Holding Register (Registro de retencion de transmision 0 0 1 0 R/W IER Interrupt Enable Register (Registro de habilitacion de interrupciones) 0 0 1 1 R/W DLM Divisor latch MSB (Divisor de velocidad, parte alta) 0 1 0 X R IIR Interrupt IdentiIication Register (Registro de identiIicacion de interrupciones) 0 1 0 X W FCR FIFO Control Register (Registro de control FIFO) - SOLO 16550 - 0 1 1 X R/W LCR Line Control Register (Registro de control de linea) EL BIT 7 ES DLAB!! 1 0 0 X R/W MCR Modem Control Register (Registro de control del modem) 1 0 1 X R/W LSR Line Status Register (Registro de estado de la linea)
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo 1 1 0 X R/W MSR Modem Status Register (Registro de estado del modem) 1 1 1 X R/W SCR Scratch Register (Registro residual)
Los registros mas importantes de la UART 8250 son:
LCR (Line Control Register), Base + 3. Controla el Iormato del caracter de datos, e incluye el bit DLAB.
LSR (Line Status Register), Base + 5. Este suele ser el primer registro consultado tras una interrupcion (cuando llega un caracter DR1). Controla ciertos errores.
BRSR (Baud Rate Select Register), DLL Base+0, DLM Base+1 . Son los registros DLL (parte baja) y DLM (parte alta).
Estos dos registros de 8 bits constituyen un valor de 16 bits que sera el divisor que se aplicara a la Irecuencia base para seleccionar la velocidad a emplear. Dicha Irecuencia base (por ejemplo, 1.8432 MHz) sera dividida por 16 veces el valor almacenado aqui. Para 9600 bps, DLL0C, DLM00. RBR (Receiver Buffer Register), Base+0. BuIIer de Recepcion (cuando se lee el registro inportb-)
THR (TRansmit Buffer Register), Base+0. BuIIer de Transmision (cuando se escribe en el registro outportb-)
IER (Interrupt Enable Register), Base+1 con LDAP0. Este registro de escritura se utiliza para seleccionar que interrupciones activan INTRPT y, por consiguiente, van a ser solicitadas a la CPU. Decide que interrupciones activan el PIC (Controlador de Interrupciones). Se suele activar la interrupcion para recibir datos (IER1).
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo
Se puede ver una inicializacion habitual del puerto serie (usando el lenguaje de programacion C) en el apartado 3 'Arquitectura SoItware
DeIinir el puerto #deIine PORT1 0x3F8 Deshabilitar interrupciones (para poder conIigurar) outportb(PORT1 1, 0); ConIiguracion del puerto outportb(PORT1 3, 0x80); /* Habilita LDAP1 para conIiguracion */ outportb(PORT1 0, 0x0C); /* pone velocidad a 9600 baudios */ outportb(PORT1 1, 0x00); /* idem */ outportb(PORT1 3, 0x03); /* Deshabilita LDAP, sin paridad, 1 bit Stop, 8 bits de datos */
- PIC 8259. Controlador de Interrupciones
El PIC posee 2 registros y varios modos de operacion de los registros. Los principales registros internos del 8259 son el IRR (Interrupt Request Register), el ISR (In Service Register) y el IMR (Interrupt Mask Register). El IRR almacena todas las peticiones de interrupcion pendientes; el ISR almacena todas las interrupciones que estan siendo atendidas en un momento dado. El IMR habilita o inhibe las 8 interrupciones posibles en un PIC. La direccion base del PIC1 es 0x20 y su Iuncionamiento esta basado en palabras de comando llamadas OCW e ICW. Para programar el IMR se utiliza la palabra de comando OCW1 accesible en la direccion base 1 (0x21), y cuya programacion coincide con las lineas de interrupcion del IMR. Las lineas del PIC son activadas por los periIericos, siempre que se ponga a 1 el bit correspondiente en el registro IMR (OCW1). La Iamilia de microprocesadores 8086 provee 256 interrupciones. Estos microprocesadores disponen de una tabla vector de interrupciones de 1024 bytes, algunos los cuales se usan exclusivamente como interrupciones soItware. La tabla vector de interrupciones guarda la direccion de la rutina de servicio de interrupciones (ISR) de 4 bytes de longitud. Asi dan los 256 vectores de interrupcion (1024 / 4). INT (Hex) IRQ Uso mas comn 00 - 01 Exception Handlers - 02 Non-Maskable IRQ Non-Maskable IRQ (Parity Errors) 03 - 07 Exception Handlers - 08 Hardware IRQ0 Reloj de Sistema 09 Hardware IRQ1 Teclado 0A Hardware IRQ2 Redirected 0B Hardware IRQ3 Serial Comms. COM2/COM4 0C Hardware IRQ4 Serial Comms. COM1/COM3
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo 0D Hardware IRQ5 Reserved/Sound Card 0E Hardware IRQ6 Floppy Disk Controller 0F Hardware IRQ7 Puerto paralelo. 10 - 6F SoItware Interrupts - 70 Hardware IRQ8 Real Time Clock 71 Hardware IRQ9 Redirected IRQ2 72 Hardware IRQ10 Reserved 73 Hardware IRQ11 Reserved 74 Hardware IRQ12 PS/2 Mouse 75 Hardware IRQ13 Math's Co-Processor 76 Hardware IRQ14 Hard Disk Drive 77 Hardware IRQ15 Reserved 78 - FF SoItware Interrupts -
El Programmable Interrupt Controller (PIC) maneja las interrupciones hardware. La mayoria de los PC's suele tener 2 PIC's para manejar las 15 interrupciones hardware. Cada uno de estos PIC's gestiona las interrupciones de 8 dispositivos hardware, uno gestiona las IRQ's 0-7 y el otro 8-15.
Conexiones de cable.
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo
3. Arquitectura Software
INICIALIZACIN DE INTERRUPCIONES INICIALIZACIN DE PUERTO CUERPO DE PROGRAMA RESTAURACIN DE VALORES ANTERIORES RUTINA DE INTERRUPCIN DE PUERTO SERIE
Una inicializacion habitual del puerto serie (usando el lenguaje de programacion C) seria la siguiente (repasar el apartado 2 'Arquitectura del Sistema reIerido a la UART8250):
a) DeIinir el puerto =define PORT1 0x3F8
b) Deshabilitar interrupciones (para poder conIigurar) outportb(PORT1 1, 0),
c) ConIiguracion del puerto outportb(PORT1 3, 0x80), /* Habilita LDAP1 para configuracion */ outportb(PORT1 0, 0x0C), /* pone velocidad a 9600 baudios */ outportb(PORT1 1, 0x00), /* idem */ outportb(PORT1 3, 0x03), /* Deshabilita LDAP, sin paridad, 1 bit Stop, 8 bits de datos */
Para la programacion de las interrupciones, sera necesario deIinir una Rutina de Servicio de Interrupciones (ISR) y llevar el primer puntero de la rutina a la direccion de memoria del vector de
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo interrupcion correspondiente, asi, se puede entender el siguiente codigo ejemplo comentado: #define INTVECT 0x0C /* IRQ del puerto COM */
void interrupt (*oldport1isr)(); void interrupt PORT1INT() /* Rutina de Servicio de Interr. (ISR) para PORT1 */ {
..... /* Cuerpo de la Rutina ISR */ outportb(0x20,0x20); /* Devuelve el control de la CPU al cuerpo del programa principal en el punto en que se estaba ejecutando cuando se ejecut la interrupcin. */
}
void main(void) { oldport1isr = getvect(INTVECT); /* Salva el anterior vector de int. */ setvect(INTVECT, PORT1INT);/* Habilita nuevo Vector de interrupciones */
........ /* Cuerpo 1 del programa (Configuracin comunicaciones serie)*/
Familiarizacion con el entorno Borland TC. Realizacion de un programa de conIiguracion del puerto serie, asi como de visualizacion de los parametros de control del puerto (registros). Realizacion de un programa de comunicacion transmisor y otro receptor entre los dos ordenadores, que incluya la posibilidad de conIiguracion del puerto serie, transmitiendo por uno de ellos en modo programa y recibiendo el otro por interrupcion. Para ello se utilizara el programa ejemplo que se incluye en el directorio C:\comp\ara\prac2\ejemara1.c
Para usuarios avanzados, se propone una segunda Iase.
- Segunda Fase:
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo Realizacion de la interIaz de presentacion de la conversacion. Esta se puede plantear de la siguiente Iorma:
Una ventana MSDOS para la recepcion de los mensajes (o caracteres) entrantes. Una ventana MSDOS activa para la escritura y transmision de los mensajes (o caracteres) salientes.
Para ello se utilizara el programa ejemplo que se incluye en el directorio C:\comp\ara\prac2\ejemara2.c
Arquitecturas Avanzadas Curso 2006-2007 Ingenieria InIormatica Campus Ourense- Universidad de Vigo
Se resalta la necesidad de manejar las Iunciones siguientes como corazon del programa y control sobre registros y rutinas de interrupcion.
setvect() : Iuncion que pone un vector de interrupcion apuntando a una direccion dada. getvect() : lee el vector de interrupcion inportb(): lee un registro outportb(): escribe en un registro.