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.

MSP432 Launchpad ADC14 Window Comparator, Example Code Error

Hey, i am again,

it think their is an error of an low-level program example for the ADC14:

msp432p401_adc14_21.c

ADC14CTL0 = ADC14SHT0_2 | ADC14SHP | ADC14ON;
ADC14CTL1 = ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0 | ADC14RES_3;

"ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0 " these make no sense for register ADC14CTL1, cause there not the fields, can some confirm that ?

btw. the example doesn't work :(

full code

main:

/* --COPYRIGHT--,BSD_EX
 * Copyright (c) 2013, 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.
 *
 *******************************************************************************
 *
 *                       MSP432 CODE EXAMPLE DISCLAIMER
 *
 * MSP432 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 http://www.ti.com/tool/mspdriverlib for an API functional
 * library & https://dev.ti.com/pinmux/ for a GUI approach to peripheral configuration.
 *
 * --/COPYRIGHT--*/
//******************************************************************************
//  MSP432P401 Demo - ADC14, Window Comparator, 2.5V ref
//
//  Description; A1 is sampled in single ch/ single conversion mode.
//  Window comparator is used to generate interrupts to
//  indicate when the input voltage goes above the High_Threshold or below the
//  Low_Threshold or is in between the high and low thresholds. TimerB0 is used
//  as an interval timer used to control the LED at P1.0 to toggle slow/fast
//  or turn off according to the ADC12 Hi/Lo/IN interupts.
//
//               MSP432p401rpz
//            -----------------
//        /|\|                 |
//         | |                 |
//         --|RST              |
//           |                 |
//       >---|P5.4/A1     P1.0 |--> LED
//
//   Dung Dang
//   Texas Instruments Inc.
//   November 2013
//   Built with Code Composer Studio V6.0
//******************************************************************************
#include "msp.h"
#include "stdint.h"

#define High_Threshold 0xAAAA         // ~2V
#define Low_Threshold  0x5555         // ~1V

volatile unsigned int SlowToggle_Period = 20000-1;
volatile unsigned int FastToggle_Period = 1000-1;


int main(void) {
	volatile unsigned int i;
    WDTCTL = WDTPW | WDTHOLD;               // Stop WDT

    // GPIO Setup
    P1OUT &= ~BIT0;                         // Clear LED to start
    P1DIR |= BIT0;                          // Set P1.0/LED to output
    P5SEL1 |= BIT4;                         // Configure P5.4 for ADC A1
    P5SEL0 |= BIT4;

    __enable_interrupt();
    NVIC_ISER0 = 1 << ((INT_ADC14 - 16) & 31);         // Enable ADC interrupt in NVIC module
    NVIC_ISER0 = 1 << ((INT_TA0_0 - 16) & 31);         // Enable Timer_A0 interrupt in NVIC module

    // Configure internal reference
    while(REFCTL0 & REFGENBUSY);            // If ref generator busy, WAIT
    REFCTL0 |= REFVSEL_3 |REFON;            // Select internal ref = 2.5V
                                            // Internal Reference ON
    for (i = 75; i > 0; i--);               // Delay (~75us) for Ref to settle

    // Configure ADC14
    // tsample = 16ADC14CLK cycles, tconvert = 16 ADC12CLK cycles
    // software trigger for SOC, MODOSC, single ch-single conversion,
    // tsample controlled by SHT0x settings
    // Channel 1, reference = internal, enable window comparator
    // Set thresholds for ADC14 interrupts
    // Enable Interrupts
    ADC14CTL0 = ADC14SHT0_2 | ADC14SHP | ADC14ON;
    ADC14CTL1 = ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0 | ADC14RES_3;

    ADC14MCTL0 |= ADC14INCH_1 | ADC14VRSEL_1 | ADC14WINC;
    ADC14HI0 = High_Threshold;
    ADC14LO0 = Low_Threshold;
    ADC14IER1 |= ADC14HIIE | ADC14LOIE | ADC14INIE;



    // Configure TA0 period-timer for LED toggle
    TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled
    TA0CTL = TASSEL_1 | TACLR;                // ACLK, clear TBR

    SCB_SCR &= ~SCB_SCR_SLEEPONEXIT;           // Wake up on exit from ISR

    while (1)
    {
      for (i = 20000; i > 0; i--);            // Delay
      ADC14CTL0 |= ADC14ENC | ADC14SC;        // Start sampling/conversion
      __sleep();


      __no_operation();                       // For debugger
    }




}

