So I was right suspecting that you are clearing timer flags incorrectly.
TFLG1 |= 0x01; //Clear flag
^^ here you are clearing all TFLG1 flags, including channel 0 and 3 flags
TFLG1 |= 0x08; //Clear flag
Same ^^ here. You are clearing all TFLG1 flags, including channel 0 and 3 flags
Search forum for flag clearing like stuf and you will find it desribed many times. Reading TFLG1, ORing read bit pattern with mask of flag you are interested in, then writing resulting bitpattern back to TFLG1, you are writing "1" not just to flag you are interested in, but you write more "1"-es and clearing not just flag you are interested in. Correct code to clear channel 3 flag is either
TFLG1 = (1<<3);
or
TFLG1 &= (1<<3); // please note that there's no ~ operator in front of bitpattern on the right