I picked up the below method of reading the ADC here
http://www.rentron.com/PICX2.htm
I like it much better than ADCIN.
The below code is an example for reading ADC channel 0. Look at the example on the above link to add other channels.
It looks like a lot of stuff to do to read the ADC, pretty much what ADCIN does behind the scenes. This way you have control.
The "READ_AD" part is only needed once no matter how many channels you are reading (reusable).
Use your LCD or SERIAL to see what is happening. I have this running at 2400 baud. Works OK with the internal OSC for testing.
Code:
[color=#000000] '16F88 ADC TEST FOR CHANNEL 0
DEFINE OSC 4
OSCCON = %01100000
@ __config _CONFIG1, _INTRC_IO & _WDT_OFF & _LVP_OFF & _MCLR_OFF &_CP_OFF
ANSEL = %00001111
TRISA = %11111111
CHAN0 VAR WORD 'VAR TO HOLD ADC0 READING
START:
HIGH PORTB.3 'HEART BEAT
PAUSE 250
LOW PORTB.3
PAUSE 250
'BELOW WILL SHOW WHAT THE ADRESH AND ADRESL REGISTER HOLDS
SEROUT2 PORTB.2, 16780, ["ADRESH ",DEC ADRESH," ADRESL ",DEC ADRESL,$a,$d]
PAUSE 50
'BELOW SHOWS THE 10 BIT READING OF ADC0 IN VAR CHAN0
SEROUT2 PORTB.2, 16780, ["CHAN0 ",DEC CHAN0,$a,$d]
GOSUB ADC_0 'STARTS THE READING OF ADC CHANNEL 0
GOTO START
ADC_0: 'READ AN0
ADCON1 = %10000000 'SET FOR 10 BIT
ADCON0 = %00000001 'TURNS ADC ON
GOSUB READ_AD
CHAN0.HighByte = ADRESH 'PLACES THE HIGH AND LOW BYTE
CHAN0.LowByte = ADRESL 'INTO VAR CHAN0
RETURN
READ_AD: 'DOES THE ADC CONVERSION
PAUSE 50
ADCON0.2 = 1
PAUSE 50
RETURN
Bookmarks