19
1 DIRECCIÓN GENERAL DE EDUCACIÓN SUPERIOR TECNOLÓGICA INSTITUTO TECNOLÓGICO DE HUEJUTLA CLAVE: 13DIT0006L LENGUAJES DE INTERFAZ INVESTIGACION Alumno: JOSE LUIS VITE PEREZ ELMER HERNANDEZ BAUTISTA ENRIQUE BAUTISTA AZUARA Semestre y Grupo VBCarrera Ingeniería en Sistemas Computacionales Docente Ing. Faustino Peraza Rodríguez Ciclo Escolar Enero Junio 2012 SECRETARÍA DE EDUCACIÓN PÚBLICA Carretera Huejutla-Chalahuiyapa Km. 5.5 Huejutla, Hgo.

Jose Luis Vite

Embed Size (px)

Citation preview

Page 1: Jose Luis Vite

1

DIRECCIÓN GENERAL DE EDUCACIÓN SUPERIOR TECNOLÓGICA

INSTITUTO TECNOLÓGICO DE HUEJUTLA CLAVE: 13DIT0006L

LENGUAJES DE INTERFAZ INVESTIGACION

Alumno:

JOSE LUIS VITE PEREZ

ELMER HERNANDEZ BAUTISTA ENRIQUE BAUTISTA AZUARA

Semestre y Grupo

V“B”

Carrera Ingeniería en Sistemas Computacionales

Docente

Ing. Faustino Peraza Rodríguez

Ciclo Escolar Enero – Junio 2012

SECRETARÍA DE EDUCACIÓN PÚBLICA

Carretera Huejutla-Chalahuiyapa Km. 5.5 Huejutla, Hgo.

Page 2: Jose Luis Vite

2

INDICE

Instrucción Int 14h……………………………….....................3 Instrucción int x86 en lenguaje c……………………………...6 Interfaz rs232…………………………………………………..12 Configuración de pines en db9 para puerto serie………….17

Page 3: Jose Luis Vite

3

INSTRUCCIÓN INT 14H En lenguaje ensamblador, se puede acudir a la interrupción 14H de la ROM-BIOS para configurar, leer, escribir o simplemente para conocer el estado del puerto; cada una de estas cuatro opciones es un servicio de la interrupción, y se seleccionan a través del registro AH. La figura 1 muestra los valores que debe contener el registro AH para invocar cada uno de los servicios. En todos los casos, el registro DX debe contener el número del

puerto serie; el primero de ellos, COM1 se especifica como 00h.

Servicio Descripción

00 Inicializar puerto serie

01 Enviar un dato

02 Recibir un dato

03 Obtener el estado del puerto

figura 1.Servicios para el puerto serial disponibles a través de la interrupción 14H

Para configurar o inicializar el puerto serie, bastará con utilizar el servicio 00 de la interrupción, colocando en el registro AL los valores equivalentes a los parámetros, como se puede observar en la figura 2. Con éste método es posible obtener frecuencias de transmisión que van desde los 110 hasta los 9600 baudios.

figura 2

Para enviar un dato por el puerto serial, bastará con colocar en el registro AH el valor 01 correspondiente a este servicio y en el registro AL el dato a ser enviado, invocando de nuevo la interrupción 14H. La lectura de un dato que ha llegado al puerto se logra con el servicio 02, el cual devuelve en el registro AL el dato. La lectura del estado del puerto se consigue a través del servicio 03 de esta misma interrupción, y retorna en el registro AX el

Page 4: Jose Luis Vite

4

estado del puerto, el cual contendrá los bits que se muestran en la figura 3.

figura 3

FUNCIÓN 0

