Sei sulla pagina 1di 12

1

PRESENTACION

El presente documento es una breve recopilacin de datos referentes a como se programa el puerto paralelo para su utilizacin en automatismos, circuitos electronicos controlados por computadora y en demostraciones didacticas de cmo un sistema operativo, como lo es Windows, controla el puerto para la muestra de datos. Este articulo esta referenciado en datos obtenidos en diferentes paginas de Internet, ante lo cual agradezco de antemano a sus diferentes autores que esa informacion sea de carcter abierto. Para poder entender algunos aspectos de la programacin, se recomienda tener algunos conocimientos basicos en el lenguaje de programacin C y de la electronica de control, mas que nada en lo que respecta a la comprensin de conceptos como lo son librerias de instrucciones, instrucciones basicas, el concepto de palabra reservada y programa principal. Espero este trabajo sea de su agrado y realmente le sirva como un apoyo en la enseanza de la programacin de sistemas para la comunicacin hardware-software, agradezco su atencin de antemano y disfruten de este trabajo.

COMO PROGRAMAR EL PUERTO PARALELO

Ing. Jose Antonio Ruiz Laureano


Ingeniero Electronico en Computacin

Ing. Jose Antonio Ruiz Laureano

4 main, desde la cual es posible llamar a otras funciones. Cada funcin estar formada por la cabecera de la funcin, compuesta por el nombre de la misma y la lista de argumentos (si los hubiese), la declaracin de las variables a utilizar y la secuencia de sentencias a ejecutar. Ejemplo:
declaraciones globales main( ) { variables locales bloque } funcion1( ) { variables locales bloque }

UNIDAD 1
ALGUNOS ASPECTOS DE PROGRAMACION
Esta primera unidad se enfocara bsicamente a dar algunos aspectos de la programacin en C/C++ que son necesarios para programar el puerto. Cabe mencionar que no se pretende ensear el lenguaje en esta unidad, solo describe de manera muy general las sentencias y palabras que se requieren en la programacin del puerto, si se requiere conocer mas sobre el lenguaje se recomiendan varios cursos para conocer este lenguaje tan poderoso. Primeramente se dara una descripcin muy general de lo que es el lenguaje C/C++ y su estructura. El lenguaje C/C++ se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan del cdigo fuente para funcionar (P.ej: Basic). Los compilados convierten el cdigo fuente en un fichero objeto y ste en un fichero ejecutable. Este es el caso del lenguaje C/C++. Podemos decir que el lenguaje C/C++ es un lenguaje de nivel medio, ya que combina elementos de lenguaje de alto nivel con la funcionalidad del lenguaje ensamblador. Es un lenguaje estructurado, ya que permite crear procedimientos en bloques dentro de otros procedimientos. Hay que destacar que el C es un lenguaje portable, ya que permite utilizar el mismo cdigo en diferentes equipos y sistemas informticos: el lenguaje es independiente de la arquitectura de cualquier mquina en particular. Estructura de un programa en C/C++ Todo programa en C/C++ consta de una o ms funciones, una de las cuales se llama main. El programa comienza en la funcin

Los comentarios A la hora de programar es conveniente aadir comentarios (cuantos ms mejor) para poder saber que funcin tiene cada parte del cdigo, en caso de que no lo utilicemos durante algn tiempo. Adems facilitaremos el trabajo a otros programadores que puedan utilizar nuestro archivo fuente. Para poner comentarios en un programa escrito en C usamos los smbolos /* y */:
/* Este es un ejemplo de comentario */ /* Un comentario tambin puede estar escrito en varias lneas */

El smbolo /* se coloca al principio del comentario y el smbolo */ al final. El comentario, contenido entre estos dos smbolos, no ser tenido en cuenta por el compilador.

5 Palabras clave Existen una serie de indicadores reservados, con una finalidad determinada, que no podemos utilizar como identificadores. A continuacin vemos algunas de estas palabras clave:
char double else short static continue sizeof int if do long default break typedef float while extern register for

