Nur ein paar Dinge, die mir aufgefallen sind.

phaseAngleTiming[257] ist 257 lang.
Dein next_trigger ist unsigned char ( 0..255 )
also erreichst du nie die letzen werte des arrays.


Im Interrupt0 wird next_trigger = 1;
also erreichst Du nie phaseAngleTiming[0]



if(!btn1){
btn1_time = btn1_time + (t_msec - old_msec);

heist das - wenn Button 1 nicht gedrückt ist ?
Wolltest Du da nicht auf gedrückt abfragen ( if(btn1){ )



if (ch1_level >=255){
ch1_level = 0;

schadet nicht - ist aber auch nicht sinvoll.
ch1_level wird nie groesser als 255 - ist ja unsigned char.
Wenn nach 255 eine 1 addiert wird, geht er sowieso auf 0


Gruss
Frank