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

Intellectual 440 points

Replies: 12

Views: 1265

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 

  • In reply to Devin Cottier:

    Hi devin, 

    I kept the Save-to-text loop in the adc_isr but I changed the allocated in the RAM for the .text as following: 

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

    BEGIN : origin = 0x000000, length = 0x000002
    RAMM0 : origin = 0x000122, length = 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


    RAMGS10 : origin = 0x016000, length = 0x001000    // I moved  this here from page 1 in order to fprintf the adc result to a text file 
    RAMGS11 : origin = 0x017000, length = 0x001000    // // I added this here 
    RAMGS12 : origin = 0x018000, length = 0x003000    // I moved this from page 1 so that 
    RESET : origin = 0x3FFFC0, length = 0x000002

    and then in RAM section i edited the .text  to:

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

    After these changes in the RAM, I've been able to store up to 1024 adc result to the opened text file. 

    I have question as I don't understand how it's work because the length of the RAMGS12 originally was 0x001000 and I was not able to store adc array of 64, but when I accidentally chaged it to 0x003000 as above, I've been able to save an array of 1024 of adc results. Moreover, is it correct to put it as 0x003000 as the other RAMSG are all 0x001000. 

    Kind Regards 

    Hayder  

  • In reply to Hayder Jahanger:

    Hi Hayder,

    The physical RAM is only 0x1000 but you can combine contiguous RAMs of the same type by increasing the length.

    Just make sure you comment out the other RAMs that also occupy that space...otherwise you can assign multiple variables to the same memory location. This is not something you want to have to debug.

    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.