40.2.6 ADC Conversion Procedure (Basic Mode)
This is an example procedure for using the ADC to perform an Analog-to-Digital Conversion:
- Configure Port:
- Disable pin output driver (refer to the TRISx register)
- Configure pin as analog (refer to the ANSELx register)
- Configure the ADC module:
- Configure ADC interrupt (optional):
- Clear ADC interrupt flag
- Enable ADC interrupt
- Enable global interrupt (GIE bit)(1)
- If ADACQ =
0
, software must wait the required acquisition time(2). - Start conversion by setting the GO bit.
- Wait for ADC conversion to complete by
one of the following:
- Polling the GO bit
- Waiting for the ADC interrupt (if interrupt is enabled)
- Read ADC Result.
- Clear the ADC interrupt flag (if interrupt is enabled).
Note:
- With global interrupts disabled (GIE
=
0
), the device will wake from Sleep but will not enter an Interrupt Service Routine. - Refer to the ADC Acquisition Requirements section for more details.
ADC Conversion (assembly)
; This code block configures the ADC for polling, Vdd and Vss references,
; ADCRC 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, ADCRC 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,GO ; Start conversion
btfsc ADCON0,GO ; Is conversion done?
goto $-2 ; No, test again
BANKSEL ADRESH ;
movf ADRESH,W ; Read upper byte
movwf RESULTHI ; store in GPR space
movf ADRESL,W ; Read lower byte
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; //ADCRC 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
}
}