Realmente no habia entendido lo que habias puesto, pero todo se puede :3.
7.3 Timer1 Operation in Asynchronous Counter Mode
The timer will
continue to run during SLEEP and can
generate an interrupt on overflow which will wake-up the processor. However,
special precautions in software are needed to read/write the timer (Section 7.3.2).
For writes, it is recommended that the user
simply stop the timer and write the desired values.
Reading the 16-bit value
requires some care.
Example 7-1 is an example routine to read the 16-bit timer value.
This is useful if the timer cannot be stopped.
; All interrupts are disabled
MOVF TMR1H, W ;Read high byte
MOVWF TMPH ;
MOVF TMR1L, W ;Read low byte
MOVWF TMPL ;
MOVF TMR1H, W ;Read high byte
SUBWF TMPH, W ;Sub 1st read
; with 2nd read
BTFSC STATUS,Z ;Is result = 0
GOTO CONTINUE ;Good 16-bit read
;
; TMR1L may have rolled over between the read
; of the high and low bytes. Reading the high
; and low bytes now will read a good value.
;
MOVF TMR1H, W ;Read high byte
MOVWF TMPH ;
MOVF TMR1L, W ;Read low byte
MOVWF TMPL ;
; Re-enable the Interrupts (if required)
CONTINUE
En fin si no te interesa mucho el ASM.
Copia la parte alta y luego la baja a dos variables de 8 bits, como puede haber habido un overflow (cuando copiaba la parte baja) entonces pregunta nuevamente por la parte alta, si es la misma que la primera ves que lo copio entonces sale. Si es distinto quiere decir que entro un pulso por TMR1, de esa forma vuelve a cargar los datos de nuevo en las variables sabiendo que ya cambio Y que el procesador es mas rapido que los pulsos.
El TMR1 como ves dice que continua corriendo en SLEEP, asi que te puede incluso despertar el TMR1, y para eso solo lees el flag, si no te desperto eso y fue otra cosa, entonces podes usar el codigo de arriba o pasarlo a C es lo mismo (ya que es bastante simple).