#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();
}
i want to interface 18 bit ADC MCP3421 with pic16f886So, what is the question?
by Robert Keim
by Aaron Carman
by Robert Keim