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.

TMS570LS1224: TI ADC example not working

Part Number: TMS570LS1224
Other Parts Discussed in Thread: LAUNCHXL2-TMS57012, HALCOGEN

I was running this example https://training.ti.com/hercules-how-tutorial-12bit-adc?cu=1136292 with the launchpad LAUNCHXL2-TMS57012 in halcoGen and CCS software. But, I am getting while run the example code. 

Please tell me what I need to change in my halcoGen project and CCS project. 

>> Compilation failure
source/subdir_rules.mk:9: recipe for target 'source/sys_main.obj' failed
"../source/sys_main.c", line 90: error #19: extra text after expected end of number
"../source/sys_main.c", line 90: error #110: expression preceding parentheses of apparent call must have (pointer-to-) function type
2 errors detected in the compilation of "../source/sys_main.c".
gmake: *** [source/sys_main.obj] Error 1
gmake: Target 'all' not remade because of errors.

Main code


/* USER CODE BEGIN (0) */
#include "reg_adc.h"
#include "reg_sci.h"
#include "sci.h"
#include "adc.h"
#include "stdlib.h"

/* USER CODE END */

/* Include Files */

#include "sys_common.h"
#include "system.h"

/* USER CODE BEGIN (1) */
unsigned char command[8];
/* USER CODE END */

/** @fn void main(void)
* @brief Application main function
* @note This function is empty by default.
*
* This function is called after startup.
* The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
/* USER CODE END */

void main(void)
{
/* USER CODE BEGIN (3) */
adcData_t adc_data;
adcData_t *adc_data_ptr = &adc_data;
unsigned int NumberOfChars, value;

sciInit();
adcInit();

while(1)
{
adcStartConversion(adcREG1,adcGROUP1);
while(!adcIsConversionComplete(adcREG1,adcGROUP1))
adcGetData(adcREG1, adcGROUP1, adc_data_ptr);
value = (unsigned int)adc_data_ptr->value;
NumberOfChars = 1toa(value,(char *)command);
sciSend(scilinREG, 2, (unsigned char*)"0x");
sciSend(scilinREG, NumberOfChars, command);
sciSend(scilinREG, 2, (unsigned char *)"\r\n");
}
/* USER CODE END */


}


/* USER CODE BEGIN (4) */

void adcNotification(adcBASE_t *adc, unsigned group)
{
return;
}

void sciNotification(sciBASE_t *sci, unsigned flags)
{
return;
}

void esmGroup1Notification(int bit)
{
return;
}

void esmGroup2Notification(int bit)
{
return;
}

