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.

  • TI Thinks Resolved

TMS320F28379D: problem with transmitting the adc result via the sci

Part Number: TMS320F28379D

Hi,

Related to my previous question about transmitting the result of the adc to a hyperterminal via SCI which I managed to transmit the result correctly. Now I want to save the AdcResult to text file to be used later for further processing.  what I added so far to my amended "adc_soc_epwm_cpu01.c" example are: 

1- I defined a file Globally as (FILE *myFile).

2- In the Adca1_isr below I created a condition to open and close the file.

3- I tried to save a simple counter to the file using the fprintf function which resulted in that the alocated RAM for .text is not enough. SO I tried to change the .text ram alocation as following: 

//.text : >>RAMM0 | RAMD0| RAMLS0, PAGE = 0                                              // I chaged it to this previously so that sprintf to work and it worked correctly.
 .text : >>RAMGS12 | RAMGS13| RAMGS14| RAMGS15, PAGE = 1                // I chaged the above line to this line so that the fprintf works.

but when I did this change, the error which showed below is no more exist. HOWEVER, when I debug and run the project, the adcaResults buffer didn't receive and conversion results. 

"C:/ti/controlSUITE/device_support/F2837xD/v210/F2837xD_common/cmd/2837xD_RAM_lnk_cpu1.cmd", line 54: error #10099-D: program will not fit into available memory. placement with
alignment/blocking fails for section ".text" size 0x2b3f page 0. Available memory ranges:
RAMM0 size: 0x2de unused: 0x1 max hole: 0x1
RAMD0 size: 0x800 unused: 0x0 max hole: 0x0
RAMLS0 size: 0x2000 unused: 0x1 max hole: 0x1 
error #10010: errors encountered during linking; "adc_soc_epwm_cpu01.out" not built. 

See my RAM file at the end of the post.

----------------------------------------------------------------------------------------------------------------------------------------------------


//
// adca1_isr - Read ADC Buffer in ISR
//
interrupt void adca1_isr(void)
{

AdcaResults[resultsIndex++] =AdcaResultRegs.ADCRESULT0;
 
if(RESULTS_BUFFER_SIZE == resultsIndex)
{
for (z=0;z<RESULTS_BUFFER_SIZE;z++)
{
Vin = AdcaResults[z];
send_result(Vin);
}
}
int counter = 0;
if (counter < 9){
myFile = fopen("AdcaResults.txt","w");
fprintf(myFile,"%d\n",counter);
//printf(filePtr,"%d,",AdcaResults);
counter++;
}
else if(counter == 9){
fclose(myFile);
}


if(RESULTS_BUFFER_SIZE <= resultsIndex)
{
resultsIndex = 0;
bufferFull = 1;
}

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

-------------------------------------------------------------------------------------------------------------------------------------------------------


MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to SARAM" bootloader mode */

BEGIN : origin = 0x000000, length = 0x000002
RAMM0 : origin = 0x000122, length = 0x0002DE // length was = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x002000 // this was 0x000800
// RAMLS1 : origin = 0x008800, length = 0x000800 // was 0x000800
// RAMLS2 : origin = 0x009000, length = 0x000800 // was 0x000800
// RAMLS3 : origin = 0x009800, length = 0x000800 // was 0x000800
// RAMLS4 : origin = 0x00A000, length = 0x000800 // was 0x000800
RESET : origin = 0x3FFFC0, length = 0x000002

PAGE 1 :

BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800

RAMLS5 : origin = 0x00A800, length = 0x000800

RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS13 : origin = 0x019000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS15 : origin = 0x01B000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */

CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400

CANA_MSG_RAM : origin = 0x049000, length = 0x000800
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
}


