View previous topic :: View next topic |
Author |
Message |
chingB
Joined: 29 Dec 2003 Posts: 81
|
#int_lowvolt Help |
Posted: Mon Feb 02, 2004 8:20 pm |
|
|
Hi,
I am coding a PIC18F452 at 20Mhz to use the low voltage detect module thru interrupt.
My code:
Code: |
#int_lowvolt
void Low_voltageDetect_isr() // low voltage detect interrupt routine
{
lvdetect = 1;
}
void init_chip() { // Initialize the MCU Chip
// configure LVD interrupt before enabling
LVDCONbits.LVDLN = 10; // set LVD limits to 3.6Vmin ~ 3.82Vmax
LVDCONbits.LVDEN = 1; // enable/powers up the LVD circuit
while (!LVDCONbits.IRVST); // wait for LVD circuitry to stabilized?
PIR2bits.LVDIF = 0; // clear LVD interrupt before enabling
setup_adc_ports(NO_ANALOGS);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); // 20M/(4*16*65536)
setup_timer_2(T2_DIV_BY_16,250,10); // 8.0mSec. interupt intervals
setup_timer_3(T3_INTERNAL | T3_DIV_BY_1); // 13.2mSec. timer overflow
enable_interrupts(int_lowvolt); // Enable LVD interrupt
enable_interrupts(int_timer0); // Enable timer0 interrupt
enable_interrupts(GLOBAL); // Enable Global interrupt
}
main()
{
init_chip(); // Initialize the MCU Chip
while (TRUE)
{
// this routine is only a demo for low voltage detect
if (lvdetect)
{
lvdetect = 0;
buzzSound();
}
}
}
|
to simulate the effect, I have a variable power supply when I lower the power to 3.7Volts... the buzzer will sound to simply notify me that a low voltage interrupt occur. But when I restore the power back to 5.0Volts, the buzzer won't turn off?
Is their something wrong with the code? Need help on this....
Thanx |
|
|
languer
Joined: 09 Jan 2004 Posts: 144 Location: USA
|
Need to clear the interrupt flag condition? |
Posted: Tue Feb 03, 2004 2:37 am |
|
|
Maybe this is way out in left field, not having worked with the part and all. Shouldn't you clear the lowvolt detect flag at the very end of the ISR.
Code: |
#int_lowvolt
void Low_voltageDetect_isr() // low voltage detect interrupt routine
{
lvdetect = 1;
PIR2bits.LVDIF = 0; /* --> you already defined this */
}
|
This is normal procedure for other interrupts, otherwise since your flag is set it will always keep triggering the ISR.
Hope it helps. |
|
|
chingB
Joined: 29 Dec 2003 Posts: 81
|
Re: Need to clear the interrupt flag condition? |
Posted: Tue Feb 03, 2004 3:28 am |
|
|
languer wrote: | Maybe this is way out in left field, not having worked with the part and all. Shouldn't you clear the lowvolt detect flag at the very end of the ISR.
Code: |
#int_lowvolt
void Low_voltageDetect_isr() // low voltage detect interrupt routine
{
lvdetect = 1;
PIR2bits.LVDIF = 0; /* --> you already defined this */
}
|
This is normal procedure for other interrupts, otherwise since your flag is set it will always keep triggering the ISR.
Hope it helps. |
Do you have any idea or a sample code snippet on how I can disable the LVD module most of the time, and only enabled ocassionally to do the voltage check? This is a method to reduce current consumption.
Thnx |
|
|
SteveS
Joined: 27 Oct 2003 Posts: 126
|
|
Posted: Tue Feb 03, 2004 6:08 am |
|
|
I believe the compiler should reset the flag for you in the code it generates.
However the 18F452 is rated down to 4.2V and you are taking it to 3.7V. You can't be sure it is still running right at that point. You may want to switch to the LF version which can run down to 2.0V in particular oscillator modes. That may not be your problem, but you should be aware of it anyway. You can set the setpoint higher of course.
Don't know offhand about disabling it most of the time. If you need to take action due to power supply loss you may want to consider a diode-capacitor feeding the VCC for the micro and a comparator on the supply voltage feeding an interrupt. Microchip has some very low power comparators. The diode protected cap will run the micro for a time after the supply fails.
EDIT:
actually the internal comparator can be referenced off an external voltage so the extra comparator wouldn't be needed.
- SteveS |
|
|
|