La función 0 (AH=00h) de la interrupción 14 (INT 14h) nos servirá para configurar el puerto. La configuración cambiará en función del ratón que vayamos a emplear. Para realizar dicha configuración, el registro AL estará formado por pequeños grupos de bits, cada uno de los cuales indicará una característica configurable del ratón. Vamos a mostrarlo a continuación, para que se entienda mejor lo que acabamos de explicar: • Bits nº 0 y 1: Estos bits son los encargados de indicar el tamaño de la palabra, pudiendo elegir entre 8 bits (bit 0, bit 1 = 11) y 7 bits (bit 0, bit 1 = 10). • Bit nº 2: Este bit indica el número de stop bits que utiliza la interfaz RS232. Puede tratarse de 1 stop bit (bit 2= 0) o de 2 stop bits (bit 2= 1). • Bits nº 3 y 4: Son los encargados de indicar la paridad. Éstas son las posibles opciones: o Paridad nula Æ (bit 4 bit 3 = 00, bit 4 bit 3 = 10) o Paridad par Æ (bit 4 bit 3 = 11) o Paridad impar Æ (bit 4 bit 3 = 01). • Bits nº 5, 6 y 7: Por último, estos bits son los encargados de indicar la velocidad de transferencia del ratón conectado a la interfaz RS232. Las distintas opciones son: o 110 baudios Æ (bit 5 bit 6 bit 7 = 000) o 150 baudios Æ (bit 5 bit 6 bit 7 = 001) o 300 baudios Æ (bit 5 bit 6 bit 7 = 010) o 600 baudios Æ (bit 5 bit 6 bit 7 = 011) o 1200 baudios Æ (bit 5 bit 6 bit 7 = 100) o 2400 baudios Æ (bit 5 bit 6 bit 7 = 101) o 4800 baudios Æ (bit 5 bit 6 bit 7 = 110) o 9600 baudios Æ (bit 5 bit 6 bit 7 = 111) Esta función (la función 0) devuelve en el registro AH el estado del puerto, y en el registro AL el estado del módem (esto último no nos incumbe).

FUNCIÓN 2 La función 2 (AH= 02h) de la interrupción 14 (INT 14h) sirve para leer del puerto serie los datos recibidos. Estos datos deberemos tratarlos para saber en todo momento que acción realiza el usuario y así poder empezar a tratar los bytes de información correspondientes al ratón.

Page 5: Jose Luis Vite

5

Como ya ocurriera con otras funciones, previa a la llamada de la interrupción 14 (INT 14h) en el registro DX se ha de especificar el puerto al que está conectado el periférico (el ratón). Tras la llamada, la función 2 devuelve en el registro AX datos muy importantes de cara al desarrollo de la práctica. Por un lado, en el registro AH devuelve el estado del puerto, distinguiendo si se produjo algún envío de datos (en cuyo caso el bit más significativo estará a 0) o si por el contrario no se produjo envío ninguno, por lo que dicho bit contendrá un 1. Esto nos será de gran utilidad para saber en que momento el usuario está operando con el ratón. Por su parte, en caso de que se produjese algún envío de datos (un 0 en el bit más significativo del registro AH), en el regisro AL se almacenará el byte de información recibido. Una cosa importante a resaltar es el hecho de que el periférico en realidad no manda toda su información en un byte, sino que lo hace en paquetes de 3 bytes (incluso de hasta 4 bytes), y la función 2 (AH= 02h) de la interrupción 14 (INT 14h) sólo nos permite leer un byte. Es por eso por lo que se deberá llamar a esta función tantas veces como haga falta para poder descifrar los bytes enviados por el periférico y saber si se está realizando una acción u otra.

FUNCIÓN 5 La función 5 (AH= 05h) de la interrupción 14 (INT 14h) sirve para activar el “lazo de prueba”, el cual nos permitirá conectar el ratón al puerto serie sin necesidad de modificar el cable. La modificación de dicho cable no es necesaria porque el lazo de prueba conecta el controlador con el periférico. Por otro lado, antes de llamar a la interrupción 14 (INT 14h), debemos especificar si deseamos escribir o leer en el registro de control del puerto. En nuestro caso, deseamos realizar una escritura, por lo que deberemos establecer AL con el valor 01h (por lo que el valor 00h se refiere lógicamente a una operación de lectura). A su vez, el registro DX deberá contener el puerto al que está conectado el ratón. Para poner en marcha el lazo de prueba, deberemos activar en el registro BL el cuarto bit, que es el encargado de activar dicho lazo de prueba. Los demás bits no tienen importancia para el desarrollo de la práctica, por lo que no haremos ningún comentario al respecto. La función 5 (AH= 05h) de la interrupción 14 (INT 14h) devuelve en el registro AH el estado del puerto y en el registro BL el la información del registro de control del controlador RS232. Además devuelve en el registro AL el estado del módem (pero esto no nos atañe).

