Unidad IV.- Lenguajes de Interfaz

14
Instituto Tecnológico de Durango Lenguajes de Interfaz Ingeniería en Sistemas Computacionales Ing. José Lauro Solís Gallegos Unidad IV Programación de Dispositivos Introducción Un puerto es una forma genérica de denominar a una interfaz a través de la cual los diferentes tipos de datos se pueden enviar y recibir. Dicha interfaz puede ser de tipo físico, o puede ser a nivel de software (por ejemplo, los puertos que permiten la transmisión de datos entre diferentes computadoras, en cuyo caso se usa frecuentemente el término puerto lógico). Puerto Lógico Se denomina así a una zona, o localización de la memoria de una computadora que se asocia con un puerto físico o con un canal de comunicación, y que proporciona un espacio para el almacenamiento temporal de la información que se va a transferir entre la localización de memoria y el canal de comunicación. En el ámbito de Internet, un puerto es el valor o número que se usa en el modelo de la capa de transporte, para distinguir entre las múltiples aplicaciones que se pueden conectar al mismo host, puesto o computadora. Por ejemplo, por el puerto número 80 se manda el servicio del protocolo HTTP (servicio de www), y por el puerto 21 se manda el servicio del protocolo FTP (servicio de transferencia de grandes archivos). Puerto Físico Un puerto físico, es aquella interfaz, o conexión entre dispositivos, que permite conectar físicamente distintos tipos de dispositivos como monitores, impresoras, escáneres, discos duros externos, cámaras digitales, memorias pendrive USB, etc. Estas conexiones tienen denominaciones particulares como, por ejemplo, los puertos "serie", "paralelo", Ethernet, USB o SATA de una computadora.

Transcript of Unidad IV.- Lenguajes de Interfaz

Page 1: Unidad IV.- Lenguajes de Interfaz

Instituto Tecnológico de Durango Lenguajes de Interfaz Ingeniería en Sistemas Computacionales Ing. José Lauro Solís Gallegos Unidad IV Programación de Dispositivos Introducción Un puerto es una forma genérica de denominar a una interfaz a través de la cual los diferentes tipos de datos se pueden enviar y recibir. Dicha interfaz puede ser de tipo físico, o puede ser a nivel de software (por ejemplo, los puertos que permiten la transmisión de datos entre diferentes computadoras, en cuyo caso se usa frecuentemente el término puerto lógico).

Puerto Lógico Se denomina así a una zona, o localización de la memoria de una computadora que se asocia con un puerto físico o con un canal de comunicación, y que proporciona un espacio para el almacenamiento temporal de la información que se va a transferir entre la localización de memoria y el canal de comunicación. En el ámbito de Internet, un puerto es el valor o número que se usa en el modelo de la capa de transporte, para distinguir entre las múltiples aplicaciones que se pueden conectar al mismo host, puesto o computadora. Por ejemplo, por el puerto número 80 se manda el servicio del protocolo HTTP (servicio de www), y por el puerto 21 se manda el servicio del protocolo FTP (servicio de transferencia de grandes archivos).

Puerto Físico Un puerto físico, es aquella interfaz, o conexión entre dispositivos, que permite conectar físicamente distintos tipos de dispositivos como monitores, impresoras, escáneres, discos duros externos, cámaras digitales, memorias pendrive USB, etc. Estas conexiones tienen denominaciones particulares como, por ejemplo, los puertos "serie", "paralelo", Ethernet, USB o SATA de una computadora.

Page 2: Unidad IV.- Lenguajes de Interfaz

Puerto serie (o serial) Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales, frecuentemente utilizado por computadoras y periféricos, en donde la información es transmitida bit a bit enviando un solo bit a la vez, en contraste con el puerto paralelo que envía varios bits simultáneamente. La comparación entre la transmisión en serie y en paralelo se puede explicar usando una analogía con las carreteras. Una carretera tradicional de un sólo carril por sentido sería como la transmisión en serie y una autopista con varios carriles por sentido sería la transmisión en paralelo, siendo los vehículos los bits que circulan por el cable.

Puerto serie de conector DB9

