Vous êtes sur la page 1sur 15

31 42

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.
COMO PROGRAMAR
EL PUERTO Para poder entender algunos aspectos de la programacin,
se recomienda tener algunos conocimientos basicos en el lenguaje
PARALELO 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.

Ing. Jose Antonio Ruiz Laureano


Ingeniero Electronico en Computacin

Ing. Jose Antonio Ruiz Laureano


3 42

main, desde la cual es posible llamar a otras funciones.


UNIDAD 1
Cada funcin estar formada por la cabecera de la funcin,
ALGUNOS ASPECTOS compuesta por el nombre de la misma y la lista de argumentos (si
DE PROGRAMACION los hubiese), la declaracin de las variables a utilizar y la secuencia
de sentencias a ejecutar.

Esta primera unidad se enfocara bsicamente a dar algunos Ejemplo:


aspectos de la programacin en C/C++ que son necesarios para
programar el puerto. declaraciones globales

main( ) {
Cabe mencionar que no se pretende ensear el lenguaje en variables locales
esta unidad, solo describe de manera muy general las sentencias y bloque
palabras que se requieren en la programacin del puerto, si se Todo programa en C/C++ consta de una o ms funciones, una
requiere conocer mas sobre el lenguaje se recomiendan varios cursos de las cuales se llama main. El programa comienza en la funcin
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++


3 42

funcion1( ) {
variables locales
bloque
}

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.
75 86

Palabras clave La directiva #define no slo nos permite sustituir un


Existen una serie de indicadores reservados, con una finalidad nombre por un valor numrico, sin tambin por una cadena de
determinada, que no podemos utilizar como identificadores. caracteres.

A continuacin vemos algunas de estas palabras clave: El valor de una constante no puede ser modificado de
ninguna manera.
char int float
double if Secuencias de escape
else do while for switch Ciertos caracteres no representados grficamente se pueden
short long extern
static default representar mediante lo que se conoce como secuencia de escape.
continue break register
sizeof typedef
A continuacin vemos una tabla de las ms significativas:
Observe que no se indica el punto y coma de final de
Variable sentencia ni tampoco el tipo de dato.
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>


75 86

\n salto de lnea
\b retroceso
\t tabulacin horizontal
\v tabulacin vertical
\\ contrabarra
\f salto de pgina
\' apstrofe
\" comillas dobles
\0 fin de una cadena de caracteres

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:
75 86

Operadores relacionales
+ Suma Los operadores relacionales se utilizan para comparar el
- Resta contenido de dos variables. En C existen seis operadores relacionales
* Multiplicacin
/ Divisin bsicos:
% Mdulo (resto)
> Mayor que
y los unarios: < Menor que
>= Mayor o igual que
++ Incremento (suma 1) <= Menor o igual que
-- Decremento (resta 1) == Igual que
- Cambio de signo
!= Distinto que
Su sintaxis es:
El resultado que devuelven estos operadores es 1 para
binarios: Verdadero y 0 para Falso.
<variable1><operador><variable2>
Funcion de salida de datos en pantalla.
unarios: La rutina printf permite la aparicin de valores numricos,
<variable><operador> caracteres y cadenas de texto por pantalla. El prototipo de la
<operador><variable>. sentencia printf es el siguiente:

printf(control,arg1,arg2...);
Operadores de asignacion
La mayora de los operadores aritmticos binarios explicados En la cadena de control indicamos la forma en que se
anteriormente tienen su correspondiente operador de asignacin: mostrarn los argumentos posteriores. Tambin podemos introducir
una cadena de texto ( sin necesidad de argumentos ), o combinar
= Asignacin simple ambas posibilidades, as como secuencias de escape.
+= Suma
-= Resta En el caso de que utilicemos argumentos deberemos
*= Multiplicacin indicar en la cadena de control tantos modificadores como
/= Divisin argumentos vayamos a presentar.
%= Mdulo (resto)
Funcion de entrada de datos desde teclado
Con estos operadores se pueden escribir, de forma ms breve, La rutina scanf permite entrar datos en la memoria del
expresiones del tipo: ordenador a travs del teclado. El prototipo de la sentencia scanf es
el siguiente:
n=n+3 se puede escribir n+=3
k=k*(x-2) lo podemos sustituir por k*=x-2 scanf(control,arg1,arg2...);
11
9 10
12

En la cadena de control indicaremos, por regla general, for (inicializacin;condicin;incremento){


los modificadores que harn referencia al tipo de dato de los sentencia1;
argumentos. Al igual que en la sentencia printf los modificadores sentencia2;
estarn formados por el caracter % seguido de un caracter de }
conversin. Los argumentos indicados sern, nuevamente, las
variables. La inicializacin indica una variable (variable de control)
que condiciona la repeticin del bucle. Si hay ms, van separadas
por comas:
La principal caracterstica de la sentencia scanf es que
necesita saber la posicin de la memoria del ordenador en que se for (a=1,b=100;a!=b;a++,b- -){
encuentra la variable para poder almacenar la informacin
obtenida. Para indicarle esta posicin utilizaremos el smbolo
ampersand ( & ), que colocaremos delante del nombre de cada Sentencia DO...WHILE
variable. ( Esto no ser necesario en los arrays ). Su sintaxis es:

Sentencias condicionales do{


Este tipo de sentencias permiten variar el flujo del programa sentencia1;
en base a unas determinadas condiciones. Existen varias estructuras sentencia2;

diferentes: }while (condicin);

Estructura IF...ELSE Con esta sentencia se controla la condicin al final del


Sintaxis: bucle. Si sta se cumple, el programa vuelve a ejecutar las
if (condicin) sentencia; sentencias del bucle.

La sentencia solo se ejecuta si se cumple la condicin. En caso Pues bien, una vez vistos estos aspectos (recordando que
contrario el programa sigue su curso sin ejecutar la sentencia. esta unidad no pretendia ensear a programar en C, si no solo
conocer los aspectos basicos del mismo para la programacin del
Otro formato: puerto) corresponde ahora solo practicarlos realizando programas
de control hacia el puerto, relacionandolos con los datos necesarios que
if (condicin) sentencia1; seran requeridos en su momento.
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:
11
9 10
12

las lneas de datos e informa a la parte receptora que la


UNIDAD 2 informacin (los datos) estn disponibles; entonces la parte
receptora lee la informacin en las lneas de datos e informa a la
ESTRUCTURA DEL parte transmisora que ha tomado la informacin (los datos).
PUERTO PARALELO
Observe que mbas partes sincronizan su respectivo acceso a
las lneas de datos, la parte receptora no leer las lneas de datos
Una vez vistos los aspectos basicos de la programacin en C, hasta que la parte transmisora se lo indique en tanto que la parte
que sera requerida para controlar dispositivos con el puerto de la transmisora no colocar nueva informacin en las lneas de datos
PC, ahora toca ver los aspectos relacionados al hardware, la hasta que la parte receptora remueva la informacin y le indique a
estructura del puerto, como funciona este. la parte transmisora que ya ha tomado los datos, a sta
coordinacin de operaciones se le llama acuerdo entendimiento el
Los puertos de comunicacin de la PC son de particular cual es llamado handshaking.
inters para el estudioso de la electrnica ya que le permiten utilizar
una computadora personal para controlar todo tipo circuitos Para implementar el handshaking se requieren dos lneas
electrnicos utilizados, principalmente, en actividades de adicionales. La lnea de strobe es la que utiliza la parte transmisora
automatizacin de procesos, adquicisin de datos, tareas repetitivas para indicarle a la parte receptora la disponibilidad de informacin.
y otras actividades que demandan precisin. La lnea de admisin (acknowledge) es la que utiliza la parte
receptora para indicarle a la parte transmisora que ha tomado la
Existen dos mtodos bsicos para transmisin de datos en las informacin (los datos) y que est lista para recibir ms datos.
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 El puerto paralelo provee de una tercera lnea de
travs de un medio. Por otro lado, en un formato de transmisin de handshaking llamada en ingls busy (ocupado), sta la puede
datos en paralelo un dispositivo enva datos a otro a una tasa de n utilizar la parte receptora para indicarle a la parte transmisora que
nmero de bits a travs de n nmero de medios a un tiempo. Sera est ocupada y por lo tanto la parte transmisora no debe intentar
fcil pensar que un sistema en paralelo es n veces ms rpido que colocar nueva informacin en las lneas de datos. Una tpica sesin
un sistema en serie, sin embargo sto no se cumple, bsicamente el de transmisin de datos se parece a lo siguiente:
impedimiento principal es el tipo de cable que se utiliza para
interconectar los equipos. 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
Si bin un sistema de comunicacin en paralelo puede
inactiva.
utilizar cualquier nmero de cables para transmitir datos, la
2. La parte transmisora coloca la informacin en las lneas de
mayora de los sistemas paralelos utilizan ocho lneas de datos para datos.
transmitir un byte a la vez. 3. La parte transmisora activa la lnea de strobe.
4. La parte transmisora espera en un bucle hasta que la lnea
Un tpico sistema de comunicacin en paralelo puede ser de acknowledge est activa.
una direccin (unidireccional) o de dos direcciones (bidireccional). 5. La parte transmisora inactiva la lnea de strobe.
Donde tambien distinguimos dos elementos: la parte transmisora y 6. La parte transmisora espera en un bucle hasta que la lnea
la parte receptora. La parte transmisora coloca la informacin en acknowledge est inactiva.
13 14
Pin E/S Polaridad Descripcin
7. La parte transmisora repite los pasos anteriores por cada
byte a ser transmitido. 1 Salida 0 Strobe
Lneas de datos
8. La parte receptora inactiva la lnea busy (asumiendo que 2 ~ 9 Salida -
(bit 0/patita 2, bit 7/patita 9)
est lista para recibir informacin).
9. La parte receptora espera en un bucle hasta que la lnea Lnea acknowledge
strobe est activa. 10 Entrada 0 (activa cuando el sistema remoto toma
10. La parte receptora lee la informacin de las lneas de datos datos)
(y si es necesario, procesa los datos). Lnea busy
11. La parte receptora activa la lnea acknowledge. 11 Entrada 0 (si est activa, el sistema remoto no
12. La parte receptora espera en un bucle hasta que est acepta datos)
inactiva la lnea de strobe.
13. La parte receptora inactiva la lnea acknowledge. Lnea Falta de papel
14. La parte receptora repite los pasos anteriores por cada byte 12 Entrada 1 (si est activa, falta papel en la
que debe recibir. impresora)
Lnea Select
Se debe ser muy cuidadoso, tanto la parte transmisora como la 13 Entrada 1 (si est activa, la impresora se ha
receptora coordinan sus acciones de tal manera que la parte seleccionado)
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 Lnea Autofeed
le enve la parte transmisora, un byte a la vez. (si est activa, la impresora inserta una
14 Salida 0 nueva
Estructura del puerto paralelo lnea por cada retorno de carro)
Lnea Error
El puerto paralelo de una tpica PC utiliza un conector hembra 15 Entrada 0 (si est activa, hay un error en la
de tipo D de 25 pines (DB-25). El orden de los pines del conector es impresora)
ste: Lnea Init
(Si se mantiene activa por al menos 50
16 Salida 0 micro-segundos, sta seal
autoinicializa la impresora)
Lnea Select input
17 Salida 0 (Cuando est inactiva, obliga a la
impresora a salir de lnea)
18 ~
La siguiente tabla describe la funcin de cada patita del - - Tierra elctrica
25
conector 1284 tipo A:
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 16
Hay tres direcciones de E/S asociadas con un puerto paralelo Bit 2 IRQ (Not)
de la PC, stas direcciones pertenecen al registro de datos, el registro Bit 1 Reservado
de estado y el registro de control. Bit 0 Reservado
El registro de datos es un puerto de lectura-escritura de ocho
bits. Leer el registro de datos (en la modalidad unidireccional) Tabla 2: Registro de estado
retorna el ltimo valor escrito en el registro de datos.
Bit
Los registros de control y estado proveen la interface a las otras Direccin Nombre Lectura/Escritura Propiedades
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 Base + 2 Puerto de Lectura/Escritura Bit 7 No usado
tablas: control Bit 6 No usado
Permite
Bit Bit 5 puerto
Direccin Nombre Lectura/Escritura Propiedades bidireccional
#
Base + 0 Puerto de Escritura Bit 7 Dato 7 Permite IRQ a
datos travs de la
Bit 6 Dato 6 Bit 4 lnea
Bit 5 Dato 5 acknowledge
Bit 4 Dato 4 Selecciona
Bit 3 impresora
Bit 3 Dato 3
Bit 2 Dato 2 Inicializa
Bit 2 impresora
Bit 1 Dato 1
Nueva lnea
Bit 0 Dato 0 Bit 1 automtica

Bit 0 Strobe
Tabla 1: Registro de datos

Bit Tabla 3: Registro de control


Direccin Nombre Lectura/Escritura Propiedades
#
Una PC soporta hasta tres puertos paralelo separados, por
Base + 1 Puerto de Slo Lectura Bit 7 Busy tanto puede haber hasta tres juegos de registros en un sistema en un
estado Bit 6 Acknowledge momento dado. Existen tres direcciones base para el puerto paralelo
Falta de asociadas con tres posibles puertos paralelo: 0x3BCh, 0x378h y
Bit 5 0x278h, nos referimos a stas como las direcciones base para el
papel
puerto LPT1, LPT2 y LPT3, respectivamente.
Bit 4 Select In
Bit 3 Error
17
19 18
20

El registro de datos se localiza siempre en la direccin base UNIDAD 3


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 PROGRAMACION DEL
ejemplo, para un puerto LPT2 localizado en 0x378h, sta es la
direccin del registro de datos, al registro de estado le corresponde
PUERTO PARALELO
la direccin 0x379h y su respectivo registro de control est en la
direccin 0x37Ah.
Una vez vistos los aspectos basicos de la programacin y
Cuando la PC se enciende el BIOS ejecuta una rutina para como esta estructurado el puerto y como este funciona, ahora si en
determinar el nmero de puertos presentes en el sistema asignando esta unidad se citara lo que realmente compete a este documento.
la etiqueta LPT1 al primer puerto localizado, si existen ms puertos
entonces se asignarn consecutivamente las etiquetas LPT2 y LPT3.
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);
17
19 18
20

Si se trata de un compilador C/C++ 4.0 o superior de Se puede apreciar que los datos D0 a D2 no tienen un pin
Borland o Microsoft: especifico de trabajo, por lo que asumen un valor binario de 1.
Vemos tambien que el D7 contiene antecedido una diagonal
Librera requerida: conio.h indicando que es un valor negado, es decir que si la entrada es 1 el
Linea a utilizar: outp(dir_puerto, valor); puerto lo lee como 0 y viceversa.

Donde: dir_puerto es la direccion de memoria base que


ocupa el puerto por lo general es 0x378. EJEMPLOS DE PROGRAMACION DEL PUERTO
Ejemplo 1: implementacion de una caminata o rotabit
Y valor es el valor en numero decimal que se mostrara en el utilizando el puerto de datos.
puerto en su equivalente visto en binario.
#include<dos.h>
La tabla de trabajo del puerto es:
void main()
Pin 9 8 7 6 5 4 3 2 {
Valor 27 26 25 24 23 22 21 20 int x;
Dato D7 D6 D5 D4 D3 D2 D1 D0 for(x=1; x<=128; x=x*2)
{
outportb(0x378,x);
delay(1000);
CAPTURA DE DATOS EN EL REGISTRO DE ESTADO }
A traves del registro de estado es posible capturar datos, lo for(x=128; x>=1; x=x/2)
cual no indica que este funciona como entrada de datos al puerto, {
para poder capturar datos y poderlos utilizar como condicion para outportb(0x378,x);
delay(1000);
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 Ejemplo 2: Encender solo el led deseado utilizando los valores
Linea: inportb(dir_puerto+1); posicionales de 0 a 7
Si es de Borland C/C++ 4.0 o superior o de Microsoft: #include<dos.h>
Librera: conio.h #include<stdio.h>
Linea: inp(dir_puerto+1); #include<math.h>
La tabla de trabajo del registro de estado es: void main()
Pin 11 10 12 13 15 NA NA NA {
Dato /D7 D6 D5 D4 D3 D2 D1 D0 int x, y;
printf(Cual led deseas encender: (0 al 7) );
21
23 22

scanf(%i, &x);
y=pow(2,x); Tabla 2.- Entrada en el pin 15
outportb(0x378,y); Pin 11 10 12 13 15 NA NA NA
} Dato /D7 D6 D5 D4 D3 D2 D1 D0
Valor 0 0 0 0 1 1 1 1
La interfaz electronica para comprobar los programas de los
ejemplos anteriores es la siguiente: 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)
{
Ejemplo 3: Se recibe un dato en el registro de estado a traves
outportb(0x378, x);
del pin 10, y deseamos que dicho pin haga que se genere un rotabit
delay(1000);
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 NA NA NA
21
23 22

Dato /D7 D6 D5 D4 D3 D2 D1 D0
Valor 0 1 0 0 0 1 1 1
21
23 22

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

Vous aimerez peut-être aussi