This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADC and TIMER Trigger MSP430FR5969

Other Parts Discussed in Thread: MSP430FR5969

Hi,

I want to read 2 voltage input with the ADC every 1ms. My code seems work but when I try to read the input every 10 ms there is some problems.

The first 20 samples are ok afrer that the Timer seems stop to work for about 80 ms and after that it restart to work for another 20 sample. So I have 20 samples every 100ms and I don't understand why . I'm using the launchpad( MSP430FR5969) with an external 16 mH crystal and this is my code :

 #include <msp430.h>

volatile int ADC_A2[100]={0};
volatile int ADC_A12[100]={0};
volatile unsigned int i=0;

int main(void)
{
    //SET PORT


    PM5CTL0 &= ~LOCKLPM5;       // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

    //Port 1
    P1DIR |= BIT0;

    //Port 3
    //P3DIR = 0b00000000;
    P3SEL1 |= BIT0;
    P3SEL0 |= BIT0;
    P2SEL1 |= BIT2;
    P2SEL0 |= BIT2;

    //Port J
    PJSEL0 |=  BIT6 | BIT7;          // External Cristall XT2

   
    FRCTL0 = FWPW+NACCESS_1;                              //SET FRAM to WORK WITH HIGH CLOCK

    //SET CLOCK SURCE
    CSCTL0_H = CSKEY >> 8;                                                                             // Unlock CS registers
    CSCTL1 = DCOFSEL_6;                                                                                 // Set DCO to 8MHz (not used)
    CSCTL2 =  SELA__VLOCLK|SELS__HFXTCLK | SELM__HFXTCLK;   // SMCLK = HFXT and MCLK = HFXT
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;                                                   // Set all dividers to 1
    CSCTL4 =  HFXTDRIVE_3 | HFFREQ_2;                                                    // Maximum drive strength HFXT oscillator
    CSCTL4 &= ~(HFXTOFF);                                                                              // Disable Crystall bypass
    CSCTL4 |= LFXTOFF ;
    do
    {
       CSCTL5 &= ~(LFXTOFFG |HFXTOFFG);                   // Clear XT1 and XT2 fault flag
       SFRIFG1 &= ~OFIFG;
    }while (SFRIFG1&OFIFG);                               // Test oscillator fault flag until the ext. clock is ready
    CSCTL0_H = 0;                                                // Lock CS registers


    //SET CLOCK
    TA0CCTL0 = CCIE;                                                        // TACCR0 interrupt enabled
    TA0CCR0 = 50000;                                                       // Value to compare with the timer to generate interrupt
    TA0CTL = TASSEL__SMCLK |ID__8| MC__UP;      // select SMCLK, Divide SMCLK/8, UP mode
    TA0EX0 = TAIDEX_1;                                                     // DIV2 : So timer_CLK = SMCLK/16

    //ADC
    //Set reference
    while(REFCTL0 & REFGENBUSY);              // If ref generator busy, WAIT
    REFCTL0 |= REFVSEL_1 | REFON;             // Select internal ref = 2.0V and Internal Reference ON


    // Configure ADC12
    ADC12CTL0 = ADC12SHT1_2|ADC12SHT0_2 |ADC12MSC| ADC12ON ;           //Set S&H time = 16 CLK;
    ADC12CTL1 = ADC12SHP|ADC12CONSEQ_1 ;                                                       // Sampling timer;Sequence mode;ADCCLK = MODCLK
    ADC12CTL2 |= ADC12RES_2;                                                                                      // 12-bit conversion results
    ADC12MCTL0 |= ADC12INCH_2 | ADC12VRSEL_1;                                               // A2 ADC input select; Vref int
    ADC12MCTL1 |= ADC12EOS_L| ADC12INCH_12 | ADC12VRSEL_1;  // ADC12EOS_L : Set this channel as END OF SEQUENCE;A12 ADC input select; Vref
    ADC12IER0 |= ADC12IE1;                                                                                         // Enable ADC conv complete interrupt just for the second and last channel

    while(!(REFCTL0 & REFGENRDY));                         // Wait for reference generator



    __bis_SR_register(GIE);     // ENABLE INTERRUPT

    while(1)
    {

     
    }
    return 0;

}



