Was machen die Funktionen
void LED2DIMIN(void);
void LED1DIMIN(void);
void LED2DIMOUT(void);
void LED1DIMOUT(void);
void LED3DIMIN(void);
void LED3DIMOUT(void);
?

Diese müsste man von einem Interrupt/Timer aus steuern, dann kann man jederzeit unterbrechen.

So habe ich es gemacht:
In einem Timer wird die PWM gesteuert. (eine Variable wird erhöht, ist der gewählte PWM-Wert über der Variable bleibt die LED an, ansonsten geht sie aus)

Die PWM-Werte an sich werden von einem 2. Timer aus langsam verändert. Dadurch kommt die Farbänderung zustande.

Nun kann man die weiß-Abfrage in beiden Timern realisieren, im Timer1 wäre es sicherlich sinnvoller.