// ADC14 interrupt service routine

void ADC14IsrHandler(void) {
    if (ADC14IFGR1 & ADC14HIIFG)
    {
        ADC14IFGR1 &= ~ADC14HIIFG;            // Clear interrupt flag
        TA0CTL &= ~MC_1;                      // Turn off Timer
        TA0CCR0 = FastToggle_Period;          // Set Timer Period for fast LED toggle
        TA0CTL |= MC_1;
    }
    if (ADC14IFGR1 & ADC14LOIFG)
    {
        ADC14IFGR1 &= ~ADC14LOIFG;            // Clear interrupt flag
        TA0CTL &= ~MC_1;                      // Turn off Timer
        P1OUT &= ~BIT0;                         // Turn off LED
    }
    if (ADC14IFGR1 & ADC14INIFG)
    {
        ADC14IFGR1 &= ~ADC14INIFG;            // Clear interrupt flag
        TA0CTL &= ~MC_1;                      // Turn off Timer
        TA0CCR0 = SlowToggle_Period;          // Set Timer Period for slow LED toggle
        TA0CTL |= MC_1;
    }
}

// Timer A0 interrupt service routine

void TimerA0_0IsrHandler(void) {
    P1OUT ^= BIT0;
}

startupfile:

//*****************************************************************************
//
// Copyright (C) 2012 - 2014 Texas Instruments Incorporated - http://www.ti.com/
//
// 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.  
//
// MSP432 Family Interrupt Vector Table for CGT
//
//****************************************************************************

/* Forward declaration of the default fault handlers. */
static void resetISR(void);
static void nmiISR(void);
static void faultISR(void);
static void intDefaultHandler(void);


/* External declaration for the reset handler that is to be called when the */
/* processor is started                                                     */
extern void _c_int00(void);


/* Linker variable that marks the top of the stack. */
extern unsigned long __STACK_END;
/* External declarations for the interrupt handlers used by the application. */
extern void ADC14IsrHandler(void);
extern void TimerA0_0IsrHandler(void);
/* To be added by user */


