En la Actividad 2 se han presentado algunas formas de controlar entradas digitales mediante el puerto paralelo. Se describe ahora una solución cuando lo que interesa es la detección de señales analógicas y, por tanto, el control de entradas de tipo analógico.
Para ello se propone el esquema eléctrico de un conversor analógico-digital básico como el de la siguiente figura:
Dicho circuito se alimenta a +5v y convierte señales analógicas en el intervalo entre 0 y 5v. Como núcleo se utiliza el circuito integrado ADC0804 de National Semiconductor (hojas de datos del ADC0804), un conversor A/D de 8 bit, barato y habitualmente disponible. Por defecto, el intervalo de entrada está entre 0 y +5V pero, usando una referencia externa y/o elevando la señal Vin- respecto a GND, se puede conseguir un amplio intervalo de niveles de entrada. Trabaja con una frecuencia máxima de 8 kHz, de modo que se puede utilizar incluso con señales de audio de baja calidad.
A efectos de prueba, la señal analógica a convertir proviene del potenciómetro R2; variando éste se modifica la señal entre 0 y 5 voltios. Dicha señal se introduce en el conversor ADC0804. Una vez convertida, el valor digital es presentado en las líneas D0 a D7 y deberá ser leído a través del puerto paralelo según el protocolo explicado a continuación.
Para el correcto funcionamiento de la conversión se debe respetar un protocolo entre el PC y el conversor, explicado en detalle en las hojas de datos del conversor. Básicamente es el siguiente:
Diagrama de tiempos para el inicio de la conversión
Diagrama de tiempos para la lectura del dato
Los ciclos anteriores se repetirán tantas veces como datos se quieran capturar.
Con objeto de simplificar la circuitería y, puesto que se cuenta con un solo ADC, se puede mantener permanentemente la señal CS a nivel bajo conectándola directamente a tierra (ver arriba en el esquema del interfaz).
He aquí un ejemplo en TurboC de cómo implementar el código que lleva a cabo la lectura de entradas analógicas mediante el p. paralelo. Hace uso de bloques de código utilizados en actividades anteriores.
/****************************************************************/ /* */ /* Programa de lectura analógica mediante p. paralelo */ /* 2002 Víctor R. González */ /* */ /****************************************************************/ #include <stdio.h> #include <dos.h> #include <time.h> #include "paralel.h" /* Definiciones para control mediante p. paralelo */ int ParaleloIni (void); /* Detecta el puerto paralelo */ void pausa (unsigned long); /* Retardo de precisión */ #define ADC_TMAX 0.1 /* Espera máxima (en s) de la respuesta del ADC */ void main(void) { unsigned int muestra, Byte, tmp; clock_t clock_ini; float crono; /* Comprueba en la BIOS puerto con capacidad bidireccional */ if (ParaleloIni()>1){ /* Pone C5 (bit 5 de CONTROL) a 1 (modo entrada) */ Byte = inportb (CONTROL); outportb (CONTROL, Byte | 0x20 ); tmp = Byte; /* Realiza 1000 lecturas */ for (muestra=0; muestra<1000; muestra++) { /* Fija comienzo de conversión con un pulso de #WR */ /* Pone #WR (pin 3) bajo: C2=0 (#INIT, pin 16 LPT) Espera al menos 100 ns Pone #WR (pin 3) alto: C2=1 (#INIT, pin 16 LPT) */ outportb (CONTROL, 0x20 ); pausa (1); outportb (CONTROL, 0x24 ); /* Espera #INTR (pin 15) alto : S3==1 (#ERROR, pin 15 LPT) */ clock_ini = clock(); crono = 0; while (((inportb (ESTADO) & 0x08))==0 && crono < ADC_TMAX) crono=(clock()-clock_ini)/CLK_TCK; if (crono < ADC_TMAX) { /* Lectura del dato */ /* Pone #RD (pin 2) bajo : #C0=1 (#STROBE, pin 1 LPT) Espera al menos 200 ns Lee el puerto de datos */ outportb (CONTROL, 0x25 ); pausa (1); Byte = inportb(DATOS); outportb( CONTROL, 0x24 ); printf("Lectura: %X\n", Byte); } else printf("No se recibe señal de final de conversión\n"); } /* Restaura C5 a su valor original */ outportb (CONTROL, tmp ); } } |
Móntese la interfaz de control de entradas analógicas y prográmese una función en Turbo C que lea la señal de entrada y retorne el valor leído. El programa principal debe invocar esta función permanentemente y mostrar el resultado.
NOTA: Para el correcto funcionamiento de la actividad, el puerto de datos del p. paralelo deberá estar configurado en modo bidireccional. Ello requiere que se halle seleccionado este modo en la configuración del BIOS y que el bit de puerto bidireccional, C5, se halle a 1. En la presente actividad este bit se puede fijar inicialmente a uno. Hay que tener cierta precaución, pues la escritura en el puerto de datos modifica este bit a cero.
Lista de componentes:
R1: resistencia de 10K 1/4 W
R2: potenciómetro de 10Kl
C1: condensador de 150 pF
Conversor A/D modelo ADC0804
Zócalo para el integrado anterior
Conector DB25 macho
Cable plano de 12 hilos, mínimo