Si haces un goto dentro de una subrutina para pasar a otra subrutina se te reseteará.
vszener, tal vez no te he entendido lo que has querido decir, pero no coincido contigo en que usar un goto para pasar de una subrutina a otra hará resetear el PIC.
Si el goto está bien hecho, no veo razón por la cual deba ocurrir esto. De hecho el goto es la forma de no necesitar la pila para hacer 'saltos' de programa.
guanacho2002, creo que tienes un problema en tu código. El código te está saltando a un lugar que no esperas que te salte y ahí 'algo' haces.
Está bien lo que dices que un return si no hay un dato en la pila, hará "como si fuera un reset" en el pic. Yo mismo he dicho eso hace un par de posts (aunque tal vez lo leíste del post de otro usuario) y la razón es que al no tener datos en el stack de 'calls' el pic hace un rellenado del program counter con ceros 0x0000.
Si el problema se soluciona modificando tu código, entonces el problema es casi con seguridad de firmware (aclaro esto porque a veces el hardware puede hacer resetear a tu pic. Ej poner tensiones negativas en un pin A/D).
Si quieres podemos 'echarle' una mirada a tu código. Otra cosa que puedes hacer es correr tu firmware con el 'trace' habilitado en el simulador MPSIM que viene con el MPLAB IDE.
Pones que haga un 'breakpoint' cuando hace un reset, eso lo defines en el apartado Settings del Menú Debugger. El trace lo que hace es guardarte las últimas 8000 (si mal no recuerdo) líneas de código y de esa forma puedes ver en las líneas próximas anteriores al reset qué ha ocurrido.
Tal vez no estes haciendo un reset sino que tu pic esté yendo a una dirección que esté mal configurada o cerca del final del programa y que siga ejecutando instrucciones hasta que el Program Counter rebase y se haga 0x0000.
Saludos