/* Intrrupt vector table.  Note that the proper constructs must be placed on this to  */
/* ensure that it ends up at physical address 0x0000.0000 or at the start of          */
/* the program if located at a start address other than 0.                            */
#pragma DATA_SECTION(interruptVectors, ".intvecs")
void (* const interruptVectors[])(void) =
{
    (void (*)(void))((unsigned long)&__STACK_END),
                                            /* The initial stack pointer */
    resetISR,                               /* The reset handler         */
    nmiISR,                                 /* The NMI handler           */
    faultISR,                               /* The hard fault handler    */
    intDefaultHandler,                      /* The MPU fault handler     */
    intDefaultHandler,                      /* The bus fault handler     */
    intDefaultHandler,                      /* The usage fault handler   */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    0,                                      /* Reserved                  */
    intDefaultHandler,                      /* SVCall handler            */
    intDefaultHandler,                      /* Debug monitor handler     */
    0,                                      /* Reserved                  */
    intDefaultHandler,                      /* The PendSV handler        */
    intDefaultHandler,                      /* The SysTick handler       */
    intDefaultHandler,                      /* PSS ISR                   */
    intDefaultHandler,                      /* CS ISR                    */
    intDefaultHandler,                      /* PCM ISR                   */
    intDefaultHandler,                      /* WDT ISR                   */
    intDefaultHandler,                      /* FPU ISR                   */
    intDefaultHandler,                      /* FLCTL ISR                 */
    intDefaultHandler,                      /* COMP0 ISR                 */
    intDefaultHandler,                      /* COMP1 ISR                 */
    TimerA0_0IsrHandler,                    /* TA0_0 ISR                 */
    intDefaultHandler,                      /* TA0_N ISR                 */
    intDefaultHandler,                      /* TA1_0 ISR                 */
    intDefaultHandler,                      /* TA1_N ISR                 */
    intDefaultHandler,                      /* TA2_0 ISR                 */
    intDefaultHandler,                      /* TA2_N ISR                 */
    intDefaultHandler,                      /* TA3_0 ISR                 */
    intDefaultHandler,                      /* TA3_N ISR                 */
    intDefaultHandler,                      /* EUSCIA0 ISR               */
    intDefaultHandler,                      /* EUSCIA1 ISR               */
    intDefaultHandler,                      /* EUSCIA2 ISR               */
    intDefaultHandler,                      /* EUSCIA3 ISR               */
    intDefaultHandler,                      /* EUSCIB0 ISR               */
    intDefaultHandler,                      /* EUSCIB1 ISR               */
    intDefaultHandler,                      /* EUSCIB2 ISR               */
    intDefaultHandler,                      /* EUSCIB3 ISR               */
    ADC14IsrHandler,                    	/* ADC14 ISR                 */
    intDefaultHandler,                      /* T32_INT1 ISR              */
    intDefaultHandler,                      /* T32_INT2 ISR              */
    intDefaultHandler,                      /* T32_INTC ISR              */
    intDefaultHandler,                      /* AES ISR                   */
    intDefaultHandler,                      /* RTC ISR                   */
    intDefaultHandler,                      /* DMA_ERR ISR               */
    intDefaultHandler,                      /* DMA_INT3 ISR              */
    intDefaultHandler,                      /* DMA_INT2 ISR              */
    intDefaultHandler,                      /* DMA_INT1 ISR              */
    intDefaultHandler,                      /* DMA_INT0 ISR              */
    intDefaultHandler,                        /* PORT1 ISR                 */
    intDefaultHandler,                      /* PORT2 ISR                 */
    intDefaultHandler,                      /* PORT3 ISR                 */
    intDefaultHandler,                      /* PORT4 ISR                 */
    intDefaultHandler,                      /* PORT5 ISR                 */
    intDefaultHandler,                      /* PORT6 ISR                 */
    intDefaultHandler,                      /* Reserved 41               */
    intDefaultHandler,                      /* Reserved 42               */
    intDefaultHandler,                      /* Reserved 43               */
    intDefaultHandler,                      /* Reserved 44               */
    intDefaultHandler,                      /* Reserved 45               */
    intDefaultHandler,                      /* Reserved 46               */
    intDefaultHandler,                      /* Reserved 47               */
    intDefaultHandler,                      /* Reserved 48               */
    intDefaultHandler,                      /* Reserved 49               */
    intDefaultHandler,                      /* Reserved 50               */
    intDefaultHandler,                      /* Reserved 51               */
    intDefaultHandler,                      /* Reserved 52               */
    intDefaultHandler,                      /* Reserved 53               */
    intDefaultHandler,                      /* Reserved 54               */
    intDefaultHandler,                      /* Reserved 55               */
    intDefaultHandler,                      /* Reserved 56               */
    intDefaultHandler,                      /* Reserved 57               */
    intDefaultHandler,                      /* Reserved 58               */
    intDefaultHandler,                      /* Reserved 59               */
    intDefaultHandler,                      /* Reserved 60               */
    intDefaultHandler,                      /* Reserved 61               */
    intDefaultHandler,                      /* Reserved 62               */
    intDefaultHandler,                      /* Reserved 63               */
    intDefaultHandler                       /* Reserved 64               */
};


/* This is the code that gets called when the processor first starts execution */
/* following a reset event.  Only the absolutely necessary set is performed,   */
/* after which the application supplied entry() routine is called.  Any fancy  */
/* actions (such as making decisions based on the reset cause register, and    */
/* resetting the bits in that register) are left solely in the hands of the    */
/* application.                                                                */
void resetISR(void)
{
    /* Jump to the CCS C Initialization Routine. */
    __asm("    .global _c_int00\n"
          "    b.w     _c_int00");
}


