I'm trying to enter in LPM4 inside a Comparator_D interruption but when the systems enters in LPM4_bits, never exits. This is my code:
#include <msp430.h>
unsigned int l=0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
PJDIR |= BIT0; // P1.0/LED output direction
// compare input
P1SEL0 |= BIT1; // P1.1/CD1
P1SEL1 |= BIT1;
// Setup ComparatorD
CDCTL0 |= CDIPEN + CDIPSEL_1; // Enable V+, input channel CD1
CDCTL2 |= CDRSEL; // VREF is applied to -terminal
CDCTL2 |= CDRS_3+CDREFL_1; // R-ladder off; bandgap ref voltage (1.2V)
// supplied ref amplifier to get Vcref=1.5V (CDREFL_2)
CDCTL3 |= BIT1; // Input Buffer Disable @P1.1/CD1
__delay_cycles(400); // delay for the reference to settle
CDINT &= ~(CDIFG + CDIIFG); // Clear any errant interrupts
CDINT |= CDIE; // Enable CompB Interrupt on rising edge of CDIFG (CDIES=0)
CDCTL1 |= CDON; // Turn On ComparatorD
__bis_SR_register(GIE);
__no_operation(); // For debug
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=COMP_D_VECTOR
__interrupt void Comp_D_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(COMP_D_VECTOR))) Comp_D_ISR (void)
#else
#error Compiler not supported!
#endif
{
l++;
CDCTL1 ^= CDIES; // Toggles interrupt edge
CDINT &= ~(CDIFG + CDIIFG);
if (l%2==0)
{
CDINT|=CDIE;
__bis_SR_register(LPM4_bits);
}
__bic_SR_register_on_exit(LPM4_bits);
PJOUT ^= 0x01; // Toggle P1.0
P3DIR |= BIT5;
P3SEL1 |= BIT5;
P3SEL0 |= BIT5;
//CDCTL1 ^= CDIES; // Toggles interrupt edge
CDINT &= ~CDIFG; // Clear Interrupt flag
}