Problema en la lectura I2C de ADS112C04 con PIC

Hola gente les quería preguntar si el código que escribí es correcto para poder leer la entrada del adc.
El ADC en cuestión es uno de 16Bits por I2C de Texas instruments. Según lo que leí al principio tengo que enviar el comando de reset para asegurarme un inicio adecuado del adc y luego tengo que leer a través del comando RDATA la conversión más reciente y guardar en dos variables de 8 bits el Msb y Lsb de la información pero el problema que tengo es que la lectura o me da 255 o 0.
Cabe destacar que es la primera vez que pruebo un ADC por i2c por lo cual les solicito una mano.

El pic que uso es el 16F877A y el compilador es CCS 5.07. El adc tiene una referencia externa de 5V con el Ref5050

El código :
Objective-C:
#include <16f877a.h>
#fuses  hs,nolvp,nobrownout,nowdt
#use    delay(clock=20M)               
                                                            
#use    i2c(master,fast,sda=pin_c4,scl=pin_c3)                                                     

#byte   porta=0x05                                                       
#byte   portb=0x06                                               
#byte   portc=0x07                       
#byte   portd=0x08                                             
#byte   porte=0x09           
                                                                              
#byte   trisa=0x85
#byte   trisb=0x86
#byte   trisc=0x87                                                     
#byte   trisd=0x88
#byte   trise=0x89
      
#define lcd_rs_pin      pin_a0
#define lcd_enable_pin  pin_a1
#define data4           pin_a2
#define data5           pin_a3
#define data6           pin_a4                                         
#define data7           pin_a5                 
                                                    
#include <lcd_porta.c>                                                 

int8  msb_data_adc=0,lsb_data_adc=0;                                     
                                                                                      
void main(){                                         
                                                    
porta=0x00;                                 
portb=0x00;                                                         
portc=0x00;                                                             
portd=0x00;                                       
porte=0x00;                           

lcd_init();   

i2c_start();
i2c_write(0x88);// Address+R/~w=0
i2c_write(0x06);//0000-0110 Reset Command 
i2c_stop();
                                                                    
while (true){                                                                               
                            
i2c_start();
i2c_write(0x88);// Address+R/~w=0
i2c_write(0x10);// RData command
i2c_start();                                                                     
i2c_write(0x89);// Address+R/~w=1
msb_data_adc=i2c_read();
lsb_data_adc=i2c_read(0);
i2c_stop();

lcd_gotoxy(1,1);
printf(lcd_putc,"MSB:   %i",msb_data_adc); 
lcd_gotoxy(1,2);                                                             
printf(lcd_putc,"LSB:   %i",lsb_data_adc);                                                           
                
}
}


La libreria lcd_porta no es más que la libreria flex_lcd pero con los pines del puerto a ya definidos en la misma

Desde ya muchas gracias de antemano.
 

Adjuntos

  • lcd_porta.zip
    1.7 KB · Visitas: 3
Hola les quería comentar que estuve haciendo unas modificaciones al código y quería saber si alguien me lo puede corregir
Lamentablemente desde el celular no me deja editar el mensaje anterior así que tuve que crear un mensaje nuevo.
Objective-C:
#include <16f877a.h>
#fuses  hs,nolvp,nobrownout,nowdt
#use    delay(clock=20M)                                                                         

//Address + Write = 0x88        ???????????
//Address + Read  = 0x89        ???????????
                                                        
#use    i2c(master,fast,sda=pin_c4,scl=pin_c3)                                                   

#byte   porta=0x05                                                     
#byte   portb=0x06                                             
#byte   portc=0x07                     
#byte   portd=0x08                                           
#byte   porte=0x09         
                                                                            
#byte   trisa=0x85
#byte   trisb=0x86                                                 
#byte   trisc=0x87                                                   
#byte   trisd=0x88
#byte   trise=0x89
    
#define lcd_rs_pin      pin_a0
#define lcd_enable_pin  pin_a1
#define data4           pin_a2
#define data5           pin_a3
#define data6           pin_a4                                       
#define data7           pin_a5               
                                                  
#include <lcd_porta.c>                                               

