Вы находитесь на странице: 1из 26

LENGUAJES DE INTERFAZ

UNIDAD IV
Programacin de Dispositivos

NDICE
4. Programacin de dispositivos.....2 4.1 El buffer de video en modo texto......2 4.1.1 Escritura directa en el bfer de vdeo.......4 4.1.2. Ejemplos completos en modo texto.5 4.2 Acceso a discos en lenguaje ensamblador.5 4.2.1. Particiones del DOS...6 4.2.2. Parmetros absolutos de un Disco Duro6 4.2.3. Acceso a dispositivos de almacenamiento.7 4.2.4. Acceso a disco usando lenguaje ensamblador..7 4.3 Programacin del puerto serial10 4.3.1. Explicacin de los registros..11 4.3.2. Abrir un canal asociado a un puerto serie..12 4.3.3. Modificar los parmetros de transmisin........13 4.3.4. Monitorizacin de eventos.13 4.3.5. Escribir en el puerto serie..14 4.3.6. Esperar a que haya algo para leer...15 4.3.7. Leer desde el puerto serie.16 4.4 Programacin del paralelo.17 4.4.1. Conector Paralelo...18 4.5 hbrida..20 puerto Puerto Programacin

4.5.1. Operadores..20 4.6 Programacin de USB...............23 puerto

Bibliografa......24

DAVID MONTIEL RAMIREZ

DAVID MONTIEL RAMIREZ

4. Programacin de dispositivos
4.1 El buffer de video en modo texto
Se llama modo texto a cualquier modo de vdeo de un ordenador en el que el contenido de la pantalla se representa internamente en trminos de caracteres textuales en lugar de pxeles individuales. Las aplicaciones en modo texto se comunican con el usuario mediante lneas de comandos (CLIs) e interfaces textuales de usuario (TUIs). Muchos juegos de caracteres usados en aplicaciones en modo texto tambin incluyen un conjunto limitado de caracteres semi -grficos predefinidos que pueden usarse para dibujar cajas y otros grficos rudimentarios usados para destacar el contenido o simular widgets u controles como los presentes en las aplicaciones escritas para interfaces grficas (GUIs). Las ventajas de los modos de texto respecto a los grficos incluyen el menor consumo de memoria y la ms rpida manipulacin de pantalla. Adems, las aplicaciones en modo texto tienen unos requisitos de ancho de banda relativamente bajos en uso remoto. Una desventaja obvia del modo texto es la restriccin del contenido de pantalla, que lo hace inviable para muchos tipos de aplicaciones. Una caracterstica importante de los programas en modo texto es que asumen un ancho constante de las fuentes, donde cada carcter tiene la misma anchura en pantalla, lo que permite mantener fcilmente la alineacin vertical cuando se muestran caracteres semi-grficos. Segn el entorno, el buffer de pantalla puede ser directamente accesible, como memoria convencional, para los programas locales. Los programas que muestran salidas en una terminal remota deben enviar secuencias de control especiales para manipular el buffer de pantalla. Los estndares ms populares de dichas secuencias de control son ANSI y VT100. Los programas que acceder al buffer de pantalla mediante secuencias de control pueden perder la sincronizacin con la pantalla real, por lo que muchos programas en modo texto tienen un comando para refrescar toda la pantalla, a menudo asociado con la combinacin de teclas Ctrl+L. La distincin entre los programas en modo texto y grfico puede a veces ser difusa, especialmente en ordenadores con tarjetas VGA, debido a que muchos programas en modo texto recientes llevaron al extremo las posibilidades de dicho hardware manipulando la controladora de vdeo. Por ejemplo, redefinan el juego de caracteres para crear caracteres semi-grficos a medida, e DAVID MONTIEL RAMIREZ
3

incluso simulaban un cursor de ratn grfico redefiniendo la apariencia de los caracteres sobre los que dicho cursor quedaba en cada momento. Tambin pueden usarse estas tcnicas para videojuegos 2D que necesiten aprovechar la mayor velocidad de manipulacin de los modos de texto respecto a los grficos. Muchos programas modernos con interfaz grfica simulan el estilo de los programas en modo texto, especialmente cuando es importante preservar la alineacin vertical del texto, por ejemplo, durante la programacin. Existen tambin componentes software que emulan modos de texto, tales como los emuladores de terminal o la consola de Windows. Bfer de vdeo. Fsicamente se encuentra ubicada en la tarjeta de vdeo, pero forma parte de la memoria RAM del PC, aunque su acceso es mucho ms lento que sta. Aqu se almacenan los datos que posteriormente sern visualizados en el monitor.

