Autor Tema: Problema con modulo comparador despues de un reset  (Leído 1561 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Problema con modulo comparador despues de un reset
« en: 08 de Enero de 2016, 15:07:35 »
Hola a todos, estoy tratando de implementar un indicador de batería para esto, yo estoy usando CCS y el modulo comparador de un Pic12f629, aparentemente funciona pero tengo problemas al inicio o después de un reset, si el voltaje de batería es menor que la referencia (3.6V), el comparador no funciona, necesariamente tengo que incrementar el valor de voltaje por encima de los 3.6V, recién ahí empieza a funcionar el comparador.

Alguien me puede decir cual es mi error y como puedo solucionar esto?

Código: [Seleccionar]
#include <12F629.h>
#fuses INTRC_IO, NOWDT, NOPROTECT               
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A2)

#define BATTERY PIN_A1
#define LED_R PIN_A4
#define LED_V PIN_A5

#define ON  output_high
#define OFF output_low

#INT_COMP
void isr()  {

if (C1OUT == 0){
printf("Baterry Voltage level is above 3.6 V\r\n");
OFF (LED_R);
ON (LED_V);
}
else {
printf("WARNING!!  Baterry Voltage level is below 3.6 V\r\n");
OFF (LED_V);
ON (LED_R);
}
}

main()   {

OFF (LED_R);
ON (LED_V);
setup_comparator(A1_VR);
  delay_us(10); //just allow a little time for the voltages to settle
    clear_interrupt(INT_COMP); //now ensure the interrupt is clear.
   
setup_vref(VREF_HIGH|15);
enable_interrupts(INT_COMP);
enable_interrupts(GLOBAL);

   while(TRUE);

}
[/font]

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con modulo comparador despues de un reset
« Respuesta #1 en: 08 de Enero de 2016, 18:50:36 »
Podrias explicar un poco mas el problema ?

Con V<3.6V

Se produce reset y luego tenes que subirlo a 3.6V o mas para que responda.. Esto es correcto ?

Si es asi entonces esta funcionando bien. el comparado unicamente genera una interrupcion cuando hay un cambio en la salida del mismo. Si esta en con una tension de menos de 3,6V en el power-up no vas a tener ninguna interrupcion, ya que el comparador recien arranca y no cuando se activo la interrupcion no se produjo ningun cambio. Si comenzo el programa y la tension ya esta por encima de los 3.6V entonces cuando active las interrupciones tampoco vas a ver nada, por que la salida estaba en 1, y no cambio al momento de activar la interrupcion.

Lo que te faltaria es una condicion de inicio si es lo que creo que intentas hacer. Si podes explicarte un poco mas seria mas facil decirte que podes hacer.

PD: Si solamente tu programa no va a hacer mas nada esta bien, si vas a hacer muchas mas cosas, te sugiero que quites los printf de la interrupcion


Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re:Problema con modulo comparador despues de un reset
« Respuesta #2 en: 08 de Enero de 2016, 19:33:46 »
Hola  KILLERJC,

Lo que tu mansionas es justamente lo que esta sucediendo, necesito de alguna manera inicializar los registros del comparador al inicio de todo y no esperar hasta que haya alguna variaron del voltaje.

Con respecto al print esta solo como debuger.

Por favor me podrias decir como puedo inicializar el comparador?

Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con modulo comparador despues de un reset
« Respuesta #3 en: 08 de Enero de 2016, 19:48:36 »
Es que no es un problema de inicializacion, esta bien. pero quiero saber exactamente que es lo que prentedes. Yo creo que lo tuyo se solucionaria con un simple:

Código: C
  1. main()   {
  2.  
  3.         setup_comparator(A1_VR);
  4.         delay_us(10);                                           //just allow a little time for the voltages to settle
  5.         clear_interrupt(INT_COMP);                      //now ensure the interrupt is clear.
  6.    
  7.         setup_vref(VREF_HIGH|15);
  8.  
  9.         // Set inicial de salidas
  10.         if (!C1OUT) { OFF (LED_R); ON (LED_V); }
  11.         else { OFF (LED_V); ON (LED_R); }
  12.  
  13.         enable_interrupts(INT_COMP);
  14.         enable_interrupts(GLOBAL);
  15.  
  16.    while(TRUE);
  17.  
  18. }

Por eso decia de condicion al inicio.


 

anything