Transmisor1-Te recomiendo que leas el codigo que provee el datasheet acerca de guardar/restorar el contexto, veras que usa instrucciones como SWAPF porque estas instrucciones no modifican las variables. Algo que estas haciendo mal en tu codigo, Simplmente es copiar y pegar.
Con lo cual vas a terminar con una funcion de Salir_interrupcion y cuando tengas que salir simplemente vas a hacer un GOTO a la misma.
2-MOVF UNIDAD,W
SUBLW D'0'
BTFSC STATUS,Z
El SUBLW no es necesario, el MOVF actualiza la bandera Z por si solo.
3-waittx BTFSS TXSTA,TRMT
GOTO waittx
Un loop que depende de otra cosa dentro de una interrupcion es malo, ya que si esta dentro de una interrupcion y ocurre otra no va a poder atenderlo. Lo mejor tal ves sea acomodar el valor y activar un flag, para que el loop principal luego lo envie.
4-Inicio_pausa ; Inicia o pausa el contador
BTFSC INTCON,T0IE
Un error, ya que el Timer0 sigue corriendo, eso quiere decir que por mas que pares , apenas arranques vas a tener el flag en 1, y no lo estas limpiando antes de activarlo. O usar un timer que si pueda detenerse como el Timer1
5-MuestraDigito
movwf Digito ;Carga el valor de W en Dígito
movlw .0 ;Compara con 0
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 0?
goto Envia0 ;Sí: Envia Dígito
movlw .1 ;No: Compara con 1
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 1?
goto Envia1 ;Sí: Envia Dígito
movlw .2 ;No: Compara con 2
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 2?
goto Envia2 ;Sí: Envia Dígito
movlw .3 ;No: Compara con 3
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 3?
goto Envia3 ;Sí: Envia Dígito
movlw .4 ;No: Compara con 4
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 4?
goto Envia4 ;Sí: Envia Dígito
movlw .5 ;No: Compara con 5
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 5?
goto Envia5 ;Sí: Envia Dígito
movlw .6 ;No: Compara con 6
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 6?
goto Envia6 ;Sí: Envia Dígito
movlw .7 ;No: Compara con 7
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 7?
goto Envia7 ;Sí: Envia Dígito
movlw .8 ;No: Compara con 8
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 8?
goto Envia8 ;Sí: Envia Dígito
movlw .9 ;No: Compara con 9
xorwf Digito,W
btfsc STATUS,Z ;Cuenta = 9?
goto Envia9 ;Sí: Envia Dígito
Envia0
movlw b'10000001'
movwf PORTA
return
Envia1
movlw b'11110011'
movwf PORTA
return
Envia2
movlw b'01001001'
movwf PORTA
return
Envia3
movlw b'01100001'
movwf PORTA
return
Envia4
movlw b'00110011'
movwf PORTA
return
Envia5
movlw b'00100101'
movwf PORTA
return
Envia6
movlw b'00000101'
movwf PORTA
return
Envia7
movlw b'11110001'
movwf PORTA
return
Envia8
movlw b'00000001'
movwf PORTA
return
Envia9
movlw b'00100001'
movwf PORTA
return
Todo eso es demasiado codigo para solo una tabla el cual te llevaria unas 12 lineas.
Receptor1-Mismo problema con el guardado/restaurado de contexto que el transmisor en las interrupciones
2-interrupciones ; CONTROLA INTERRUPCIÓN DE PERIFÉRICOS, ESPECÍFICAMENTE DE USART
MOVWF WTEMP
MOVF STATUS,W
MOVWF STATUSTEMP
; RUTINA RECEPCIÓN
BTFSS PIR1,RCIF
GOTO interrupciones
Loop posiblemente infinito dentro de una interrupcion, no debe haber loops asi, ademas si ya entro a la interrupcion es porque llego algo, asi que o no tiene sentido tener eso, o puede traerte problemas, en resumen quitarlo.
3-Nuevamente lo de la tabla..
----------------------------------------------------------------------
Solucionando eso creo que podriamos empezar a pensar en que esta mal acerca de la comunicacion Serial
Y uan cosa que no entiendo, si utilizas decimal no se porque lo escribis en binario. Y tambien veo que estas enviando un solo valor ( UNIDAD ) pero en el transmisor usas DECENA. Lo cual pienso que no estas enviando los 2 digitos en un byte ( packet-BCD )