6 La directiva #define no slo nos permite sustituir un nombre por un valor numrico, sin tambin por una cadena de caracteres. El valor de una constante no puede ser modificado de ninguna manera.
switch

Secuencias de escape Ciertos caracteres no representados grficamente se pueden representar mediante lo que se conoce como secuencia de escape. A continuacin vemos una tabla de las ms significativas: \n \b \t \v \\ \f \' \" \0 salto de lnea retroceso tabulacin horizontal tabulacin vertical contrabarra salto de pgina apstrofe comillas dobles fin de una cadena de caracteres

Variable Una variable es un tipo de dato, referenciado mediante un identificador (que es el nombre de la variable). Su contenido podr ser modificado a lo largo del programa. Una variable slo puede pertenecer a un tipo de dato. Para poder utilizar una variable, primero tiene que ser declarada:
[calificador] <tipo> <nombre>

Es posible inicializar y declarar ms de una variable del mismo tipo en la misma sentencia:
[calificador]<nombre1>,<nombre2>=<valor>,<nombre3>=<valor>

Constantes Al contrario que las variables las constantes mantienen su valor a lo largo de todo el programa. Para indicar al compilador que se trata de una constante, usaremos la directiva #define:
#define <identificador> <valor>

Inclusin de librerias En la programacin en C es posible utilizar funciones que no esten includas en el propio programa. Para ello utilizamos la directiva #include, que nos permite aadir libreras o funciones que se encuentran en otros archivos a nuestro programa indicando que
se encuentran en el directorio por defecto del compilador.

#include <misfunc.h> Operadores A continuacin se explican los tipos de operadores (aritmticos y de asignacin) que permiten realizar operaciones matemticas en lenguaje C. Existen dos tipos de operadores aritmticos: Los binarios:

Observe que no se indica el punto y coma de final de sentencia ni tampoco el tipo de dato.

7
+ * / % Suma Resta Multiplicacin Divisin Mdulo (resto)

8 Operadores relacionales Los operadores relacionales se utilizan para comparar el contenido de dos variables. En C existen seis operadores relacionales bsicos: > < >= <= == != Mayor que Menor que Mayor o igual que Menor o igual que Igual que Distinto que

y los unarios:
++ -Incremento (suma 1) Decremento (resta 1) Cambio de signo

Su sintaxis es: binarios: <variable1><operador><variable2> unarios: <variable><operador> <operador><variable>. Operadores de asignacion La mayora de los operadores aritmticos binarios explicados anteriormente tienen su correspondiente operador de asignacin: = += -= *= /= %= Asignacin simple Suma Resta Multiplicacin Divisin Mdulo (resto)

El resultado que devuelven estos operadores es 1 para Verdadero y 0 para Falso. Funcion de salida de datos en pantalla. La rutina printf permite la aparicin de valores numricos, caracteres y cadenas de texto por pantalla. El prototipo de la sentencia printf es el siguiente: printf(control,arg1,arg2...); En la cadena de control indicamos la forma en que se mostrarn los argumentos posteriores. Tambin podemos introducir una cadena de texto ( sin necesidad de argumentos ), o combinar ambas posibilidades, as como secuencias de escape. En el caso de que utilicemos argumentos deberemos indicar en la cadena de control tantos modificadores como argumentos vayamos a presentar. Funcion de entrada de datos desde teclado La rutina scanf permite entrar datos en la memoria del ordenador a travs del teclado. El prototipo de la sentencia scanf es el siguiente: scanf(control,arg1,arg2...);

Con estos operadores se pueden escribir, de forma ms breve, expresiones del tipo: n=n+3 se puede escribir n+=3 k=k*(x-2) lo podemos sustituir por k*=x-2

