Aunque de las cosas que te digo hay excepciones, es bueno que sigas estos lineamientos.
Interrupcion:
- En la interrupcion jamas debes tener un loop infinito, es decir que no pueda salir
- La funcion de interrupcion debe salir lo mas rapido posible, asi que nada de delays o funciones que ocupen demasiado tiempo del micro
- Si queres usar algo para salir de tu programa principal usas una variable, la cual cambias en tu interrupcion ( a 1 por ejemplo), y luego en tu programa principal la pones a 0 nuevamente.
- La funcion de interrupcion es que deje el programa principal y vuelva donde dejo.
Programa principal:
- Para comenzar con la programacion, intenta limitarte a 1 solo loop infinito, un solo while(1) o do..while(1), o for(;

el que mas te guste, pero solo 1. Al menos por ahora
No tuve tiempo para ver el programa, apenas puedo veo si hay una forma mas simple de hacerlo.