práctica 11. control del puerto paralelo de un ordenador personal

Anuncio
PRÁCTICA 11. CONTROL DEL PUERTO PARALELO DE UN
ORDENADOR PERSONAL
11.1.- Objetivos.
•
Conocimiento y control del puerto paralelo.
•
Ejemplo de aplicación en un programa en C.
11.2.- Metodología.
Una posibilidad bastante interesante que nos proporciona los ordenadores el
control del puerto paralelo, en esta práctica se expondrá el uso y conocimiento del
mismo.
Desde los inicios de la expansión de los ordenadores personales, se impusieron
dos tipos de puertos en los PC's, estos son el puerto serie y puerto paralelo, en el serie,
la comunicación de datos ser realiza de bit a bit, es decir, una sucesión de bits en serie,
mientras que en la comunicación mediante el puerto paralelo, la transferencia de datos
se realiza de ocho en ocho a la vez. Esta situación nos proporciona ventajas e
inconvenientes, la ventaja es la sencillez y capacidad de transmitir datos, el
inconveniente es que el cable de conexión no puede ser largo (algunos fabricantes
recomiendan que no supere 1,5 metros).
No se debe olvidar que el puerto paralelo fue creado inicialmente para la
comunicación con la impresora, de hecho, también es llamado Centronics, (nombre de
la compañía que creó la conexión y se dedicaba a la creación de impresoras), por tanto,
los nombres que tiene los pines son debido a la función que tiene respecto a la
impresora.
1
La funcionalidad de cada pin se detalla a continuación:
Pin
Nombre
1
/STROBE
-->
Strobe
2
D0
-->
Data Bit 0
3
D1
-->
Data Bit 1
4
D2
-->
Data Bit 2
5
D3
-->
Data Bit 3
6
D4
-->
Data Bit 4
7
D5
-->
Data Bit 5
8
D6
-->
Data Bit 6
9
D7
-->
Data Bit 7
10
/ACK
<--
Acknowledge
11
BUSY
<--
Busy
12
PE
<--
Paper End
13
SEL
<--
Select
14
/AUTOFD
-->
Autofeed
15
/ERROR
<--
Error
16
/INIT
-->
Initialize
17
/SELIN
-->
Select In
18-25 GND
Descripcion
Signal Ground (Referencia a masa)
Se debe destacar los niveles de tensión que se deben utilizar en este tipo de
conexiones, en sistemas PC's antiguos con tarjetas controladoras ISA/EISA los niveles
de tensión son de 5 voltios, pero actualmente el nivel en los ordenadores actuales son de
3 voltios aproximadamente, ambos usan tecnología CMOS.
2
11.3.- CONPUPAR. CONtrol del PUerto PARalelo. Programa en C.
A continuación se expondrá un programa que visualiza y cambia el estado de los
pines del puerto paralelo, este programa es llamado conpupar.exe, que ilustrará un
ejemplo de control.
Su funcionamiento es el siguiente:
Una vez ejecutado el programa, saldrá el siguiente menú:
Seleccionando la opción 1, se accede a la escritura del puerto, obteniéndose la
siguiente presentación:
Se introduce un valor en decimal que es convertido en binario de forma que fija
a nivel alto o bajo el pin correspondiente de salida de datos indicándose con color rojo
si está a nivel alto o color azul si está a nivel bajo
3
.
Pulsando una tecla, se vuelve al menú principal, si esta vez se pulsa la opción 2
que es la lectura del puerto, se obtendrá información del estado actual del puerto.
Si hubiera algún cambio de estado en las entradas del puerto, se reflejaría
instantáneamente.
Este programa no es recomendable usarlo bajo entornos Windows puesto que el
acceso al puerto está controlado por este sistema operativo y el sistema interpreta que se
está mandando o recibiendo información desde la impresora.
A continuación se lista el código fuente el programa:
4
/*
CONPUPAR. CONtrol del PUerto PAralelo
Angel Fco. Villoria Marcos
Instrumentación.
3er curso de Ingeniería Técnica en Electrónica Industrial
Nota: El programa no cumple ANSI-C
*/
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void DibujaLPT(void)
{
printf("CONPUPAR. CONTROL DEL PUERTO PARALELO. Angel Villoria.
Instrumentación.\n\n");
printf (" 13 12 11 10 09 08 07 06 05 04 03 02 01
printf("-----------------------------------------------------Salida\n");
printf(" \\ X
X
X
X
O
O
O
O
O
O
O
O
O /
Entrada\n");
printf(" \\ G
G
G
G
G
G
G
G
O
O
X
O /
Tierra\n");
printf("
------------------------------------------------(del PC al\n");
printf("
25 24 23 22 21 20 19 18 17 16 15 14
exterior)\n");
}
\n");
O:
X:
G:
void LecturaLPT(void)
{
union REGS reg;
int estado=0;
do
{
reg.h.ah=2;
reg.x.dx=0;
int86(0x17, &reg, &reg);
gotoxy(1,10);
estado= reg.h.ah;
printf("Realizando la lectura del puerto (ah: %d) ... \n", estado);
printf("\n\n\n\n\n\n\nPulse una tecla para finalizar la lectura.");
// El estado de cada entrada
//Bit 7: Not busy
if ((estado & 0x80) != 0x80)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(12,5);
cprintf("X");
textcolor(LIGHTGRAY);
//Bit 6: Acknowledge
if ((estado & 0x40) != 0x40)
{
5
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(16,5);
cprintf("X");
textcolor(LIGHTGRAY);
//Bit 5: Out of paper
if ((estado & 0x20) == 0x20)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(8,5);
cprintf("X");
textcolor(LIGHTGRAY);
//Bit 4: Selected
if ((estado & 0x10) == 0x10)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(4,5);
cprintf("X");
textcolor(LIGHTGRAY);
//Bit 3: I/O Error
if ((estado & 0x08) != 0x08)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(46,6);
cprintf("X");
textcolor(LIGHTGRAY);
}while (!kbhit());
getch();
}
void EscrituraLPT(void)
{
union REGS reg;
int valor;
printf("\n\nIntroduce el valor de salida: ");
scanf("%d",&valor);
reg.h.ah=0;
reg.h.al=(char)valor;
6
reg.x.dx=0;
//lpt
if ((valor & 0x01) == 0x01)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(48,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x02) == 0x2)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(44,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x04) == 0x04)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(40,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x08) == 0x08)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(36,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x10) == 0x10)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(32,5);
cprintf("O");
textcolor(LIGHTGRAY);
7
if ((valor & 0x20) == 0x20)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(28,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x40) == 0x40)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(24,5);
cprintf("O");
textcolor(LIGHTGRAY);
if ((valor & 0x80) == 0x80)
{
textcolor(RED);
}
else
textcolor(BLUE);
gotoxy(20,5);
cprintf("O");
textcolor(LIGHTGRAY);
int86(0x17, &reg, &reg);
gotoxy(1,16);
printf("\nPulse una tecla...");
getch();
}
void main()
{
int eleccion=0;
textcolor(LIGHTGRAY);
do
{
clrscr();
DibujaLPT();
printf("\n\n\n");
textcolor(RED);
cprintf("¦: ");
8
textcolor(LIGHTGRAY);
printf("Valor alto. ");
textcolor(BLUE);
cprintf("¦: ");
textcolor(LIGHTGRAY);
printf("Valor bajo.");
printf("\n\nNo usar el programa bajo Windows. Nivel ISA-AT: 5 V. PCIATX: 3.5 V.");
printf("\n\nMenú principal:\n");
printf("\n1. Escritura del puerto.");
printf("\n2. Lectura del puerto.");
printf("\n0. Salir\n\n");
printf("Elige elección: ");
scanf("%d",&eleccion);
if (eleccion==1)
{
clrscr();
DibujaLPT();
EscrituraLPT();
}
if (eleccion==2)
{
clrscr();
DibujaLPT();
LecturaLPT();
}
}
while(eleccion!=0);
normvideo();
}
//Austamos el video a su modo normal
La lectura y escritura se realiza mediante una llamada a la interrupción a la
BIOS INT 17h, siendo en el registro ah = 2 la función de lectura y en ah = 0 la de
escritura.
Aparte de esta aplicación, nos dedicamos a la investigación y control del puerto
paralelo por medio de Labview, el modo de acceso es diferente al empleado en el
programa, puesto que se debe especificar la dirección de puerto 0278h (normalmente),
la información que nos suministra es un número que se debe interpretar según el bit que
se realiza la lectura del puerto.
9
Angel Francisco Villoria Marcos
10
Descargar