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.

While loop executing only once in RM48

Other Parts Discussed in Thread: HALCOGEN

I have generated floating point PWM outputs using HET and while not using the delay the  PWM output is fine and if I use for loop delay in the main function the while loop is getting executed only once (or the PWM output is generated once -  I want to output with ON/OFF time delay of 3 seconds ON time and 1 second OFF time continuously). please help me short out the problem.

2502.sys_main.c

Program:

/* USER CODE BEGIN (0) */
/* USER CODE END */
/* USER CODE BEGIN (4) */
/* USER CODE END */
#include "sys_common.h"

/* USER CODE BEGIN (1) */
#include "het.h"

/* USER CODE BEGIN (2) */
static const uint32 s_het1pwmPolarity[8U] = { 3U, 3U, 3U, 3U, 3U, 3U, 3U, 3U, };

hetSIGNAL_t setup_pwm;

void pwmSetDuty_full(hetRAMBASE_t * hetRAM, uint32 pwm, uint32 fuse_pwmDuty,
uint32 pwmdutty);

void wait(uint32 time);
//int j=0;
void main(void)
{
/* USER CODE BEGIN (3) */
hetInit();
while(1)
{
int i;

setup_pwm.period=(float64)1e6/1000; //5khz
float DuttyC=45.7/100;
uint32 Dutcycle=setup_pwm.period*DuttyC;
uint32 Porcentdutty=DuttyC*100;
pwmSetSignal(hetRAM1,pwm0,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm0,Porcentdutty,Dutcycle);

setup_pwm.period=(float64)1e6/1000;
float DuttyC1=45.8/100;
uint32 Dutcycle1=setup_pwm.period*DuttyC1;
uint32 Porcentdutty1=DuttyC1*100;
pwmSetSignal(hetRAM1,pwm1,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm1,Porcentdutty1,Dutcycle1);

setup_pwm.period=(float64)1e6/1000;
float DuttyC2=45.9/100;
uint32 Dutcycle2=setup_pwm.period*DuttyC2;
uint32 Porcentdutty2=DuttyC2*100;
pwmSetSignal(hetRAM1,pwm2,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm2,Porcentdutty2,Dutcycle2);

setup_pwm.period=(float64)1e6/1000;
float DuttyC3=46.0/100;
uint32 Dutcycle3=setup_pwm.period*DuttyC3;
uint32 Porcentdutty3=DuttyC*100;
pwmSetSignal(hetRAM1,pwm3,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm3,Porcentdutty3,Dutcycle3);

setup_pwm.period=(float64)1e6/1000;
float DuttyC4=46.1/100;
uint32 Dutcycle4=setup_pwm.period*DuttyC4;
uint32 Porcentdutty4=DuttyC4*100;
pwmSetSignal(hetRAM1,pwm4,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm4,Porcentdutty4,Dutcycle4);

setup_pwm.period=(float64)1e6/1000;
float DuttyC5=46.2/100;
uint32 Dutcycle5=setup_pwm.period*DuttyC5;
uint32 Porcentdutty5=DuttyC5*100;
pwmSetSignal(hetRAM1,pwm5,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm5,Porcentdutty5,Dutcycle5);

setup_pwm.period=(float64)1e6/1000;
float DuttyC6=46.3/100;
uint32 Dutcycle6=setup_pwm.period*DuttyC6;
uint32 Porcentdutty6=DuttyC6*100;
pwmSetSignal(hetRAM1,pwm6,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm6,Porcentdutty6,Dutcycle6);

setup_pwm.period=(float64)1e6/1000;
float DuttyC7=99.1/100;
uint32 Dutcycle7=setup_pwm.period*DuttyC7;
uint32 Porcentdutty7=DuttyC7*100;
pwmSetSignal(hetRAM1,pwm7,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm7,Porcentdutty7,Dutcycle7);

for(i=0;i<11000000;i++);
for(i=0;i<11000000;i++);
for(i=0;i<11000000;i++);

/*
pwmStop(hetRAM1, pwm0);
pwmStop(hetRAM1, pwm1);
pwmStop(hetRAM1, pwm2);
pwmStop(hetRAM1, pwm3);
pwmStop(hetRAM1, pwm4);
pwmStop(hetRAM1, pwm5);
pwmStop(hetRAM1, pwm6);

setup_pwm.period=(float64)1e6/1000;
DuttyC7=99.1/100;
Dutcycle7=setup_pwm.period*DuttyC7;
Porcentdutty7=DuttyC7*100;
pwmSetSignal(hetRAM1,pwm7,setup_pwm);
pwmSetDuty_full(hetRAM1,pwm7,Porcentdutty7,Dutcycle7);
for(i=0;i<33000000;i++);
*/
pwmStop(hetRAM1, pwm0);
pwmStop(hetRAM1, pwm1);
pwmStop(hetRAM1, pwm2);
pwmStop(hetRAM1, pwm3);
pwmStop(hetRAM1, pwm4);
pwmStop(hetRAM1, pwm5);
pwmStop(hetRAM1, pwm6);
pwmStop(hetRAM1, pwm7);


for(i=0;i<11000000;i++);
}
}

