Hola, estoy empezador a usar los comparadores y me iba mas o menos bien, haya que he tenido problemas al establecer la tension interna de referencia. Para ello la establezo a nivel bajo y cargo el valor 12 en VR3-0, con lo que CVREF = (VR<3:0>/24) × VDD, asi la Vref sera la mitad de la alimentacion. Use las instrucciones de Ccs:
#include <12f683.h>
#fuses INTRC_IO,NOWDT, PUT, NOBROWNOUT, NOCPD,NOMCLR, NOPROTECT
#use delay(clock=4000000)
//Se usa comparador analogico y si vin+>Vin- activa gp4
//Se hara por interrupcion
#INT_COMP
void compara(){
if (C1out){
output_high(pin_a4);
}
else{
output_low(pin_a4);
}
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
//Arranca el oscilador
setup_oscillator(OSC_4MHZ|OSC_INTRC);
//Puerto¿Como configurrar entradas comparador?
//set_tris_a(000011); //porta como salida, excepto a0ya1 comparador
setup_comparator(A1_VR); //Entrada en a1 y Vreferencia interna
setup_vref(VREF_LOW||12); //Vref rango bajo y 12 en VR3-0 = 1/2 Vdd
//Interrupciones
enable_interrupts(INT_COMP);
enable_interrupts(GLOBAL); //todas las interrupciones desactivadas
//Programa
do{
}while(TRUE); //bucle infinito
// TODO: USER CODE!!
}
Al mover el potenciometro practicamente el comparador se activaba al pasar de 3-4mV. He pasado a configurar el registro VRCON manuealmente para ello se define el byte que es, en mi caso del 12f683 el 0x99, y a continuacion le cargo el valor que mirando el datasheet y los bits de VRCON seria 0b10101100
#byte VRCON = 0x99
VRCON = 0b10101100;//Activa, low y 12
Y ahora va perfecto, lo coloco por aqui por si alguien mas tiene el mismo problema.
Edito-> Me he dado cuenta donde tenia el error en
setup_vref(VREF_LOW||12);
//Me sobraba un | es
setup_vref(VREF_LOW|12);