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.

MSP430G2553: MSP430G2553 Hangs On ADC10DTC1 Usage

Part Number: MSP430G2553

Hello,

If I enable using ADC10DTC1 - it will hang the application I'm developing - here's a code snippet:

for (EVER)
{
ADC10CTL0 &= ~ENC; //
while (ADC10CTL1 & ADC10BUSY); // Wait if ADC10 core is active

ADC10DTC1 = 0x10;
ADC10SA = &adc_readings[0];
__no_operation(); // space for debugger
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit

__no_operation(); // Set Breakpoint here

It hangs here.

The ISR just basically clears the CPUOFF bit.

If I disable using ADC10DTC1 and ADC10SA, I can read ADC10MEM just fine.

Thanks In Advance,
John W.

  • Hi John,

    I am not very clear about what you want based on your code. However, I find a ADC10 DTC function code example. You can try with it and see if the functions are all working well.

     

    msp430g2x33_adc10_13.c
    /* --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, DTC Sample A2-0, AVcc, Single Sequence, DCO
    //
    //  Description: Sample A3/A2/A1 as single sequence with reference to AVcc.
    //  Software sets ADC10SC to trigger sample sequence. In Mainloop MSP430 waits
    //  in LPM0 to save power until ADC10 conversion complete, ADC10_ISR(DTC) will
    //  force exit from any LPMx in Mainloop on reti. ADC10_ISR will force any LPMx
    //  exit. ADC10 internal oscillator times sample period (16x) and conversion
    //  (13x). DTC transfers conversion code to RAM 200h - 206h. P1.0 set at start
    //  of conversion burst, reset on completion.
    //
    //               MSP430G2x33/G2x53
    //            -----------------
    //        /|\|              XIN|-
    //         | |                 |
    //         --|RST          XOUT|-
    //           |                 |
    //       >---|P1.3/A3      P1.0|-->LED
    //       >---|P1.2/A2          |
    //       >---|P1.1/A1          |
    //
    //  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_3 + CONSEQ_1;            // A3/A2/A1, single sequence
      ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
      ADC10DTC1 = 0x03;                         // 3 conversions
      ADC10AE0 |= 0x0E;                         // P1.3,2,1 ADC10 option select
      P1DIR |= 0x01;                            // Set P1.0 output
    
      for (;;)
      {
        ADC10CTL0 &= ~ENC;
        while (ADC10CTL1 & ADC10BUSY);               // Wait if ADC10 core is active
        ADC10SA = 0x200;                        // Data buffer start
        P1OUT |= 0x01;                          // P1.0 = 1
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
        P1OUT &= ~0x01;                         // P1.0 = 0
      }
    }
    
    // ADC10 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(ADC10_VECTOR))) ADC10_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
    }
    

    Best regards,

    Cash Hao

  • More specifically, the ADC10IFG will only happen after the DTC has counted DTC1=16 conversions [Ref UG (SLAU144J) Sec 22.2.7.1, final paragraph]. With CONSEQ=0 (I'm guessing) you'll only do 1 conversion, so you won't get an interrupt and you'll stay in LPM.

  • Thanks for the replies Bruce and Cash.

    I have ADC10CTL1 configured as:

    ADC10CTL1 = INCH_1 + CONSEQ_2;

    and

    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE  + REF2_5V ;

    I'm beginning to wonder if I have a stack issue - these processors don't have a lot of RAM.

    I'm going to try and run some of this standalone and see if I get the program halts I've been seeing. 

    Sometimes even with the DTC not enabled the program halts.

    Thanks,
    John

  • With MSC=0 (and CONSEQ=2) you'll only get one conversion per trigger (ADC10SC). I suspect you want to set MSC=1. [Ref UG Fig 22-7]

    With CONSEQ=2 and MSC=1 the ADC will convert (as fast as it can) forever, though the DTC will stop after the DTC1 count is met. Once you write to ADC10SA, the DTC will start again.

  • Bruce - I thought that was only necessary if grabbing data from more than one channel - guess it isn't crystal clear - I'll give it a try and post results.

    Thanks,
    John

  • Bruce - that was it - thanks for your help!  Works now. 

    Now onto how large I can make heap and stack in a 512 byte RAM space.

    Thanks!
    John

**Attention** This is a public forum