SECTIONS
{
codestart : > BEGIN, PAGE = 0
// .text : >>RAMM0 | RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0
//.text : >>RAMM0 | RAMD0| RAMLS0, PAGE = 0                                    // I chaged the above line to this line
.text : >>RAMGS12 | RAMGS13| RAMGS14| RAMGS15, PAGE = 1     // I chaged the above line to this line so that fprintf works

.cinit : > RAMM0, PAGE = 0
.pinit : > RAMM0, PAGE = 0
.switch : > RAMM0, PAGE = 0
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */

.cio : > RAMGS15, PAGE = 1 // I added this Line, was not here
.stack : > RAMM1, PAGE = 1
.ebss : > RAMGS13, PAGE = 1 // was RAMLS5 I changed to open text file
.econst : > RAMGS14, PAGE = 1 // was RAMLS5
.esysmem : > RAMLS5, PAGE = 1
Filter_RegsFile : > RAMGS0, PAGE = 1

ramgs0 : > RAMGS0, PAGE = 1
ramgs1 : > RAMGS1, PAGE = 1

#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
.TI.ramfunc : {} > RAMM0, PAGE = 0
#else
ramfuncs : > RAMM0 PAGE = 0 
#endif
#endif

/* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU1TOCPU2RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

GROUP : > CPU2TOCPU1RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
}

/* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

kind Regards

Hayder 

  • Hi Hayder,

    .text is for program instructions.  These should go in page 0.

    Page 1 is for data/variables. 

    You can map the GSRAM or other rams to either page, but you need to make sure that everything is consistent (text goes into page 0 RAMS and those rams are defined as page 0).  

    Did a reply answer your question? If yes, please click the "Resolved" button located at the bottom of that post.
    Visit these helpful C2000 Links!

    C2000 TI Wiki Pages
    TI Forum Sitemap

    ControlSUITE
    C2000 Getting Started

    CLA FAQs
    Workshop Material!

  • In reply to Devin Cottier:

    Hi Devin,

    Thanks for your reply and explanation. I moved the RAMSG12 from page 1 to page 0, and I added it to the .text alocation as following:

      .text            : >>RAMM0 | RAMD0|  RAMLS0| RAMGS12,   PAGE = 0

    this removed the error when building the project.

    I did some changes to the condition in the adca1_isr I mentioned earlier to save the adcaResult to a text file as in the attached picture:

    When I debug and run the project, the created text file start to store the the adcaResults, HOWEVER, Not all the adcaResults buffer array  is stored in the text file.  the text file only received 45 integer as following:

    3078,  3093,  3100,  18,  1,  25,  3098,  3088,  3092,  0,  6,  12,  3084,  3070,  3091,  14,  0,  0,  3086,  3074,  3086,  2,  3,  19,  3092,  3099,  3103,  23,  16,  22,  3085,  3044,  3094,  0,  3,  7,  3088,  3098,  3085,  8,  19,  20,  3107,  3081,  3

    I appreciate your reply

    Regards

    Hayder

  • In reply to Hayder Jahanger:

    Hi Hayder,

    What do the results look like in memory? I'd probably recommend you just store the ADC results in an array in RAM and make sure that looks correct. Then you can add code to scan them out either after the results are complete or at the same time. Either way you'll have the values in RAM to compare to while debugging so you know if the issue is the program flow or the scan-out process.

    Did a reply answer your question? If yes, please click the "Resolved" button located at the bottom of that post.
    Visit these helpful C2000 Links!

    C2000 TI Wiki Pages
    TI Forum Sitemap

    ControlSUITE
    C2000 Getting Started

    CLA FAQs
    Workshop Material!

  • In reply to Devin Cottier:

    Hi devin,

    The below picture shows the Adc results in the memory:


    The results in the memory look fine to me and the plotting shows that as well. while below is  the array which have been stored to the text file: 

    226,  3329,  3324,  3329,  243,  246,  250,  3321,  3312,  3303,  236,  238,  222,  3319,  3317,  3320,  237,  256,  259,  3316,  3316,  3350,  243,  255,  237,  3312,  3312,  3277,  245,  245,  232,  3319,  3316,  3277,  242,  237,  197,  3307,  3312,  32

    Any advice to sort this out. 

    kind regards 

    Hayder 

  • In reply to Hayder Jahanger:

    Hi Devin,

    I'm still waiting your reply to this.

    Regards

    Hayder

  • In reply to Hayder Jahanger:

    Hi Hayder,

    I'm not able to follow your algorithm for determining which results to print. It seems overly complicated. It seems like this is likely the problem vs. any issues with the device or SCI module.

    Did a reply answer your question? If yes, please click the "Resolved" button located at the bottom of that post.
    Visit these helpful C2000 Links!

    C2000 TI Wiki Pages
    TI Forum Sitemap

    ControlSUITE
    C2000 Getting Started

    CLA FAQs
    Workshop Material!

  • In reply to Devin Cottier:

    Hi Devin, 

    Please can you have a look at the full algorithm in the attached text file to point out if there is any problem. It's the adc_soc_epwm_cpu01.c example with some addition like the sci, I donn't know why saving the adc results to text file is limited even though I increased the RAM space for .text many times.Adc_epwm_sci.txt

    Moreover, how can I check if there is a problem with the device or the sci module.
    Kind regards 

    Hayder

  • In reply to Hayder Jahanger:

    Hi Hayder,

    One thing you may want to try is moving the save-to-file loop outside of the ADC ISR into the background loop. You usually don't want such a long-running chunk of code in an ISR.

    Did a reply answer your question? If yes, please click the "Resolved" button located at the bottom of that post.
    Visit these helpful C2000 Links!

    C2000 TI Wiki Pages
    TI Forum Sitemap

    ControlSUITE
    C2000 Getting Started

    CLA FAQs
    Workshop Material!

  • In reply to Devin Cottier:

    Hi Devin,

    I move save-to-file loop to the program main loop and then I moved it to the function that sending the adc array to the hyperterminal (void send_result(Uint16 res)) at the end end of the text file in my previous reply.
    In both cases, it didn't save any the to the file. then I simplified the code to just, open the file and write to it, also nothing is written to the file.

    One thing I'm not quite sure about it, what do you mean by the "background loop"?

    Regards
  • In reply to Hayder Jahanger:

    Hi Hayder,

    The background loop is what is running in main() that will be interrupted by the ADC ISR. There is where you want to do less time-critical tasks like iterating through a list of values to scan-out.

    Did a reply answer your question? If yes, please click the "Resolved" button located at the bottom of that post.
    Visit these helpful C2000 Links!

    C2000 TI Wiki Pages
    TI Forum Sitemap

    ControlSUITE
    C2000 Getting Started

    CLA FAQs
    Workshop Material!

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.