Are you allowing enough settling time after selecting the ADC input?Are the Tad time correct?How you you seeing the ADC value?Which compiler are you using?Have you studied the PIC data sheet on using the ADC?Have you read and studied the 18C reference Manual (Doc #DS39500A) om how to use the ADC?Are you using function that came which the compiler for the ADC or are you writing/reading the PIC ADC registers directly?

I've never used a PIC, but if the value is exactly 0, 1, 2 or 3, then perhaps the problem is related to that those are the highest 2 bits out of a 10-bit value between 0 and 1023. I e 1023 == 0x3ff. So, if you were only reading the highest byte of a two-byte value, that's what you would get.

Good point jwatt.The PIC has a 10 bit ADC and the ADC result is put into two 8 bit registers.If the ADC result is Right Justified (a setting in the ADC registers) and only the high byte is read then you effectively have a 2 bit ADC.