This may not answer your problem but I use the following (in C) and it = works perfectly for a 10bit result in my 16F877 projects. UINT16 ReadADC(UINT8 ADC_Channel) { volatile UINT16 ADC_VALUE; /* Selecting ADC channel */ ADCON0 =3D (ADC_Channel << 3) + 1; /* Enable ADC, Fosc/2 */ ADIE =3D 0; /* Masking the interrupt */ ADIF =3D 0; /* Resetting the ADC interupt = bit */ ADRESL =3D 0; /* Resetting the ADRES value = register */ ADRESH =3D 0; ADGO =3D 1; /* Starting the ADC process */ while(!ADIF) continue; /* Wait for conversion complete = */ ADC_VALUE =3D ADRESL; /* Getting HSB of CCP1 */ ADC_VALUE +=3D (ADRESH << 8); /* Getting LSB of CCP1 */ return (ADC_VALUE); /* Return the value of the ADC = process */ } Where ADC_Channel is a number from 0->5 having previously set ADCON1 =3D ADC_CONFIG; where..... #define ADC_CONFIG 0x82 // Set Right justified, PORT A = as analogue, PORT E as digital Maybe you can convert this to ASM. Pete -- http://www.piclist.com hint: The list server can filter out subtopics (like ads or off topics) for you. See http://www.piclist.com/#topics