A lo largo de la mayor parte de la historia de las computadoras, la transferencia de datos a través de los puertos serie ha sido generalizada. Se ha usado y sigue usándose para conectar las computadoras a dispositivos como terminales o módems. Los “mouses”, teclados, y otros periféricos también se conectaban de esta forma. Mientras que otras interfaces como Ethernet, FireWire y USB mandaban datos como un flujo en serie, el término "puerto serie" normalmente identifica el hardware conforme al estándar RS-232, diseñado para interactuar con un módem o con un dispositivo de comunicación similar. Actualmente en la mayoría de los periféricos serie, la interfaz USB ha reemplazado al puerto serie puesto que es más rápida. La mayor parte de las computadoras están conectadas a dispositivos externos a través de USB y, a menudo, ni siquiera llegan a tener un puerto serie de conector DB9. El puerto serie se elimina para reducir los costes y se considera que es un puerto heredado y obsoleto. Sin embargo, los puertos serie todavía se encuentran en sistemas de automatización industrial y algunos productos industriales y de consumo (cañones de proyección, televisores tipo LCD, cajas registradoras, dispositivos especializados en interconectividad y redes, etc.). Los dispositivos de redes, como los enrutadores y conmutadores, a menudo tienen puertos serie para modificar su configuración. Los puertos serie se usan frecuentemente en estas áreas porque son sencillos, baratos y permiten la interoperabilidad entre dispositivos. La desventaja es que la configuración de las conexiones serie requiere, en la mayoría de los casos, un conocimiento avanzado por parte del usuario y el uso de comandos complejos si la implementación no es adecuada.

Page 3: Unidad IV.- Lenguajes de Interfaz

Puerto serie asincrónico A través de este tipo de puerto la comunicación se establece usando un protocolo de transmisión asíncrono. En este caso, se envía en primer lugar una señal inicial anterior a cada byte, carácter o palabra codificada. Una vez enviado el código correspondiente se envía inmediatamente una señal de stop después de cada palabra codificada. La señal de inicio sirve para preparar al mecanismo de recepción, o receptor, la llegada, y registro de un símbolo, y la señal de “stop” sirve para predisponer al mecanismo de recepción para que tome un descanso y se prepare para la recepción del nuevo símbolo. La típica transmisión “start-stop” es la que se usa en la transmisión de códigos ASCII a través del puerto RS-232, como la que se establece en las operaciones con los llamados teletipos.

Puerto serie sincrónico El puerto serie RS-232 (también conocido como COM) es del tipo sincrónico en el protocolo a bajo nivel, utiliza cableado simple desde 3 hilos hasta 25 y conecta computadoras o microcontroladores a todo tipo de periféricos, desde terminales a impresoras y módems, pasando por “mouses”. El término sincrónico se refiere al uso de un reloj que sincronice al receptor y transmisor para el envío de información, generalmente esto se configura en la inicialización del puerto medida en bps (bits por segundo). La interfaz entre el RS-232 y el microprocesador generalmente se realiza mediante una UART 8250 (computadoras de 8 y 16 bits, PC XT) o 16550 (IBM Personal Computer/AT y posteriores). El RS-232 original tenía un conector tipo DB-25, sin embargo la mayoría de dichos pines no se utilizaban, por lo que IBM estandarizó con su gama IBM Personal System/2 el uso del conector DB-9 (ya introducido en el modelo AT) que se usaba, de manera mayoritaria en computadoras. Sin embargo, a excepción del mouse el resto de periféricos solían presentar el conector tipo DB-25. La norma RS-422, similar al RS-232, es un estándar utilizado en el ámbito industrial.

Puertos serie modernos Uno de los defectos de los puertos serie iniciales era su lentitud en comparación con los puertos paralelos -hablamos de 19.2 kbits por segundo- sin embargo, con el paso del tiempo, estuvieron apareciendo multitud de puertos serie de alta velocidad que los hacían muy interesantes, ya que presentaban las ventajas del menor cableado y solución al problema de la baja de velocidad, con un mayor apantallamiento y más baratos, usando la técnica del par trenzado. Por ello, el puerto RS-232, e incluso multitud de puertos paralelos, se sustituyeron y reemplazaron por los nuevos puertos serie como el USB, el “FireWire” (IEEE1394) o el Serial ATA (SATA). El puerto serie puede transmitir por hardware hasta 9600 bps, y con sistemas de compresión por software hasta más de 900000 bps (casi 1 megabit).

Page 4: Unidad IV.- Lenguajes de Interfaz

