Part Number:MSP430FR2111
Tool/software: Code Composer Studio
Hello,
i am using the MSP430FR2111 to read ADC values after some time of waiting in LPM3. I am using Timer B0 interrupt to wake up. The ADC also uses the interrupt.
Everthing works fine (LED´s blinking, ADC_Result fill´s up with data) until the controller resets after about 20 seconds. The data in ADC_Result is erased and the ADC starts again writing in position 0.
I tried several things, but nothing helped.
I am using CCS 7.2 and the MSP430FR2311 LaunchPad to program my own MSP board.
Here is my code:
#include <msp430fr2111.h>
unsigned int Counter = 0;
unsigned int i = 0;
unsigned int ADC_Result[60];
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x03; // Set P1.2 to output direction
P2DIR |= 0x01; // Set P2.0 to output direction
P2DIR |= 0x02; // Set P2.1 to output direction
P1OUT = 0x00; // Set P1 outputs low
P2OUT = 0x00; // Set P2 outputs low
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
// Configure ADC10
ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks
ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC; sampling timer
ADCCTL2 |= ADCRES; // 10-bit conversion results
ADCMCTL0 |= ADCINCH_0; // A0 ADC input select; Vref=AVCC
ADCIE |= ADCIE0; // Enable ADC conv complete interrupt
TB0CCTL0 = CCIE; // CCR0 interrupt enabled
TB0CCR0 = 511; // Timer count compare: 4095 -> 1 sec,
TBCTL = TBSSEL_1 + ID_3 + MC_1; // ACLK, /8, upmode
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
for(;;) {}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_B0_VECTOR
__interrupt void Timer_B (void)
{
Counter++;
if(Counter == 5) // 1 min 480
{
P1OUT |= 0x03; // Set output P1.2
P2OUT |= 0x01; // Set LED green
}
if(Counter == 6)
{
ADCCTL0 |= ADCENC | ADCSC; // Sampling and conversion start
P2OUT &= ~(0x01); // Clear LED green
P2OUT |= 0x02; // Set LED red
Counter = 0;
_BIS_SR(LPM0_bits | GIE); // LPM0 w/ interrupt
}
else
{
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
}
// ADC Interrupt
#pragma vector=ADC_VECTOR
__interrupt void ADC_ISR(void)
{
switch(__even_in_range(ADCIV,ADCIV_ADCIFG))
{
case ADCIV_NONE:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCOVIFG:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCTOVIFG:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCHIIFG:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCLOIFG:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCINIFG:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
case ADCIV_ADCIFG:
P1OUT &= ~(0x03); // Clear output P1.2
P2OUT &= ~(0x02); // Clear LED red
ADC_Result[i] = ADCMEM0;
i++;
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
default:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt0
break;
}
}
Thank you very much!

