Attached is updated project for PSoC5. The only difference is single line of code, where original code for P4 is wrong (uint->int):
//uint16_t result = offset + (uint16_t)(amplitude * sine); // incorrect calculation
uint16_t result = offset + (int16_t) (amplitude * sine); // OK
So, apparently, PWM duty cycle was never set below 50%.
The way PWM works, the Compare value is updated on PWM rollover, and writing Compare has no immediate effect. So ISR timing is not important - the update happens on hardware timing.
P.S. Sorry for delay, I was busy last week and now developers community is down.