Tipos de comunicación en serie Simplex: En este caso el emisor y el receptor están perfectamente definidos y la comunicación es unidireccional. Este tipo de comunicaciones se emplean, usualmente, en redes de radiodifusión, donde los receptores no necesitan enviar ningún tipo de dato al transmisor. Duplex, half duplex o semi-duplex: En este caso ambos extremos del sistema de comunicación cumplen funciones de transmisor y receptor y los datos se desplazan en ambos sentidos pero no de manera simultánea. Este tipo de comunicación se utiliza habitualmente en la interacción entre terminales y una computadora central. Full Duplex: El sistema es similar al duplex, pero los datos se desplazan en ambos sentidos simultáneamente. Para que sea posible ambos emisores poseen diferentes frecuencias de transmisión o dos caminos de comunicación separados, mientras que la comunicación semi-duplex necesita normalmente uno solo. Para el intercambio de datos entre computadores este tipo de comunicaciones son más eficientes que las transmisiones semi-dúplex. 4.1 El buffer de video en modo texto ;Programa 1.- Despliegue de caracter con atributos usando memoria de video org 0100h mov di,0002h ;Valores pares para apuntar a 16 bits mov ax,0B800h ;0B800h=Direccion de inicio de desplazamiento para video mov es,ax ;Pasar la dirección al registro de uso con apuntadores mov ah,0A1h ;Color de Fondo, Color de Caracter mov al,'T' ;Poner en AL el ASCII del caracter mov word ptr es:[di],ax ;Instrucción de uso de apuntadores directos mov ah,07h

Page 5: Unidad IV.- Lenguajes de Interfaz

int 21h int 20h ;Programa 2.- Despliega cadena en pantalla con atributos org 0100h jmp eti0 cad0 db 'Tecnologico' eti0: mov bp,offset cad0 mov cl,[bp-1] ;CL=Longitud de la cadena mov ch,00h ;CX=Longitud de la Cadena CAD0 mov ah,13h ;AH=Funcion 13H de la INT 10h mov al,1d ;AL=Modo de escritura, 0=Usando el Cursor, 1=Atributos de Cadena mov bh,0h ;BH=Pagina de despliegue mov bl,11111100b ;BL=Atributos de la cadena (Fondo y Caracteres) mov dl,10d ;DL=Columna mov dh,10d ;DH=Renglon int 10h mov ah,07h int 21h int 20h 4.2 Acceso a discos en lenguaje ensamblador El sistema de almacenamiento en disco constituye el soporte externo de la información. Los datos se registran sobre la superficie del disco en una serie de circunferencias concéntricas llamadas pistas (track). Varias pistas, una por cada cara del disco (generalmente 2), componen un cluster. Cada pista está dividida en porciones iguales llamadas sectores. Un sector es la unidad básica de almacenamiento en disco. El tamaño de un sector se mide en bytes, y depende de las características del disco. Interrupciones que hacen uso del acceso a discos: INT 0EH, INT 25H, INT 26H, función 36H de la INT 21H, algunas funciones de la INT 13H. Manejo de Discos Para almacenar información permanente en grandes cantidades, las computadoras cuentan con dispositivos especiales, llamados memoria secundaria o externa, generalmente son dispositivos que almacenan información magnética. Un disco es una superficie plana, magnética dividida en círculos concéntricos a los cuales se les llama “Tracks“ (pistas), además de tener 2 lados, cabe mencionar que los primeros discos únicamente tenían 1 sola cara. Cada track está dividido en sectores, los cuales almacenan un determinado número de bytes. Las unidades de disco, son dispositivos capaces de leer o escribir en un disco, y para eso tienen una cabeza lectora quien realiza una operación de moverse al track deseado (Seek Time), y luego esperar por el sector seleccionado (Latency Time). Hay un transmisor y un receptor para ver donde inician los sectores.

Seek Time: Tiempo en que se tarda en posicionar la cabeza lectora en moverse a un track. El número de tracks y lados en un disco depende del hardware del disco, y de la unidad que lo maneja, pero el número de sectores y el tamaño de los mismos se determina en el momento de formatear el disco (depende del software).

Page 6: Unidad IV.- Lenguajes de Interfaz

Acceso al disco Para leer o escribir en un disco, no se realiza byte a byte, sino más bien en bloques de bytes, debido a que el acceso a disco implica movimientos mecánicos además de que el acceso se da por sectores; en este proceso no interviene el CPU, puesto que solo envía los comandos a la interface que maneja la unidad de disco y ésta es la que se encarga de leer o escribir información de un área especial de memoria, llamada DMA; este proceso es conocido como acceso directo a memoria.