Un sistema de vdeo viene definido por los siguientes parmetros:

En la memoria RAM de vdeo en modo texto, dada una pgina determinada, la primera posicin la ocupa el primer carcter de la primera posicin de la pantalla (esquina superior izquierda: fila 0, columna 0), a continuacin viene el byte del atributo, luego el siguiente carcter de la lnea seguido de su byte de atributo y as sucesivamente. Cuando termina la primera lnea el siguiente carcter se corresponde con la primera posicin a la izquierda de la siguiente

DAVID MONTIEL RAMIREZ

fila y as sucesivamente. Podramos calcular la posicin en memoria de vdeo RAM de cualquier posicin de la pantalla mediante la siguiente frmula: Posicin en memoria = Lnea * 160 + Columna * 2. En el modo de texto slo se puede trabajar con los 256 (de 0 a 255) caracteres ASCII que podemos ver en el Apndice A, cada carcter ocupa una columna de las 80 que caben en cada una de las 25 filas posibles. Un pixel en modo grfico es el menor puntito que podemos iluminar en la pantalla, en el modo 13h es de 320 puntitos por cada una de las 200 lneas posibles. En ambos casos empezamos a contar desde la esquina superior izquierda, avanzando hacia la derecha y cuando llegamos al extremo derecho bajamos a la fila inmediatamente inferior en su extremo izquierdo.

4.1.1 Escritura directa en el bfer de vdeo


El bfer de vdeo se encuentra localizado en la posicin de memoria B800:0000 para tarjetas en color y en B000:0000 para tarjetas monocromo. De tal modo que podemos escribir directamente aqu sin usar las interrupciones BIOS o DOS para conseguir su salida a pantalla. Veamos a continuacin el mismo ejemplo anterior pero usando escritura directa al bfer de vdeo:

La ventaja que obtenemos escribiendo directamente en la memoria de vdeo es mucha mayor rapidez, puesto que las interrupciones son muy lentas, en cuanto a un programa crtico en tiempo, como puede ser un juego. Por contra saltarse el mtodo estndar, como son las interrupciones, supone un riesgo de encontrarse un hardware que no soporte nuestro mtodo de acceso a la memoria de vdeo, en este caso los resultados pueden ser impredecibles. Veamos ahora un ejemplo muy interesante de escritura directa al bfer de vdeo para escribir en cada pgina de vdeo:

DAVID MONTIEL RAMIREZ

4.1.2. Ejemplos completos en modo texto


Copper bars: Son unas barras que se mueven por la pantalla, incluso sobre el texto. Para ello modificaremos el color 0 (negro) desde que termina un barrido horizontal y antes de empezar el siguiente, de esta forma no notaremos ninguna interferencia en la pantalla. Este efecto no funciona bien en modo texto en la ventana MSDOS de mi Windows XP, pero s en el del Windows 98, por ejemplo (podremos verlo en Windows XP cambiando a modo grfico con MOV AH, 13h Int 10h). Para poderlos ver de forma correcta es necesario ejecutarlos a pantalla completa (Alt+Intro) sobre la ventana del MS-DOS. Existen dos formas bsicas de mover las barras: mediante un contador o siguiendo una matriz de datos correspondiente a la funcin seno, ello es debido a la que la funcin seno es cclica "sube y baja". Veamos el primer ejemplo de una barra sobre la pantalla con el primer mtodo.

4.2 Acceso a discos en lenguaje ensamblador


En un ordenador slo es posible trabajar directamente con los datos de la memoria RAM. Pero la memoria RAM es voltil, es decir, pierde su contenido cuando se apaga el ordenador. Por este motivo, para conservar datos de manera permanente se utilizan dispositivos de almacenamiento tales como disquetes o discos duros. En cualquier caso, cabe distinguir tres elementos: Unidad de Disco. Dispositivo mecnico formado por una pila de uno o ms discos (plato), que rotan sobre un eje, y dos o ms cabezas de lectura/escritura cuya misin es leer y escribir la informacin en el disco. En las unidades de disquetes el plato comienza a girar cada vez que se accede al disquete, mientras que en las unidades de disco duro el movimiento giratorio es constante durante todo el tiempo que est encendido el ordenador. El plato de un disco duro gira a una velocidad de entre 3.600 y 5.400 r.p.m.

DAVID MONTIEL RAMIREZ

Controlador de Disco. Dispositivo electrnico que establece la conexin entre el procesador y el disco. Por una parte, enlaza fsicamente la unidad de disco con el bus de datos (camino por el que fluyen los datos dentro del ordenador). Y por otro lado, transforma las peticiones del sistema operativo en instrucciones especiales que actan directamente sobre la unidad de disco. Disco. Dispositivo magntico que almacena la informacin. Normalmente, los discos se componen de una superficie circular plana de plstico (disquete) o metal (disco duro) recubierta de algn xido magnetizable. La informacin se graba sobre el disco mediante alteraciones de su superficie con un campo magntico.