Page 6: Jose Luis Vite

6

INSTRUCCIÓN INT X86 EN LENGUAJE C

INT (instrucción x86)

INT es un lenguaje ensamblador de instrucciones x86 procesadores que genera una interrupción de software . Se necesita el número de interrupción formato de byte de valor. Cuando está escrito en lenguaje ensamblador, la instrucción se escribe así: INT X

donde X es la interrupción de software que debe ser generada (0-255). Dependiendo del contexto, compilador o ensamblador, un número de interrupción software se da a menudo como un hexadecimal valor, a veces con un prefijo 0x o el sufijo h . Por ejemplo, la INT 21H va a generar la interrupción de software 0x21 (33 en decimal), haciendo que la función a la que apunta el vector 34a en la tabla de interrupciones para ser ejecutado, que es típicamente un MS-DOS API llamada.

Uno de los problemas más comunes que se encuentran en los programas escritos para

x86 es suposiciones sobre el tamaño del puntero y los tipos enteros. Por lo general esto

lleva al truncamiento, un común C + + error tiene el siguiente aspecto:

str = string get_some_string (); unsigned int = delimPos str.find (':'); if (delimPos! = string :: npos) handle_delimiter (str);

Sin embargo, desde un entero sin signo abarca una gama más pequeña de string ::

size_type , string :: npos se trunca para ajustarse, y el condicional se ejecuta siempre.

En realidad, con la int sin signo anterior es sólo una mala práctica y debe evitarse en favor

del tipo adecuado proporcionado por la biblioteca estándar, string :: size_type . Este tipo

de errores se deslizan fácilmente por un sistema de 32-bit sin embargo donde suelen

tener unsigned int == string :: size_type . Por suerte, son fácilmente encontrados por un

compilador - estudiar cuidadosamente sus advertencias del compilador - son por lo

general hay una razón!

Punteros

Un grupo de más desagradables errores se producen porque el tamaño del puntero en un

sistema de 64-bit es naturalmente 64 bits de ancho. Cualquier código que está haciendo

horribles cosas de bajo nivel relacionados con punteros a enteros de fundición probable

que se rompa de una manera bastante desagradable.

Los tamaños de los tipos, para el registro

La pieza trivial de código C + + aquí se muestran los tamaños correspondientes de varios

tipos. Para un sistema de 64-bit amd64 con g+ +, tengo el siguiente:

Page 7: Jose Luis Vite

7

$. / Test_data_sizes Tipos de enteros: sizeof (char) = 1 sizeof (short) = 2 sizeof (int) = 4 sizeof (long) = 8 sizeof (long long) = 8 Punteros: sizeof (void *) = 8 Tipos de punto flotante: sizeof (float) = 4 sizeof (double) = 8 sizeof (long double) = 16 Medidas desde stddef.h: sizeof (size_t) = 8 sizeof (ptrdiff_t) = 8

Por otro lado, cuando se compila con g+ + en un sistema de 32-bit (i686), obtenemos lo

siguiente:

$. / Test_data_sizes Tipos de enteros: sizeof (char) = 1 sizeof (short) = 2 sizeof (int) = 4 sizeof (long) = 4 sizeof (long long) = 8 Punteros: sizeof (void *) = 4 Tipos de punto flotante: sizeof (float) = 4 sizeof (double) = 8 sizeof (long double) = 12 Medidas desde stddef.h: sizeof (size_t) = 4 sizeof (ptrdiff_t) = 4

