Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

74HC4051 with PIC18F4520

Status
Not open for further replies.

venkates2218

Full Member level 6
Joined
Sep 30, 2016
Messages
354
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,298
Activity points
4,306
Code:
#include <xc.h>
#define  _XTAL_FREQ 8000000 

#include "lcd.h"   

// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 3         // Brown Out Reset Voltage bits (Minimum setting)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = OFF     // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      /* Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)*/

void adc_convert(void);
void fn_display(void);
void sensor_ip(void);

unsigned int input_2;
int enable_sensor_1, enable_sensor_2, enable_sensor_3;

#define S0 LATD2 
#define S1 LATD3
#define S2 LATC5 
#define EN LATC1 

void System_init(void) {
    TRISA = 0b00000011;
    LATA = 0b00000011;

    CMCON = 0X07;

    TRISB = 0b00000000;
    LATB = 0b00000000;

    TRISC = 0b10000100;
    LATC = 0b10000100;

    TRISD = 0b10000011;
    LATD = 0b10000011;

    TRISE = 0b00000000;
    LATE = 0b00000000;

    ADCON0 = 0b00000100; //clear ADCON0 to select channel 1 (AN1)
    ADCON1 = 0b00001101; //VSS,VDD ref. AN1 analog only
    ADCON2 = 0b10010010;
}

void main(void) {
    System_init();
    lcd_init();

    lcd_clear();
    lcd_goto(1, 1);
    lcd_puts("ADC Test"); //Initial sign

    EN = 0;
    __delay_ms(30);

    while (1) {
        enable_sensor_1 = 1;
        enable_sensor_2 = 0;
        enable_sensor_3 = 0;
        sensor_ip();
        __delay_ms(100);
        __delay_ms(100);

        enable_sensor_1 = 0;
        enable_sensor_2 = 1;
        enable_sensor_3 = 0;
        sensor_ip();
        __delay_ms(100);
        __delay_ms(100);

        enable_sensor_1 = 0;
        enable_sensor_2 = 0;
        enable_sensor_3 = 1;
        sensor_ip();
        __delay_ms(100);
        __delay_ms(100);
    }
}

void sensor_ip(void) {

    if (enable_sensor_1 == 1) {
        /*SENSOR 1*/
        lcd_goto(3, 1);
        lcd_puts("Sensor 1");
        S0 = 1;
        S1 = 0;
        S2 = 1;
        __delay_ms(50);
        adc_convert();
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);
    }

    if (enable_sensor_2 == 1) {
        /*SENSOR 2*/
        lcd_goto(3, 1);
        lcd_puts("Sensor 2");

        S0 = 1;
        S1 = 1;
        S2 = 1;
        __delay_ms(50);
        adc_convert();
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);

    }

    if (enable_sensor_3 == 1) {
        /*SENSOR 3*/
        lcd_goto(3, 1);
        lcd_puts("Sensor 3");
        S0 = 0;
        S1 = 1;
        S2 = 1;
        __delay_ms(50);
        adc_convert();
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);
        __delay_ms(100);
    }
}

void adc_convert(void) {
    unsigned long int iv_temp1 = 0;
    input_2 = 0;

    ADCON0bits.ADON = 1; //Enable A/D module
    ADCON0bits.GO_DONE = 1; //Start A/D Conversion
    while (ADCON0bits.GO_DONE != 0); //Loop here until A/D conversion 


    iv_temp1 = ((ADRESH << 8) + ADRESL);
    input_2 = (iv_temp1 * 5000uL) >> 10;
    ADCON0bits.ADON = 0; //Enable A/D module

    fn_display();
}

void fn_display(void) {
    unsigned long long int a122, b122, c122, d122, e122, f122, i122, j122, k122, l122;

    a122 = 0;
    b122 = 0;
    c122 = 0;
    d122 = 0;
    e122 = 0;
    f122 = 0;
    i122 = 0;
    j122 = 0;
    k122 = 0;
    l122 = 0;

    a122 = input_2 / 100000;
    b122 = input_2 % 100000;

    c122 = b122 / 10000;
    d122 = b122 % 10000;

    e122 = d122 / 1000;
    f122 = d122 % 1000;

    i122 = f122 / 100;
    j122 = f122 % 100;

    k122 = j122 / 10;
    l122 = j122 % 10;


    lcd_goto(2, 1);
    lcd_puts("ADC Value ");
    lcd_put_num(a122);
    lcd_put_num(c122);
    lcd_put_num(e122);
    lcd_put_num(i122);
    lcd_put_num(k122);
    lcd_put_num(l122);

    __delay_ms(100);
    __delay_ms(100);

}

