Prefiero contestarte por las news porque creo que es algo que tamos dandole caña por aqui y no creo que a nadie le moleste. Añado tu comentario sobre el error que describes ( pero que no te moleste ;) )
"Pues toda la decodificación se hace en la rutina que atiende la interrupción.Dentro de la rutina de interrupción, puse unas instrucciones para grabar el nº de teléfono en la EEPROM. Como el circuito aparentemente no hacía nada al recibir la llamada y en la EEPROM solo se grababa datos sin sentido y ocupando todas las direcciones, le añadí las otras instrucciones, que hacen que se alternen dos LED y si funciona, pero cuando se recibe una llamada, dejan de parpadear y se queda uno encendido fijo."
Le echado un vistazo bastante detenido a la interrupcion y al error que comentas ( no tengo el mplab ahora mismo y no he podido compilarlo pero te creo ), tienes muchas probabilidades de que el compilador la joda hay con el elseif, y a lo mejor algun despiste que es mucho codigo. Tambien, he apreciado lo que dices que parece que se queda bloqueado, y la corrupcion de la eeprom, eso me suena a recursividad como bien señalas, pero es mas, es como cuando avanzas en una cadena de C fuera de los caracteres reservados que empieza a salir basura, pues esto debe ir navegando por alguna de las variables y grabandola.
Mi consejo, elimina todas las rutinas de grabacion de la eeprom ya.., mete el max232 y al puerto serie y dale a que te escupa datos en el hyperterminal, cuando llames, si el led se queda bloqueado y no haces mas que recibir datos al hyperterminal algo huele mal.
P.D: Otra cosa que he pensado pero que no tengo comprobada, a ver si alguien la confirma, si intentas escribir en una zona de la memoria de los pic que no existe, exactamente que ocurre? se peta el pic? se reinicia? que hace?...
P.D2: Si estas algo agil con C en 2 horas tienes eso echo en el PCW, no tiene mucha complicacion, aparte en PCW tienes el case ;).
Tu recuerda, la UART es nuestra amigaaaa..