4.2.1 Particiones del DOS.


Para usar un disco duro primero hay que particionarlo (FDISK) y a continuacin dar formato a cada una de las particiones (FORMAT). Bajo DOS, un disco duro puede tener dos particiones, una particin primaria y una particin extendida. La particin primaria es imprescindible y designa la particin en la cual se almacenan los ficheros de arranque del sistema. La particin primaria es la particin activa. La particin extendida puede dividirse a su vez en varias unidades lgicas. Una particin extendida slo puede crearse cuando ya existe una particin primaria.

4.2.2. Parmetros absolutos de un Disco Duro.


Para acceder a los parmetros del disco duro, independientemente del nmero de las particiones, hay que obtener el contenido de la palabra doble de memoria situada en la direccin 0000:0104 que contiene la direccin donde se guarda una tabla de 16 bytes con los parmetros absolutos de la primera unidad de disco duro.

DAVID MONTIEL RAMIREZ

Si se trata de una particin extendida, los datos de la entrada corresponden al total de las unidades lgicas que almacena. La particin extendida posee su propia tabla de particiones, pero slo se usan las dos primeras entradas. La primera entrada corresponde a la primera unidad lgica de la particin extendida, y la segunda indica si hay otra unidad lgica. En caso afirmativo, sta contiene de nuevo una tabla de particiones. Con ello se crea una especie de lista enlazada que permite acceder a la informacin de las diferentes particiones.

4.2.3 Acceso a dispositivos de almacenamiento


Un dispositivo de almacenamiento de acceso directo, es cualquier tipo de dispositivos de almacenamiento secundario que tiene un tiempo de acceso bajo en proporcin a su capacidad. Un disco es una superficie plana, magntica dividida en crculos concntricos a los cuales se les llama Tracks (pistas), adems de tener 2 lados, cabe mencionar que los primeros discos nicamente tenan 1 sola cara. Cada track est dividido en sectores, los cuales almacenan un determinado nmero de bytes. Las unidades de disco, son dispositivos capaces de leer o escribir en un disco para eso tiene una cabeza lectora quien realiza una operacin de moverse al track deseado (Seek Time), y luego espera por el sector seleccionado (Latency Time). 4.2.4.- Acceso a disco usando lenguaje ensamblador

DAVID MONTIEL RAMIREZ

Para leer o escribir en un disco, no se realiza byte a byte, sino ms bien en bloque de bytes, debido a que el acceso a disco implica movimientos mecnicos adems de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto que solo enva los comandos a la interface que maneja la unidad de disco y est es la que se encarga de leer o escribir informacin de un rea en especial de memoria, llamada DMA; en este proceso es conocido acceso directo a memoria. Rutinas que permiten lectura y escritura absoluta de sectores, as como la determinacin del espacio libre disponible en un disco. Rutina_AbsolutedRead: Transfiere el contenido de uno o ms sectores del disco al buffer especificado, accesando directamente a los sectores lgicos. En caso de error, se enciende el bit de acarreo y AX contiene el cdigo del error. Rutina_AbsoluteWrite: Transfiere el contenido del buffer especificado a uno o ms sectores de disco, accesando directamente a los sectores lgicos. En caso de error, se enciende el bit de acarreo y AX contiene el cdigo del error.

DAVID MONTIEL RAMIREZ

Rutina_FreeDiskSpace: Devuelven en DX:AX el espacio libre en disco (en Kb). En caso de error, se enciende el bit de acarreo.

DAVID MONTIEL RAMIREZ

10

4.3 Programacin del puerto serial


Puerto: Es un conjunto de lneas (interfaz) que puede utilizar el CPU para intercambiar informacin con otros dispositivos. Puerto Serie: Transmite un bit a la vez, e.g. RS-232. Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales, frecuentemente utilizado por computadoras y perifricos,donde la informacin es transmitida bit a bit enviando un solo bit a la vez, en contraste con el puerto paralelo que enva varios bits simultneamente. El canal serie del PC es uno de los recursos ms comunes para la conexin de perifricos como pueden ser dispositivos de puntero (mouse) o de comunicacin (modem, cables de conexin entre PCs). Configuracin del puerto serie Cada uno de los puertos COM tiene 7 registros a comentar: Registro base+0: tiene 3 funciones Transmitter Hlding Register (THR); Su funcin es la de transmitir un dato (palabra) por el Puerto. Reciver Data Register (RDR): Su funcin es la de recibir un dato (palabra) del puerto. Baud Rate Divisor Low (BRDL): Velocidad del canal, parte baja.