9 En la cadena de control indicaremos, por regla general, los modificadores que harn referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modificadores estarn formados por el caracter % seguido de un caracter de conversin. Los argumentos indicados sern, nuevamente, las variables. La principal caracterstica de la sentencia scanf es que necesita saber la posicin de la memoria del ordenador en que se encuentra la variable para poder almacenar la informacin obtenida. Para indicarle esta posicin utilizaremos el smbolo ampersand ( & ), que colocaremos delante del nombre de cada variable. ( Esto no ser necesario en los arrays ). Sentencias condicionales Este tipo de sentencias permiten variar el flujo del programa en base a unas determinadas condiciones. Existen varias estructuras diferentes: Estructura IF...ELSE Sintaxis: if (condicin) sentencia; La sentencia solo se ejecuta si se cumple la condicin. En caso contrario el programa sigue su curso sin ejecutar la sentencia. Otro formato: if (condicin) sentencia1; else sentencia2; Si se cumple la condicin ejecutar la sentencia1, sin ejecutar la sentencia2. En cualquier caso, el programa continuar a partir de la sentencia2. Sentencia FOR Su sintaxis es:

10 for (inicializacin;condicin;incremento){ sentencia1; sentencia2; } La inicializacin indica una variable (variable de control) que condiciona la repeticin del bucle. Si hay ms, van separadas por comas: for (a=1,b=100;a!=b;a++,b- -){ Sentencia DO...WHILE Su sintaxis es: do{ sentencia1; sentencia2; }while (condicin); Con esta sentencia se controla la condicin al final del bucle. Si sta se cumple, el programa vuelve a ejecutar las sentencias del bucle. Pues bien, una vez vistos estos aspectos (recordando que esta unidad no pretendia ensear a programar en C, si no solo conocer los aspectos basicos del mismo para la programacin del puerto) corresponde ahora solo practicarlos realizando programas de control hacia el puerto, relacionandolos con los datos necesarios que seran requeridos en su momento.

11

UNIDAD 2
ESTRUCTURA DEL PUERTO PARALELO
Una vez vistos los aspectos basicos de la programacin en C, que sera requerida para controlar dispositivos con el puerto de la PC, ahora toca ver los aspectos relacionados al hardware, la estructura del puerto, como funciona este. Los puertos de comunicacin de la PC son de particular inters para el estudioso de la electrnica ya que le permiten utilizar una computadora personal para controlar todo tipo circuitos electrnicos utilizados, principalmente, en actividades de automatizacin de procesos, adquicisin de datos, tareas repetitivas y otras actividades que demandan precisin. Existen dos mtodos bsicos para transmisin de datos en las computadoras modernas. En un formato de transmisin de datos en serie un dispositivo enva datos a otro a razn de un bit a la vez a travs de un medio. Por otro lado, en un formato de transmisin de datos en paralelo un dispositivo enva datos a otro a una tasa de n nmero de bits a travs de n nmero de medios a un tiempo. Sera fcil pensar que un sistema en paralelo es n veces ms rpido que un sistema en serie, sin embargo sto no se cumple, bsicamente el impedimiento principal es el tipo de cable que se utiliza para interconectar los equipos. Si bin un sistema de comunicacin en paralelo puede utilizar cualquier nmero de cables para transmitir datos, la mayora de los sistemas paralelos utilizan ocho lneas de datos para transmitir un byte a la vez. Un tpico sistema de comunicacin en paralelo puede ser de una direccin (unidireccional) o de dos direcciones (bidireccional). Donde tambien distinguimos dos elementos: la parte transmisora y la parte receptora. La parte transmisora coloca la informacin en

12 las lneas de datos e informa a la parte receptora que la informacin (los datos) estn disponibles; entonces la parte receptora lee la informacin en las lneas de datos e informa a la parte transmisora que ha tomado la informacin (los datos). Observe que mbas partes sincronizan su respectivo acceso a las lneas de datos, la parte receptora no leer las lneas de datos hasta que la parte transmisora se lo indique en tanto que la parte transmisora no colocar nueva informacin en las lneas de datos hasta que la parte receptora remueva la informacin y le indique a la parte transmisora que ya ha tomado los datos, a sta coordinacin de operaciones se le llama acuerdo entendimiento el cual es llamado handshaking. Para implementar el handshaking se requieren dos lneas adicionales. La lnea de strobe es la que utiliza la parte transmisora para indicarle a la parte receptora la disponibilidad de informacin. La lnea de admisin (acknowledge) es la que utiliza la parte receptora para indicarle a la parte transmisora que ha tomado la informacin (los datos) y que est lista para recibir ms datos. El puerto paralelo provee de una tercera lnea de handshaking llamada en ingls busy (ocupado), sta la puede utilizar la parte receptora para indicarle a la parte transmisora que est ocupada y por lo tanto la parte transmisora no debe intentar colocar nueva informacin en las lneas de datos. Una tpica sesin de transmisin de datos se parece a lo siguiente: 1. La parte transmisora checa la lnea busy para ver si la parte receptora est ocupada. Si la lnea busy est activa, la parte transmisora espera en un bucle hasta que la lnea busy est inactiva. La parte transmisora coloca la informacin en las lneas de datos. La parte transmisora activa la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est activa. La parte transmisora inactiva la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est inactiva.

2. 3. 4. 5. 6.

13 7. La parte transmisora repite los pasos anteriores por cada byte a ser transmitido. 8. La parte receptora inactiva la lnea busy (asumiendo que est lista para recibir informacin). 9. La parte receptora espera en un bucle hasta que la lnea strobe est activa. 10. La parte receptora lee la informacin de las lneas de datos (y si es necesario, procesa los datos). 11. La parte receptora activa la lnea acknowledge. 12. La parte receptora espera en un bucle hasta que est inactiva la lnea de strobe. 13. La parte receptora inactiva la lnea acknowledge. 14. La parte receptora repite los pasos anteriores por cada byte que debe recibir. Se debe ser muy cuidadoso, tanto la parte transmisora como la receptora coordinan sus acciones de tal manera que la parte transmisora no intentar colocar varios bytes en las lneas de datos, en tanto que la parte receptora no debe leer ms datos que los que le enve la parte transmisora, un byte a la vez. Estructura del puerto paralelo El puerto paralelo de una tpica PC utiliza un conector hembra de tipo D de 25 pines (DB-25). El orden de los pines del conector es ste:

14 Pin 1 E/S Salida Polaridad Descripcin 0 Strobe Lneas de datos (bit 0/patita 2, bit 7/patita 9) Lnea acknowledge (activa cuando el sistema remoto toma datos) Lnea busy (si est activa, el sistema remoto no acepta datos) Lnea Falta de papel (si est activa, falta papel en la impresora) Lnea Select (si est activa, la impresora se ha seleccionado) Lnea Autofeed (si est activa, la impresora inserta una nueva lnea por cada retorno de carro) Lnea Error (si est activa, hay un error en la impresora) Lnea Init (Si se mantiene activa por al menos 50 micro-segundos, sta seal autoinicializa la impresora) Lnea Select input (Cuando est inactiva, obliga a la impresora a salir de lnea) Tierra elctrica

2 ~ 9 Salida 10

Entrada 0

11

Entrada 0

12

Entrada 1

13

Entrada 1

14

Salida

15

Entrada 0

16

Salida

17 La siguiente tabla describe la funcin de cada patita del conector 1284 tipo A:

Salida

0 -

18 ~ 25

Observe que el puerto paralelo tiene 12 lneas de salida (8 lneas de datos, strobe, autofeed, init, y select input) y 5 de entrada (acknowledge, busy, falta de papel, select y error).

15 Hay tres direcciones de E/S asociadas con un puerto paralelo de la PC, stas direcciones pertenecen al registro de datos, el registro de estado y el registro de control. El registro de datos es un puerto de lectura-escritura de ocho bits. Leer el registro de datos (en la modalidad unidireccional) retorna el ltimo valor escrito en el registro de datos. Los registros de control y estado proveen la interface a las otras lneas de E/S. La distribucin de las diferentes seales para cada uno de los tres registros de un puerto paralelo esta dada en las siguientes tablas: Direccin Nombre Base + 0 Puerto de datos Lectura/Escritura Escritura Bit # Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Propiedades Dato 7 Dato 6 Dato 5 Dato 4 Dato 3 Dato 2 Dato 1 Dato 0

16 Bit 2 IRQ (Not) Bit 1 Reservado Bit 0 Reservado Tabla 2: Registro de estado Direccin Nombre Base + 2 Puerto de control Lectura/Escritura Lectura/Escritura Bit Propiedades # Bit 7 No usado Bit 6 No usado Permite Bit 5 puerto bidireccional Permite IRQ a travs de la Bit 4 lnea acknowledge Selecciona Bit 3 impresora Inicializa Bit 2 impresora Nueva lnea Bit 1 automtica Bit 0 Strobe

Tabla 1: Registro de datos Direccin Nombre Base + 1 Puerto de estado Lectura/Escritura Slo Lectura Bit # Propiedades Tabla 3: Registro de control

Bit 7 Busy Bit 6 Acknowledge Falta de Bit 5 papel Bit 4 Select In Bit 3 Error

Una PC soporta hasta tres puertos paralelo separados, por tanto puede haber hasta tres juegos de registros en un sistema en un momento dado. Existen tres direcciones base para el puerto paralelo asociadas con tres posibles puertos paralelo: 0x3BCh, 0x378h y 0x278h, nos referimos a stas como las direcciones base para el puerto LPT1, LPT2 y LPT3, respectivamente.

17 El registro de datos se localiza siempre en la direccin base de un puerto paralelo, el registro de estado aparece en la direccin base + 1, y el registro de control aparece en la direccin base + 2. Por ejemplo, para un puerto LPT2 localizado en 0x378h, sta es la direccin del registro de datos, al registro de estado le corresponde la direccin 0x379h y su respectivo registro de control est en la direccin 0x37Ah. Cuando la PC se enciende el BIOS ejecuta una rutina para determinar el nmero de puertos presentes en el sistema asignando la etiqueta LPT1 al primer puerto localizado, si existen ms puertos entonces se asignarn consecutivamente las etiquetas LPT2 y LPT3.

UNIDAD 3
PROGRAMACION DEL PUERTO PARALELO

18

Una vez vistos los aspectos basicos de la programacin y como esta estructurado el puerto y como este funciona, ahora si en esta unidad se citara lo que realmente compete a este documento. Primeramente, se dira que para poder visualizar el valor de los datos del puerto de datos, utilizaremos algunos dispositivos electronicos, llamados LED (diodo emisor de luz) apoyados por unos resistores que limitan la corriente y ayudan a que los LED no se quemen. En lo que respecta a la planeacion de los datos que deseamos mostrar en el puerto, nos podemos, y es sugerencia, apoyar en tablas de estado de puerto (asi yo las llamo) que se veran en cada ejemplo. Pues bien, ya una vez mencionados estos detalles, se describen a continuacion la estructura de los programas de entrada y salida de datos asi como ejemplos basicos de la programacin del puerto (recordando que trabajo con valores binarios, las salidas o las entradas solo pueden tener 2 valores: 0 o 1) MUESTRA DE INFORMACION EN EL PUERTO La linea principal que permite mostrar datos en el puerto, es la linea que mas sera utilizada y varia segn el tipo de compilador que se este utilizando. Si estas utilizando un compilador de C/C++ version 3.0 de Borland o inferior la estructura es asi: Librera requerida: dos.h Linea a utilizar: outportb(dir_puerto, valor);

19 Si se trata de un compilador C/C++ 4.0 o superior de Borland o Microsoft: Librera requerida: conio.h Linea a utilizar: outp(dir_puerto, valor); Donde: dir_puerto es la direccion de memoria base que ocupa el puerto por lo general es 0x378. Y valor es el valor en numero decimal que se mostrara en el puerto en su equivalente visto en binario. La tabla de trabajo del puerto es: Pin Valor Dato 9 27 D7 8 26 D6 7 25 D5 6 24 D4 5 23 D3 4 22 D2 3 21 D1 2 20 D0

20 Se puede apreciar que los datos D0 a D2 no tienen un pin especifico de trabajo, por lo que asumen un valor binario de 1. Vemos tambien que el D7 contiene antecedido una diagonal indicando que es un valor negado, es decir que si la entrada es 1 el puerto lo lee como 0 y viceversa. EJEMPLOS DE PROGRAMACION DEL PUERTO Ejemplo 1: implementacion de una caminata o rotabit utilizando el puerto de datos. #include<dos.h> void main() { int x; for(x=1; x<=128; x=x*2) { outportb(0x378,x); delay(1000); } for(x=128; x>=1; x=x/2) { outportb(0x378,x); delay(1000); } } Ejemplo 2: Encender solo el led deseado utilizando los valores posicionales de 0 a 7 #include<dos.h> #include<stdio.h> #include<math.h> void main() { int x, y; printf(Cual led deseas encender: (0 al 7) );

CAPTURA DE DATOS EN EL REGISTRO DE ESTADO A traves del registro de estado es posible capturar datos, lo cual no indica que este funciona como entrada de datos al puerto, para poder capturar datos y poderlos utilizar como condicion para que la salida haga una tera especifica se requiere de la siguiente linea: Si se trata de Borland C/C++ 3.0 o inferior: Librera: dos.h Linea: inportb(dir_puerto+1); Si es de Borland C/C++ 4.0 o superior o de Microsoft: Librera: conio.h Linea: inp(dir_puerto+1); La tabla de trabajo del registro de estado es: Pin Dato 11 /D7 10 D6 12 D5 13 D4 15 D3 NA D2 NA D1 NA D0

21 scanf(%i, &x); y=pow(2,x); outportb(0x378,y); } La interfaz electronica para comprobar los programas de los ejemplos anteriores es la siguiente: Tabla 2.- Entrada en el pin 15 Pin 11 10 12 13 15 Dato /D7 D6 D5 D4 D3 Valor 0 0 0 0 1 NA D2 1 NA D1 1

