33.2.7 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:
- Select ADC conversion clock
- Configure voltage reference
- Select ADC input channel (precharge+acquisition)
- Turn on ADC module
- Configure ADC interrupt (optional):
- Clear ADC interrupt flag
- Enable ADC interrupt
- Enable peripheral interrupt (PEIE bit)
- Enable global interrupt (GIE bit)(1)
- If ADACQ =
0
, software must wait the required acquisition time(2). - Start conversion by setting the ADGO bit.
- Wait for ADC conversion to complete by one of the following:
- Polling the ADGO bit
- Waiting for the ADC interrupt (interrupts enabled)
- Read ADC Result.
- Clear the ADC interrupt flag (required if interrupt is enabled).
Important:
- With global interrupts disabled, the device will wake from Sleep but will not enter an Interrupt Service Routine.
- Refer to 33.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
}
}