Registro base+1: Tiene 2 funciones Baud Rate Divisor High (BRDH): Velocidad del canal, parte alta. Interrupt Enable Register (IER): Activar o desactivar las interrupciones para el puerto COM.

Registro base+2: Interrupt ID Register (IIR): Controla la prioridad de las interrupciones. Registro Base+3: Line Control Register (LCR): Controla los parmetros de configuracin del canal serie (velocidad).

Registro base+4: Modem Control Register (MCR): Activa las seales del MODEM.

Registro base+5: Line Status Register (MSR): Muestra el estado del modem.

Registro base+6:

DAVID MONTIEL RAMIREZ

11

Modem Status Register (MSR): Muestra el estado del Modem.

Debemos configurar correctamente el puerto serial antes de trabajar con l. Y para configurarlo hacemos lo siguiente: Primero configuramos el LCR, pero poniendo el bit DLAB a 1. Luego configuro el DRDL, seguidamente el BRDH y finalmente vuelvo a configurar el LCR con los mismos bits que antes, pero esta vez el bit DLAB a 0.

4.3.1 Explicacin de los registros


LCR: Con este registro definimos (configuramos) los parmetros de la comunicacin serie. DLAB es el bit de ms peso y Num (1) el de menos peso.

Stop: Indica el nmero de bits de stop que enviar (o esperar) del puerto. Lo normal es poner un 0 en este bit para conseguir un bit de stop. Pero si ponemos un 1, el canal usar 1.5 bits de stop si el nmero de bits de la palabra (configurada en Num) es de 5. En caso de que sean ms de 5, se usaran 2 stop bits. Puede que en determinados momentos nos sea de utilidad, pero yo lo nico que veo es que enva 10 bits en lugar de 9, cosa que implica ms tiempo en l envi, as que siempre ponemos un 0 (1 stop bit). Paridad: Indica si hay paridad en la comunicacin serial. Con un 0 le diremos que nos queremos paridad, y con un 1 que s. La paridad es una manera de detectar errores, pero debemos programar nuestro programa para que lo detecte. As que de momento ponemos un 0. Tipo: Este bit nos indicar el tipo de paridad que vamos a usar. Con un 0 le indicaremos que vamos a mirar la paridad de modo impar, mientras que con 1 miraremos la paridad de modo par. Stick: Indica el nivel que usaremos para la paridad, si ponemos un 0, contaremos el nmero de 1 para la paridad. Y si ponemos un 1 contaremos el nmero de 0 para la paridad. Break: Fuerza un corte de la comunicacin. Si lo dejamos a 0 no pasar nada, pero si lo ponemos a i cortamos la comunicacin y forzamos la salida a 0.

DAVID MONTIEL RAMIREZ

12

DLAB: Bit interno, de uso no es decisivo. Lo que hace es configurar una vez el puerto poniendo a 1 este bit, configurar la velocidad (los 2 registros) y luego volver a configurar el puerto poniendo un 0.

4.3.2. Abrir un canal asociado a un puerto serie


Lo primero que necesitamos es un fichero asociado a nuestro puerto serie. Para eso usaremos la funcin del API CreateFile. CreateFile es una funcin con muchas opciones y que sirve para muchas cosas, pero ahora nos centraremos en el puerto serie. Veremos ahora los valores posibles de los siete parmetros que necesita esta funcin: 1. LPCTSTR lpFileName: Nombre del fichero. Se trata de una cadena que contiene el nombre del puerto que queremos abrir. Los valores posibles son "COM1", "COM2", "COM3" y "COM4". 2. DWORD dwDesiredAccess: Tipo de acceso. En general querremos leer y escribir en el puerto, por lo tanto especificaremos los valores GENERIC_READ | GENERIC_WRITE. 3. DWORD dwShareMode: modo en que se comparte el fichero. En nuestro caso, un puerto serie no puede ser compartido, de modo que usaremos 0 para este parmetro. 4. LPSECURITY_ATTRIBUTES lpSecurityAttributes: Atributos de seguridad, especifican el modo en que el fichero se puede heredar por procesos hijos. En nuestro caso no queremos que eso ocurra, de modo que usamos el valor NULL. 5. DWORD dwCreationDistribution: modo de creacin. Los puertos serie son dispositivos fsicos, por lo tanto, existen. El modo de creacin ser OPEN_EXISTING. 6. DWORD dwFlagsAndAttributes: Atributos del fichero. Por ahora no nos interesa ninguno de estos atributos, usaremos el valor 0. 7. HANDLE hTemplateFile: Plantilla de fichero. Se puede especificar un fichero existente del cual se copirarn los atributos. En nuestro caso no usaremos esta opcin, y usaremos el valor NULL para este parmetro.

