Other Parts Discussed in Thread: C2000WARE
Tool/software:
Can someone help me figure out an issue with interrupts? According to the task, the interrupt is supposed to trigger only once. I don't think I missed anything, but it's not working.
in hal.c
void HAL_enablePwmTzInt(HAL_Handle handle, const PWM_Number_e pwmNumber) { HAL_Obj *obj = (HAL_Obj *)handle; // Enable Trip Zone interrupt PWM_enableTripZoneInt(obj->pwmHandle[pwmNumber], PWM_TripZoneFlag_CBC | PWM_TripZoneFlag_OST); PIE_enablePwmTzInt(obj->pieHandle, pwmNumber); // CPU_enableInt(obj->cpuHandle, CPU_IntNumber_2); return; }
in hal.h
extern __interrupt void TripZoneISR(void); static inline void HAL_initIntVectorTable(HAL_Handle handle) { HAL_Obj *obj = (HAL_Obj *)handle; PIE_Obj *pie = (PIE_Obj *)obj->pieHandle; ..... pie->EPWM1_TZINT = &TripZoneISR; // Interrupt for EPWM1 Trip Zone pie->EPWM2_TZINT = &TripZoneISR; // Interrupt for EPWM2 Trip Zone pie->EPWM3_TZINT = &TripZoneISR; // Interrupt for EPWM3 Trip Zone .... static inline void HAL_enablePwm(HAL_Handle handle) { HAL_Obj *obj = (HAL_Obj *)handle; PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_1]); PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_2]); PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_3]); // #ifndef TZ_DISABLE PWM_clearTripZone(obj->pwmHandle[PWM_Number_1], PWM_TripZoneFlag_Global); PWM_clearTripZone(obj->pwmHandle[PWM_Number_2], PWM_TripZoneFlag_Global); PWM_clearTripZone(obj->pwmHandle[PWM_Number_3], PWM_TripZoneFlag_Global); PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_1); PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_2); PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_3); //6 // #endif return; } // end of HAL_enablePwm() function
in main
HAL_enablePwmTzInt(halHandle, PWM_Number_1); HAL_enablePwmTzInt(halHandle, PWM_Number_2); HAL_enablePwmTzInt(halHandle, PWM_Number_3); CPU_enableInt(halHandle->cpuHandle, CPU_IntNumber_2); // Added to enable global CPU interrupt for Trip Zone
__interrupt void TripZoneISR(void) { // Get a pointer to the global HAL structure HAL_Obj *obj = (HAL_Obj *)halHandle; // Iterate through all PWM channels (EPWM1, EPWM2, EPWM3) for (int cnt = 0; cnt < 3; cnt++) { PWM_Obj *pwm = (PWM_Obj *)obj->pwmHandle[cnt]; // Clear INT, CBC and OST flags directly. pwm->TZCLR |= (PWM_TripZoneFlag_Global | PWM_TripZoneFlag_CBC | PWM_TripZoneFlag_OST); // Increment fault counters for logging or diagnostics TzCnt[cnt].CBC++; TzCnt[cnt].OST++; // Optionally, set a global fault flag or perform further actions gMotorVars.Flag_nFault = true; } // Clear PIE interrupt flag PIE_clearInt(obj->pieHandle, PIE_GroupNumber_2); // End ISR return; }
Thanks for your help.
Andrew.