22 NA D0 1

Como se aprecia en las tablas tenemos los valores siguentes: Para el pin 10: el valor es 71. Para el pin 15: el valor es 15. #include<dos.h> void main() { int x, in; in=inportb(0x378+1); if (in==71) { for(x=1; x<=128; x=x*2) { outportb(0x378, x); delay(1000); } } if (in==15) { for(x=128; x>=1; x=x/2) { outportb(0x378, x); delay(1000); } } }

Ejemplo 3: Se recibe un dato en el registro de estado a traves del pin 10, y deseamos que dicho pin haga que se genere un rotabit del pin 2 al 9 o llega un dato al pin 15 que genera un rotabit del pin 9 al 2. Tabla 1.- Entrada en el pin 10 Pin 11 10 12 13 15 Dato /D7 D6 D5 D4 D3 Valor 0 1 0 0 0 NA D2 1 NA D1 1 NA D0 1

23 A MANERA DE CONCLUSION Como se puede apreciar la programacion es bastante sencilla, pero requiere de tener conocimientos en programacin en lenguaje C/C++ y algunos aspectos basicos de electronica para comprender sobre todo el circuito aqu expuesto, el resto dependera del interesado, pues como bien se sabe para programar solo bastan tres requisitos, conocer la estructura de un lenguaje de programacin, ser buen investigador y tener imaginacin para la solucion de problemas. Como se pudo ver este documento trato en lo mayor posible de recopilar toda la informacin relacionada al tema y que permita a un estudiante de las areas de computacin y electronica el poder programar el puerto con un minimo de dificultades. Si desea conocer mas sobre el tema le recomiendo e siguiente link de Virgilio Negrete, al cual le agradezco que esta informacin este disponible a todos y del cual tome muchas referencias, gracias Virgilio!: http://www.modelo.edu.mx/univ/virtech/circuito/paralelo.htm

Potrebbero piacerti anche