Disculpa, no eh tenido tiempo para verlo. Apenas me haga un tiempo lo miro, ya que requiero un poco mas de tiempo para este programa.Simple, tu problema esta en que el I2C es por software y lo estas realizando en la interrupcion. Si el I2C se toma demasiado tiempo perdes un pulso cada 2.
Solucion: Mover la lectura de I2C al loop principal. Pero como esta lleno de cosas el loop principal seguramente tampoco te funcione.
Entonces como solucionamos este problema. Mejor encararlo de otra forma. Para que vamos a leer y leer y leer cada segundo el RTC. Para eso hacemos esto (antes del loop principal y luego de la configuracion) que nos facilite la vida:
- Limpiamos Flag RB0, todavia no habilitamos la interrupcion
- Configuramos el RTC
- Leemos el RTC, vamos a tener Hora, Minutos y Segundos guardados en el micro
- Activamos la interrupcion de RB0, si paso un pulso mientras leiamos al activarlo va a ir a la interrupcion, si no paso entonces no pasa nada.
Y aca solo resta la parte de la interrupcion, que hacemos en la interrupcion?, solo sumamos 1 segundo cada ves que ocurre a esos registros donde guardamos los segundos, miuntos y horas.
Entonces al durar muy poco la interrupción, NUNCA vas a perder un segundo. Solo necesitas leer el RTC 1 sola ves. Y luego en tu loop principal que es donde vas a mostrar todo es donde va a depender si lo haces muy lento va a mostrarte tal ves mal el valor, pero ahora vas a tener los segundos/minutos y horas de forma correcta en tu PIC.
Si queres asegurarte un poco mas, cada 1 dia, es decir cuando de que Horas = Minutos = Segundos = 0, activas un bit de algun registro, y luego en tu loop principal (fuera de la interrupcion) lees nuevamente el RTC.
PD: Todavia te falta pasar todos las letras y numeros que los tenes realizados con MOVLW/MOVWF, a ponerlos con DT Como tenes los Meses.
Luego hay que modificar TABLA_CARACTERES para que no haga saltos de esa forma, sino que lo vamos a computar de otra forma y leer la flash. Pensa que es aproximadamente el 40% de lineas de programa que tenes, te deberia quedar asi:
COMIENZO_LETRAS:
DT 0X3C, 0X7E, 0X66, 0X66, 0X66, 0X66, 0X7E, 0X3C ;0
DT 0X18, 0X38, 0X78, 0X18, 0X18, 0X18, 0X18, 0X7E ;1
;......... Aca siguen todas las demas