De particular relevancia, los tamaños de la larga, void * y tipos de stddef.h son

diferentes. Tenga en cuenta que estos resultados también pueden depender

del compilador, y no sólo de la arquitectura. Me han dicho que VC + + se diferencia de +

g+ en relación con el sizeof (long).

Page 8: Jose Luis Vite

8

Este pequeño ejercicio de lenguaje ensamblador es para la arquitectura x86 (Procesadores Intel y Amd 32 bits) y utiliza la sintaxis de Nasm, un ensamblador libre, gratuito y que puede ser utilizado en diferentes plataformas como Windows o Linux. Además, las funciones externas utilizadas provienen de la biblioteca de C estándar. Por lo tanto, no tendrás problemas con tu equipo para realizar este ejercicio: éste no depende del sistema operativo utilizado. Únicamente depende de la arquitectura x86. Nota: Para utilizar nasm con el propósito de probar este ejercicio, puedes consultar el tutorial de uso e instalación de nasm para Windows y Linux haciendo clic aquí

Nociones tratadas en este ejercicio

Las funciones con parámetro de entrada

Los saltos

La pila

Las cadenas de caracteres

Enunciado

El objetivo es el de escribir una función en ensamblador capaz de invertir una cadena de Caracteres. Esta función deberá aceptar como parámetro de entrada un puntero hacia una cadena de caracteres e invertir esta cadena en el mismo puntero. Esto es lo que daría esta función en C:

void invertir_cadena(char *str); //El modelo de esta función

//Ejemplo de uso:

char string[] = "Esta es la cadena a invertir";

invertir_cadena(string);

printf(string); //Mostrará "ritrevni a anedac al se atsE" Deberás insertar este código aquí:

extern printf

section .data

cadena db 'Invierteme! Yo te dire que programador eres!', 0x0

section .text

global main, invertir_cadena

invertir_cadena:

;Pon el código aquí

Page 9: Jose Luis Vite

9

main:

mov eax, cadena ;Direccion de cadena en eax

push eax

;Llamado de invertir_cadena con la dirección de la cadena a invertir

call invertir_cadena

;Las dos líneas siguientes son opcionales ya que la dirección

De la cadena (ahora invertida) siempre está en la pila.

mov eax, cadena; Dirección de la cadena en eax

push eax

;Visualización de la cadena con printf

call printf

add esp, 4 ;Salimos de la función main

mov eax, 0

Intenta resolver este ejercicio por ti mismo sin mirar las siguientes secciones. Si tienes

alguna dificultad, consulta la sección que sigue (Índices), luego vuelve a intentarlo.

Para recordar

Un carácter ASCII estándar está codificado en un octeto. Por lo tanto, una cadena de caracteres es una serie de caracteres de 1 octeto y no de 4 como los enteros.

Una cadena termina con el carácter 0 (el valor 0 y no el carácter '0').

Únicamente se pueden apilar elementos de 2 ó 4 octetos en la pila (a menos que se trate de una constante de un octeto).

Propiedad Probablemente sepas que la pila es una memoria cuyo acceso es del tipo Last In First Out. Lo que significa que si pones en la pila tres letras una a continuación de la otra, por ejemplo primero a luego b luego c, las recuperarás en el orden inverso: primero c luego b luego a. Solución

Aquí una solución: invertir_cadena:

;Inicio de la función

push ebp

mov ebp, esp

;Cargamos el puntero pasado como parámetro en eax

mov eax, [ebp+8]

;Introducimos el carácter de fin de cadena en la pila

push word 0

cadena_en_pila:

;Vamos a apilar cada carácter de la cadena

;Recuperación del carácter actual

Page 10: Jose Luis Vite

10

mov bl, byte [eax]

;¿Es el fin de la cadena? (bl = 0 ?)

test bl, bl

;Si es sí pasamos a la etapa siguiente

jz fin_cadena_en_pila