This is the code use to interface Analog signal with PIC18F4520 with 74HC4051.After reading the value,it's displayed for reference.
If the multiplexer is operated with single output selection in 7HC4051 means,ADC value shown in the display is correct.
If multiple output is selected as like above,the value shown in display are interchanged.
Like sensor 1 value displayed in sensor 2,sensor 2 value displayed in sensor 3,and sensor 3 value displayed in sensor 1.
 

Hi,

On sensor1 you do:
Code:
        S0 = 1;
        S1 = 0;
        S2 = 1;
Which in my eyes selects sensor2.
... and so on

But it's just a guess, because we don't know your schematic.
--> show your schematic, even hand drawn.
In case you don't have it yet, then draw one. No design without schematic.

Klaus
 

Image_1.jpg

S0,S1,S2 are connected to PIC Controller.
 

If the INPUT pin selected above two combination means only the values are interchanging.If sensor 1 and sensor 2 is operated means it working fine without interchanging of values.
If the third pin selected with any combination of two pins means only,the values are interchanging between each other.

- - - Updated - - -

1.If the input in 74HC4051 is selected by using tactile switch means every channel is working fine.
2.Connected an 2.2K pulldown resistor with S0,S1,S2 but still facing the issue.
3.Removed the series resistor between PIC and 74HC4051 but facing the same issue.

Code:
 while (1) {


        lcd_goto(3, 1);
        lcd_puts("Sensor 1");
        S2 = 1;
        S1 = 0;
        S0 = 1;
        adc_convert();

        lcd_goto(3, 1);
        lcd_puts("Sensor 2");
        S2 = 1;
        S1 = 1;
        S0 = 1;
        adc_convert();

        lcd_goto(3, 1);
        lcd_puts("Sensor 3");
        S2 = 1;
        S1 = 1;
        S0 = 0;
        adc_convert();
    }

If the input is selected like above means only the values are interchanging between each other.
 

If the input is selected like above means only the values are interchanging between each other.
Isn't that what you want?

I would suggest you write a routine to read a selected input and return a measured value, something like:
Measured = ReadAdcInput(Channel);

You do not need to turn the ADC off between measurements.
Set the channel select bits by AND/OR ing the LAT bits in the appropriate port.
Wait a short time for the ADC S&H to settle, usually less than 1mS.
Read the ADC and do your math on the high and low bytes of the ADC result. You might have to cast the register values as integers for the math to work, it looks like MikroC code to me and I'm not sure if it does promotion on register values.
Return the value.

Why all the 'long long int' variables, whatever that means. You can format the result as a string and display it directly.

Brian.
 

this 74hc chip has logic converter,i advise you to read ADC through pic microcontroller and select a proper chip
 

74HC4051 is an analog switch with digital select inputs, with VEE taken to a negative supply it can even carry negative signal inputs.
I think venkates2218's problem is just one of producing the required channel selection bits.

Brian.
 

Created an time delay in adc_convert function,made an condition loop in adc_convert to stop the conversion
but facing the same issue.the values are interchanging.
 

Where did you put the delay?
It has to be AFTER setting the channel but BEFORE starting the ADC conversion.

The idea is that inside the PIC there is only one ADC module and to hold the value steady while it reads the voltage it 'freezes' it in a sample and hold circuit. When the input voltage changes, it takes a moment for the S&H to settle to the new voltage. The input change can be from selecting a different internal ADC channel or selecting an external one like the 4051.

Also note that the time it takes for the voltage to settle depends on the impedance at the input of the ADC. It draws a little current to charge the S&H circuit so if the impedance is higher at the input it takes longer for the voltage to stabilize. The 4051 doesn't have any buffering, it is purely an analog switch so you still have to be careful to give it sufficient current for the sampling time you use. This is why Microchip specify the ADC conversion time with a low impedance voltage source. If you can keep the input impedance below about 5K it should run at full speed.

Brian.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top