Este WDT es la respuesta a tu problema:
#fuses HS,PROTECT,PUT,WDT,NOBROWNOUT,NOLVP,NOCPD,WRT,MCLR
Como comentaba al principio, una de las posibilidades era que el watchdog te estuviera reseteando el micro.
Si el fuse WDT está activado, el watchdog está activo. Su misión es sacar al micro de un posible bucle infinito reseteándolo si no le "das de comer".
Por tanto, tienes dos opciones:
1.- Darle de comer: pones en medio de tu bucle principal el comando restart_wdt(). Yo lo pondría detrás del while (TRUE), como primer comando del bucle.
2.- Evitar que esté activo, cambiando ese fuse por NOWDT. Obviamente con esto perderás la posibilidad del reset si el micro se cuelga, por lo que la opción recomendable es la primera.