#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR (void)
{
   
    ADC12CTL0 |= ADC12ENC | ADC12SC;         // Sampling and conversion start
    P1OUT |= BIT0;
}










#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
  {
    case ADC12IV_NONE:        break;       
    case ADC12IV_ADC12OVIFG:  break;    
    case ADC12IV_ADC12TOVIFG: break;       
    case ADC12IV_ADC12HIIFG:  break;             
    case ADC12IV_ADC12LOIFG:  break;
    case ADC12IV_ADC12INIFG:  break;                  
    case ADC12IV_ADC12IFG0: break;      
    case ADC12IV_ADC12IFG1:
 

       ADC12CTL0 &= ~ ADC12ENC;
 
        if(i<100)
        {
                  ADC_A2[i]=ADC12MEM0;
                  ADC_A12[i]=ADC12MEM1;
                  i++;
                  P1OUT &= ~BIT0;
        }
        else
        {
                  i=0;
        }

    break;
    case ADC12IV_ADC12IFG2:   break;        // Vector 16:  ADC12MEM2
    case ADC12IV_ADC12IFG3:   break;        // Vector 18:  ADC12MEM3
    case ADC12IV_ADC12IFG4:   break;        // Vector 20:  ADC12MEM4
    case ADC12IV_ADC12IFG5:   break;        // Vector 22:  ADC12MEM5
    case ADC12IV_ADC12IFG6:   break;        // Vector 24:  ADC12MEM6
    case ADC12IV_ADC12IFG7:   break;        // Vector 26:  ADC12MEM7
    case ADC12IV_ADC12IFG8:   break;        // Vector 28:  ADC12MEM8
    case ADC12IV_ADC12IFG9:   break;        // Vector 30:  ADC12MEM9
    case ADC12IV_ADC12IFG10:  break;        // Vector 32:  ADC12MEM10
    case ADC12IV_ADC12IFG11:  break;        // Vector 34:  ADC12MEM11
    case ADC12IV_ADC12IFG12:  break;        // Vector 36:  ADC12MEM12
    case ADC12IV_ADC12IFG13:  break;        // Vector 38:  ADC12MEM13
    case ADC12IV_ADC12IFG14:  break;        // Vector 40:  ADC12MEM14
    case ADC12IV_ADC12IFG15:  break;        // Vector 42:  ADC12MEM15
    case ADC12IV_ADC12IFG16:  break;        // Vector 44:  ADC12MEM16
    case ADC12IV_ADC12IFG17:  break;        // Vector 46:  ADC12MEM17
    case ADC12IV_ADC12IFG18:  break;        // Vector 48:  ADC12MEM18
    case ADC12IV_ADC12IFG19:  break;        // Vector 50:  ADC12MEM19
    case ADC12IV_ADC12IFG20:  break;        // Vector 52:  ADC12MEM20
    case ADC12IV_ADC12IFG21:  break;        // Vector 54:  ADC12MEM21
    case ADC12IV_ADC12IFG22:  break;        // Vector 56:  ADC12MEM22
    case ADC12IV_ADC12IFG23:  break;        // Vector 58:  ADC12MEM23
    case ADC12IV_ADC12IFG24:  break;        // Vector 60:  ADC12MEM24
    case ADC12IV_ADC12IFG25:  break;        // Vector 62:  ADC12MEM25
    case ADC12IV_ADC12IFG26:  break;        // Vector 64:  ADC12MEM26
    case ADC12IV_ADC12IFG27:  break;        // Vector 66:  ADC12MEM27
    case ADC12IV_ADC12IFG28:  break;        // Vector 68:  ADC12MEM28
    case ADC12IV_ADC12IFG29:  break;        // Vector 70:  ADC12MEM29
    case ADC12IV_ADC12IFG30:  break;        // Vector 72:  ADC12MEM30
    case ADC12IV_ADC12IFG31:  break;        // Vector 74:  ADC12MEM31
    case ADC12IV_ADC12RDYIFG: break;        // Vector 76:  ADC12RDY
    default: break;
  }
}

**Attention** This is a public forum