;Si no apilamos el siguiente carácter

push bx

;Incrementamos el puntero en 1 para procesar el siguiente carácter

inc eax

;Pasamos al siguiente carácter

jmp cadena_en_pila

fin_cadena_en_pila:

;Volvemos a cargar el puntero de la cadena para desapilar uno a uno cada carácter

mov eax, [ebp + 8]

invertir:

;Desapilamos el carácter actual

pop bx

;Lo cargamos en el puntero de cadena

mov byte [eax], bl

;Incrementamos la dirección

inc eax

;¿Era el fin de la cadena? (¿el 0 que hemos apilado al inicio?)

test bl, bl

;No entonces continuamos

jnz invertir

;Es el fin de la cadena, indicamos el fin de la función

leave

ret

Explicación Como ha sido sugerido en la sección “índices”, lo ideal es utilizar la pila. Se apilan los caracteres de la cadena y al ser desapilados se obtienen en el orden inverso. Esto es lo que ocurre: primero apilamos 0 que será desapilado al final para indicar el fin de la cadena. Luego, apilamos uno a uno cada carácter de la cadena pasando por bl (los 8 caracteres de peso débil de ebx) que es suficiente para un carácter. Al apilar, tomamos bx (16 bits de peso débil de ebx) que contiene a su vez bl ya que estamos obligados a apilar al menos 2 octetos. Durante estos sucesivos apilamientos, tendremos cuidado de no apilar el carácter de fin. En la siguiente etapa, volvemos a cargar el puntero con la dirección del inicio de la cadena. Luego, desapilamos sucesivamente cada carácter en la cadena borrando los valores antiguos. Cuando hayamos desapilado el 0 de fin de cadena, también lo insertamos en la cadena luego terminamos. Y listo!

Page 11: Jose Luis Vite

11

Ejemplo para la arquitectura x86

El siguiente es un ejemplo del programa clásico Hola mundo escrito para la arquitectura de procesador x86 (bajo el sistema operativo DOS).

; ---------------------------------------------

; Programa que imprime un string en la pantalla

; --------------------------------------------- .model small ; modelo de memoria

.stack ; segmento del stack

.data ; segmento de datos

Cadena1 DB 'Hola Mundo.$' ; string a imprimir (finalizado en $)

.code ; segmento del código

; ---------------------------------------------

; Inicio del programa

; ---------------------------------------------

programa: MOV AX, @data ; carga en AX la dirección del segmento de datos

MOV DS, AX ; mueve la dirección al registro de segmento por medio de

AX MOV DX, offset Cadena1 ; mueve a DX la dirección del string a imprimir

MOV AH, 9 ; AH = código de la función del MS DOS para imprimir un

string en la pantalla INT 21h ; llamada al MS DOS para imprimir un string en la pantalla

INT 20h ; llamada al MS DOS para finalizar el programa

end programa

Page 12: Jose Luis Vite

12

INTERFAZ RS232

RS232 (Recommended Standard 232, también conocido como Electronic Industries Alliance RS-232C) es una interfaz que designa una norma para el intercambio de una serie de datos binarios entre un DTE (Equipo terminal de datos) y un DCE (Data Communication Equipment, Equipo de Comunicación de datos), aunque existen otras en las que también se utiliza la interfaz RS-232.

Conector RS-232 (DB-9 hembra).

En particular, existen ocasiones en que interesa conectar otro tipo de equipamientos, como pueden ser computadores. Evidentemente, en el caso de interconexión entre los mismos, se requerirá la conexión de un DTE (Data Terminal Equipment) con otro DTE. Para ello se utiliza una conexión entre los dos DTE sin usar módem, por ello se llama: null módem ó módem nulo.

El RS-232 consiste en un conector tipo DB-25 (de 25 pines), aunque es normal encontrar la versión de 9 pines (DE-9, o popularmente también denominados DB-9), más barato e incluso más extendido para cierto tipo de periféricos (como el ratón serie del PC).

