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