/* USER CODE BEGIN (4) */

void wait(uint32 time)
{
while(time){time--;};
}

void pwmSetDuty_full(hetRAMBASE_t * hetRAM, uint32 pwm, uint32 fuse_pwmDuty,
uint32 pwmdutty) {
uint32 action;
uint32 pwmPolarity = 0U;
uint32 var;

if (hetRAM == hetRAM1) {
pwmPolarity = s_het1pwmPolarity[pwm];
}

if (fuse_pwmDuty == 0U) {
action = (pwmPolarity == 3U) ? 0U : 2U;
} else if (fuse_pwmDuty >= 100U) {
action = (pwmPolarity == 3U) ? 2U : 0U;
} else {
action = pwmPolarity;
}
//var = (uint32) pwmdutty * 1.2613; //((pwmPeriod * pwmDuty) / 100U)
var = (uint32) pwmdutty * 0.86;
hetRAM->Instruction[(pwm << 1U) + 41U].Control = ((hetRAM->Instruction[(pwm
<< 1U) + 41U].Control) & (~(uint32) (0x00000018U)))
| (action << 3U);
hetRAM->Instruction[(pwm << 1U) + 41U].Data = (var << 7U) + 128U;

}

  • If I understand your question, you want to run PWMs for 3 seconds, turn them off for 1 second, and then repeat? Make sure you are not using optimization. The way your wrote your software time delay loops will be removed by the optimizer. Using the RTI to generate 1 second interrupts is a better solution than software loops.
  • Thank you, Mr.Bod Crosby. 

    I am not familiar with interrupt concepts. How to do that. Please support. Thanks in advance.

  • Hello

    but the below code is working for me (the difference is the previous program is to generate floating point that is not working) and is it possible to disable optimizer kind of thing.

    #include "het.h"
    #include "sys_common.h"

    hetSIGNAL_t Set_Duty_Period2;
    void wait(uint32 time);

    void main(void)
    {
    hetInit();
    while(1)
    {
    int i;
    Set_Duty_Period2.duty = 46;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm0, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm0);

    Set_Duty_Period2.duty = 47;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm1, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm1);

    Set_Duty_Period2.duty = 48;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm2, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm2);

    Set_Duty_Period2.duty = 49;
    Set_Duty_Period2.period = 1000;

    pwmSetSignal(hetRAM1, pwm3, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm3);

    Set_Duty_Period2.duty = 50;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm4, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm4);

    Set_Duty_Period2.duty = 51;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm5, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm5);

    Set_Duty_Period2.duty = 52;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm6, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm6);

    Set_Duty_Period2.duty = 99;
    Set_Duty_Period2.period = 1000;
    pwmSetSignal(hetRAM1, pwm7, Set_Duty_Period2);
    pwmStart(hetRAM1, pwm7);

    for(i=0;i<11000000;i++);

    pwmStop(hetRAM1, pwm0);
    pwmStop(hetRAM1, pwm1);
    pwmStop(hetRAM1, pwm2);
    pwmStop(hetRAM1, pwm3);
    pwmStop(hetRAM1, pwm4);
    pwmStop(hetRAM1, pwm5);
    pwmStop(hetRAM1, pwm6);
    pwmStart(hetRAM1, pwm7);

    for(i=0;i<33000000;i++);


    pwmStop(hetRAM1, pwm0);
    pwmStop(hetRAM1, pwm1);
    pwmStop(hetRAM1, pwm2);
    pwmStop(hetRAM1, pwm3);
    pwmStop(hetRAM1, pwm4);
    pwmStop(hetRAM1, pwm5);
    pwmStop(hetRAM1, pwm6);
    pwmStop(hetRAM1, pwm7);

    for(i=0;i<55000000;i++);
    }
    }
    void wait(uint32 time)
    {
    while(time){time--;};
    }
  • To check if you have optimization on, right click on your project in CCS and select "Show Build Settings".  Then in the new window, expand "CCS Build", "ARM Compiler" and select "Optimization". For optimization level, select off. See the picture below:

  • For an example on how to use the RTI and interrupts, in HALCoGen select "Help", "Help Topics". Then in the new window select the "example_rtiBlinky.c" example.

  • Thank you Mr.Bob Crosby ,

    I will try it out and if I face any struggle i will come back to you

  • Hi, Mr.Crosby

    I have checked the optimizer option in build setting and still the loop executes only once. attached the build settings configuration.

  • Hi, Mr.Crosby.

    after execution of the main function  once. the exit.c popups in the CCS edit window. attached the obtained results. How to make it to continuously run in while loop.