Conexiones (Desde la perspectiva del DTE)

En la siguiente tabla se muestran las señales RS-232 más comunes según los pines asignados:

Señal DB-25 DE-9 (DB-9, TIA-574) EIA/TIA 561 Host RJ-50 MMJ

Common Ground G 7 5 4 4,5 6 3,4

Transmitted Data TD 2 3 6 3 8 2

Received Data RD 3 2 5 6 9 5

Page 13: Jose Luis Vite

13

Data Terminal Ready DTR 20 4 3 2 7 1

Data Set Ready DSR 6 6 1 7 5 6

Request To Send RTS 4 7 8 1 4 -

Clear To Send CTS 5 8 7 8 3 -

Carrier Detect DCD 8 1 2 7 10 -

Ring Indicator RI 22 9 1 - 2 -

La interfaz RS-232 está diseñada para imprimir documentos para distancias cortas, de hasta 15 metros según la norma, y para velocidades de comunicación bajas, de no más de 20 kbps. A pesar de esto, muchas veces se utiliza a mayores velocidades con un resultado aceptable. La interfaz puede trabajar en comunicación asíncrona o síncrona y tipos de canal simplex, half duplex o full duplex. En un canal simplex los datos siempre viajarán en una dirección, por ejemplo desde DCE a DTE. En un canal half duplex, los datos pueden viajar en una u otra dirección, pero sólo durante un determinado periodo de tiempo; luego la línea debe ser conmutada antes que los datos puedan viajar en la otra dirección. En un canal full duplex, los datos pueden viajar en ambos sentidos

simultáneamente. Las líneas de handshaking de la RS-232 se usan para resolver los problemas asociados con este modo de operación, tal como en qué dirección los datos deben viajar en un instante determinado.

Si un dispositivo de los que están conectados a una interfaz RS-232 procesa los datos a una velocidad menor de la que los recibe deben de conectarse las líneas handshaking que permiten realizar un control de flujo tal que al dispositivo más lento le de tiempo de procesar la información. Las líneas de "hand shaking" que permiten hacer este control de flujo son las líneas RTS y CTS. Los diseñadores del estándar no concibieron estas líneas para que funcionen de este modo, pero dada su utilidad en cada interfaz posterior se incluye este modo de uso.

El estándar RS-232C

El puerto serie RS-232C, presente en todos los ordenadores actuales, es la forma mas comúnmente usada para realizar transmisiones de datos entre ordenadores. El RS-232C es un estándar que constituye la tercera revisión de la antigua norma RS-232, propuesta por la EIA (Asociaci¢n de Industrias Electrónicas), realizándose posteriormente un versión internacional por el CCITT, conocida como V.24. Las diferencias entre ambas son mínimas, por lo que a veces se habla indistintamente de V.24 y de RS-232C (incluso sin el sufijo "C"), refiriéndose siempre al mismo estándar.

Page 14: Jose Luis Vite

14

El RS-232C consiste en un conector tipo DB-25 de 25 pines, aunque es normal encontrar la versión de 9 pines DB-9, mas barato e incluso mas extendido para cierto tipo de periféricos (como el ratón serie del PC). En cualquier caso, los PCs no suelen emplear mas de 9 pines en el conector DB-25. Las señales con las que trabaja este puerto serie son digitales, de +12V (0 lógico) y -12V (1 lógico), para la entrada y salida de datos, y a la inversa en las señales de control. El estado de reposo en la entrada y salida de datos es -12V. Dependiendo de la velocidad de transmisión empleada, es posible tener cables de hasta 15 metros. Cada pin puede ser de entrada o de salida, teniendo una función especifica cada uno de ellos. Las mas importantes son:

Pin Función

TXD (Transmitir Datos)

RXD (Recibir Datos)

DTR (Terminal de Datos Listo)

DSR (Equipo de Datos Listo)

RTS (Solicitud de Envío)

CTS (Libre para Envío)

DCD (Detección de Portadora)