Cuando se escribe en disco, el CPU coloca la información en el área de DMA, después envía un comando de escritura a la interface. La interface lee la información de la memoria (DMA) y la escribe en el sector deseado, después informa al CPU si terminó la operación o si se produjo un error (INT 0Eh). Cuando se requiere leer información del disco entonces el CPU envía un comando de lectura a la interface, ésta localiza el sector deseado, lee la información y la deposita en el área de DMA, avisa al CPU que terminó o bien si hay error. Después de esto el CPU puede leer la información para procesarla. Para el manejo de disco desde BIOS se hace uso de la INT 13h, y con servicios de la misma interrupción. Para el manejo de disco desde el sistema DOS, se utilizan los discos a los cuales se le haya aplicado el comando “format”, el cual realiza un formato a nivel de BIOS (INT 13h), es decir mapea todos los sectores físicos de un disco en sectores lógicos, y divide el disco en 4 áreas básicas de información: a) Boot record: Contiene la información acerca del formato del disco, tal como número de sectores, número de tracks, número de lados, etc. Además contiene un pequeño programa que se encargará de bajar el sistema operativo (boot del sistema). Boot Strap: Lee el primer sector del disco (boot record) y le transfiere el control. Boot del sistema: Pasa a memoria los archivos del sistema operativo, les transfiere el control para que aparezca el prompt del sistema. b) Tabla de localización de archivos (FAT): En esta tabla se guarda una lista de los sectores ocupados por cada archivo contenido en el disco. c) Directorio: Se guarda información acerca de los archivos en el disco (nombre, extensión, tamaño, fecha y hora de última actualización, atributos y un apuntador a su correspondiente en el FAT). d) Archivos (área de datos): Es donde se guarda la información contenida en los archivos. Los pasos a seguir para trabajar con archivos son los siguientes: 1.- Identificar el archivo (nombre.ext). 2.- Si el archivo no existe, entonces crearlo si hay que escribir, sino marcar error. 3.- Localizar el archivo en el directorio. 4.- Abrir el archivo. 5.- Acceder el archivo (leer o escribir registros). 6.- Cerrar el archivo. La forma de acceder a un archivo es mediante registros, es decir, se lee un registro o se escribe un registro de memoria a disco. Al área destinada para la transferencia de registros se le conoce como DTA (área de transferencia de datos) y puede estar localizada en cualquier parte del segmento de datos. El DTA tiene un tamaño de 128 bytes. Cuando se crea un archivo en el directorio se guarda el nombre y la extensión, se busca

Page 7: Unidad IV.- Lenguajes de Interfaz

espacio en el disco y se guarda, por lo que no siempre son secuenciales los sectores de los archivos, es por eso que en la FAT se guardan las direcciones de los sectores. Un archivo se puede acceder de dos formas: acceso secuencial; en este caso se sigue un orden en la lectura/escritura de registros, acceso aleatorio; en esta caso no se sigue un orden establecido y se puede leer/escribir en cualquier registro. En DOS, para trabajar con archivos se necesitan dos estructuras de datos: 1.- Un área de memoria para el DTA, donde se van a escribir los registros, por ejemplo: DTA DB 128 DUP (0) 2.- Un área para el bloque de control de archivos (FCB) en donde se guarda información importante para el acceso a archivo, por ejemplo: FCB DB 36 DUP (0) El formato para el FCB es el siguiente: Byte Contenido:

0 Número de unidad donde se encuentra el archivo: 0 = Unidad corriente 1 = A 2 = B ...

1 – 8 Nombre del archivo en ASCII, los espacios que no se ocupen se llenan con espacios en blanco.

9 – 0Bh Extensión en ASCII 0Ch – 0Dh Número de bloque corriente. 0Eh – 0Fh Tamaño de los registros, por default 80h. 10h – 13h Tamaño del archivo. 14h – 15h Fecha de la última actualización. 16h – 17h Hora de la última actualización.

<0 ... 4> segundos <5 ... 11> minutos <12 ... 15> horas

18h – 1Fh Reservados por el sistema. 20h Número de registro corriente relativo al inicio del bloque corriente.

21h – 24h

Número de registro corriente relativo al inicio del archivo.

Un bloque de archivo consta de 80h registros de 80h bytes cada uno. Al iniciar el manejo de un archivo los únicos campos del FCB que se inicializan son el de la unidad, el nombre y la extensión; los demás bytes se ponen en cero y son actualizados por el sistema.

4.3 Programación del puerto serial El MS-DOS soporta el uso de impresoras, plotters, modems y otros dispositivos de impresión o comunicaciones a través de “drivers” (manejadores) para los puertos paralelo y serial. Los puertos paralelos reciben este nombre, porque transfieren la información (8 bits) en paralelo a través de cables independientes. Los puertos seriales transfieren la información serialmente (1 bit a la vez) a través de un única conexión física. Los puertos paralelos se emplean generalmente para dispositivos de salida de alta velocidad, como impresoras, a una distancia corta. Los puertos seriales son empleados para dispositivos lentos, como modems y terminales, que requieren comunicación bidireccional con la computadora y a mayores distancias (hasta 1 kilómetro). El interfaz más común para puertos seriales es el llamado RS-232. Este estándar especifica una conexión de 25 cables con ciertas características eléctricas, el uso de ciertas señales de control (handshaking) y un conector estándar DB-25. El MS-DOS incorpora manejadores para varios adaptadores paralelos y dos seriales. Los nombres lógicos de estos adaptadores son LPT1, LPT2, etc. para los puertos paralelos, y COM1, COM2 para los puertos seriales. El dispositivo estándar de impresión (PRN1) y dispositivo estándar auxiliar (AUX) están generalmente asociados a LPT1 y COM1 respectivamente.