unsigned int8 msb_data_adc=0,lsb_data_adc=0;                                   


#int_ext
      
void EXT_isr(){
  
output_high(pin_b1);
delay_ms(200);                                                                     
output_low(pin_b1);                                             
                                                                                  
i2c_start();   
i2c_write(0x44);//Address --> 0b10001000
i2c_write(0x10);//Rdata
i2c_start();     
i2c_write(0x44);
msb_data_adc=i2c_read();                                   
lsb_data_adc=i2c_read(0);                             
i2c_stop();

}         
                                                                                                                                
void main(){                                       
                                                  
porta=0x00;                               
portb=0x00;                                                       
portc=0x00;                                                           
portd=0x00;                                     
porte=0x00;                         

lcd_init();                         


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////COMANDO DE REINICIO////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                                                                                  
i2c_start();
i2c_write(0x44);        //ADDRESS 
i2c_write(0x06);        //00000110 Reset Command
i2c_stop(); 
          
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////REGISTERS CONFIGURATION////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

i2c_start();            //Iniciar Trama
                        //-------------------------------------------------------------------------------------------------   
i2c_write(0x44);        //ADDRESS
                        //-------------------------------------------------------------------------------------------------
i2c_write(0b01000000);  //Register 0 write + register 0 address                                                         
                        //-------------------------------------------------------------------------------------------------   
i2c_write(0b10000000);  //  ||   MUX-CH     |3|  GAIN         |2|  PGA-BYPASS         |1|                             
                        //  ||   1000=AIN0  |3|  000=G=1      |2|  1= PGA Disabled    |1|                                                                         
                        //-------------------------------------------------------------------------------------------------
i2c_write(0b01000100);  //Register 1 write + register 1 address                                                         
                        //-------------------------------------------------------------------------------------------------   
i2c_write(0b10001010);  //  || DATA RATE    |3|  MODE         |1|  CONVERSION MODE    |1| VREF       |2| TEMPERATURE S |1|
                        //  || 100=330SPS   |3|  0=NORMAL     |1|  1=CONTINUOUS CONV. |1| 01=EXT.    |2| 0=DISABLED    |1|                                                                                                                                                                                   
                        //-------------------------------------------------------------------------------------------------                                                                           
i2c_write(0b01001000);  //Register 2 write + register 2 address                                                         
                        //-------------------------------------------------------------------------------------------------   
i2c_write(0b10000000);  //  || DATA READY   |1|  DATA COUNTER |1|  DATA INTEGRITY     |2| BURN-OUT C.|1| IDAC C.       |3|
                        //  || 1=BIT FLAG   |1|  0=DISABLED   |1|  00=DISABLED        |2| 0=DISABLED |1| 000=DISABLED  |3|                                                                                                                                                                                   
                        //-------------------------------------------------------------------------------------------------
i2c_write(0b01001100);  //Register 3 write + register 3 address                                                 
                        //-------------------------------------------------------------------------------------------------   
i2c_write(0b00000000);  //  || IDAC1        |3|  IDAC2        |3|  RESERVED           |2|
                        //  || 000=DISABLED |3|  000=DISABLED |3|  00 SIEMPRE         |2|                                                                                                                                                                                     
                        //-------------------------------------------------------------------------------------------------   
i2c_stop();             //Finalizar trama
                        //-------------------------------------------------------------------------------------------------   
                      
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                     
                                                                                                                  
                                                                        
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////INICIAR CONVERSIONES///////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                                                                            
i2c_start();      //Iniciar Trama                                                                                                     
i2c_write(0x44);  //ADDRESS
i2c_write(0x08);  //START/SYNC COMMAND
i2c_stop();       //Finalizar Trama         
                      
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////CONFIGURACION DE INTERRUPCIONES///////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(global);                                                             

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                     

while (true){                                                                             
                                                                  
output_toggle(pin_b2);                                                                                                                                 

lcd_gotoxy(1,1);                                           
printf(lcd_putc,"MSB:  %i",msb_data_adc);
lcd_gotoxy(1,2);                                                           
printf(lcd_putc,"LSB:   %i",lsb_data_adc);                                                         
                                
}
}
 
Atrás
Arriba