32.2.7 ADC Conversion Procedure (Basic Mode)

This is an example procedure for using the ADC to perform an Analog-to-Digital Conversion:

  1. Configure the Port:
    1. Disable the pin output driver (Refer to the TRISx register)
    2. Configure the pin as analog (Refer to the ANSELx register)
  2. Configure the ADC module:
    1. Select the ADC conversion clock
    2. Configure the voltage reference
    3. Select the ADC input channel (precharge+acquisition)
    4. Turn on ADC module
  3. Configure the ADC interrupt (optional):
    1. Clear the ADC interrupt flag
    2. Enable the ADC interrupt
    3. Enable the peripheral interrupt (PEIE bit)
    4. Enable the global interrupt (GIE bit)(1)
  4. If ADACQ = 0, software must wait the required acquisition time(2).
  5. Start the conversion by setting the ADGO bit.
  6. Wait for the ADC conversion to complete by one of the following:
    1. Polling the ADGO bit
    2. Waiting for the ADC interrupt (interrupts enabled)
  7. Read the ADC Result.
  8. Clear the ADC interrupt flag (required if interrupt is enabled).
Important:
  1. With global interrupts disabled, the device will wake from Sleep but will not enter an Interrupt Service Routine.
  2. Refer to 32.3 ADC Acquisition Requirements.

ADC Conversion (assembly)

; This code block configures the ADC for polling, Vdd and Vss references,
; FRC oscillator, and AN0 input.
; Conversion start & polling for completion are included.

    BANKSEL ADCON1
    clrf    ADCON1      ;
    clrf    ADCON2      ; Legacy mode, no filtering, ADRES->ADPREV
    clrf    ADCON3      ; no math functions
    clrf    ADREF       ; Vref = Vdd & Vss
    clrf    ADPCH       ; select RA0/AN0
    clrf    ADACQ       ; software controlled acquisition time
    clrf    ADCAP       ; default S&H capacitance
    clrf    ADRPT       ; no repeat measurements
    clrf    ADACT       ; auto-conversion disabled
    movlw   B'10010100' ; ADC On, right-justified, FRC clock
    movwf   ADCON0
    BANKSEL TRISA       ;
    bsf     TRISA,0     ; Set RA0 to input
    BANKSEL ANSEL       ;
    bsf     ANSEL,0     ; Set RA0 to analog
    call    SampleTime  ; Acquisiton delay
    BANKSEL ADCON0 
    bsf     ADCON0,ADGO ; Start conversion
    btfsc   ADCON0,ADGO ; Is conversion done?
    goto    $-2         ; No, test again
    BANKSEL ADRESH      ;
    movf    ADRESH,W    ; Read upper 2 bits
    movwf   RESULTHI    ; store in GPR space
    movf    ADRESL,W    ; Read lower 8 bits
    movwf   RESULTLO    ; Store in GPR space	

ADC Conversion (C)

/*This code block configures the ADC
for polling, VDD and VSS references, ADCRC
oscillator and AN0 input.
Conversion start & polling for completion
are included.
  */
    void main() {
        //System Initialize
        initializeSystem();

        //Setup ADC
        ADCON0bits.FM = 1;      //right justify
        ADCON0bits.CS = 1;      //FRC Clock
        ADPCH = 0x00;           //RA0 is Analog channel
        TRISAbits.TRISA0 = 1;   //Set RA0 to input
        ANSELAbits.ANSELA0 = 1; //Set RA0 to analog
        ADCON0bits.ON = 1;      //Turn ADC On

    while (1) {
        ADCON0bits.GO = 1;     //Start conversion
        while (ADCON0bits.GO); //Wait for conversion done
        resultHigh = ADRESH;   //Read result
        resultLow = ADRESL;    //Read result
    }
 }