This is an example procedure for using the ADC to perform an Analog-to-Digital Conversion:
0
, software must wait the required
acquisition time(2).; 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
/*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
}
}