Page 8: Unidad IV.- Lenguajes de Interfaz

Al igual que en el caso de manejo de teclado y video, existen tres niveles de manejo para los puertos paralelo y serial: - Funciones del MS-DOS orientadas a manejador (handle). - Funciones tradicionales del MS-DOS. - Funciones del BIOS. Interrupciones que hacen uso del puerto serial y paralelo: INT 14H y 17H respectivamente, además del uso de las instrucciones IN y OUT para el puerto paralelo. 4.4 Programación del puerto paralelo Ejemplo del uso de Puerto Paralelo El siguiente ejemplo nos va a mostrar cómo se envía información al puerto paralelo de la computadora utilizando instrucciones del lenguaje ensamblador. El Puerto paralelo, en la mayoría de las computadoras personales compatibles con IBM - PC, es una salida de propósito general de 8 bits utilizada para manejar una amplia gama de impresoras, trazadores y otros dispositivos externos. Las líneas de datos del interfaz responden a un tipo de instrucción de E/S en ensamblador: out, y podemos usar los datos de estas líneas para controlar el hardware que elijamos. El puerto paralelo es un puerto de 8 bits de datos, lo cual significa que se pueden enviar hasta 8 bits a la vez. El tipo de dato de 8 bits en lenguaje ensamblador es el byte, mientras que en lenguaje C el tipo corresponde a char o unsigned char. Los datos se escriben en las terminales de salida al ejecutar una instrucción out. Las señales de salida del puerto llevan una corriente de 20 mA. El voltaje alto de salida es de 5 V de corriente continua mientras que el potencial bajo es de 0.5 V. Los datos circulan a través de las terminales (conector DB25) del pin 2 al 9 y representan las líneas de datos DO a D7. Iluminación de un LED El ejemplo es un programa que hace dos llamadas a rutinas en lenguaje ensamblador insertadas (Ensamblador Híbrido). La primera limpia la pantalla y la segunda envía un valor de 8 bits al puerto paralelo. Puesto que el potencial del puerto es compatible TTL (el 1 lógico corresponde con 5 V y el cero con 0.5 V), puede manejar directamente pequeños diodos emisores de luz (LED). Para conectar 8 LED al puerto paralelo se necesita solamente un cable que conecte el puerto paralelo a un tablero de prototipos electrónicas, algún alambre de conexión y 8 LEDs. Este ejemplo usa un conector D de 25 terminales para conectar el puerto a un cable acabado en un enchufe macho de 24 terminales. Se descarta el terminal #13 del conector D. El tablero de prototipos electrónicos será del tipo que permita que los circuitos integrados DIP sean insertados y retirados fácilmente. Este material se puede encontrar en cualquier tienda de repuestos electrónicos. Si se adquieren conectores que se anclan en el enchufe de conexión no será necesaria la soldadura. Los potenciales presentes en un puerto paralelo son muy bajos por lo que no representan peligro alguno. Asimismo, es casi imposible dañar la computadora debido a una conexión errónea. No obstante, recordemos que estamos realizando conexiones “en vivo” a la computadora. Hay que tener mucho cuidado de no conectar ningún dispositivo externo donde se presenten potenciales desconocidos. El siguiente código en C contiene la rutina de limpieza de pantalla, y la rutina para acceder al puerto paralelo: /* * Programa en C que muestra cómo usar el lenguaje ensamblador en línea para limpiar la pantalla y * acceder al puerto paralelo. Este programa irá iluminando secuencialmente 8 L.E.D. conectados a las * líneas de datos D0 a D7 del puerto 956 (LPT1). */ #pragma inline #include <dos.h> #include <stdio.h> #include <math.h> main() { int i,temp; int puerto=965;

Page 9: Unidad IV.- Lenguajes de Interfaz