idComDev = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

DAVID MONTIEL RAMIREZ

13

4.3.3 Modificar los parmetros de transmisin


En general, necesitaremos establecer los parmetros de la lnea serie que vamos a usar. Tendremos que fijar la velocidad de transmisin, el nmero de bits de datos, la paridad, y los bits de stop. Y a veces algunos parmetros ms. Para hacer esto, primero recuperaremos los parmetros del canal que acabamos de abrir, los modificaremos y actualizaremos la coniguracin del canal. Para recuperar los parmetros usaremos la funcin GetCommState. Esta funcin nos devuelve una estructura DCB, que contiene la configuracin actual del puerto serie. fSuccess = GetCommState(idComDev, &dcb); De todos los valores que incluye la estructura DCB, de momento slo nos preocuparemos por unos pocos: 1. DWORD BaudRate: Velocidad en baudios. Este parmetro puede tener los siguientes valores: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000 y CBR_256000. 2. BYTE ByteSize: Tamao de los datos en bits. Tradicionalmente 7 u 8. 3. BYTE Parity: Valor de paridad. Se admiten los valores EVENPARITY, para paridad par; MARKPARITY; NOPARITY, para no paridad y ODDPARITY, para paridad impar. 4. BYTE StopBits: Bits de stop. Admite los valores ONESTOPBIT, 1 bit de stop; ONE5STOPBITS, 1.5 bits de stop y TWOSTOPBITS, 2 bits de stop. Una vez que hemos actualizado la estructura de datos podemos configurar el puerto envindosela mediante la funcin: GetCommState. SetCommState(idComDev, &dcb);

4.3.4. Monitorizacin de eventos


Podemos especificar qu eventos de los que se pueden producir en el puerto serie nos interesa procesar o monitorizar. De este modo, el sistema operativo nos avisar cada vez que se produzca uno de esos eventos. El modo de especificar los eventos de inters es mediante una mscara, y para hacerlo usaremos la funcin SetCommMask. Se pueden especificar varios eventos, pero generalmente nos interesararn slo dos de ellos, al menos en la aplicaciones normales: DAVID MONTIEL RAMIREZ
14

1. EV_RXCHAR: se ha recibido un carcter y se a colocado en el buffer de entrada. 2. EV_TXEMPTY: de ha enviado el ltimo carcter del buffer de salida. Para nuestro ejemplo slo monitorizaremos el evento EV_RXCHAR.

4.3.5. Escribir en el puerto serie


Para enviar caracteres al puerto serie se usa la funcin WriteFile. Sin embargo, como ya hemos explicado, no basta con enviar los caracteres al puerto serie, el destinatario puede interrumpir la transmisin si no es capaz de procesar los datos a la misma velocidad que se los enviamos, de modo que los datos que intentamos enviar pueden no ser enviados por completo. Para estar seguros de que enviamos toda la informacin que queremos, usaremos uno de los parmetros que devuelve la funcin, y que nos dice cuntos caracteres se han enviado. Colocando la funcin WriteFile en un bucle, podemos enviar los caracteres que an estn pendientes hasta que todos hayan sido enviados. WriteFile puede retornar con valor false si se ha producido un error. Sin embargo, uno de los errores no es tal, el error ERROR_IO_PENDING en realidad slo nos informa de que no se ha completado la operaci n de escritura. En caso de recibir ese error, debemos continuar enviado datos al puerto serie. void EscribirSerie(char *buf) { char Buffer[1024]; DWORD n, l, p, err; strcpy(Buffer, buf); l = strlen(Buffer); // Longitud de los datos p = 0; // Posicin actual de los datos a enviar while(l) { if(!WriteFile(idComDev, &Buffer[p], 1, &n, NULL)) { err = GetLastError(); if(err != ERROR_IO_PENDING) { Comunicacion = false; return; } } DAVID MONTIEL RAMIREZ
15

l -= n; p += n; } }

4.3.6 Esperar a que haya algo para leer


