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 problem in ccs debug session in tiva

Other Parts Discussed in Thread: TM4C123GH6PM

Hii.

I am using ADC in my TIVA EKTM4C123GXL launchpad.. I have configured the ADC and wanted to watch it on CCS debug session. When I compile, i didnt get any error. But in debug session, when i stop debugging i got error 

No source available for "SysCtlDelay() at D:/workspace\...out:{3}0xa28{4}"

Help me on this. I am stucked here. I have follow all steps which is given in  " TIVA MCU DEEP DIVE HANDS ON" . I am attaching my project as well as this hands on pdf. 

Thank you in advance.

Have a nice day.

EXPERIMENT 3.2.rar
  • Hi Brinda,

        Do you have sysctl.c included in your project?

    -kel

  • Hii Markel,

    I have indirectly included it. By giving a whole tivaware's path in Project properties-> ARM Compiler -> Include Options -> Add dir to #include search path. Tivaware's driverlib folder contains sysctl.h as well as sysctl.c files.

    As per your hint, i also try by adding in project directly. I have copied the file in the project but the result is not changed. Please help me.

    Thank you.

    Have a nice day.

  • Hi Brinda,

    I don't have CCS. What I meant was, to add sysctl.c file to group source like below at Keil Uvision. That is if you intend to debug into SysCtlDelay.



    If you don't intend to step into SysCtlDelay and the "No Source Available" error is occuring, then it is caused by another factor. You, can alternatively post this at CCS forum. I have seen some post with similar problem. Do a search in the CCS forum.

    -kel

  • Hii,

    i am showing here the image of ccs debug session print screen. Please refer on this.

  • hii kel,

    I have tried another program having sysctldelay(). But i didnt get this error. This error only occurs when I am using ADC. Thats why i have posted it here.

  • Hi Brinda,

    The SysCtlDelay is inline assembly. Your compiler/linker would have optimized it. It is OK as long as the delay is getting processed by the CPU.

    When stepping through the code, if you step over the function then do you still an issue?

    Regards

    Amit

  • Hii Amit,

    You are right. But actually i need it for the process analysis. So can't I see it on CCS debug??

    I need ADC for timer width. So i want to see my hardware inputs in digital and according timer width i have to set. As my hardware is not stable our assumption may go wrong.

    Thank you.

    Have a nice day.

  • Hello Brinda,

    Why do you not use a General Purpose Timer which can be used to trigger the ADC. The timer value will be exact and you do not have to worry about delays.

    Regards

    Amit

  • Hi Amit,

    I need ADC to check the PID controller values and according to the ADC values, I have to operate GPIO. So process will be ,

    1) ADC values will be taken in every period.

    2) According to ADC channel value, Timer width is set. (for high value, timer will provide high delay. And vice versa.)

    3) Timer interrupt will operate GPIO.

    So, for this i should have Software trigger to get continuous reading from PID controller.

  • Hi Brinda,

    I would suggest the following, please do correct my understanding

    1) ADC values will be taken in every period.

    AMIT> Timer-0 is used to trigger the ADC for values to be taken every fixed period

    2) According to ADC channel value, Timer width is set. (for high value, timer will provide high delay. And vice versa.)

    3) Timer interrupt will operate GPIO.

    AMIT> Based on the ADC Channel Value Timer-1 is set with a width value in one shot mode and that can be used to toggle a GPIO.

    What I am still unclear is when you mention "timer width is set", do you mean the SysCtlDelay based timer or a Hardware (General Purpose) Timer

    Regards

    Amit

  • Hi Amit,

    As you have mentioned, I am using sysctldelay instead of timer0 in your example. 

    The logic is, i am making a power controller by AC synchronisation. To fire the thyristors, I am using gpio interrupt to get the zero crossing and than according to required output, delay is provided by timer(timer 1 as you have mentioned.) and than gate pulse is generated. This whole synchronisation is done. But now i am trying to get feedback. That feedback is required output as i have mentioned above. 

    Feedback is 0-12 V linear. So i am taking an ADC channel to get the feedback and than give it to controller. 

    I am using software triggering to get samples and for the continuous reading, i am using sysctldelay() so that after every 1 ms( sysctldelay time) software will trigger the ADC0 part.

    Thank you.

  • Hi Brinda,

    Some clarifications

    The ADC will not work above the Vref that you have used of 3.3V/3.0V. Hence 0 to Vref will be fine, but Vref to 12V will saturate the ADC

    Secondly, if you are using SysCtlDelay for every 1 ms firing of the ADC conversion, please use a timer in periodic mode with timeout at every 1ms and ADC trigger so that Software does not have to count 1 ms. Instead you offload the 1ms time tick to the HW and it does that for you, freeing up valuable CPU time.

    I hope I am being clear.

    Regards

    Amit

  • Hi Amit,

    I have the ADC input varieng from 0-12 V. But i am conditioning it and convert it to 0-3 V with isolation. So i think it will not be the cause of problem.

    And i have tried your suggestion about timer trigger but my program goes in faultISR. I think there must be a configure error. Can you help me? 

    Thank you in advance.

    Program

    #include <stdbool.h>
    #include <stdint.h>
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_timer.h"
    #include "driverlib/adc.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/timer.h"
    #include "driverlib/sysctl.h"
    
    static uint32_t pui32ADC0Value[1];
    
    void ADC0IntHandler(void)
    {
    	//clear the adc interrupt
    	ADCIntClear(ADC0_BASE, 3) ;
    	// disable the timer  so that we do not get a fault ISR routine
    	TimerDisable(TIMER0_BASE, TIMER_A) ;
    	ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);
    	IntPendClear(INT_ADC0SS3);
    	TimerLoadSet(TIMER0_BASE, TIMER_A, 800);
    	TimerEnable(TIMER0_BASE, TIMER_A);
    
    }
    int
    main(void)
    {
    
        SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
    
        SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);
    
        TimerClockSourceSet(TIMER0_BASE,TIMER_CLOCK_SYSTEM);
        TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR |TIMER_CFG_A_PERIODIC);
        TimerControlTrigger(TIMER0_BASE,TIMER_A,true);
        TimerLoadSet(TIMER0_BASE, TIMER_A, 8000);
        TimerEnable(TIMER1_BASE, TIMER_A);
    
        ADCSequenceDisable(ADC0_BASE,3);
        ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0);
        ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
        ADCSequenceEnable(ADC0_BASE, 3);
        ADCIntEnable(ADC0_BASE,3);
    
        while(1);
    
    }
    

     

  • Hi Brinda,

    Brinda Shah said:
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);

    Based, from TM4C123GH6PM datasheet, there are no Analog Pin multiplexed with PE7. Verify this yourself.

    -kel

  • Hi Brinda,

    It is not going to FaultISR I believe but, the Interrupt Handler is not registered. Can you please check the startup_ccs.c to see if the ADC0IntHandler is mapped in the Interrupt Vector Table?

    Regards

    Amit

  • Hi kel,

    I have also tried by PE3 port. But its still giving me faultISR. As per the datasheet it it AIN0. So i think it should work as analog input if my configuration is right.

  • Hi Amit,

    I have also worked on your suggestion. But i have already registered ADC0IntHandler in startup_ccs.c..

    I am also attaching the file.

    Thank you.

    //*****************************************************************************
    //
    // Startup code for use with TI's Code Composer Studio.
    //
    // Copyright (c) 2011-2013 Texas Instruments Incorporated.  All rights reserved.
    // Software License Agreement
    // 
    // Software License Agreement
    //
    // Texas Instruments (TI) is supplying this software for use solely and
    // exclusively on TI's microcontroller products. The software is owned by
    // TI and/or its suppliers, and is protected under applicable copyright
    // laws. You may not combine this software with "viral" open-source
    // software in order to form a larger program.
    //
    // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
    // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
    // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
    // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
    // DAMAGES, FOR ANY REASON WHATSOEVER.
    //
    //*****************************************************************************
    
    #include <stdint.h>
    
    //*****************************************************************************
    //
    // Forward declaration of the default fault handlers.
    //
    //*****************************************************************************
    void ResetISR(void);
    static void NmiSR(void);
    static void FaultISR(void);
    static void IntDefaultHandler(void);
    extern void ADC0IntHandler(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 uint32_t __STACK_TOP;
    
    //*****************************************************************************
    //
    // External declarations for the interrupt handlers used by the application.
    //
    //*****************************************************************************
    // To be added by user
    
    //*****************************************************************************
    //
    // The 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(g_pfnVectors, ".intvecs")
    void (* const g_pfnVectors[])(void) =
    {
        (void (*)(void))((uint32_t)&__STACK_TOP),
                                                // The initial stack pointer
        ResetISR,                               // The reset handler
        NmiSR,                                  // 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,                      // GPIO Port A
        IntDefaultHandler,                      // GPIO Port B
        IntDefaultHandler,                      // GPIO Port C
        IntDefaultHandler,                      // GPIO Port D
        IntDefaultHandler,                      // GPIO Port E
        IntDefaultHandler,                      // UART0 Rx and Tx
        IntDefaultHandler,                      // UART1 Rx and Tx
        IntDefaultHandler,                      // SSI0 Rx and Tx
        IntDefaultHandler,                      // I2C0 Master and Slave
        IntDefaultHandler,                      // PWM Fault
        IntDefaultHandler,                      // PWM Generator 0
        IntDefaultHandler,                      // PWM Generator 1
        IntDefaultHandler,                      // PWM Generator 2
        IntDefaultHandler,                      // Quadrature Encoder 0
        IntDefaultHandler,                      // ADC Sequence 0
        IntDefaultHandler,                      // ADC Sequence 1
        IntDefaultHandler,                      // ADC Sequence 2
        ADC0IntHandler,                      // ADC Sequence 3
        IntDefaultHandler,                      // Watchdog timer
        IntDefaultHandler,                      // Timer 0 subtimer A
        IntDefaultHandler,                      // Timer 0 subtimer B
        IntDefaultHandler,                      // Timer 1 subtimer A
        IntDefaultHandler,                      // Timer 1 subtimer B
        IntDefaultHandler,                      // Timer 2 subtimer A
        IntDefaultHandler,                      // Timer 2 subtimer B
        IntDefaultHandler,                      // Analog Comparator 0
        IntDefaultHandler,                      // Analog Comparator 1
        IntDefaultHandler,                      // Analog Comparator 2
        IntDefaultHandler,                      // System Control (PLL, OSC, BO)
        IntDefaultHandler,                      // FLASH Control
        IntDefaultHandler,                      // GPIO Port F
        IntDefaultHandler,                      // GPIO Port G
        IntDefaultHandler,                      // GPIO Port H
        IntDefaultHandler,                      // UART2 Rx and Tx
        IntDefaultHandler,                      // SSI1 Rx and Tx
        IntDefaultHandler,                      // Timer 3 subtimer A
        IntDefaultHandler,                      // Timer 3 subtimer B
        IntDefaultHandler,                      // I2C1 Master and Slave
        IntDefaultHandler,                      // Quadrature Encoder 1
        IntDefaultHandler,                      // CAN0
        IntDefaultHandler,                      // CAN1
        IntDefaultHandler,                      // CAN2
        0,                                      // Reserved
        IntDefaultHandler,                      // Hibernate
        IntDefaultHandler,                      // USB0
        IntDefaultHandler,                      // PWM Generator 3
        IntDefaultHandler,                      // uDMA Software Transfer
        IntDefaultHandler,                      // uDMA Error
        IntDefaultHandler,                      // ADC1 Sequence 0
        IntDefaultHandler,                      // ADC1 Sequence 1
        IntDefaultHandler,                      // ADC1 Sequence 2
        IntDefaultHandler,                      // ADC1 Sequence 3
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port J
        IntDefaultHandler,                      // GPIO Port K
        IntDefaultHandler,                      // GPIO Port L
        IntDefaultHandler,                      // SSI2 Rx and Tx
        IntDefaultHandler,                      // SSI3 Rx and Tx
        IntDefaultHandler,                      // UART3 Rx and Tx
        IntDefaultHandler,                      // UART4 Rx and Tx
        IntDefaultHandler,                      // UART5 Rx and Tx
        IntDefaultHandler,                      // UART6 Rx and Tx
        IntDefaultHandler,                      // UART7 Rx and Tx
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C2 Master and Slave
        IntDefaultHandler,                      // I2C3 Master and Slave
        IntDefaultHandler,                      // Timer 4 subtimer A
        IntDefaultHandler,                      // Timer 4 subtimer B
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // Timer 5 subtimer A
        IntDefaultHandler,                      // Timer 5 subtimer B
        IntDefaultHandler,                      // Wide Timer 0 subtimer A
        IntDefaultHandler,                      // Wide Timer 0 subtimer B
        IntDefaultHandler,                      // Wide Timer 1 subtimer A
        IntDefaultHandler,                      // Wide Timer 1 subtimer B
        IntDefaultHandler,                      // Wide Timer 2 subtimer A
        IntDefaultHandler,                      // Wide Timer 2 subtimer B
        IntDefaultHandler,                      // Wide Timer 3 subtimer A
        IntDefaultHandler,                      // Wide Timer 3 subtimer B
        IntDefaultHandler,                      // Wide Timer 4 subtimer A
        IntDefaultHandler,                      // Wide Timer 4 subtimer B
        IntDefaultHandler,                      // Wide Timer 5 subtimer A
        IntDefaultHandler,                      // Wide Timer 5 subtimer B
        IntDefaultHandler,                      // FPU
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C4 Master and Slave
        IntDefaultHandler,                      // I2C5 Master and Slave
        IntDefaultHandler,                      // GPIO Port M
        IntDefaultHandler,                      // GPIO Port N
        IntDefaultHandler,                      // Quadrature Encoder 2
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port P (Summary or P0)
        IntDefaultHandler,                      // GPIO Port P1
        IntDefaultHandler,                      // GPIO Port P2
        IntDefaultHandler,                      // GPIO Port P3
        IntDefaultHandler,                      // GPIO Port P4
        IntDefaultHandler,                      // GPIO Port P5
        IntDefaultHandler,                      // GPIO Port P6
        IntDefaultHandler,                      // GPIO Port P7
        IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
        IntDefaultHandler,                      // GPIO Port Q1
        IntDefaultHandler,                      // GPIO Port Q2
        IntDefaultHandler,                      // GPIO Port Q3
        IntDefaultHandler,                      // GPIO Port Q4
        IntDefaultHandler,                      // GPIO Port Q5
        IntDefaultHandler,                      // GPIO Port Q6
        IntDefaultHandler,                      // GPIO Port Q7
        IntDefaultHandler,                      // GPIO Port R
        IntDefaultHandler,                      // GPIO Port S
        IntDefaultHandler,                      // PWM 1 Generator 0
        IntDefaultHandler,                      // PWM 1 Generator 1
        IntDefaultHandler,                      // PWM 1 Generator 2
        IntDefaultHandler,                      // PWM 1 Generator 3
        IntDefaultHandler                       // PWM 1 Fault
    };
    
    //*****************************************************************************
    //
    // 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.  This will enable the
        // floating-point unit as well, so that does not need to be done here.
        //
        __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
    NmiSR(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)
    {
        //
        // Go into an infinite loop.
        //
        while(1)
        {
        }
    }
    

  • Hi Brinda,

         If I remember correctly, your shared code is some parts not correct on how to trigger adc conversion using timer interrupt. You should have a timer interrupt handler instead of adc interrupt handler. I have seen that code before. However, I can not find a similar post for show and tell. I will get back to you when I get more info.

    -kel

  • Hi Brinda,

    I reviewed the code post and I think the problem is in the main loop

        TimerEnable(TIMER1_BASE, TIMER_A);

    You are enabling TIMER-1, while Timer-0 clock is enabled. The above line should be TIMER0_BASE and not TIMER1_BASE

    Regards

    Amit

  • Thank you Amit and Kel.

    I got it.

    Another fault is I haven't put IntEnale(INT_ADC0SS3). So its working now.