/*Borra la ventana de texto*/ asm{ mov cx,0 /*esquina superior izquierda*/ mov dx,2479H /*esquina inferior de la ventana*/ mov bh,7 /*atributo normal de pantalla*/ mov ax,0600H /*valor de la interrupción del BIOS*/ int 10H /*llamada a la interrupción*/ } for (i=0;i<9;i++) { temp=(int) pow(2.0,(double) y); /*accediendo al puerto paralelo*/ asm{ mov dx,puerto /*pone el número en el puerto*/ mov ax,temp /*valor enviado al puerto*/ out dx,al /*enviando solo los 8 bits más bajos*/ } printf(“&d\n”,temp); delay(1000); } return (0); } En este programa se realiza algo más interesante que imprimir números en la pantalla: mantiene una secuencia de valores de 8 bits a través del puerto paralelo. Con una secuencia temporal adecuada, podemos crear un conjunto de pilotos luminosos que se persiguen. Si cada bit de datos en el puerto paralelo corresponde a una potencia entera de 2, con la función “pow” se generarán los números 1,2,4,8,16,32,64, y 128 siendo enviados al puerto (realmente, se genera también 256 que provoca el final de la secuencia y del programa).

PIN Función 1 Strobe 2 BIT 1 3 BIT 2 4 BIT 3 5 BIT 4 6 BIT 5 7 BIT 6 8 BIT 7 9 BIT 8 10 Acknowledge 11 Busy 12 Paper OUT 13 Select OUT 14 Autofeed 15 Error 16 Printer Reset 17 Select IN 18 Tierra 19 Tierra 20 Tierra 21 Tierra 22 Tierra

Page 10: Unidad IV.- Lenguajes de Interfaz

23 Tierra 24 Tierra 25 Tierra

4.5 Programación híbrida Mientras que muchos programadores prefieren escribir aplicaciones completamente en lenguaje ensamblador, otros reservan para este último sólo aquellas labores de muy bajo nivel o que exigen un muy alto rendimiento. Existen incluso otros, que prefieren escribir sus programas principalmente en ensamblador, aprovechando ocasionalmente las ventajas que proporcionan las librerías y construcciones de lenguajes de alto nivel. Interfaz con PASCAL El Turbo Assembler proporciona facilidades extensas y poderosas para la adición de rutinas en lenguaje ensamblador a programas escritos en Turbo PASCAL. ¿Por qué usar rutinas en lenguaje ensamblador en programas escritos en PASCAL?. Aunque la mayoría de las aplicaciones serán escritas sólo en PASCAL, existen ocasiones en las cuales este no provea alguna facilidad específica o se requiera de una gran velocidad de ejecución, sólo alcanzable con lenguaje ensamblador. Interfaz con lenguaje C y C++ Tradicionalmente el C++ y el lenguaje ensamblador han sido mezclados escribiendo módulos separados completamente en C++ o completamente en ensamblador, compilando los módulo en C++ y ensamblando los módulos en ensamblador, y finalmente enlazando los módulos objeto. Esta es una solución muy recomendable, pero tiene un inconveniente: el programador de ensamblador debe atender a las reglas de interfaz con C++. Reglas para mezclar programas en C++ y lenguaje ensamblador Para enlazar programas en C++ con programas en lenguaje ensamblador es necesario observar dos cosas: 1.- El módulo en lenguaje ensamblador debe emplear un esquema de segmentos compatible con C++. 2.- Los módulos en C++ y ensamblador deben compartir variables y funciones en una forma aceptable para el compilador de C++. Enlace de módulos en C++ con módulos en lenguaje ensamblador El enlace es un concepto importante en C++. El compilador y el enlazador deben trabajar en conjunto para asegurar que las invocaciones a funciones contienen los argumentos correctos. Un proceso llamado “namemangling” proporciona la información necesaria referente a los tipos de argumentos. Este proceso modifica el nombre de la función para indicar los argumentos que ella toma. Cuando el programa es escrito completamente en C++, la modificación de los nombres de las funciones ocurre automáticamente y de una manera transparente al programador. Sin embargo, al escribir rutinas en ensamblador que van a ser enlazadas con programas en C++, es necesario asegurarse de que las funciones contengan los nombres modificados. 4.6 Programación de puerto usb Introducción Velocidades y comparativas Funciones típicas del puerto USB Características generales del puerto USB Facilidad de uso para los usuarios Flexibilidad Ancho de banda isócrono Aplicaciones y carga de trabajo Robustez Implementación de bajo costo Topología del bus USB Estructura de capas Capa Física Capa Lógica Flujo de datos del bus USB Puntos finales y direcciones de dispositivos Tuberías Stream Mensaje Frames y Microframes Tipos de transferencia De Control Isócronas De interrupción

Page 11: Unidad IV.- Lenguajes de Interfaz

De Bultos Capas de protocolo Formato de los campos Identificador de paquete De dirección EndPoint Número de frame De datos Formato de los paquetes De tipo Token Inicio de Frame De datos HandShake Transacciones IN Mediante conmutación de Bits OUT Setup Split Protocolo y Transferencias Transferencia de bulto Transferencia de control Transferencia de Interrupción Transferencias isócronas La Eléctrica Identificación de velocidad del dispositivo Codificación de datos Relleno de bits Sync

