mira aca tengo una rutina en ensamblador para el 16f877a, que convierte la entrada analógica del canal 0 RA0 a digital y lo muestra en 10 bits por el puerto B y C, dale un vistazo, solom debes configurar el adc y esperar con un retardo de 20us para cargar el muestreo creo y despues tenes el resultado en adresl y adresh, esta tb explicado en la hoja de datos:
INICIO
BANCO_0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF TMR0
MOVLW B'11010000'
MOVWF OPTION_REG
BANCO_1
MOVLW D'0'
MOVWF TRISB
MOVLW D'252'
MOVWF TRISC
MOVLW D'255'
MOVWF TRISA
;SE INICIALIZA MODULO DE CONVERSION A/D
BANCO_0
MOVLW D'193'
MOVWF ADCON0
BANCO_1
MOVLW D'142'
MOVWF ADCON1
;LECTURA CANAL ANALÓGICO
MAIN
BANCO_0
CALL DELAY_20us ; es una rutina de retardo qeu esta en un INC que estaba incluido en este programa
BSF ADCON0,GO
WAIT BTFSC ADCON0,GO
GOTO WAIT
MOVF ADRESH,W
MOVWF PORTC
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB
GOTO MAIN
END
y la misma rutina pero en CCS:
//----------------------------------------------
// P5.c
// El resultado de la conversión A/D del canal0
// se muestra en el puerto b y puerto c
//----------------------------------------------
#include <16F877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#byte port_a=0x05
#byte port_b=0x06
#byte port_c=0x07
#byte ADRESH=0x1e
#byte ADRESL=0x9e
/*---------------------------------------------------------------------*/
void main()
{
int16 adcValue;
setup_adc_ports(RA0_ANALOG); //RA0 entrada analógica
setup_adc(ADC_CLOCK_INTERNAL); // reloj interno
set_tris_a(0xFF);
set_tris_b(0x00);
set_tris_c(0xBC);
port_b=0x00;
port_c=0x00;
do
{
set_adc_channel(0); // selecciona el canal 0
delay_us(20); // Retardo para carga del cap. de muestreo
adcValue=read_adc(); // Lee el resultado de la conversion
port_c=ADRESH; // Parte alta de la conversion al PORTC
port_b=ADRESL; // Parte baja de la conversion al PORTB
delay_ms(1000);
} while (TRUE);
}
espero te sirva, y si tienes alguna duda acerca del codigo aca te respondemos
ahh y para lo de los rangos en ASM te sugiero que te des una vueltita por el foro del lenguaje ensamblador qeu seguro encontras una respuesta para ello, y bueno si es solo un rango talvez solo sea necesario 8 bits y no los 10 del conversor, date una miradita por ahi en el subforo
un saludo