Manejo del ADC0838 con microcontrolador

Cordial Saludo a todos.

Bueno en procura de simplificar puertos de conexion y no utilizar conversores ADC paralelos en cualquier tipo de microcontrolador, la idea general es implementar rutinas en varios lenguajes de programacion para PIC, ATMEL etc.

Importancia>>>>

Este integrado es uno de los mas economicos en mi ciudad y ademas cuenta con 8 canales de entrada, se puede configurar con entradas simples o diferenciales.

Les presento el diagrama de tiempos.


Ahora les presento la tabla para la configuracion del mux.


Personalmente tengo muchos inconvenientes con el manejo de este integrado y me ha dado muchos dolores de cabeza.

Simulacion en proteus pero con ninguna esperanza



Posiblemente exista algo mas que tenga que ver con este.


Gracias por sus colaboraciones.
 
Bueno este es el código esperado por los que quieran utilizar este conversor.


Código:
/*   LIBRERIA PARA EL MANEJO DEL ADC0838 EN MODO SINGLE-ENDED CHANNEL
  	 HACIENDO PRUEBAS HE DESCUBIERTO QUE EN EL PROTEUS SOLAMENTE 
	 FUNCIONA EL CANAL 0

*/


#include<reg51.h>    
#define uchar unsigned char   
#define uint unsigned int 


 
sbit AD_CLOCK=P1^6;   
sbit AD_IN=P1^5;   
sbit AD_OUT=P1^7;   
sbit AD_CS=P1^4;   
uchar read0838(uchar port);


main()   
{                       
   //uchar result;   
   P2=read0838(2);
   while(1)   
   {   
   //result=adc_tlc0838(7);   
   } 
   
    
}

uchar read0838(uchar port)    
 {   
    uchar ad;uint i;   
    ad=0;   
    AD_CS=1;   
    AD_CLOCK=0;   
    AD_CS=0;   
    AD_IN=1;  //Start bit   
    AD_CLOCK=1;   
    AD_CLOCK=0;   
    AD_IN=1;   //Modo simple
    AD_CLOCK=1;   
    AD_CLOCK=0;   
    AD_IN=port&0x01;   
    AD_CLOCK=1;   
    AD_CLOCK=0;   
    AD_IN=port&0x04;   
    AD_CLOCK=1;   
    AD_CLOCK=0;   
    AD_IN=port&0x02;   
    AD_CLOCK=1;   
    AD_CLOCK=0;     
    AD_CLOCK=1;   
    for(i=0;i<8;i++)   
     {   
        AD_CLOCK=0;   
        ad=ad<<1;//ad=00000000   
        ad=ad|AD_OUT;   
        AD_CLOCK=1;   
     }   
 AD_CS=1;   
 return (ad);   
 }

Bueno solo les comento

En proteus solamente funciona el canal 0.
 
Bueno

Este es otro intento fallido con este maldito ADC

Código:
program adcprueb

' Prueba para el conversod adc0838 serial

dim    CS as sbit at P1.B0
dim    SA as sbit at P3.B5

dim    CLK as sbit at P1.B2
dim    ADI as sbit at P1.B1
dim    ADO as sbit at P1.B3




sub procedure ADCLEE(dim canal as byte)
    dim  MUX,cont,keo,num,sal as byte
    MUX=0x18
    num=0x10
    
    select case canal
    case 0
    MUX = 0x18
    case 1
    MUX = 0x1c
    case 2
    MUX = 0x19
    case 3
    MUX = 0x1d
    case 4
    MUX = 0x1a
    case 5
    MUX = 0x1e
    case 6
    MUX = 0x1b
    case 7
    MUX = 0x1f
    case else
    MUX = 0x18
    end select
    CLK=0
    delay_us(100)
    CS=0
    for cont = 0 to 4
        Delay_us(200)
        CLK=1
        keo=num>>cont
        if(keo and MUX) then
                   ADI=1
        else
                   ADI=0
        end if
        Delay_us(200)
        CLK=0
    next cont
    ADI=0
    Delay_us(200)
    CLK=1
    Delay_us(200)
    CLK=0
    'Delay_us(100)
    
    for cont = 0 to 7
        Delay_us(200)
        CLK=1
        if (ADO) then
           sal=((sal<<1) or 0x01)
        else
            sal= sal<<1
        end if
        Delay_us(200)
        CLK=0
    next cont
    delay_us(1000)
    CS=1
    
    'P2=sal

end sub

main:
     Delay_us(100)
     ADCLEE(0)
     while TRUE

     wend
     

end.


No logro hacer funcionar sino el canal 0 pero con proteus aun no lo he montado.

Cualquier ayuda les agradecería.
 
Atrás
Arriba