Hello all, I seem to have a problem with the 10-bit ADC on the 16F877. As you know, the ADC uses two 8-bit registers to store the result: ADRESH and ADRESL. In the ADC config you can choose to have the converted values left-justified or right-justified, as only 10 bits out of these 16 are needed: Left-justified: ADRESH ADRESL xxxxxxxx xx000000 Right-justified: ADRESH ADRESL 000000xx xxxxxxxx (where xxxxxxxx is the actual value) Now the problem we have is that regardless of the configuration I try, I always read a zero in ADRESL, so I have either two valid bits or eight valid bits, but never ten bits. I've searched the archive in www.piclist.com but all ADC code I can find always uses 8-bit results only, configuring the ADC to be left-justified and neglecting the ADRESL register. Has anyone found this problem before? Any hints? Code follows: === Cut === Startup bsf STATUS, RP0 ; Bank1 movlw b'11111111' ; PORT A = all inputs movwf TRISA clrf TRISC ; PORT C = all outputs bcf STATUS, RP0 ; Bank0 movlw b'01000001' ; Fosc/8, A/D enabled movwf ADCON0 bsf STATUS, RP0 ; Bank1 movlw b'00001110' ; Left justify, 1 analog channel movwf ADCON1 ; VDD and VSS references movlw b'10000111' ; TMR0, 1:256 movwf OPTION_REG bcf STATUS, RP0 ; go back to Bank0 Main ; ; acquisition time before starting the AD conversion ; clrf TMR0 ; ensures that we start a complete T0 cycle here bcf INTCON,T0IF _T0Wait btfss INTCON,T0IF ; wait for Timer0 to timeout goto _T0Wait bcf INTCON,T0IF ; ; starts the AD conversion ; bsf ADCON0,GO ; start A/D conversion _waitAdc btfss PIR1, ADIF ; conversion complete? goto _waitAdc ; = NO (wait) bcf PIR1, ADIF ; clear conversion complete flag movf ADRESH, W ; get the 8 MSBs movwf adc_high bsf STATUS, RP0 ; Bank1 movf ADRESL, W ; get the 2 MSBs movwf adc_low bcf STATUS, RP0 ; Bank0 goto Main ; Loop forever === Cut === Thanks, G. -- 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