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.

TMS320F280049C: Trip Zone Interrupt CLA Tasks

Part Number: TMS320F280049C

Hi,

I want to use the CLA, when the trip zone interrupt occurs. Trip zone occurs cycle by cycle. I use CLA_forceTasks inside the tripzone interrupt ISR. But CLA is not working. Variables in CLA is not changing. 

The following code is variables that are transferred between CPU and CLA.

#pragma DATA_SECTION(iL1_sensed_real_poz,"CpuToCla1MsgRAM");
volatile float32_t iL1_sensed_real_poz;
#pragma DATA_SECTION(iL1_sensed_real_neg,"CpuToCla1MsgRAM");
volatile float32_t iL1_sensed_real_neg;
#pragma DATA_SECTION(TTPLPFC_ac_vol_sensed_Volts,"CpuToCla1MsgRAM");
volatile float32_t TTPLPFC_ac_vol_sensed_Volts;
#pragma DATA_SECTION(TTPLPFC_vBus_sensed_Volts,"CpuToCla1MsgRAM");
volatile float32_t TTPLPFC_vBus_sensed_Volts;
#pragma DATA_SECTION(TripZoneCNTR1,"CpuToCla1MsgRAM");
volatile float32_t TripZoneCNTR1;
#pragma DATA_SECTION(grid_direction,"CpuToCla1MsgRAM");
volatile int16_t grid_direction;

#pragma DATA_SECTION(iL1_ort,"Cla1ToCpuMsgRAM");
volatile float32_t iL1_ort;

The following code is CLA configuration.

void setupCLA(void)
{

memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,(uint32_t)&Cla1ProgLoadSize);
memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,(uint32_t)&Cla1ConstLoadSize );


MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1));
while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU));

MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS2, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS3, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS6, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS7, MEMCFG_LSRAMMASTER_CPU_ONLY);

MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS2, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS3, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS6, MEMCFG_CLA_MEM_DATA);
MemCfg_setCLAMemType(MEMCFG_SECT_LS7, MEMCFG_CLA_MEM_DATA);


#pragma diag_suppress=770

CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_1, (uint16_t)&Cla1Task1);

CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_SOFTWARE);

#pragma diag_warning=770

CLA_enableIACK(CLA1_BASE);
CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1 | CLA_TASKFLAG_2 );


Interrupt_register(INT_myCLA01, &cla1Isr1);
Interrupt_enable(INT_myCLA01);


}

The following code is trip zone interrupt setup

void setupInterrupt(void)
{


Interrupt_register(INT_myEPWM2_TZ, &INT_myEPWM2_TZ_ISR);

EPWM_enableTripZoneInterrupt(EPWM2_BASE, EPWM_TZ_INTERRUPT_DCBEVT2);
Interrupt_enable(INT_myEPWM2_TZ);

setupCLA();

EALLOW;

//
//Enable Global interrupt INTM
//
EINT;

//
//Enable Global realtime interrupt DBGM
//
ERTM;
EDIS;
}

interrupt void cla1Isr1(void)
{
//
// Acknowledge the end-of-task interrupt for task 1
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP11);

//
// Uncomment to halt debugger and stop here
//
// asm(" ESTOP0");
}

In the following code, iL1_ort is calculated in CLA. But, it is not working.

interrupt void INT_myEPWM2_TZ_ISR(void)
{

TripZoneCNTR1 = (EPWM_getTimeBaseCounterValue(TTPLPFC_HIGH_FREQ_PWM1_BASE) + 1) * CPU_SYS_CLOCK_PERIOD;

duty_ref = TripZoneCNTR1;

CLA_forceTasks(CLA1_BASE,CLA_TASKFLAG_1);

iL1_avg = iL1_ort;

Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
}

  • Hello,

    To make sure I understand correctly, are you trying to:

    1. Have the EPWM trip zone interrupt fire on the CPU.
    2. In the EPWM trip zone interrupt ISR, manually software trigger task 1 on the CLA.
    3. Compute iL1_ort in CLA task 1.
    4. Trigger the end of task 1 interrupt on the CPU once CLA task 1 is complete.

    Your CLA task 1 code definition is in the .cla file correct? Can you share this code as well (as a file rather than text)?

    Can you add breakpoints to your EPWM trip zone interrupt, the CLA task 1 (using __mdebugstop()), and the end of task 1 CPU interrupt to see which of them are being hit in the debugger?

    Let me know if you need any guidance with using the debugger for this purpose.

    Best Regards,

    Delaney

  • Hi,

    My problem is solved. When I clear the trip zone cbc flags, it works.

    Thanks,