Hola muchachos, miren estoy aprendiendo a usar los comparadores del pic 18F4550, y bueno, he hecho un programa que me permita comparar un voltaje de referencia interno con el comparador 1, cuya señal analógica entra por AN0.... Cuando simulo, y verifico el bit 6 de del CMCON, pues siempre está en 0, es decir, siempre me dice que el V+ (voltaje de referencia interno) es menor... aún así cuando por AN0, introduzco un voltaje mucho menor a la referencia... Es como si el comparador no me leyera o no comparara!! y bueno la verdad me gustaria que me orientaran porque no veo el error en mi programa, aquí se los dejo a ver que tal....
#include <18f4550.h>
#DEVICE ADC=8
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT,NOMCLR
#use fast_io (A)
#use fast_io (C)
#use fast_io (D)
#use fast_io (B)
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Habilita las funciones RS232, velocidad a 9600 baudios
#byte RCON=0xFD0
#bit POR=RCON.1 // Bit de la bandera del Power On Reset
#byte CMCON=0xFB4 // Registro de control de los comparadores
#bit c1inv=CMCON.4
//#bit C1OUT=CMCON.6
float value,dato,vref;
void main(main)
{
//c1inv=0;
set_tris_a(0xe7);
set_tris_c(0xD8);
set_tris_d(0x00);
setup_port_a(AN0_TO_AN1_ANALOG ); // RA0_RA1_RA2 son analógicos y los demás son digitales
setup_adc(ADC_CLOCK_INTERNAL ); // Tomará el dato contando el tiempo con el reloj interno
setup_comparator(A0_VR_A1_VR); // Solo A0 para C1 y A1 para C2
if(POR==0) // Reset por POR
{
output_high(PIN_D1); // Enciendo un led de prueba
delay_ms(1000); // Una demora para que se estabilicen los voltajes
POR=1; // Limpio la bandera del POR
output_low(PIN_D1); // Enciendo un led de prueba
}
#asm
bsf CMCON,2; // Bit de selección del modo del comparador
bsf CMCON,1; // Bit de selección del modo del comparador
bcf CMCON,0; // Bit de selección del modo del comparador
#endasm
while(true)
{
set_adc_channel(0); // El canal de adquisición del dato es el RA0
delay_us(10); // Un retardo para capturar bien el dato
value=read_adc(); // Leo el dato
dato=(value*5)/255; // Convierto el valor a decimal y lo guardo
printf("\f"); // Borro pantalla
printf(" Voltaje= %2.2g V",dato); // Mando a mostrar el valor del conversor
delay_ms(2000);
setup_vref(VREF_HIGH |2); // Para mayor exactitud del comparador
if( bit_test(cmcon,6))
{
output_high(PIN_D3); // Referencia es mayor que AN0
delay_ms(2000);
output_low(PIN_D3); // Referencia es mayor que AN0
}
else
{
output_high(PIN_D2); // Referencia es menor que AN0
delay_ms(2000);
output_low(PIN_D2); // Referencia es menor que AN0
}
}
}
Atte: Enigma... La llanerita de Guayana