Part Number: ADS1115
HELLO JOSEPF WU,
I hope you will help me, i am using atmel 8052 micro-controller IC. i have connected SCL PIN TO PORT 1.0 OF 8052 AND SDA PIN TO PORT 1.1 OF 8052. In program you can see that. i am tring this from last 3 to 4 days. i have followed the same time diagram as shown in datasheet. still i am unable to read 16 bit. i am getting only msb 8 bit data correct and it varies as i change the input voltage. i am calling it correct coz it gives me 7F as per set gain.. when i set gain to ±2.048 i got 7F at 2v.. so basically my half operation is absolutely correct. even i tried to read config register there also i am getting msb 8 bit correctly.. i am not getting what i am doing wrong here which is affecting my lsb 8 bit data. please take out some time and help me.
#include <REGX52.H>
sbit SCL=P1^0;
sbit SDA=P1^1;
sbit D7= B^7; //MSBbit
bit flag=0,RT=1,BIT=0;
unsigned char i,ini_char,t,STRING,STX=02,CR=0X0D,AD1,AD2,AD3,AD4,DATA0,DATA1,E,ADC_L,OK,ADS;
unsigned int ADC_M;
unsigned char check [5];
unsigned char nibble [5];
void main();
void port_ini();
void serial_ISR(void);
void go(ini_char);
void SEND_ADC_READING();
void HEX_TO_BCD();
void ADC_WRITE();
void ADC_WR();
void SPI();
void ADCM();
void ADCL();
//----------------------------------------------------------------------
//--------- MAIN PROGRAM ---------------------------------------------
//----------------------------------------------------------------------
void main()
{
//
port_ini();
ADC_WRITE();
while(1)
{
ADC_WRITE();
if (RT==0)
{
for(i=0;i<5;i++)
{
nibble[i]=check[i];
}
RT=1;
ini_char=nibble[0];
go(ini_char);
}
}
}
void port_ini()
{
EA=1; //all_interrupt_enable
ES=1; //serial_interrupt_enable
TMOD=0x20; //TIMER 1 MODE 2(auto reload)
TH1=0xFD; //9600 Baudrate
SCON=0x50; // REN enable, 8bit 1 stop bit
TR1=1;
SCL=1;
SDA=1;
}
void ADC_WRITE()
{
ADC_M=0x00; //clear previous data to collect new
ADC_L=0x00; //clear previous data to collect new
//WRITE OPERAION
SCL=1;
SDA=1;
SDA=0; //START
B=0x90; //SLAVE ADDRESS+WR
ADC_WR();
SCL=0;
SCL=1;
B=0x01; //CONFIGURE REG
ADC_WR();
SCL=0;
SCL=1;
B=0xC3; //OS=1, A0 CH, ONE SHOT MODE
ADC_WR();
SCL=0;
SCL=1;
SCL=0;
SCL=0;
SCL=0;
B=0x83; //128SPS
ADC_WR();
SCL=0;
SCL=1;
SCL=0; //STOP
SCL=1;
SDA=1; //STOP
TH0=0xDC; //DC
TL0=0x00;
TR0=1;
while(TF0==0); //DELAY OF 10MS
TR0=0;
TF0=0;
SCL=1;
SDA=1;
SDA=0; //START
//READ OPERAION
B=0x90; //SLAVE ADDRESS+WR
ADC_WR();
SCL=0;
SCL=1;
B=0x00; //CONVERSION REG
ADC_WR();
SCL=0;
SCL=1;
SCL=0;
SCL=1;
SDA=1; //STOP
SCL=1;
SDA=1;
SDA=0; //START
B=0x91; //SLAVE ADDRESS+RD
ADC_WR();
SCL=0;
SCL=1;
ADCM(); //call ADCM subroutine
SCL=0;
SCL=1;
SCL=0;
SCL=1;
SDA=1; //STOP
E=ADC_M/256; //MSB
HEX_TO_BCD();
AD4=DATA1;
AD3=DATA0;
E=ADC_M%256; //LSB
HEX_TO_BCD();
AD2=DATA1;
AD1=DATA0;
}
void ADC_WR()
{
for (i=0; i<8; i++)
{
SCL=0;
SDA=D7;
SCL=1;
B = B<<1; //rotate left B reg into MSB to detect next bit
}
}
void ADCM()
{
for(i=0; i<16; i++)
{
SCL=0; //high to low pulse to receive digital data from analog
if (SDA==1) //first rotate then add
{
ADC_M= ADC_M << 1; //every rotate 0 will occure at LSB
ADC_M=ADC_M+1;
}
else if(SDA==0) //only rotate
{
ADC_M=ADC_M << 1; //every rotate 0 will occure at LSB
}
SCL=1;
}
}
//**********************************************************************
void ADCL()
{
for(i=0; i<8; i++)
{
SCL=0; //high to low pulse to receive digital data from analog
if (SDA==1) //first rotate then add
{
ADC_L= ADC_L << 1; //every rotate 0 will occure at LSB
ADC_L=ADC_L+1;
}
else if(SDA==0) //only rotate
{
ADC_L=ADC_L << 1; //every rotate 0 will occure at LSB
}
SCL=1;
}
SCL=0;
OK=0;
SCL=1;
}
//**********************************************************************
//-------------------------------------------------//
//------- SERIAL_COMMUNICATION -------------------//
//-------------------------------------------------//
void serial_ISR(void) interrupt 4
{
if(RI==1) //if RI is set
{
STRING=SBUF; //move content of SBUF into STRING
RI=0; //clear RI to reset
if(STRING==CR) //if carrige return is detected (CR=0x0D)
{
flag=0; //clear flag
t=0; //clear t
RT=0;
}
else if (flag==1) //if flag is set
{
check[t]=STRING; //transfer data into array
t++; //increment array pointer
}
else if (STRING==STX && RT==1) //if STX=0x02 is detected & RT is set
{
flag=1; //set flag 1
t=0; //start pointer from 0 location
}
}
}
//****************************************
//----------------------------------------
//-------- GO BYTE0 AND BREAK ------------
//----------------------------------------
void go(int ini_char) // 1st received char
{
switch(ini_char)
{
case 'R': //if R
{
SEND_ADC_READING();
break;
}
}
}
//****************************************
//----------------------------------------
//-------- SEND_ADC_READING ------------
//----------------------------------------
void SEND_ADC_READING()
{
SBUF= STX;
while(TI==0);
TI=0;
SBUF= 'R';
while(TI==0);
TI=0;
SBUF= AD4;
while(TI==0);
TI=0;
SBUF= AD3;
while(TI==0);
TI=0;
SBUF= AD2;
while(TI==0);
TI=0;
SBUF= AD1;
while(TI==0);
TI=0;
SBUF= CR;
while(TI==0);
TI=0;
}
//****************************************
//----------------------------------------//
//----------- HEX_TO_BCD -----------------//
//----------------------------------------//
void HEX_TO_BCD()
{
DATA1=E/16; //6A/10=6 MSB
if(DATA1>9)
{
DATA1=DATA1+0x37;
}
else
{
DATA1=DATA1+0x30;
}
DATA0=E%16; //A LSB
if(DATA0>9)
{
DATA0=DATA0+0x37;
}
else
{
DATA0=DATA0+0x30;
}
}
//****************************************