Problema con el comparador del PIC16F676

Hola que tal, realice un programa en CCS muy simple, ya que nunca use los comparadores con una referencia interna y quise hacer un pequeño ejercicio, resulta que cuando lo simulo en Proteus, el mismo no funciona, revise varias veces la configuracion de los comparadores y de la tensión de referencia pero no encuentro donde es que esta el error. Adjunto el programa para ver si alguien encuentra que estoy haciendo mal y el esquemático.

PD: La Vref la configure para LOW y valor en 1 con lo cual la Vref es de 0,2083V y el comparador estaría para comparar la entrada CIN- ==> A1 con la Vref. La idea era hacer un pequeño detector de cruce por cero de una señal senoidal V(t) = 2,5*(1+sen(50t)) [V]. Al detectar el valor de cero, activaría un led durante lo que durara el cero y luego lo apagaría.

Código:
#include <16F676.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES PUT                      //Power Up Timer
#FUSES BANDGAP_HIGH          
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

// Definiciones del puerto A

#define Led       PIN_A0
#define V_ripple  PIN_A1

#use fast_io(A)
#use fast_io(C)

void Inicializacion (void)
{
   setup_comparator(A1_VR);
   set_tris_a (0b11111110); // Entradas:A1,A2,A3,A4,A5 - Salidas:A0
   output_a (0);
   setup_vref(VREF_LOW|1);
}

void main()
{
   Inicializacion ();
   for (;;)
   {
      if (C1out)
         output_high(Led);
      else
         output_low(led);
   }
}
...
Circuito.jpg
 
Última edición:
No estarás usando mal los nombres? Honestamente no soy experto en PIC (realmente no los uso mucho) pero el C1 seria comparador 1 en un PIC con 2 comparadores, por compatibilidad las direcciones se reservan pero quizá ni exista si lo implementas así.
 
Hola, el problema radica en qué utilizas la entrada del comparador, cómo salida al LED. Y la señal de entrada está conectada al pin Vref. que no se utiliza porque declaraste un umbral interno. Hay cambios de estado en el pin 11?, ya que es la salida por hardware del comparador.
Personalmente nunca utilicé el for( ; ; ) vacío para hacer un bucle infinito, y puede que no trabaje cómo tal
Prueba con while.
Resumiendo, conecta la señal de entrada al pin RA0, en RA1 no se conecta nada. Y la señal al LED, utiliza cualquier puerto RC.
 
Última edición:
Veo correcto el programa y también la configuración para el comparador.
CMCON = 0b01000100
VRCON = 0b10100001
Internal Reference.jpg

De hecho, a mi me funciona perfectamente en el simulador.
VRCON.jpg

VRCON II.jpg

Pueden estar pasando dos cosas.
Tienes mal configurado el VSINE en proteus o la versión de tu compilador es muy antigua.
Eso lo noto porque te permite el uso del fuse BANDGAP_HIGH, que ya es obsoleto desde hace varios años.

Te recomiendo usar el componente ALTERNATOR a 1 Hz. para que puedas ver la transición por cero, y también actualizar el compilador.
 
Última edición:
La versión del compilador si no mal recuerdo es la 4.14 creo... y el proteus es la 7.4. El Vsine estoy seteandolo en Vdc = 2.5V, Vac = 2.5V y frecuencia 50Hz. Probare de actualizar el compilador, pero la verdad que nunca tuve un problema con él.



---------------Actualización-----------------
He actualizado el compilador a la versión 5.61 y he reemplazado el Vsine por un alternator a 5V y 1Hz y aún continua sin funcionar, la verdad es que no se que será...:cry::rolleyes:
PD: D@rkbyte la configuración del comparador que estoy usando no es la que vos pusiste sino la siguiente:

Configuracion Comparador.jpg
 
Última edición:
El CMCON debe estar en b'00000111 y el ANSEL debe estar en b'00000000, porque el código ta bien y a mi también me funciona bien la simulación:unsure:
 
Última edición:
Por que el CMCON en b'00000111?, si esa opcion es para desactivar los comparadores y yo lo que quiero es usarlos.
En un primer momento los comparadores son desactivados por lo que vi del codigo asm y luego cuando yo lo configuro queda en el valor 0x04 que es el modo que yo quiero que trabaje, por otro lado el registro ANSEL está en 0x00, aún así no funciona.
 
He actualizado el compilador a la versión 5.61 y he reemplazado el Vsine por un alternator a 5V y 1Hz y aún continua sin funcionar, la verdad es que no se que será...:cry::rolleyes:
PD: D@rkbyte la configuración del comparador que estoy usando no es la que vos pusiste sino la siguiente:

Ver el archivo adjunto 152912
Sí, yo me equivoqué de imagen.
En Watch Window de Proteus podrás ver los valores de los registros CMCON y VRCON.

Adjunto el programa y simulación que tengo funcionando.
Pero es con PCWHD PIC C Compiler v 5.065 y Proteus 7.10

Nota: No lo compiles antes de probar, realiza la prueba con el archivo cof que viene.
 

Adjuntos

  • 16F676 Comparadores.rar
    32 KB · Visitas: 19
Bien luego de luchar muuuuchhhoooo, terminó siendo problema del modelo del pic del proteus mio V7.4. Prove con el pic 16f627 y funcionaba bien, asi que intuia que podia ser el modelo del pic 16f676 de ese proteus, asi que instale la versión 7.9 y ahora anda de 10, gracias a todo por la ayuda.
 
Atrás
Arriba