/* This is the code that gets called when the processor receives a NMI.  This  */
/* simply enters an infinite loop, preserving the system state for examination */
/* by a debugger.                                                              */
static void nmiISR(void)
{
    /* Enter an infinite loop. */
    while(1)
    {
    }
}


/* This is the code that gets called when the processor receives a fault        */
/* interrupt.  This simply enters an infinite loop, preserving the system state */
/* for examination by a debugger.                                               */
static void faultISR(void)
{
    /* Enter an infinite loop. */
    while(1)
    {
    }
}


/* This is the code that gets called when the processor receives an unexpected  */
/* interrupt.  This simply enters an infinite loop, preserving the system state */
/* for examination by a debugger.                                               */
static void intDefaultHandler(void)
{
    /* Enter an infinite loop. */
    while(1)
    {
    }
}

  • ADC14CTL1 = ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0 | ADC14RES_3;

    the line is ok, cause xxxx_0 is 0x000000, but its unnecessary, but still doen't work, he jump allways in:

    ....
    if (ADC14IFGR1 & ADC14HIIFG)
    {
       ...
    }

    if i switch between 3,3 V and GND its allways the same result ;(

  • I agree with you. , could you have a look at it. It is example

    • msp432p401_adc14_21.c

    from the code examples of the MSP432. The example code writes:

    ADC14CTL0 = ADC14SHT0_2 | ADC14SHP | ADC14ON;
    ADC14CTL1 = ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0 | ADC14RES_3;

    But ADC14SHS, ADC14SSEL and ADC14CONSEQ belong to ADC14CTL0. Maybe some mistake when thinking about two 16 bit long LO and HI halfs of the 32 bit register. But ADC14RES would not fit tin that case :)

    Dennis

  • Hi Bilbo & thanks Dennis for flagging this!

    There were indeed some bugs in this code as it was more or less ported from FR5969 code example. Here's the updated code with bug fixes:

    • Correct ADC14 register/bits
    • Updated timer intervals & timer ISR handling
    • Updated comments/descriptions

    I've checked that into our repository, so the official fix will be rolled out in the next software/mspware update.

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2013, 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.
     *
     *******************************************************************************
     *
     *                       MSP432 CODE EXAMPLE DISCLAIMER
     *
     * MSP432 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/.../mspdriverlib for an API functional
     * library & https://dev.ti.com/pinmux/ for a GUI approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP432P401 Demo - ADC14, Window Comparator, 2.5V ref
    //
    //  Description; A1 is sampled in single ch/ single conversion mode.
    //  Window comparator is used to generate interrupts to
    //  indicate when the input voltage goes above the High_Threshold or below the
    //  Low_Threshold or is in between the high and low thresholds. TimerA0 is used
    //  as an interval timer used to control the LED at P1.0 to toggle slow/fast
    //  or turn off according to the ADC12 Hi/Lo/IN interupts.
    //
    //               MSP432P401RPZ
    //            -----------------
    //        /|\|                 |
    //         | |                 |
    //         --|RST              |
    //           |                 |
    //       >---|P5.4/A1     P1.0 |--> LED
    //
    //   Dung Dang
    //   Texas Instruments Inc.
    //   September 2015
    //   Built with Code Composer Studio V6.1.0
    //******************************************************************************
    #include "msp.h"
    #include "stdint.h"
    
    #define High_Threshold 0x2AAA         // ~2V
    #define Low_Threshold  0x1555         // ~1V
    
    volatile unsigned int SlowToggle_Period = 10000-1;
    volatile unsigned int FastToggle_Period = 1000-1;
    
    
    int main(void) {
    	volatile unsigned int i;
        WDTCTL = WDTPW | WDTHOLD;               // Stop WDT
    
        // GPIO Setup
        P1OUT &= ~BIT0;                         // Clear LED to start
        P1DIR |= BIT0;                          // Set P1.0/LED to output
        P5SEL1 |= BIT4;                         // Configure P5.4 for ADC A1
        P5SEL0 |= BIT4;
    
        __enable_interrupt();
        NVIC_ISER0 = 1 << ((INT_ADC14 - 16) & 31);         // Enable ADC interrupt in NVIC module
        NVIC_ISER0 = 1 << ((INT_TA0_0 - 16) & 31);         // Enable Timer_A0 interrupt in NVIC module
    
        // Configure internal reference
        while(REFCTL0 & REFGENBUSY);            // If ref generator busy, WAIT
        REFCTL0 |= REFVSEL_3 |REFON;            // Select internal ref = 2.5V
                                                // Internal Reference ON
        for (i = 75; i > 0; i--);               // Delay (~75us) for Ref to settle
    
        // Configure ADC14
        // tsample = 16ADC14CLK cycles, tconvert = 16 ADC12CLK cycles
        // software trigger for SOC, MODOSC, single ch-single conversion,
        // tsample controlled by SHT0x settings
        // Channel 1, reference = internal, enable window comparator
        // Set thresholds for ADC14 interrupts
        // Enable Interrupts
        ADC14CTL0 = ADC14SHT0_2 | ADC14SHP | ADC14ON | ADC14SHS_0 | ADC14SSEL_0 | ADC14CONSEQ_0;
        ADC14CTL1 =  ADC14RES_3;
    
        ADC14MCTL0 |= ADC14INCH_1 | ADC14VRSEL_1 | ADC14WINC;
        ADC14HI0 = High_Threshold;
        ADC14LO0 = Low_Threshold;
        ADC14IER1 |= ADC14HIIE | ADC14LOIE | ADC14INIE;
    
    
    
        // Configure TA0 period-timer for LED toggle
        TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled
        TA0CTL = TASSEL_1 | TACLR;                // ACLK, clear TBR
    
        SCB_SCR &= ~SCB_SCR_SLEEPONEXIT;           // Wake up on exit from ISR
    
        while (1)
        {
          for (i = 20000; i > 0; i--);            // Delay
          ADC14CTL0 |= ADC14ENC | ADC14SC;        // Start sampling/conversion
          __sleep();
    
    
          __no_operation();                       // For debugger
        }
    
    }
    
    // ADC14 interrupt service routine
    
    void ADC14IsrHandler(void) {
        if (ADC14IFGR1 & ADC14HIIFG)
        {
            ADC14CLRIFGR1 |= ADC14HIIFG;            // Clear interrupt flag
            TA0CTL &= ~MC_1;                      // Turn off Timer
            TA0CCR0 = FastToggle_Period;          // Set Timer Period for fast LED toggle
            TA0CTL |= MC_1;
        }
        if (ADC14IFGR1 & ADC14LOIFG)
        {
        	ADC14CLRIFGR1 |= ADC14LOIFG;            // Clear interrupt flag
            TA0CTL &= ~MC_1;                      // Turn off Timer
            P1OUT &= ~BIT0;                         // Turn off LED
        }
        if (ADC14IFGR1 & ADC14INIFG)
        {
        	ADC14CLRIFGR1 |= ADC14INIFG;            // Clear interrupt flag
            TA0CTL &= ~MC_1;                      // Turn off Timer
            TA0CCR0 = SlowToggle_Period;          // Set Timer Period for slow LED toggle
            TA0CTL |= MC_1;
        }
    }
    
    // Timer A0 interrupt service routine
    
    void TimerA0_0IsrHandler(void) {
    	TA0CCTL0 &= ~CCIFG;
        P1OUT ^= BIT0;
    }
    

    Thanks again for reporting this!

    ~Dung

  • Thanks Dung for your fix!

    The high threshold (2 V)  and the low threshold (1 V) are to high, i just tested and found following values (its not calculated !):

    #define High_Threshold 0x33C2  	// ~2V 
    #define Low_Threshold  0x1900 	// ~1V 

    but thanks allot for your fix, i would take hours to make it works!

    -bilbo

  • Hi Bilbo,
    good point on the voltages. I calculated based on 3V (VCC reference) but it should be 2.5V.
    Here's some napkin calculation:
    2.5V=0x3FFF
    2V ~= 0x3333
    1V =~ 0x1999
    Your measurement is pretty close.
    ~Dung

**Attention** This is a public forum