interface 18 bit ADC with PIC16F883 using I2C protocol

Thread Starter

nithinf94

Joined Jun 19, 2024
5
hi guys , I'm new to this platform. I need some help with my project.
In my project, i want to interface 18-bit ADC with PIC16F883 using I2C protocol. can you guys help me with this plzzz..
 

Thread Starter

nithinf94

Joined Jun 19, 2024
5
hi guys , I'm new to this platform. I need some help with my project.
In my project, i want to interface 18-bit ADC mcp3421 with PIC16F883 using I2C protocol. can you guys help me with this plzzz..
 

Thread Starter

nithinf94

Joined Jun 19, 2024
5
Code:
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "i2c.h"
#include <math.h>
#include <stdint.h>
#include <pic16f883.h>

// PIC16F883 Configuration Bit Settings
// Configuration bits can be set in code or configured using the MPLAB IDE

// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT // Internal oscillator, no clock o utput
#pragma config WDTE = OFF            // Watchdog Timer disabled
#pragma config PWRTE = OFF           // Power-up Timer disabled
#pragma config MCLRE = OFF           // MCLR pin is not used as an input
#pragma config CP = OFF              // Code protection disabled
#pragma config CPD = OFF             // Data code protection disabled
#pragma config BOREN = ON            // Brown-out Reset enabled
#pragma config IESO = OFF            // Internal/External Switchover disabled
#pragma config FCMEN = OFF           // Fail-Safe Clock Monitor disabled
#pragma config LVP = OFF             // Low Voltage Programming disabled

// CONFIG2
#pragma config BOR4V = BOR40V       // Brown-out Reset set to 4.0V
#pragma config WRT = OFF             // Flash Memory Write Protection off

//define shift register pins
#define DS PORTAbits.RA4 // Data pin
#define DS1 PORTAbits.RA7 // Data pin
#define DS2 PORTCbits.RC0 // Data pin
#define SCLK   PORTAbits.RA6 // Shift clock pin
#define SSTB   PORTAbits.RA5 // Storage clock (latch) pin

// Define transistor control pins
#define q1 PORTBbits.RB4// Transistor controlling common anode of digit 1
#define q2 PORTBbits.RB1 // Transistor controlling common anode of digit 2
#define q3 PORTAbits.RA0 // Transistor controlling common anode of digit 3
#define q4 PORTAbits.RA1 // Transistor controlling common anode of digit 4

//define swtiches
#define SW4 PORTCbits.RC2
#define SW3 PORTCbits.RC7
#define SW2 PORTCbits.RC6
#define SW1 PORTCbits.RC5

//define mcp3421 pins
#define scl PORTCbits.RC3
#define sda PORTCbits.RC4

#define MCP3421_ADDRESS 0xD6
#define MCP_READ 0xD7
#define MCP_CONFIG 0x8C

// Define segment data for displaying numbers 0 to 9 and "-" (for negative numbers)
const unsigned char digitSegments[] = {
    0x06, // 0 0b00111111
    0x7E, // 1 0b00000110
    0x45, // 2 0b01011011
    0x54, // 3 0b01001111
    0x3C, // 4 0b01100110
    0x94, // 5 0b01101101 
    0x84, // 6 0b01111101
    0x5E, // 7 0b00000111
    0x04, // 8 0b01111111
    0x14, // 9 0b01101111
    0xFD,  // - 0b01000000
   0X7C,
};
/*const unsigned char rangeSegment[] = {
    0xFD,// -
    0xF9,//-.
    0x64,//d
    0x60,//d.
    0x0D,//p
    0x09,//p.
    0x7A,//i  
    0xA7,//L
    0x94,//S
    0x24,//H
    0x34,//y
    0x8F,//r
    0x0C,//a
    0x0E,//n
    0x14,//g
};*/


unsigned char prVal, s1Val=5689, s2Val;
unsigned int  VAdcrslt,S1value=0,S2value = 4321;
unsigned char pmsd,psnd,ptrd,plsd,s1msd,s1snd,s1trd,s1lsd,s2msd,s2snd,s2trd,s2lsd;

uint32_t adcrslt,adcrslt1;
unsigned int adc_read,X;
unsigned int ADCHRG,ADCMRG,ADCLRG,dachrg,daclrg,ADCread,ADC_BIT_17,DACwrite;


void system_init();
void power_on();


void display();
void shiftdata595(unsigned char data1, unsigned char data2, unsigned char data3 );
void clock();
void strobe();

//ADC FUNCTIONS
unsigned int ADC_READING_PGM();
void MCP3421_WriteADC();
void MCP3421_ReadADC();
unsigned int adc_result();

void main(void)
{    
    
    system_init();
    power_on() ;
        
      while (1)
    {
          
        while (TMR0 != 0);
        {
            
            TMR0 = 223;//TIMER 4msec
         
             adc_read= ADC_READING_PGM();// read ADC value
             
            display();
}//timer ends
        
    } //while(1)ends
    
}//main ends