End of Packet (EOP) La Mecánica Cable standard (quita-pon) Cable fijo de velocidad alta y media Cable fijo de baja velocidad Programación de Puertos seriales (forma Híbrida en C, C++) Un protocolo de comunicación define las reglas de la comunicación entre dos puntos (transmisor y receptor), por lo tanto es posible crear protocolos que realicen una sincronización entre el equipo que desea transmitir información y el que la debe recibir. La programación de un protocolo se puede realizar prácticamente con cualquier lenguaje de programación que permita el manejo de dispositivos hardware de comunicación de una computadora (puertos series, USBs, paralelos, tarjeta de red ethernet, firewire, etc.) o dispositivos externos dedicados a la misma tarea (módems, concentradores, switches etc.). Ejemplo de los lenguajes que permiten la creación de protocolos a nivel básico son el Lenguaje “C” y el Lenguaje Ensamblador, aunque existen otros que se pueden utilizar para dicho fin (Java, Visual Basic, Delphi, etc.), estos ya aplican una técnica mucho más moderna que los puertos seriales, llamada “sockets”. En ocasiones es necesario hacer una mezcla entre dos lenguajes para utilizar los privilegios de programación que cada lenguaje puede tener, tal es el caso de usar la programación híbrida con Lenguaje “C” y Lenguaje Ensamblador. A continuación se describen algunas funciones hechas en lenguaje C con ensamblador para realizar comunicaciones del tipo serial sincrónico. Serial: Transmitir un bit o byte uno detrás de otro, nunca dos al mismo tiempo. Síncrono: Se toma como referencia al tiempo para definir exactamente (sincronizar) cuando se debe transmitir un bit o byte. La forma más sencilla de comunicación es usando los puertos seriales, entonces para este tema, se utilizarán estos puertos de la computadora (el más común: DB9) y la comunicación deberá ser sincronizada de la misma manera en las dos computadoras que participen en la comunicación.

Page 12: Unidad IV.- Lenguajes de Interfaz

Funciones híbridas (usando Lenguaje Ensamblador) en lenguaje C, C++ (Compilador Borland 3.1 1993). Función para la INICIALIZACIÓN de un puerto de comunicaciones.

void inicializa(int port) { asm{ mov ah,00h mov al,11100011b mov dx,port int 14h } }

La interrupción 14 hexadecimal de lenguaje ensamblador es la encargada de manejar y controlar el puerto serial de comunicaciones de una computadora (conector DB9, estándar IEEE RS232), el cual puede lograr comunicaciones seriales síncronas a una velocidad de 9600 Baudios o bits por segundo (modo hardware). En el caso de esta función llamada INICIALIZA, se utiliza el servicio 00 hexadecimal (mov ah,00h) de la interrupción 14 hexadecimal (int 14h) para indicar que lo que se va a hacer es inicializar o preparar el puerto de comunicaciones seriales. Se pueden tener en una computadora más de un puerto serial (posiblemente 2), entonces se debe especificar cuál de los puertos es el que se va a inicializar, cosa que se define con el valor que se almacena en el registro DX, y que a través de la variable “port” se pasa a dicho registro (mov dx,port). El valor de PORT deberá ser un número entre 0 y 3, que indicará si se inicializa el puerto serie 0 (COM0), o el 1 (COM1), o el 2 (COM2), etc. Generalmente el puerto serie más utilizado es donde se conecta el “mouse” tipo DB9, este puerto corresponde casi siempre al valor de 0. Por último, es muy importante el definir los parámetros de inicialización del puerto, donde se indican entre otras cosas: la velocidad de transmisión, paridades, bits de inicio y parada, etc. Dichos valores definirán la forma exacta en que se transmitirán los bytes entre una computadora y otra, una inicialización estándar es la que se da en la instrucción “mov al,11100011b” , en donde se está definiendo entre otras cosas una velocidad máxima de transmisión de 9600 Baudios o bits por segundo.

Función que ENVIA un carácter (byte) de una máquina a otra.

void envia(char car,int port) { asm{ mov ah,01h mov dx,port mov al,car int 14h } }

En el caso de la función ENVIA, se solicita el uso del servicio 01h de la int 14h, que es el encargado de enviar un carácter (byte) de un puerto serial a otro, en dx deberá estar el número de puerto por donde se enviará el carácter, en el registro “al” el código ASCII del carácter a enviar (por ejemplo 97 decimal para la letra “a”), y llamar por último a la int 14h. Función que LEE o recibe un carácter del puerto serial.