Las señales TXD, DTR y RTS son de salida, mientras que RXD, DSR, CTS y DCD son de entrada. La masa de referencia para todas las señales es SG (Tierra de Señal). Finalmente, existen otras señales como RI (Indicador de Llamada), y otras poco comunes que no se explican en este artículo por rebasar el alcance del mismo.

Numero de Pin Señal Descripción E/S

En DB-25 En DB-9

1 1 - Masa chasis -

2 3 TxD Transmit Data S

3 2 RxD Receive Data E

4 7 RTS Request To Send S

5 8 CTS Clear To Send E

6 6 DSR Data Set Ready E

7 5 SG Signal Ground -

8 1 CD/DCD (Data) Carrier Detect E

15 - TxC(*) Transmit Clock S

17 - RxC(*) Receive Clock E

20 4 DTR Data Terminal Ready S

22 9 RI Ring Indicator E

24 - RTxC(*) Transmit/Receive Clock S

(*) = Normalmente no conectados en el DB-25

Page 15: Jose Luis Vite

15

Conector DB 25 Conector DB 9

El puerto serie en el PC El ordenador controla el puerto serie mediante un circuito integrado especifico, llamado UART (Transmisor-Receptor-Asíncrono Universal). Normalmente se utilizan los siguientes modelos de este chip: 8250 (bastante antiguo, con fallos, solo llega a 9600 baudios), 16450 (versión corregida del 8250, llega hasta 115.200 baudios) y 16550A (con buffers de E/S). A partir de la gama Pentium, la circuiteria UART de las placa base son todas de alta velocidad, es decir UART 16550A. De hecho, la mayoría de los módems conectables a puerto serie necesitan dicho tipo de UART, incluso algunos juegos para jugar en red a través del puerto serie necesitan de este tipo de puerto serie. Por eso hay veces que un 486 no se comunica con la suficiente velocidad con un PC Pentium... Los portátiles suelen llevar otros chips: 82510 (con buffer especial, emula al 16450) o el 8251 (no es compatible).

Para controlar al puerto serie, la CPU emplea direcciones de puertos de E/S y líneas de interrupción (IRQ). En el AT-286 se eligieron las direcciones 3F8h (o 0x3f8) e IRQ 4 para el COM1, y 2F8h e IRQ 3 para el COM2. El estándar del PC llega hasta aquí, por lo que al añadir posteriormente otros puertos serie, se eligieron las direcciones 3E8 y 2E8 para COM3-COM4, pero las IRQ no están especificadas. Cada usuario debe elegirlas de acuerdo a las que tenga libres o el uso que vaya a hacer de los puertos serie (por ejemplo, no importa compartir una misma IRQ en dos puertos siempre que no se usen conjuntamente, ya que en caso contrario puede haber problemas). Es por ello que últimamente, con el auge de las comunicaciones, los fabricantes de PCs incluyan un puerto especial PS/2 para el ratón, dejando así libre un puerto serie. Mediante los puertos de E/S se pueden intercambiar datos, mientras que las IRQ producen una interrupción para indicar a la CPU que ha ocurrido un evento (por ejemplo, que ha llegado un dato, o que ha cambiado el estado de algunas señales de entrada). La CPU debe responder a estas interrupciones lo mas rápido posible, para que de tiempo a recoger el dato antes de que el siguiente lo sobrescriba. Sin embargo, las UART 16550A incluyen unos buffers de tipo FIFO, dos de 16 bytes (para recepción y transmisión), donde se pueden guardar varios datos antes de que la CPU los recoja. Esto también disminuye el numero de interrupciones por segundo generadas por el puerto serie.

Page 16: Jose Luis Vite

16

