INTRODUCCIÓN

El objetivo de este artículo es mostrar una manera rápida de obtener muestras de 8 bits a través del puerto paralelo de la PC, utilizando un CAD tipo serie de National, el ADC08831/32, un conversor económico y de fácil disponibilidad en el mercado. Aquí encontrará la conexión del conversor con el puerto paralelo de la PC y el software asociado para controlar el dispositivo. Estos tipo de conversores al tener una interfaz serie pueden ser controlados con unas pocas señales digitales. El ADC08832 es un CAD de dos canales pudiendo utilizar los dos pines de las entradas de estos canales como una única entrada del tipo diferencial. Una desventaja de este modelo es que la tensión de referencia debe ser únicamente la tensión de Vcc; no es este el caso del modelo ADC08831 el cual posee una única entrada diferencial y puede usarse una referencia distinta de Vcc. Este artículo explica el uso de ADC08832 pudiendo modificarse fácilmente para la otra versión.

EL CIRCUITO

El circuito es muy sencillo ya que no posee la etapa acondicionadora de señal que debe ser diseñada según la aplicación. Como se observa en la Fig. 1 solo se utilizan cuatro señales del puerto paralelo para controlar el dispositivo, estas señales son: tres del bus de datos D0, D1, D2 como salida y una señal B5 del registro STATUS como entrada. (Precaución: como medida de protección del puerto debería utilizar un buffer para estas señales). La fuente de 5V debe ser los más estable posible, para realizar los ensayos puede utilizar un regulador tipo 7805.

¿CÓMO MANEJAR EL CONVERSOR?

Este conversor ADC08832 posee dos canales multiplexados los cuales deben configurarse antes de cada conversión, esto se logra ingresando la palabra de configuración a través de la línea DI del dispositivo (pin 5) como indica el diagrama temporal de la Fig.2 extraído de la hoja de datos del fabricante, luego de bajar #CS, en cada flanco ascendente del CLK (pin 7) se lee la entrada DI en el primer pulso debe haber un bit de start, luego debe ingresarse el modo de funcionamiento de las entradas seleccionando entre SGL/#DIF (simple/diferencial) en el ejemplo esta seleccionado #DIF (modo diferencial) y el conversor tomara la resta entre las entradas, este modo es preferible, entre otros motivos, en lugares donde el ruido sea un problema, ya que al ser el ruido común en ambas entradas en teoría se elimina al hacer la resta. Luego de elegir entre SGL/#DIF el próximo bit se interpreta como indica la Tabla 1. : Si el bit anterior en DI fue 1 (Single-Ended MUX Mode) con un cero selecciono el  canal 0 y con un uno el canal 1, en cambio si el bit anterior en DI fue un 0 (Differential MUX Mode) con un cero el conversor hará la resta, canal 0 menos canal 1, e ingresando un uno el conversor hará la resta, canal 1 menos canal 0. En el ejemplo se hará la resta, canal 1 menos canal 0. Luego de este último flanco ascendente (pulso 3 de CLK) en medio pulso la señal será muestreada y retenida por lo tanto en este lapso la señal de entrada no debe cambiar, luego de esto después de cada flanco descendente aparecerá en DO (pin 6) el bit más significativo del dato hasta el pulso 11 donde estará completo el dato de 8 bits. En los pulsos siguientes sigue apareciendo el mismo dato pero comenzando por el bit menos significativo, lo cual se puede aprovechar para verificar la correcta lectura, es decir comparo los bit que ya leí con estos que deberían ser iguales.

EL SOFTWARE

El programa para controlar el conversor está escrito en lenguaje C, y pensado para que funcione en el puerto paralelo con dirección 0x378, el código completo lo podrá bajar de aqui , en el se encuentran dos funciones para manejo de puertos de 8 bits, función Ep() para escribir un bit de un puerto y función Lp() para leer un bit de un puerto. Por medio de unas macros se utilizan estas funciones para manejar el conversor con una nueva función llamada Cad08832() que devuelve el dato convertido.

//—————– Función Ep ———————————————–
void Ep(unsigned int Puerto,unsigned char Dato,unsigned int Bit)
{
// descripción: Escribe un Bit de un puerto de 8 bits
// Entradas: Puerto = # de puerto
// Dato = 0,1
// Bit = Posición del bit
// Salidas: Nada.

unsigned char DatoTemp;

DatoTemp=inportb(Puerto);

if( Dato == 1 && Bit < 8 )
DatoTemp = DatoTemp | (0x01 << Bit);
else
{
if( Dato == 0 && Bit < 8 )
DatoTemp = DatoTemp & ~(0x01 << Bit);
}
}

//—————– Funcion Lp ———————————————–
// descripcion: Lee un Bit de un puerto de 8 bits
// Entradas: Puerto = # de puerto
// Bit = Posici¢n del bit
// Salidas: 0,1 o -1 en caso de error;
int Lp(unsigned int Puerto,unsigned int Bit)
{

unsigned char DatoTempL;

if( Bit < 8 )
{
DatoTempL = inportb(Puerto);
DatoTempL = DatoTempL & (0x01 << Bit);
DatoTempL = DatoTempL >> Bit;
return DatoTempL;
}

}

//—————– Funcion Cad08832 —————————————–
// descripcion: Maneja un CAD ADC08832 conectado en LPT
// Entradas: canal = # de canal 0,1.
// Salida = Dato de 8 bits, error = -1.

int Cad08832( unsigned char canal)
{
unsigned char i=0,DatoMSB=0,DatoLSB=0,DatTemp=0;

CLK(1); // Estado inicial de las lineas del MicroWire
CS(1);
DI(1);

CLK(0); // Bajo CS
CS(0);

DI(1); // Bit de Start
CLK(1);
CLK(0);

DI(1); // SGL/#DIF
CLK(1);
CLK(0);

DI(canal); // # de canal
CLK(1);
CLK(0);

CLK(1);
for(i = 8 ; i > 0 ; i–)
{
CLK(0);
DatTemp = DO;
DatoMSB = DatoMSB | (DatTemp << (i-1));
CLK(1);
}

DatoLSB = DO;

for( i = 1 ; i < 8 ; i++ )
{
CLK(0);
DatTemp = DO;
DatoLSB = DatoLSB | (DatTemp << i);
CLK(1);
}

CS(1);

if( DatoMSB == DatoLSB )
return DatoMSB;

return (-1);
}