HLVD (High/Low Voltage Detect) - 18f2620

Que tal gente,

Vengo al foro con un tema que no me he logrado topar, es acerca del módulo HLVD, el cual se utiliza para detectar cuando un nivel de voltaje está arriba o debajo de un nivel. Según he leído se utiliza mucho para cuando el PIC se desenergiza, éste módulo produce una interrupción y se procede a las rutinas de backup de información importante. Básicamente para esto es que quiero utilizarlo.
En mi aplicación estoy encendiendo un motor por un tiempo, y quiero que en caso de quitarle la energía el micro "recuerde" el tiempo restante y el estado del motor (on/off).

Estoy utilizando C18 y el código es el siguiente:

Código de inicialización:
Código:
     cHoras = Read_b_eep( HOURS_ADDRESS );        Busy_eep();    //This is the información I want to recover.
     cMinutos = Read_b_eep( MINUTES_ADDRESS );    Busy_eep();
     cSegundos = Read_b_eep( SECONDS_ADDRESS );    Busy_eep();
 
     HLVDCONbits.HLVDEN = 0;            //High/Low Voltage Detection.
     HLVDCON = 0b00111010;
/*
  HLDVCON REGISTER: 
  BIT7 - Voltage Direction Magnitude Select Bit = 0 (low voltage detect)
  BIT6 - Unimplemented
  BIT5 - Internal Reference Voltage Stable Flag bit - Read only
  BIT4 - High/Low Voltage Enable Bit = 1  (Enabled)
  BIT3:BIT0 - Voltage Detection Limit Bits = 1000
*/
   PIR2bits.HLVDIF = 0;
   PIE2bits.HLVDIE = 1;
   IPR2bits.HLVDIP = 1;

   RCONbits.IPEN = 1;
   INTCONbits.GIEH = 1;

Y mi vector de interrupciones es el siguiente:
Código:
       if( PIR2bits.HLVDIF )
       {    
           INTCONbits.TMR0IE = 0;               //TMR0 Overflow Interrupt Enable bit, 1 = Enables the TMR0 overflow interrupt
           T0CONbits.TMR0ON = 0;               //Timer0 On/Off Control bit, 1 = Enables Timer0
           HLVDCONbits.HLVDEN = 0;            //High/Low Voltage Detection
           PIE2bits.HLVDIE = 0;                   //HLVD Interrupt Enable

           Write_b_eep( HOURS_ADDRESS, cHoras );        Busy_eep();
           Write_b_eep( MINUTES_ADDRESS, cMinutos );    Busy_eep();
           Write_b_eep( SECONDS_ADDRESS, cSegundos );    Busy_eep();
           Write_b_eep( MOTOR_ADDRESS, cMotorState );    Busy_eep();

           INTCONbits.TMR0IE = 1;               //TMR0 Overflow Interrupt Enable bit, 1 = Enables the TMR0 overflow interrupt
           T0CONbits.TMR0ON = 1;               //Timer0 On/Off Control bit, 1 = Enables Timer0
           HLVDCONbits.HLVDEN = 1;            //High/Low Voltage Detection
           PIE2bits.HLVDIE = 1;                   //HLVD Interrupt Enable

           PIR2bits.HLVDIF = 0;
       }

Cómo pueden ver para escribir y leer en la memoria EEPROM interna del PIC estoy utlizando Read_b_eep( char address ) y Write_b_eep( char address, char byte ), las cuales son rutinas de EEP.h

Alguien detecta algún error? Alguien ha utilizado este módulo y podría aconsejarme.

El problema que teno es el siguiente, cuando retiro la energía si guarda la información... a veces. Lo cual no es bueno. En ciertas ocasiones, cuando falla, guarda un valor de 0xFF. Lo curioso es que no siempre es en el mismo lugar :eek:

Espero alguien sepa algo, y además que este tema sirva para toda la gente interesada en el uso de este módulo, que a mi parecer es muy importante.

Saludos!
Mr.Brett
 
No utilicé ese módulo. Tampoco sé donde puede estar tu error. Lo que sí se me ocurre es poner un RC en el pin del cual sensás si se desconectó la fuente y probar de tu modo o leyendo de una entrada analógica.
 
Atrás
Arriba