Un poco más de código de la ISR, aqui la parte de recibir los seis digitos de la Hora
case_10 ;Recibiendo HORHIG , el dígito Decenas de Horas, viene en ASCII
;o la segunda coma si todavía no hay datos (módulo inicializandose)
; , o el botón para mostrar Posición Geográfica
movfw ESTADO ; Comparar
xorlw 0x10 ; con estado 10
btfss STATUS,Z ;si son iguales saltar
goto case_11 ; no es estado 10, continuar
movfw RCDATO ;el ESTADO es 10, llega HORHIG en ASCII, le sobran 30 para obtener el número a mostrar
xorlw 0x2C ; comparar con la segunda coma para detectar el mensaje de NO DATA $GNRMC,,V,,,,,,,,,,N*4D
btfsc STATUS,Z ; si no es coma, continuar, pues no es el mensaje de NO DATA (el módulo aún no no adquiere info de los GNSS)
goto es_coma ;se detecta la segunda coma, todavia no llegan los datos válidos
movfw RCDATO ;si no es coma, recuperar dato recibido y procesarlo
andlw 0x0F ; mascara para borrar ASCII, sacarle el 30; el 30 queda en 00, 31 en 01 etc.
movwf HORHIX ; cargar el digito de hora en registro auxiliar HORHIX (es hora UTC, no local)
;chequear boton de solicitud de mostrar Posición geográfica
btfss PORTB,BTB3 ;si el boton no fue apretado,esta en 1, seguir, saltar
goto bot_on ;si hay boton oprimido, ir a procesar latitud/longitud ; si no continuar normal con hora y fecha
movlw 0x11
movwf ESTADO ;pasar al estado 11
call echo_ar ;hacer eco del dígito de Hora HORHIG a la PC para chequear su validez
return
;
bot_on ;el boton esta oprimido, ir a recoger latitud y longitud y mostrala. Ya se recibio HORHIG pero ese valor se descarta
movlw 0x02 ;cargar el contador de comas a saltear dentro del mensaje, son 2
movwf ESTAUX ; en ESTAUX
movlw 0x40 ; el proximo estado de la maquina de estados sera el 40, arranca la secuencia de recoger latitud y longitud
movwf ESTADO ;pasar al estado 40
return
es_coma ;se detecto una segunda coma despues de la primera, el mensaje completo $GNRMC con todos los datos todavia no llega
movlw 0x36 ; estado final 36, para no mandar nada pues esta llegando el mensaje sin data $GNRMC,,V,,,,,,,,,,N*4D
movwf ESTADO ;pasar al estado 36, solo para mandar $+CR+LF e ir al estado de reposo 38, el último estado de la maquina
movlw 0x24 ;echoar el signo $ a la PC, luego CR,LF; la HiperTerminal de monitoreo mostrará el signo $, una linea por segundo
call tx_dato ; mientras no llega Data (el módulo GPS esta en inicialización o perdió toda señal)
return ;
;No hubo segunda coma , no hubo Boton, la secuencia continua normalmente recogiendo los dígitos de Hora
case_11 ;Recibiendo el dígito de Unidades de Hora, se guarda en registro HORLOX , viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x11 ; con estado 11
btfss STATUS,Z ;si son iguales saltar
goto case_12 ; no es 11, continuar
movfw RCDATO ;el ESTADO es 11, llega el dígito de unidades de Horas HORLOX en ASCII, le sobran 30
andlw 0x0F ; mascara para borrar ASCII, 30 queda en 00, 31 en 01 etc.
movwf HORLOX ; cargar el digito de hora en registro auxiliar HORLOX para corregir hora UTC a hora local
movlw 0x12
movwf ESTADO ;pasar al estado 12
call echo_ar ;hacer eco del dígito a la PC
return
;
case_12 ;Recibiendo decenas de Minutos, se guarda en el registro MINHIG , viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x12 ; con estado 12
btfss STATUS,Z ;si son iguales saltar
goto case_13 ; no es 12, continuar
movfw RCDATO ;el ESTADO es 12, llega MINHIG en ASCII, le sobran 30
andlw 0x0F ; mascara para borrar ASCII, 30 queda en 00, 31 en 01 etc
movwf MINHIG ; cargar el digito de MINHIG
movlw 0x13
movwf ESTADO ;pasar al estado 13
call echo_ar ;MINHIG a la PC
return
;
case_13 ;Recibiendo unidades de minutos, se guarda en MINLOW , viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x13 ; con estado 13
btfss STATUS,Z ;si son iguales saltar
goto case_14 ; no es 13, continuar
movfw RCDATO ;el ESTADO es 13, llega MINLOW en ASCII, le sobran 30
andlw 0x0F ; mascara para borrar ASCII, 30 queda en 00, 31 en 01 etc
movwf MINLOW ; cargar el digito MINLOW
movlw 0x14
movwf ESTADO ;pasar al estado 14
call echo_ar ;hacer eco de MINLOW a la PC
return
;
case_14 ;Recibiendo digito de decenas de Segundos, guardar en SEGHIG , viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x14 ; con estado 14
btfss STATUS,Z ;si son iguales saltar
goto case_15 ; no es 14, continuar
movfw RCDATO ;el ESTADO es 14, llega SEGHIG en ASCII, le sobran 30
andlw 0x0F ; mascara para borrar ASCII, 30 queda en 00, 31 en 01 etc
movwf SEGHIG ; cargar el digito SEGHIG
movlw 0x15
movwf ESTADO ;pasar al estado 15
call echo_ar ;hacer eco de SEGHIG a la PC
return
;
case_15 ;Recibiendo unidades de Segundos, guardar en SEGLOW ,
movfw ESTADO ; Comparar
xorlw 0x15 ; con estado 15
btfss STATUS,Z ;si son iguales saltar
goto case_16 ; no es 15, continuar a 16
movfw RCDATO ;el ESTADO es 15, llega SEGLOW en ASCII, le sobran 30
andlw 0x0F ; mascara para borrar ASCII, 30 queda en 00, 31 en 01 etc
movwf SEGLOW ; cargar el digito SEGLOW
movlw 0x16
movwf ESTADO ;pasar al estado 16
call echo_ar ;hacer eco de SEGLOW a la PC
return
;
case_16 ;Recibiendo el punto decimal de las centecimas de Segundos en el mensaje, viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x16 ; con estado 16
btfss STATUS,Z ;si son iguales saltar
goto case_17 ; no es 16, ir a 17
movfw RCDATO ;el ESTADO es 16, verifcar si llego el "."
xorlw 0x2E ; comparar con . punto
btfsc STATUS,Z ; si no llego, hay error, en ese lugar debe haber un punto, si no está hay error, ergo resetear estado
goto si_PU ; si se detecta el "." ir a seguir la secuencia exitosa
clrf ESTADO ;no se detecto el "."
return ;resetear ESTADO y volver
si_PU ;
movlw 0x17
movwf ESTADO ;pasar al estado 17
call echo_ar ;hacer eco del punto decimal a la PC
return
case_17 ;Recibiendo el cero 0X de las centecimas de Segundo en el mensaje, viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x17 ; con estado 17
btfss STATUS,Z ;si son iguales saltar
goto case_18 ; el estado no es 17,
movfw RCDATO ;el ESTADO es 17, verifcar si llego 0 (el modo del módulo no reporta decimales, estos siempre serán ceros)
xorlw 0x30 ; comparar con 0
btfsc STATUS,Z ; si no llego 0, hay error, resetear estado
goto si_0X ; si llego el 0, seguir secuencia
clrf ESTADO ;no era 0
return ;resetear ESTADO y volver
si_0X ;
movlw 0x18
movwf ESTADO ;pasar al estado 18
movlw 0x0D ; en lugar de mandar las centesimas que siempre son 00, mandar CR(0Dh), luego LF (0Ah)
call tx_dato ; para que la linea del HiperTerminal de monitoreo muestre la Hora y avance una linea
return
case_18 ;Recibiendo el cero x0 o segundo cero de las centecimas, viene en ASCII
movfw ESTADO ; Comparar
xorlw 0x18 ; con estado 18
btfss STATUS,Z ;si son iguales saltar
goto case_20 ; no es 18, sera 20?
movfw RCDATO ;el ESTADO es 18, verifcar si llego 0
xorlw 0x30 ; comparar con 0 en ASCII
btfsc STATUS,Z ; si no llego 0, hay error, resetear estado
goto si_X0 ; si llego el 0 , seguir secuencia
clrf ESTADO ;no era "0"
return ;resetear ESTADO y volver
si_X0 ;
movlw 0x08 ; ACA cargar el contador de comas a saltear, parámetros que no son requeridos son salteados, SON 8!
movwf ESTAUX ; en el registro ESTAUX
movlw 0x20
movwf ESTADO ;pasar al estado 20 de la máquina de estados
movlw 0x0A ; mandar LF (0Ah) para completar la linea en la HiperTerminal
call tx_dato ;
return
case_20 ;aqui se cuentan las 8 comas que separan la Hora de la Fecha en el mensaje, luego se recoje la Fecha con secuencia
;de estados similar a la Hora y se cargan sus registros.
No más código por ahora sino se pone pesado el tema.
Un saludo