rampadc 29 Posted July 2, 2015 Share Posted July 2, 2015 Hi, I'm getting a weird problem with a button interrupt while using the RF1A module on a CC430F5137 chip, where the code inside the main loop only works 1 time and never again even though the ISR is being executing and flag (buttonPressed) are being set correctly. I can't find what's wrong and can't proceed to fix the problem. Main.c extern uint8_t buttonPressed; uint8_t main(void) { WDTCTL = (uint16_t)(WDTPW | WDTHOLD); /* Stop watch dog timer */ __disable_interrupt(); //ACLK = REFO 32768 Hz //MCLK = SMCLK = 12 MHz //UART 38400 hal_init430(); hal_initTimers(); //2Hz timer for alive-LED uint8_t i; for(i = 0; i < 4; i++) printf("Syncing UART\r\n\r\n"); //prep realTerm to display ascii characters printf("Initializing RF core\r\n"); phy_reset(); //set voltage levels, write rf registers, etc. phy_enableRX(); //go into RX mode printf("RF Core initialized\r\n"); //main while loop while(1) { if(buttonPressed) { __no_operation(); //for debugging buttonPressed = 0; printf("\r\nButton pressed! main-while-loop\r\n"); phy_transmit((uint8_t*)TxBuffer, sizeof TxBuffer); } __bis_SR_register(LPM3_bits + GIE); } return 0; } isr.c extern uint8_t buttonPressed; //hal.c /************************************************************************************* * MSP430 Core Interrupts *************************************************************************************/ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) { switch(__even_in_range(P1IV, 16)) { case 0: break; case 2: break; // P1.0 IFG case 4: // P1.1 IFG P1IFG &= ~BIT1; __delay_cycles(24000); // 2ms debounce delay //button is active low if((P1IN & BIT1) == 0x00) { //button is pressed down, transmit "Hello World" printf("\r\nButton is pressed Line 39 isr.c\r\n"); buttonPressed = 1; } __bic_SR_register_on_exit(LPM3_bits); //Exit active break; case 6: break; // P1.2 IFG case 8: break; // P1.3 IFG case 10: break; // P1.4 IFG case 12: break; // P1.5 IFG case 14: break; // P1.6 IFG case 16: // P1.7 IFG break; } } UART log for RF project Quote Link to post Share on other sites
oPossum 1,083 Posted July 2, 2015 Share Posted July 2, 2015 phy_transmit() may be changing low power mode. Search that code or step through it in the debugger and look for any changes to the LPM bits. Quote Link to post Share on other sites
greeeg 460 Posted July 2, 2015 Share Posted July 2, 2015 I notice that buttonPressed is defined in hal.c Are you defining buttonPressed as volatile? If not, the compiler may be optimising it into a register, so when it is chnaged in the ISR context, the register isn't updated from memory in the main loop context. Quote Link to post Share on other sites
rampadc 29 Posted July 2, 2015 Author Share Posted July 2, 2015 Found a misbehaving while loop in phy_transmit(). Thanks for the help guys. greeeg 1 Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.