En el caso de un semaforo, que lo que vas a tener es la "maquina de estados" y luego activar una salida, podes hacerlo todo en la interrupcion ya que no es algo que sea excesivamente consumidor de tiempo, ( en el que pueda desbordarse el TMR0 de nuevo) y tampoco tenes otra interrupcion que te pueda afectar.
Me explico un poco mas, si lo que va a tener que hacer luego de que se cumpla el tiempo tarda demasiado en realizarse, va directo al while del main. ejemplos son los sprintf por ejemplo, a pesar de que son intrucciones suelen tardar demasiado, o por ejemplo una operacion matematica de divisiones y multiplicaciones, o con flotantes. Son operaciones que tardan demasiado, asi que eso mejor pasarlo al while del main y realizarlos alli con banderas. En tu caso que es preguntar por un contador + activar una salida segun el estado que estuvo antes, lo podes hacer enteramente en la interrupcion.