char lee(int port) { char temp; asm{ mov ah,02h mov dx,port int 14h mov temp,al } return temp; }

Page 13: Unidad IV.- Lenguajes de Interfaz

Para la función LEE, se solicita el uso del servicio 02h, que es el encargado de “traer” del puerto serial el carácter que ahí se encuentre (en caso de no haber nada, se puede ocasionar un error), este servicio de leer un carácter del puerto debe ser utilizado en coordinación con el servicio 03h que es el encargado de detectar el estado del puerto serial, de lo contrario se podrán ocasionar malos funcionamientos o sincronizaciones en los programas de comunicaciones. Observe que igual que en los otros servicios, el número de puerto de comunicaciones deberá estar en el registro DX, lo importante aquí es que después de la ejecución de la int 14h, se tendrá en el registro “al” el código ASCII del carácter leído del puerto, valor que es pasado a la variable “temp” para poder utilizarlo en alto nivel. Función ESTADO para detectar el estado del puerto.

unsigned char estado(int port) { unsigned char temp; asm{ mov ah,03h mov dx,port int 14h and ah,00000001b mov temp,ah } return temp; }

La función ESTADO es muy importante cuando deseamos recibir caracteres, esta función deberá ser usada antes de la función LEE, debido a que primero se debe estar seguro de que en el puerto de comunicaciones existe un carácter por leer, cosa que detecta la función ESTADO, después, si es afirmativo se utiliza la función LEE. En la función ESTADO se utiliza el servicio 03h, igual que antes en DX, debe estar el número de puerto, y por último llamar a ejecución a la instrucción de bajo nivel “int 14h”, la cual devolverá como resultado un valor en el registro “ah”, en este se encuentra información respecto al estado del puerto (véase figura siguiente), entre otras cosas, es importante recalcar que el bit donde se encuentra la información de si existe o no un carácter por leer del puerto, es en el bit menos significativo (el del extremo derecho), si este bit es 1, quiere decir que si existe un carácter por leer (para leerlo se utiliza la función LEE), si es 0 no existe nada por leer. El filtro con la compuerta “and” se utiliza para que solo quede en el registro “ah” un 0 ó un 1, depende si existe o no carácter por leer, dicho valor es pasado a la variable “temp” para ser utilizado en alto nivel.

Estado de retorno del puerto serial

Algoritmo de simulación de protocolo Para el uso de las funciones anteriores se deberá de contar con un algoritmo que nos permita lograr la comunicación a través de una buena sincronización lógica, pueden existir muchos algoritmos que nos permitan lograr el objetivo deseado, para después codificarlos en cualquier lenguaje de programación. A continuación se presenta un algoritmo básico de comunicación para un programa de TRANSMISIÓN de caracteres (TX) y salida con la tecla ESC. Inicio Preguntar por el número de puerto de comunicaciones (PORT) Inicializar puerto de comunicaciones Repetir Preguntar por un carácter (CAR) Enviar CAR Si CAR es ESC no desplegarlo en pantalla Caso contrario si desplegarlo Mientras que CAR sea diferente de ESC

Page 14: Unidad IV.- Lenguajes de Interfaz

Ahora se presenta un algoritmo básico de comunicación para un programa de RECEPCIÓN de caracteres (RX) y salida con recepción de la tecla ESC.

Inicio Preguntar por el número puerto de comunicaciones (PORT) Inicializar puerto de comunicaciones Repetir Repetir

Preguntar por el estado del puerto (EDO) Mientras EDO sea igual a 0 Leer carácter del puerto (CAR)

Si CAR es ESC no desplegarlo en pantalla Caso contrario si desplegarlo

Mientras que CAR sea diferente de ESC

Los algoritmos antes descritos funcionan codificándolos en un lenguaje soportado por manejo de hardware, y dándoles la secuencia lógica que debe implementarse para lograr la comunicación. Además es importante mencionar que el canal de comunicación utilizado entre una computadora y otra, es un cable tipo UTP de 8 hilos con conectores DB9 hembras en los extremos, y conectados eléctricamente de la manera tipo “MODEM nulo”, que es una manera de simular en el puerto de una computadora que existe un módem de comunicación, y con esto lograr que se puedan enviar caracteres de una máquina a otra. La forma de conexión para el cable de módem nulo se muestra a continuación: Relación de conexiones: 1 con 7 y 8 2 con 3 3 con 2 4 con 6 y 9 5 con 5 6 y 9 con 4 7 y 8 con 1 Tierra con Tierra Debe entenderse que las conexiones se hacen de un extremo del cable al otro en los conectores DB9, además, note los “puentes” que se deben hacer en cada extremo. Tierra se refiere al “chasis” metálico de cada conector.