void system_init()
{
    
    OPTION_REG = 0xC6;
    PIE1 = 0x00;
    PIE2 = 0x00;

    PIR1 = 0x00;
    PIR2 = 0x00;

    PCON = 0x03;
    INTCON = 0x00;
    OSCCON = 0x65;

    ADCON0 = 0x00;
    ADCON1 = 0x00;

    SSPCON=0x28;
    SSPCON2=0;
    SSPSTAT=0x00;
    SSPADD=0x09;
    
    TRISA = 0x00;
    TRISB = 0x00;
    TRISC = 0b00011100;  
    TRISE = 0x08;
    ANSEL = 0x00;
    ANSELH = 0x00;   
    
    TMR0 = 0;    
    
}

 void power_on()   
 {
    q1=0;
    q2=1;
    q3=1;
    q4=1;
    
      VAdcrslt=adc_result();
      
        pmsd=VAdcrslt/1000;
        VAdcrslt=VAdcrslt%1000;
        ptrd=VAdcrslt/100;
        VAdcrslt=VAdcrslt%100;
        psnd=VAdcrslt/10;
        plsd=VAdcrslt%10;

        s1msd=S1value/1000;
        S1value=S1value%1000;
        s1trd=S1value/100;
        S1value=S1value%100;
        s1snd=S1value/10;
        s1lsd=S1value%10;

        s2msd=S2value/1000;
        S2value=S2value%1000;
        s2trd=S2value/100;
        S2value=S2value%100;
        s2snd=S2value/10;
        s2lsd=S2value%10;

        prVal = digitSegments[pmsd];
        s1Val= digitSegments[s1msd];
        s2Val= digitSegments[s2msd];
}  

void display()
{
     if (q1==0)
    {
          q4=1;
          q3=1;
          q2=1;
          q1=1;
          prVal = digitSegments[ptrd];  
          s1Val= digitSegments[s1trd];
          s2Val= digitSegments[s2trd];
          q2=0;     
              shiftdata595(prVal,s1Val,s2Val);
              
    }
        else if (q2==0)
        {
          q4=1;
          q3=1;
          q2=1;
          q1=1;
          prVal = digitSegments[psnd];  
         s1Val= digitSegments[s1snd];
          s2Val= digitSegments[s2snd];
          q3=0;
              shiftdata595(prVal,s1Val,s2Val);
        }
        else if (q3==0)
        {
          q4=1;
          q3=1;
          q2=1;
          q1=1;
          prVal = digitSegments[plsd];
          s1Val= digitSegments[s1lsd];
          s2Val= digitSegments[s2lsd];          
          q4=0;
              shiftdata595(prVal,s1Val,s2Val);
        }
        else 
        {
          q4=1;
          q3=1;
          q2=1;
          q1=1;
          prVal = digitSegments[pmsd]; 
          s1Val= digitSegments[s1msd];
          s2Val= digitSegments[s2msd];
          q1=0;
              shiftdata595(prVal,s1Val,s2Val);
        }
    
}


void shiftdata595(unsigned char data1,unsigned char data2, unsigned char data3 )
{   
    unsigned int i=8;
    for(i=0;i<8;i++)  
    {
       DS =(data1<<i)&0x80?1:0;        
       DS1 =(data2<<i)&0x80?1:0;
       DS2 =(data3<<i)&0x80?1:0;
        clock();
    }    
    strobe();    
}
void clock()                                                                                                        
{
    SCLK=1;
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    SCLK=0;   
}
void strobe()
{
    SSTB=1;
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    SSTB=0;    
}


unsigned int ADC_READING_PGM()
{
      adccnt++;
    if(adccnt>=75)
    {
        adccnt=0; 
        adc_result();
        return adcrslt1;
    }
}
unsigned int adc_result()
{
     MCP3421_WriteADC();
    MCP3421_ReadADC();
    ADCHRG &=0x03;

    //MCP3421_WriteADC();
    
    adcrslt= ((uint32_t)(ADCHRG<<16) | (uint32_t)(ADCMRG<<8) | ADCLRG);
    //adcrslt /=96;
    adcrslt1=((adcrslt*9999)/131071);
   return adcrslt1;
}

//ADC Reading
void MCP3421_ReadADC()
{ 
    
         I2C_Start();
         I2C_Write(MCP_READ);
         I2C_Write(MCP_CONFIG);//Read mode
         
         ADCHRG = I2C_Read_Byte();  //reading high bitS
         ADCMRG = I2C_Read_Byte();  //reading middle bits
         ADCLRG = I2C_Read_Byte();  //reading low bits
        
         I2C_NACK();
         I2C_Stop();
         
         I2C_Restart();
         I2C_Write(MCP_READ);   //READ MODE
         I2C_Write(MCP_CONFIG);
         I2C_NACK();
         I2C_Stop();
       
} 

void MCP3421_WriteADC()
{ 
    
         I2C_Start();
         I2C_Write(MCP3421_ADDRESS);   //calling slave
         I2C_Write(MCP_CONFIG);
         I2C_NACK();
         I2C_Stop();
         
}
Moderators note : added code tags
 
Top