/* USER CODE END */

  • NumberOfChars = 1toa(value,(char *)command);

    The error is that in the above 1toa is used (starts with a one, where instead ltoa should be used (starts with an ell). I.e. try changing the line to:

    NumberOfChars = ltoa(value,(char *)command);

  • I tried changing that statement but getting the follwoing errors.

    >> Compilation failure
    source/subdir_rules.mk:9: recipe for target 'source/sys_main.obj' failed
    "../source/sys_main.c", line 90: error #167: too few arguments in function call
    "../source/sys_main.c", line 90: warning #515-D: a value of type "char *" cannot be assigned to an entity of type "unsigned int"
    1 error detected in the compilation of "../source/sys_main.c".
    gmake: *** [source/sys_main.obj] Error 1
    gmake: Target 'all' not remade because of errors.

    **** Build Finished ****

  • "../source/sys_main.c", line 90: error #167: too few arguments in function call

    The screenshot shows TI ARM compiler v20.2.4.LTS is used.

    Handling the Change in ltoa explains that starting from TI ARM compiler v19.6.0.STS a 3rd argument was added to the ltoa function, and the referenced page gives some guidance on how to the change the code.

    sciSend(scilinREG, 2, (unsigned char*)"0x");
    sciSend(scilinREG, NumberOfChars, command);

    Do you want the output displayed as a decimal or hexadecimal value?

    The outputting of "0x" before the command suggests a hexadecimal value.

    If you want want hexadecimal specify a radix of 16:

    NumberOfChars = ltoa(value,(char *)command, 16);

    Or for decimal specify a radix of 10:

    NumberOfChars = ltoa(value,(char *)command, 10);

  • Hi Sakthi,

    NumberOfChars = 1toa(value,(char *)command);

    I think the func is ltoa(..) rather than 1toa(..). As Chester said, 3 arguments are required for ltoa(..) function.

  • This error have gone now Wang. Now it is showing a warning and when I  dump the code to my launchpad i am not getting a proper output on the terminal screen. 

  • I had given a PWM of 62Hz to the ADC Pin 9 which mapped to PIN49 on the J11. But, the terminal doesn't show the digital equivalent value. 

      

  • it is showing a warning

    The return value of ltoa() is char rather than int. Did you get correct sampled adc value: adc_data_ptr->value?

  • Can you please try the text display function used in HALCOGen example?

     

    /** @example example_adcDisplay.c
    *   This is an example which describes the steps to create an example application which 
    *   configures ADC to start conversion ona GIO trigger and display it over an uart .
    *   The digital value can be viewed on a pc terminal with the uart configures @ 9600
    *   no parity ,2 stop bits.
    *
    *   
    *   @b Step @b 1:
    *
    *   Create a new project.
    *
    *   Navigate: -> File -> New -> Project
    *
    *   @image html example_createProject.JPG "Figure: Create a new Project"
    *
    *   @b Step @b 2:
    *
    *   Configure driver code generation: 
    *   - Enable GIO driver
    *   - Enable SCI driver
    *   - Enable ADC driver
    *   - Disable others
    *
    *   Navigate: -> TMS570LSxx /RM4 -> Enable Drivers
    *
    *   @image html adcDisplay_enabledriver.JPG "Figure: SCI Enable Driver"
    *
    *
    *   @b Step @b 3:
    *
    *   Navigate: -> TMS570LSxx /RM4 -> ADC
    *
    *   Configure ADC General : 
    *
    *   @image html adcDisplay1.JPG "Figure: ADC General Configuration"
    *
    *
    *   @b Step @b 4:
    *
    *   Configure ADC Group1 : 
    *
    *   - Configure ADC Group 1 with "Hardware trigger" source as "GIOB0" at "Rising edge"
    *   - Enable ADC1 Group 1 channel selection Pin 0 and Pin 1
    *
    *   @image html adcDisplay2.JPG "Figure: ADC Group Configuration"
    *
    *   @b Step @b 5:
    *
    *   Configure SCI: 
    *   - Configure SCI baudrate as 9600
    *
    *   Navigate: -> TMS570LSxx /RM4 -> ADC
    *
    *   @image html sci_uart1.JPG "Figure: SCI Configuration"
    *
    *   @b Step @b 6:
    *
    *   Copy the source code below into your sys_main.c or replace sys_main.c with this file.
    *
    *   The example file can also be found in the examples folder: ../HALCoGen/examples
    *
    *   @note HALCoGen generates an empty main function in sys_main.c, 
    *         please make sure that you link in the right main function or copy the source into the user code sections of this file.
    *
    *
    */
    
    /* 
    * Copyright (C) 2009-2015 Texas Instruments Incorporated - 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.
    *
    */
    
    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    
    /* Include Files */
    
    #include "sys_common.h"
    #include "system.h"
    
    /* USER CODE BEGIN (1) */
    #include "esm.h"
    #include "adc.h"
    #include "sci.h"
    #include "gio.h"
    
    #define  TSIZE1 12
    uint8  TEXT1[TSIZE1]= {'\r','\n','|','\t','C','H','.','I','D','=','0','x'};
    #define  TSIZE2 9
    uint8  TEXT2[TSIZE2]= {'\t','V','A','L','U','E','=','0','x'};
    
    
    
    adcData_t adc_data[2];
    void sciDisplayText(sciBASE_t *sci, uint8 *text, uint32 length);
    void sciDisplayData(sciBASE_t *sci, uint8 *text,uint32 length);
    void wait(uint32 time);
    /* USER CODE END */
    
    
    /** @fn void main(void)
    *   @brief Application main function
    *
    */
    
    /* USER CODE BEGIN (2) */
    /* USER CODE END */
    
    void main(void)
    {
    /* USER CODE BEGIN (3) */
        uint32 ch_count=0;
        uint32 id    =0;
        uint32 value =0; 
    
        /* initialize gio     */
        gioInit();                    
        gioSetDirection(gioPORTB, 1);
         
        /* initialize sci/sci-lin  : even parity , 2 stop bits */      
        sciInit();
        
        /* initialize ADC  */
        /* Group1 -> Channel 0 and 1                        */
        /* HW trigger trigger source as GIOB  Pin 0         */
        adcInit();                 
    
        /* start adc conversion */
        adcStartConversion(adcREG1,adcGROUP1);
        
        while(1) /* ... continue forever */
        {
            /* trigger using gio port b, pin 0  */
            gioSetBit(gioPORTB, 0, 1);
                
            /* ... wait and read the conversion count */
            while((adcIsConversionComplete(adcREG1,adcGROUP1))==0);
            ch_count = adcGetData(adcREG1, adcGROUP1,&adc_data[0]);
               
            ch_count = ch_count; 
            /* conversion results :                                       */
            /* adc_data[0] -> should have conversions for Group1 channel1 */
            /* adc_data[1] -> should have conversions for Group1 channel2 */
        
            id    = adc_data[0].id;
            value = adc_data[0].value;
              
            gioSetBit(gioPORTB, 0, 0);
    
            sciDisplayText(scilinREG,&TEXT1[0],TSIZE1);   /* send text 1 */    
            sciDisplayData(scilinREG,(uint8*)&id,4);    /* send data 1 */
            sciDisplayText(scilinREG,&TEXT2[0],TSIZE2);   /* send text 2 */     
            sciDisplayData(scilinREG,(uint8*)&value,4); /* send data 2 */
             
            id    = adc_data[1].id;
            value = adc_data[1].value;
             
            sciDisplayText(scilinREG,&TEXT1[0],TSIZE1);   /* send text 1 */
            sciDisplayData(scilinREG,(uint8*)&id,4);    /* send data 1 */
            sciDisplayText(scilinREG,&TEXT2[0],TSIZE2);   /* send text 2 */
            sciDisplayData(scilinREG,(uint8*)&value,4); /* send data 2 */     
             
            wait(0xFFFFFF);
        };          
    /* USER CODE END */
    }
    
    /* USER CODE BEGIN (4) */
    void sciDisplayData(sciBASE_t *sci, uint8 *text,uint32 length)
    {
        uint8 txt = 0;
        uint8 txt1 = 0;
        
    #if ((__little_endian__ == 1) || (__LITTLE_ENDIAN__ == 1)) 
    text = text + (length -1);
    #endif 
    
        while(length--)
        {
    #if ((__little_endian__ == 1) || (__LITTLE_ENDIAN__ == 1)) 
            txt = *text--;
    #else
            txt = *text++;
    #endif 
          
            txt1 = txt;
          
            txt  &= ~(0xF0);
            txt1 &= ~(0x0F); 
            txt1  =txt1>>4;
        
            if(txt<=0x9)
            {
                txt +=0x30;
            }
            else if(txt > 0x9 && txt < 0xF)
            {
                txt +=0x37;
            }
            else
            {
                txt = 0x30;
            }
          
            if(txt1 <= 0x9)
            {
                txt1 +=0x30;
            }
            else if((txt1 > 0x9) && (txt1 <= 0xF))
            {
                txt1 +=0x37;
            }
            else
            {
                txt1 = 0x30;
            }     
         
            while ((scilinREG->FLR & 0x4) == 4); /* wait until busy */
            sciSendByte(scilinREG,txt1);      /* send out text   */
            while ((scilinREG->FLR & 0x4) == 4); /* wait until busy */
            sciSendByte(scilinREG,txt);      /* send out text   */        
        };
    }
    
    void sciDisplayText(sciBASE_t *sci, uint8 *text,uint32 length)
    {
        while(length--)
        {
            while ((scilinREG->FLR & 0x4) == 4); /* wait until busy */
            sciSendByte(scilinREG,*text++);      /* send out text   */
        };
    }
    
    void wait(uint32 time)
    {
        while(time){time--;};
    }
    /* USER CODE END */