Вообще честно говоря интересовал кусочек проги, сразу после BEGIN, где у вас идет настройка INTCON и ожидание прерывания

Судя по этому куску обработки прерывания, в нем вроде бы все ок на первый взгляд, правда есть одно но...
Я не совсем понял от чего вы прерывания ловите, хотя по строкам
BSF INTCON,5
....................
BCF INTCON,5
рискну предположить что от TMR0. Флаг прерывания от TMR0 не сбрасывается аппаратно, а вот в подпрограмме я нигде не нашел строки которая бы программно сбрасывала флаг прерывания T0IF, нечто вроде
BCF INTCON,T0IF.
PS: еще одно но, что нашел в доках...прерывания от TMR0 не генерятся в SLEEP режиме.