Consulta Vref en ADC PIC16F873

Estoy programando un micro PIC16F873, utilizando el conversor ADC en 10 bits. El lenguaje es CCS C.

En mi diseño, tengo un voltaje a medir que varia entre 2.7 y 3.15 volts aproximadamente.

A fin de obtener la mayor precision posible, configure lo siguiente:
setup_adc_ports(AN0_VREF_VREF);

Con esto estoy intentando decir que A0 es la entrada del ADC, A3 es la referencia high y A2 es la referencia low.

En proteus (isis) intento simular una conversion (que emite el valor por rs232 a una terminal) poniendo un generador DC en A2 de 2.5 volts y uno en A3 de 3.5 volts.

Sin embargo, me tira siempre como valor leido un 0. Si pongo A2 a 0 volts ahi si empieza a leer valores, cuyo maximo (1024) solo lo obtengo si pongo A3 en 0,5 volts.

La consulta es: ¿Estoy haciendo bien las cosas? quiza sea el simulador que lo hace mal pero no estoy seguro. ¿Entendi bien la idea de que el voltaje que haya en A3 sera el maximo voltaje y representa 1024, y el de A2 el minimo y representa 0?
 
Pondrías el código para ver, puede que el simulador no soporte esa función, que tal si revisas las limitaciones que tiene el simulador con respecto a los PIC16
 
Este es el codigo en CCS C

unsigned int16 value;
set_tris_a(0b11111101);
set_tris_b(0b11111111);
set_tris_c(0b10111011);
output_a(0x00);output_b(0x00);output_c(0x00);
set_tris_a(0b11111111);

setup_adc_ports(AN0_VREF_VREF);
setup_adc(ADC_CLOCK_DIV_32);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_wdt(WDT_18MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

do {
restart_wdt();
value = read_adc();
printf("V: %Lu ", value);
delay_ms(10);
} while(TRUE);

Si te referias al codigo ASM generado, avisame y separo la parte ASM que configura el ADC.

¿Tenes alguna referencia sobre dichas limitaciones? Quiza pueda ser una limitacion el problema.
 
Lo probé y realmente no veo el problema, solo agregué #use y funcionó a la primera con los voltajes 2.5 en AN2 y 3.5 en AN3, dando como resultado 512 en el terminal al poner 3.0V en AN0.

PHP:
#device adc=10  // Esto después de declarar el chip.

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

int16 value;

void main()
{
   set_tris_a(0b11111101);
   set_tris_b(0b11111111);
   set_tris_c(0b10111011);  
   output_a(0x00); output_b(0x00); output_c(0x00);
   set_tris_a(0b11111111);
   
   setup_adc_ports(AN0_VREF_VREF);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_wdt(WDT_18MS);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   do{
      delay_ms(10);
      value = read_adc();
      printf("V: %Lu \r", value);
   }while(TRUE);
}



Es probable que sea la versión; en mi caso estoy usando el Proteus 7.6 SP4 y CCS 4.093.

Con respecto a las limitaciones puedes revisar el archivo HELP "PIC16" que se encuentra en
C:\Program Files\Labcenter Electronics\Proteus 7 Professional\HELP
 
Atrás
Arriba