El RS-232 puede transmitir los datos en grupos de 5, 6, 7 u 8 bits, a unas velocidades determinadas (normalmente, 9600 bits por segundo o mas). Después de la transmisión de los datos, le sigue un bit opcional de paridad (indica si el numero de bits transmitidos es par o impar, para detectar fallos), y después 1 o 2 bits de Stop. Normalmente, el protocolo utilizado ser 8N1 (que significa, 8 bits de datos, sin paridad y con 1 bit de Stop). Una vez que ha comenzado la transmisión de un dato, los bits tienen que llegar uno detrás de otro a una velocidad constante y en determinados instantes de tiempo. Por eso se dice que el RS-232 es asíncrono por caracter y sincrono por bit. Los pines que portan los datos son RXD y TXD. Las demás se encargan de otros trabajos: DTR indica que el ordenador esta encendido, DSR que el aparato conectado a dicho puerto esta encendido, RTS que el ordenador puede recibir datos (porque no esta ocupado), CTS que el aparato conectado puede recibir datos, y DCD detecta que existe una comunicación, presencia de datos. Tanto el aparato a conectar como el ordenador (o el programa terminal) tienen que usar el mismo protocolo serie para comunicarse entre si. Puesto que el estándar RS-232 no permite indicar en que modo se esta trabajando, es el usuario quien tiene que decidirlo y configurar ambas partes. Como ya se ha visto, los parámetros que hay que configurar son: protocolo serie (8N1), velocidad del puerto serie, y protocolo de control de flujo. Este ultimo puede ser por hardware (el que ya hemos visto, el handshaking RTS/CTS) o bien por software (XON/XOFF, el cual no es muy recomendable ya que no se pueden realizar transferencias binarias). La velocidad del puerto serie no tiene por que ser la misma que la de transmisión de los datos, de hecho debe ser superior. Por ejemplo, para transmisiones de 1200 baudios es recomendable usar 9600, y para 9600 baudios se pueden usar 38400 (o 19200).

Page 17: Jose Luis Vite

17

Configuración de pines en db9 para puerto serie

En los PCs hay conectores DB9 macho, de 9 pines, por el que se conectan los dispositivos al puerto serie. Los conectores hembra que se enchufan tienen una colocación de pines diferente, de manera que se conectan el pin 1 del macho con el pin 1 del hembra, el pin2 con el 2, etc...

La información asociada a cada uno de los pines es la siguiente:

Número de pin Señal

1 DCD (Data Carrier

Detect) 2 RX 3 TX

4 DTR (Data Terminal

Ready) 5 GND 6 DSR (Data Sheet Ready) 7 RTS (Request To Send) 8 CTS (Clear To Send) 9 RI (Ring Indicator)

Puerto serie, DB9 o DB25:

El puerto físico de conexión de la PC, puede tener el zócalo DB9 o DB25. Se utilizan tres pines, en la conexión al circuito. El pin TXD, para transmitir bits. El pin RXD, para recibir y el pin de masa. Cuando no hay transmisión de datos el pin TXD, se indica con el estado mark, con un uno lógico continuo o –10v continuos.

Page 18: Jose Luis Vite

18

Todos estos materiales se pueden adquirir en una tienda de electrónica o de componentes eléctricos. Si no se sabe soldar o no se está seguro puede pedirse a un servicio de reparación que fabrique el cable teniendo en cuenta el esquema de conexiones.

Este es un ejemplo de cómo se fabrica un cable soldando un conector db9, la foto no es específica de nuestro cable pero sirve para ilustrar el proceso. Nótese en la foto de la derecha la parte del conector que constituye el chasis.

Para realizar la conexión en el PC se puede hacer de diferentes maneras. Una manera es utilizar un cable serie macho-hembra no cruzado, y en el circuito un conector hembra db9 para circuito impreso:

También se puede fabricar un cable serie utilizando cable plano de bus, conectactando un conector db9 hembra para bus:

Page 19: Jose Luis Vite

19

CONECTOR 1 CONECTOR 2

PIN 2-------------------->PIN 3

PIN 3-------------------->PIN 2 PIN 4-------------------->PIN 6 PIN 5-------------------->PIN 5

PIN 6-------------------->PIN 4 PIN 7-------------------->PIN 8 PIN 8-------------------->PIN 7