Other Parts Discussed in Thread: MSP430FR2100
Tool/software: Code Composer Studio
Hello,
My code makes P1.6 ON and goes OFF by LOW to HIGH edge at P1.3 and turn ON a RTC for 1 second and toggles back P1.6 waiting for interrupt at P1.3. This repeats.
#include <msp430.h>
/* Global Variables */
#if defined(__IAR_SYSTEMS_ICC__)
__persistent volatile unsigned char timeIncrement = 0; //Software Count Variable
#elif defined(__TI_COMPILER_VERSION__)
#endif
#define MODCOUNT (32-1)
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P1OUT = 0x00;
P1DIR = ~BIT3;
P2OUT = 0x00;
P2DIR = 0xFF;
P2SEL1 = BIT6 | BIT7; // P2.6~P2.7: crystal pins
SYSCFG0 = FRWPPW; // Enable FRAM write access
P1OUT ^= BIT6;
PM5CTL0 &= ~LOCKLPM5;
// Initialize crystal
do
{
CSCTL7 = 0; // Clear XT1 fault flag
SFRIFG1 = 0; // Clear fault flag
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
P1REN = BIT3;
P1IES = 0x00;
P1IE = BIT3;
CSCTL4 = SELA__XT1CLK;
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3, enable interrupt
}
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
switch(__even_in_range(RTCIV,RTCIV__RTCIFG))
{
case RTCIV__NONE: break; // No interrupt
case RTCIV__RTCIFG: // RTC Overflow
P1OUT ^= BIT6;
RTCCTL = RTCSS__XT1CLK | RTCSR | RTCPS__1024; //Stop RTC
P1REN = BIT3; // P1.3 pull-down register enable
P1IES = 0x00; // P1.3 Low/High edge
P1IE = BIT3; // P1.3 interrupt enabled
__bis_SR_register_on_exit(LPM3_bits | GIE);
break;
default: break;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= BIT6;
P1IE = 0x00;
P1IFG = 0x00; //Clear P1.3 IFG
RTCMOD = MODCOUNT;
RTCCTL = RTCSS__XT1CLK | RTCSR | RTCPS__1024 | RTCIE;
__bis_SR_register_on_exit(LPM3_bits | GIE);
}
If I invert the working of P1.3 and P1.6 i.e wait for interrupt in P1.6, the ISR wont work for P1.6. Why is this happening as it should work the same for both. Am i missing something
#include <msp430.h>
/* Global Variables */
#if defined(__IAR_SYSTEMS_ICC__)
__persistent volatile unsigned char timeIncrement = 0; //Software Count Variable
#elif defined(__TI_COMPILER_VERSION__)
#endif
#define MODCOUNT (32-1)
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P1OUT = 0x00;
P1DIR = ~BIT6;
P2OUT = 0x00;
P2DIR = 0xFF;
P2SEL1 = BIT6 | BIT7; // P2.6~P2.7: crystal pins
SYSCFG0 = FRWPPW; // Enable FRAM write access
P1OUT ^= BIT3;
PM5CTL0 &= ~LOCKLPM5;
// Initialize crystal
do
{
CSCTL7 = 0; // Clear XT1 fault flag
SFRIFG1 = 0; // Clear fault flag
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
P1REN = BIT6;
P1IES = 0x00;
P1IE = BIT6;
CSCTL4 = SELA__XT1CLK;
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3, enable interrupt
}
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
switch(__even_in_range(RTCIV,RTCIV__RTCIFG))
{
case RTCIV__NONE: break; // No interrupt
case RTCIV__RTCIFG: // RTC Overflow
P1OUT ^= BIT3;
RTCCTL = RTCSS__XT1CLK | RTCSR | RTCPS__1024; //Stop RTC
P1REN = BIT6; // P1.3 pull-down register enable
P1IES = 0x00; // P1.3 Low/High edge
P1IE = BIT6; // P1.3 interrupt enabled
__bis_SR_register_on_exit(LPM3_bits | GIE);
break;
default: break;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= BIT3;
P1IE = 0x00;
P1IFG = 0x00; //Clear P1.3 IFG
RTCMOD = MODCOUNT;
RTCCTL = RTCSS__XT1CLK | RTCSR | RTCPS__1024 | RTCIE;
__bis_SR_register_on_exit(LPM3_bits | GIE);
}
