porque no pruebas primero la rutina sin sleep a ver si anda y hace lo que tu quieres que haga, y luego una vez que el resto del codigo funciona como deseas, agregas el sleep y vas viendo.
Segundo, veo que tienes un sleep dentro de la interrupcion. Asi el micro nunca sale de la interrupcion una vez que entra. Nunca ejecuta el RETURN.
si eres nuevo en la programacion, empieza con el minimo de codigo inicial y a medida que va funcionado vas modificando y agregando.
¿tantas cosas haces adentro de un método de interrupción? ¿Por que no implementas primero un led parpadeante y el sleep pero con maquinas de estado? Pasa que se ve medio "spaguetti" tu código. Yo no soy especialista, pero he leido bastante de gente dedicada y siempre comentan lo mismo... JAMAS hacer tantas cosas en la rutina de interrupción, de hecho esa rutina debiera quedar solo para cambiar estados o hacer no mas de 4 lineas de codigo. El sistema no debiera estar tanto tiempo metido en una interrupción.