Por la misma naturaleza de las transmisiones, y debido a que nuestro ordenador normalmente ser muy rpido en comparacin con las velocidades de transmisin, la mayor parte del tiempo no estaremos recibiendo nada por el puerto serie. Ya hemos definido la mscara de eventos que queremos recibir del puerto serie. Para saber si se ha producido uno de esos eventos tenemos que llamar a la funcin WaitCommEvent. Pero, tal como hemos configurado el puerto serie, esta funcin no regresa mientras no se produzca uno de los eventos que hemos definido. Esto nos impide que nuestro programa realice otras tareas, como por ejemplo, enviar informacin al puerto. Necesitamos un mecanismo que avise a nuestro programa cuando existan datos para leer, pero no debemos bloquear el sistema preguntando constantemente si hay algo preparado. Ni siquiera debemos bloquear nuestro programa, a menudo hay otras cosas que hacer adems de esperar la llegada de nueva informacin. La mejor forma es introducir la funcin WaitCommEvent en un hilo distinto del de nuestro programa principal. Podemos hacer que ese hilo espere a que se produzca un evento, y cuando eso ocurra, que lo procese. En nuestro caso, slo se puede producir un evento, de modo que una funcin posible para procesarlo es: // Hilo de escucha del puerto serie: DWORD Hilo(LPDWORD lpdwParam) { DWORD dwEvtMask; do { if(WaitCommEvent(idComDev, &dwEvtMask, NULL)) if(dwEvtMask & EV_RXCHAR) LeeSerie(); } while(true); DAVID MONTIEL RAMIREZ

16

return 0; } Esta funcin coloca la funcin WaitCommEvent en un bucle infinito, y cuando detecta el evento EV_RXCHAR, hace una llamada a la funcin LeeSerie(), que procesa los datos recibidos. Por supuesto, en algn lugar del programa, debemos lanzar el hilo, esto se hace con la funcin CreateThread. hHilo = CreateThread(NULL, 0, Hilo, &param, 0, &id);

4.3.7 Leer desde el puerto serie


Lo primero que necesitamos saber es cuantos caracteres hay en el buffer de entrada. Para eso podemos usar la funcin ClearCommError. Esta funcin nos actualiza una estructura COMSTAT, uno de cuyos miembros es cbInQue, que nos dice cuantos caracteres hay en el buffer de entrada. Con ese dato podemos llamar a la funcin ReadFile, y leer todos los caracteres que haya en el buffer. // Leer datos del puerto serie: void LeeSerie() { int i, j, k; DWORD x; COMSTAT cs; // Actualizar COMSTAT, sirve para // averiguar el nmero de bytes en el buffer de entrada: ClearCommError(idComDev, &x, &cs); // Leer cs.cbInQue caracteres: ReadFile(idComDev, cad, cs.cbInQue, &x, NULL); // Actualizar el fin de cadena: cad[x]=0; // Mostrar caracteres ledos: cout << cad; return; }

DAVID MONTIEL RAMIREZ

17

4.4 Programacin del puerto paralelo


Puerto Paralelo: Transmite ms de un bit a la vez, e.g. 8-bits. Originalmente, el puerto paralelo de la PC, fue pensado para conectar impresoras, pero puede ser usado para manejar dispositivos en general .Las 12 salidas TTL (0-5v) usan latches internos y pueden programarse va instrucciones IN/OUT del CPU. El puerto paralelo de una PC es ideal para ser usado como herramienta de control de motores, LED's, etc. El mismo posee un bus de datos de 8 bits (Pin 2 a 9) y muchas seales de control, algunas de salida y otras de entrada que tambin pueden ser usadas fcilmente. Las PC's generalmente poseen solo uno de estos puertos (LPT1) pero se le puede adicionar una tarjeta con un segundo puerto paralelo (LPT2). En reglas generales la direccin hexadecimal del puerto LPT1 es igual a 0x378 (888 en decimal) y 0x278 (632 en decimal) para el LPT2. Esto se puede verificar fcilmente en el setup de la PC. Las 5 entradas son "steady-state input points" y pueden programarse va instrucciones IN del CPU, las 3 direcciones del puerto (DATA, STATUS, CONTROL) inician comnmente en la 378H (otras direcciones comunes son la 278H y 3BCH); una de las lneas de entrada es adems una interrupcin (que puede habilitarse va programa) y ademas hay una lnea tipo "power-on reset"Buscando Direcciones del Puerto Paralelo. Normalmente la PC tiene definidos tres puertos paralelo de impresin: LPT1, LPT2 y LPT3: LPT: En las localidades 0000:0408H a 0000:040DH de la PC se encuentran las direcciones de cada puerto [5] EJEMPLO: Sean los siguientes valores de una PC hipottica Tabla 1. LPT1 se localiza en 378H, LPT2 en 278H y LPT3 no est presente.

DAVID MONTIEL RAMIREZ

18

