ADC Conversion Procedure (Basic Mode)

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

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