how to combine ADRESH and ADRESL on 12 bit ADC

391 views Asked by At

MICRO: PIC18LF47K42
compiler: XC8
application: MPLABX

I am trying to combine the values in of 12 bit ADC. They go into ADRESH and ADRESL. My ADC is set up for right-justify which does formating as so:
ADRESH:(----MSB,x,x,x) ADRESL: (X,X,X,X,X,X,X,LSB)

From inspecting the value in my result register i can tell i dont have a great resolution. Im pretty sure its becasue of how im combining ADRESH and ADRESL. How could i do this?

#include "myIncludes.h"
volatile unsigned char ZCDSoftwareFlag = 0;
volatile unsigned char switchValue = 0;
void main(void) 
{
    portInit(); 
    triac = 0;
    unsigned char result;
    adcInit();                 
    while(1)
    {
        __delay_us(4);
        ADCON0bits.GO = 1; //Start conversion
        while (ADCON0bits.GO); //Wait for conversion done
        result = ADRESH;
        result = result << 8;
        result = result |ADRESL;
    }
}

And heres the ADC init function

void adcInit(void)
{
    ADCON0bits.FM = 1;              //right-justify 
    ADCON0bits.CS = 1;              //ADCRC Clock
    ADPCH = 0x00;                   //RA0 is Analog channel
    ADCON0bits.ON = 1;              //Turn ADC On
    ADCON0bits.GO = 1;              //Start conversion
}
1

There are 1 answers

0
Mike On

You try to put an 12Bit result in an 8 Bit variable. Switch it to 16Bit.

uint16_t result;

Then you can combine the values:

result = ADRESH;
result = result << 8;
result = result |ADRESL;