Podemos localizar la direccin precisa de cada puerto paralelo en una PC de las siguientes formas: Desde DEBUG: Mediante el comando d 0:408 40d Desde Windows: Inicio / Configuracin / Panel de Control / Sistema / Administrador de Dispositivos / Puertos (COM y LPT) / Puerto de Impresora / Recursos. Programando el Puerto Paralelo Control de Impresora: Se envan datos comandos seguidos de una seal strobe que ocasiona que la impresora lea el puerto y responda por las lneas de status cuando est lista para recibir ms informacin (not bussy) en su defecto, indica si hay algn error Opciones para Controlar el Puerto Paralelo [4]: Acceso Directo: Usando ensamblador o un lenguaje de programacin, leyendo variables del sistema, manipulando bits y leyendo/escribiendo puertos Via BIOS: La INT 17H del BIOS prove 3 servicios: inicializar, imprimir y status (slo trabajan para LPT1)Via DOS: La INT 21H servicio 05h escribe un caracter y el servicio 40h que trabaja con archivos.

4.4.1 Conector Puerto Paralelo

El puerto paralelo de un PC posee un conector de salida del tipo DB25 hembra cuyo diagrama y seales utilizadas podemos ver en la siguiente figura:

DAVID MONTIEL RAMIREZ

19

Caractersticas del puerto paralelo LPT En el mbito de la electrnica comercial se le denomina como conector DB25 ("Dsubminiature type B, 25 pin"), esto es D-subminiatura tipo B, con 25 huecos para pines. Se utilizaba principalmente para la conexin de impresoras, unidades de lectura para discos ZIP y escneres. Para conectar y desconectar los dispositivos, as como para que la computadora los reconozca de manera correcta, es necesario apagar y reiniciar la computadora. Modos del puerto paralelo LPT a) Modo SPP: significa ("Standar Parallel Port") "puerto paralelo estndar". Es el estndar con que se identific al puerto paralelo inicialmente, es el mas compatible y actualmente este modo hay que activarlo desde el BIOSSETUP de la computadora para que el sistema reconozca impresoras antiguas. Permite una velocidad de transferencia entre 150KiloBytes/segundo (KB/s) a 500 KB/s. b) Modo EPP: significa ("Enhanced Parallel Port") su traduccin al espaol es puerto paralelo mejorado. Se dise para leer y escribir a la velocidad del bus ISA alcanzando velocidades de transferencia de hasta 1 MB/s. Permite la comunicacin bi-direccional entre la computadora y el dispositivo (IEEE1284) y es compatible con SPP. Permite una velocidad de transferencia entre 500 KiloBytes/segundo (KB/s) a 2 MegaBytes/segundo (MB/s). c) Modo ECP: significa ("Enhanced Capabilities Port") su traduccin al espaol es puerto de capacidad mejorada. Posee capacidad DMA (Direct Memory Access) capacidad directa para envo de datos hacia la memoria RAM, lo que reduce el tiempo de respuesta; supera la DAVID MONTIEL RAMIREZ

20

transferencia de 1 MegaByte/segundo (MB/s) y permiten la emulacin de otros modos cuando sea necesario. Permite la comunicacin bi-direccional entre la computadora y el dispositivo (IEEE1284), adems es compatible con SPP y EPP.

4.5 Programacin hbrida


La programacin hibrida es utilizada en los casos en donde el cdigo en ensamblador dificulta la estructuracin del programa. La programacin hbrida proporciona un mecanismo por medio del cual podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin escribir programas ms rpidos y eficientes. Las directivas de programacin hibrida son aquellas que nos permiten ejecutar los comandos de ensamblador en un lenguaje de alto nivel. La programacin hbrida proporciona un mecanismo por medio del cual podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin de escribir programas ms rpidos y eficientes. Directivas para compilacin hbrida: La compilacin hibrida es utilizada en lo que es conocida como programacin hibrida (vlgase la redundancia). La programacin hibrida es utilizada en los casos en donde el cdigo en ensamblador dificulta la estructuracin del programa. La programacin hbrida proporciona un mecanismo por medio del cual podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin escribir programas ms rpidos y eficientes. Ejemplo: la red es el siguiente donde utilizamos cdigo en ensamblador y cdigo pascal. El siguiente cdigo sirve para limpiar pantalla, est escrito en ensamblador dentro de una funcin en pascal, lo que es lo mismo a la funcin ClrScr en pascal. En fin podemos mezclar el cdigo ensamblador con el cdigo de cualquier otro lenguaje que admita este procedimiento. En pascal antes de escribir el cdigo en ensamblador ay que poner Asm y al final de nuestro cdigo End.

4.5.1 Operadores
Operadores Aritmticos: Pueden
21

