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.

MSP430 ADC timer trigger

Other Parts Discussed in Thread: MSP430G2253

Hello 

 I'm developing a test software in  a msp430g2253.

 The application uses the ADC10 to sample 1 channels repeat in period of 10 ms (in this case I know that the valor of  TA0CCR0  isn´t the corret, only a random number).

To accomplish this I'm using TimerA0.0 to trigger the start conversion on ADC10

#include "msp430g2253.h"

//int contador;
//int contadorADC;

unsigned int ADC_valor=0;

void ConfigureAdc(void);
void ConfigureTimer(void);
void adc_Sam10(void);


void main(void)
{
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_16MHZ; // Set range DCOCTL = CALDCO_16MHZ;
DCOCTL=CALDCO_16MHZ;
BCSCTL3 |= LFXT1S_2; // VLOCLK
//BCSCTL2 &= ~(DIVS_3); // SMCLK = DCO = 1MHz

P1SEL |= BIT4; // ADC input pin P1.4

// contador=0;
//contadorADC=0;
ConfigureTimer();
ConfigureAdc(); // ADC set-up function call
__enable_interrupt(); // Enable interrupts.


while(1)
{
adc_Sam10();
}

}
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
//contadorADC=contadorADC+1;
//P1OUT ^= BIT6;
__bic_SR_register_on_exit(CPUOFF); // Return to active mode }
}

#pragma vector=TIMER0_A0_VECTOR // Timer0 A0 interrupt service routine

__interrupt void Timer0_A0 (void) {
//contador=contador+1;
//P1OUT ^= BIT6; // Toggle green LED

__bic_SR_register_on_exit(CPUOFF); // Return to active mode }

}


// Function containing ADC set-up
void ConfigureAdc(void)
{

ADC10CTL1 = INCH_4 + SHS_2 + CONSEQ_2; // Channel 4, modo un canal repetidamente, timer ,timer0
ADC10CTL0 = SREF_0 + ADC10SHT_0 + ADC10ON + ADC10IE; // Vcc & Vss as reference, Sample and hold for 64 Clock cycles, ADC on, ADC interrupt enable
ADC10AE0 |= BIT4; // ADC input enable P1.4
}

void ConfigureTimer(void)
{
TA0CCR0 = 1000; // Count limit (16 bit)
TA0CCTL0 = 0x10; // Enable Timer A0 interrupts, bit 4=1
TA0CTL = TASSEL_1 + MC_1; // Timer A0 with ACLK, count UP

}

// ADC sample conversion function
void adc_Sam10(void)
{
ADC10CTL0 &= ~ENC; // Disable Conversion
while (ADC10CTL1 & BUSY); // Wait if ADC10 busy
ADC_valor = ADC10MEM;
ADC10CTL0 |= ENC + ADC10SC; // Enable Conversion and conversion start
__bis_SR_register(CPUOFF + GIE);// Low Power Mode 0, ADC10_ISR

}

 I'm debugging the code using the JTAG and CCS Studio, and I see that on the breakpoint inside the Main Loop, the ADC interruption never is triggered and I cant understand where is the problem

 

Thanks for any help and suggestions.

  • use this example( here is used LPM3 and SMCLK clock, change it)

     lok on TACCR1 OUT_3  set/reset usage (it is you key)

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x33/G2x53 Demo - ADC10, Sample A7, 1.5V, TA1 Trig, Ultra-Low Pwr
    //
    //  Description: A7 is sampled 1024/second (32xACLK)with reference to 1.5V. All
    //  activity is interrupt driven with proper usage of MSP430 low-power modes,
    //  ADC10 and Vref demonstrated. Timer_A with both TA1/TA0 used in upmode to
    //  drive ADC10 conversion (continuous mode can also be used). Inside
    //  of TA0_ISR software will enable ADC10 and internal reference and
    //  allow > 30us delay for Vref to stabilize prior to sample start. Sample
    //  start is automatically triggered by TA1 every 32 ACLK cycles. ADC10_ISR
    //  will disable ADC10 and Vref and compare ADC10 conversion code. Internal
    //  oscillator times sample (16x) and conversion (13x). If A7 > 0.2Vcc,
    //  P1.0 is set, else reset. Normal Mode is LPM3.
    //  //* An external watch crystal on XIN XOUT is required for ACLK *//
    //
    //                    +-----(0.9766us)---------\\------------------>+
    //    TA0_ISR        TA1      ADC10_ISR             TA0_ISR        TA1
    //  -----+------------+------------+-----------\\------+------------+----->
    //   Enable ADC    Trigger ADC  Disable ADC
    //   and Vref                   Compare
    //       +-( >30us--->+
    //
    //
    //               MSP430G2x33/G2x53
    //            -----------------
    //        /|\|              XIN|-
    //         | |                 | 32kHz
    //         --|RST          XOUT|-
    //           |                 |
    //       >---|P1.7/A7     P1.0 |--> LED
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  December 2010
    //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    
      ADC10CTL1 = INCH_7 + SHS_1;               // P1.7, TA1 trigger sample start
      ADC10AE0 = 0x80;                          // P1.7 ADC10 option select
      P1DIR |= 0x01;                            // Set P1.0 to output direction
      TACCTL0 = CCIE;                           // Enable interrupt
      TACCR0 = 32-1;                            // PWM Period
      TACCTL1 = OUTMOD_3;                       // TACCR1 set/reset
      TACCR1 = 2;                               // TACCR1 PWM Duty Cycle
      TACTL = TASSEL_1 + MC_1;                  // ACLK, up mode
      __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, enable interrupts
    }
    
    // ADC10 interrupt service routine
    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    {
      ADC10CTL0 &= ~ENC;                        // ADC10 disabled
      ADC10CTL0 = 0;                            // ADC10, Vref disabled completely
      if (ADC10MEM < 0x88)                      // ADC10MEM = A7 > 0.2V?
        P1OUT &= ~0x01;                         // Clear P1.0 LED off
      else
        P1OUT |= 0x01;                          // Set P1.0 LED on
    }
    
    // Timer A0 interrupt service routine
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A(void)
    {
      ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
      ADC10CTL0 |= ENC;                         // ADC10 enable set
    }

  • You have to generate a compare trigger output with your timer. In your case, the internal output TA0 is not changing, because OUTMOD_0 is set implicitly in TACCTL0, which means that the trigger input of the ADC has the same value as the OUT bit in TACCTL0. If you use OUTMOD_4 instead, every CCR0 hit toggles TA0 and you get ADC triggers at half the frequency of these CCR0 hits. Set/Reset with CCR0 and CCR1 as proposed by Lukasz works also, of course.

  • Thanks, your answers have been very helpful

  • Ho, sorry if i use this post but i have the same problem (i'm using msp432 but i think it is the same). My question is: how i choose the taccr1? using timerA0, ccr0 (up mode) is the value of every interrupt right? Using outmode_x  how works ccr0 and ccr1? then adc14sc is not setted in example. why?

**Attention** This is a public forum