DAVID MONTIEL RAMIREZ

emplearse libremente (+), (-), (*) y (/). En este ltimo caso la divisin es siempre entera. Tambin se admiten los operadores MOD (resto de la divisin) y SHL/SHR (desplazar a la izquierda/derecha cierto nmero de bits). Operadores Lgicos: Pueden ser el AND, OR, XOR y NOT. Realizan las operaciones lgicas en las expresiones. Operadores relacionales: Devuelven condiciones de cierto (0FFFFh o 0FFh) o falso (0) evaluando una expresin. Pueden ser: EQ (igual), NE (no igual), LT (menor que), GT (mayor que), LE (menor o igual que), GE (mayor o igual que). Operadores de retorno de valores: Operador SEG: devuelve el valor del segmento de la variable o etiqueta, silo se puede emplear en programas de tipo EXE: Operador OFFSET: devuelve el desplazamiento de la variable o etiqueta en su segmento:

Si se desea obtener el offset de una variable respecto al grupo (directiva GROUP) de segmentos en que est definida y no respecto al segmento concreto en que est definida:

Operador .TYPE: Devuelve el modo de la expresin indicada en un byte. El bit 0 indica modo relativo al cdigo y el 1 modo relativo a datos, si ambos bits estn inactivos significa modo absoluto. El bit 5 indica si la expresin es local (0 si est definida externamente o indefinida); el bit 7 indica si la expresin contiene una referencia externa. El TASM utiliza tambin el bit 3 para indicar algo que desconozco. Este operador es til sobre todo en las macros para determinar el tipo de los parmetros:

DAVID MONTIEL RAMIREZ

22

Operador TYPE: devuelve el tamao (bytes) de la variable indicada. No valido en variables DUP:

Operadores MASK y WIDTH: Informan de los campos de un registro de bits (base RECORD). Operadores de Atributos: Operador PTR: redefine el atributo QWORD, TBYTE) o el de distancia de tipo (BYTE, WORD, DWORD,

(NEAR o FAR) de un operando de memoria. Por ejemplo, si se tiene una tabla definida de la siguiente manera: Para colocar en AL el primer byte de la misma, la instruccin MOV AL, tabla es incorrecta, ya que tabla (una cadena 10 palabras) no cabe en el registro AL. Lo que desea el programador es indicrselo en este caso explcitamente al ensamblador de la siguiente manera:

Trabajando con varios segmentos, PTR puede redefinir una etiqueta NEAR de uno de ellos para convertirla en FAR desde el otro, con objeto de poder llamarla. Operadores CS:, DS:, ES: y SS: El ensamblador genera un prefijo de un byte que indica al microprocesador el segmento que debe emplear para acceder a los datos en memoria. Por defecto, se supone DS para los registros BX, DI o SI (o sin registros de base o ndice) y SS para SP y BP. Si al acceder a un dato este no se encuentra en el segmento por defecto, el ensamblador aadir el byte adicional de manera automtica. Sin embargo, el programador puede forzar tambin esta circunstancia:

DAVID MONTIEL RAMIREZ

23

4.6 Programacin de puerto USB


USB viene de frase en Ingles Universal Serial Bus que se utiliza para describir un tipo de puerto en la computadora personal en donde se conectan distintos perifricos tales como mquinas de imprimir, cmaras fotogrficas, teclados de computadoras e infinidad de productos de uso generalizado. Un puerto es una localizacin en la computadora en donde conectamos los perifricos. Estos pueden enviar informacin a la computadora, recibir informacin de la misma o hacer ambas cosas. La computadora personal moderna tiene dos puertos tpicos de conexin: a) El puerto USB descrito anteriormente b) El puerto Ethernet usado para conectar la computadora personal a la Internet Tambin incluye internamente otros puertos nombrados PCI etc. para usos en aplicaciones que requieran mayores velocidades de transferencia de informacin los cuales no fueron objeto de investigacin en este trabajo. Nos concentramos especficamente en el puerto USB.

DAVID MONTIEL RAMIREZ

24

Bibliografa
http://www.abreojosensamblador.net/Productos/AOE/html/Pags/Cap08.html http://expo.itch.edu.mx/view.php?f=asm_31 http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r86275.PDF Ensamblador del 80/86.Facultad de informtica. Universidad Apuntes realizados por Juan Fernndez Peinador. de Murcia.

http://arcaicospr.com/uploads/3/0/4/9/3049639/uso_del_puerto_usbuniversal_serial_bus_de_la_ pc_nov_09_2011.pdf http://es.scribd.com/doc/44098211/programacion-hibrida

DAVID MONTIEL RAMIREZ

25