pic con un gps en Basic

necesito ayuda con un proyecto para comunicar un pic con un modulo gps por PICBASIC estoy utilizando un 16F876A.
el problema es el siguiente hice el siguiente código:

PHP:
Include "modedefs.bas"


'RCSTA: RECEIVE STATUS ANInclude "modedefs.bas"


'RCSTA: RECEIVE STATUS AND CONTROL REGISTER (ADDRESS 18h)
DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h ' Set receive register to receiver enabled
DEFINE HSER_TXSTA 20h ' Set transmit register to transmitter enabled
DEFINE HSER_BAUD 4800 ' Set baud rateD CONTROL REGISTER (ADDRESS 18h)
DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h ' Set receive register to receiver enabled
DEFINE HSER_TXSTA 20h ' Set transmit register to transmitter enabled
DEFINE HSER_BAUD 4800 ' Set baud rate
DEFINE HSER_SPBRG 25 ' Set SPBRG directly (normally set by HSER_BAUD)


Define	LCD_DREG	PORTB
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3

hora var byte
minutos var byte
segundos var byte

latitudp1 var byte
latitudp2 var byte
latitudp3 var byte
latitudp4 var byte
ns var byte

longitudp1 var word
longitudp2 var byte
longitudp3 var byte
longitudp4 var byte
oe var byte

kmh var byte

TRISB = 0


GPS:
high PORTB.0 ' prendo un led al principio del programa
pause 200
low PORTB.0 ' apago led
gosub lee  ' esta sub rutina lee la trama del gps al final coloco como es la trama
pause 500
gosub muestra ' muestra los datos que toma de la trama
goto GPS
end
  
lee:
hserin 4800,timeout,[wait("$GPGGA"),dec2 hora,DEC2 minutos,DEC2 segundos,skip 5,dec2 latitudp1,DEC2 latitudp2,DEC2 latitudp3,DEC2 latitudp4,skip 1,ns,dec3 longitudp1, dec2 longitudp2,dec2 longitudp3,dec2 longitudp4,skip 1,oe] ' 4800 es un tiempo según para que cuando no se recibe trama el llama otra rutina en este caso timeout

return

muestra:
lcdout $FE, 1
lcdout "UTC: ",dec hora
lcdout ":",dec minutos
lcdout ":",dec segundos
pause 1200
lcdout $FE, 1
pause 50
lcdout "lat:",dec latitudp1
lcdout %10110000 'simbolo °
lcdout dec latitudp2
lcdout "."
lcdout dec latitudp3
lcdout dec latitudp4
lcdout "'"
lcdout ns
lcdout $FE, $C0
lcdout "lon"
lcdout dec longitudp1
lcdout dec longitudp2
lcdout %10110000 'simbolo °
lcdout "."
lcdout dec longitudp3
lcdout dec longitudp4
lcdout "'"
lcdout oe

clear ' borro las variables de la memoria

return


timeout:
lcdout $FE, 1
pause 500
lcdout "no hay trama"
pause 500
return


'la trama que envío es asi:
'$GPGGA,563452.000,9876.9876,N,23455.6538,E,#,##,2.5,607.75,M,47.6,M,,*67<CR>

ahora bien el problema es que el programa solo lee a primera ves que se ejecuta después no lee mas y se va a la subrutina timeout como si no recibiera tramas :confused:. Una de mis preguntas es wait sirve para que el espere $GPGGA, pero el timeout espera también a $GPGGA o solamente espera a que cualquier tipo de trama llegue?

les agradecería su ayuda por favor, la verdad no tengo ni idea que esta pasando.
nose si quieren que les envíe el archivo para simularlo en proteus
 
Última edición por un moderador:
Confirma la validez de la trama enviandola desde la Hyperterminal de Windows en vez del micro.
Saludos
 
Confirma la validez de la trama enviandola desde la Hyperterminal de Windows en vez del micro.
Saludos


nuevamente yo, te cuento que parra evitar problemas ahora estoy utilizando GPS Generator PRO que es como un emulador de un gps esta versión que baje es de prueba y solo envia tramas $gprmc basadas en NMEA 0183 v3

$GPRMC,223629.69,A,0000.337,N,00000.022,E,21.60,6.24,040510,0.0,E,A*06
mas informacion :
http://www.codepedia.com/1/The+GPRMC+Sentence

el programa lo conecto con proteus por COMPIM y Virtual serial port driver 6.

debido a que la trama es diferente a la que tenia pensado en un principio le hice unos cambios al pbp:

PHP:
Include "modedefs.bas"

DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h ' Set receive register to receiver enabled
DEFINE HSER_TXSTA 20h ' Set transmit register to transmitter enabled
DEFINE HSER_BAUD 4800 ' Set baud rate
DEFINE HSER_SPBRG 25 ' Set SPBRG directly (normally set by HSER_BAUD)


Define	LCD_DREG	PORTB
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3

hora var byte
minutos var byte
segundos var byte

latitudp1 var byte
latitudp2 var byte
latitudp3 var byte
latitudp4 var byte
ns var byte

longitudp1 var word
longitudp2 var byte
longitudp3 var byte
longitudp4 var byte
oe var byte

kmh var byte

TRISB = 0


GPS:
high PORTB.0
pause 200
low PORTB.0
gosub lee
gosub muestra
pause 500
goto GPS
end
  
lee:
hserin 4800,timeout,[wait("$GPRMC,"),dec2 hora,DEC2 minutos,DEC2 segundos,skip 6,dec2 latitudp1,DEC2 latitudp2,DEC2 latitudp3,DEC2 latitudp4,ns,dec3 longitudp1, dec2 longitudp2,dec2 longitudp3,dec2 longitudp4,oe]

return

muestra:
lcdout $FE, 1
lcdout "UTC: ",dec hora
lcdout ":",dec minutos
lcdout ":",dec segundos
pause 1200
lcdout $FE, 1
pause 50
lcdout "lat:",dec latitudp1
lcdout %10110000 'simbolo °
lcdout dec latitudp2
lcdout "."
lcdout dec latitudp3
lcdout dec latitudp4
lcdout "'"
lcdout ns
lcdout $FE, $C0
lcdout "lon"
lcdout dec longitudp1
lcdout dec longitudp2
lcdout %10110000 'simbolo °
lcdout "."
lcdout dec longitudp3
lcdout dec longitudp4
lcdout "'"
lcdout oe

clear

return


timeout:
lcdout $FE, 1
pause 500
lcdout "no hay trama"
pause 500
goto lee


ahora el problema es aun peor ahora no lee lada y se va directamente a la subrutina timeout
 
Última edición por un moderador:
nuevamente yo, te cuento que parra evitar problemas ahora estoy utilizando GPS Generator PRO que es como un emulador de un gps esta versión que baje es de prueba y solo envia tramas $gprmc basadas en NMEA 0183 v3

$GPRMC,223629.69,A,0000.337,N,00000.022,E,21.60,6.24,040510,0.0,E,A*06
mas informacion :
http://www.codepedia.com/1/The+GPRMC+Sentence

el programa lo conecto con proteus por COMPIM y Virtual serial port driver 6.

debido a que la trama es diferente a la que tenia pensado en un principio le hice unos cambios al pbp:

PHP:
Include "modedefs.bas"

DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h ' Set receive register to receiver enabled
DEFINE HSER_TXSTA 20h ' Set transmit register to transmitter enabled
DEFINE HSER_BAUD 4800 ' Set baud rate
DEFINE HSER_SPBRG 25 ' Set SPBRG directly (normally set by HSER_BAUD)


Define	LCD_DREG	PORTB
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3

hora var byte
minutos var byte
segundos var byte

latitudp1 var byte
latitudp2 var byte
latitudp3 var byte
latitudp4 var byte
ns var byte

longitudp1 var word
longitudp2 var byte
longitudp3 var byte
longitudp4 var byte
oe var byte

kmh var byte

TRISB = 0


GPS:
high PORTB.0
pause 200
low PORTB.0
gosub lee
gosub muestra
pause 500
goto GPS
end
  
lee:
hserin 4800,timeout,[wait("$GPRMC,"),dec2 hora,DEC2 minutos,DEC2 segundos,skip 6,dec2 latitudp1,DEC2 latitudp2,DEC2 latitudp3,DEC2 latitudp4,ns,dec3 longitudp1, dec2 longitudp2,dec2 longitudp3,dec2 longitudp4,oe]

return

muestra:
lcdout $FE, 1
lcdout "UTC: ",dec hora
lcdout ":",dec minutos
lcdout ":",dec segundos
pause 1200
lcdout $FE, 1
pause 50
lcdout "lat:",dec latitudp1
lcdout %10110000 'simbolo °
lcdout dec latitudp2
lcdout "."
lcdout dec latitudp3
lcdout dec latitudp4
lcdout "'"
lcdout ns
lcdout $FE, $C0
lcdout "lon"
lcdout dec longitudp1
lcdout dec longitudp2
lcdout %10110000 'simbolo °
lcdout "."
lcdout dec longitudp3
lcdout dec longitudp4
lcdout "'"
lcdout oe

clear

return


timeout:
lcdout $FE, 1
pause 500
lcdout "no hay trama"
pause 500
goto lee


ahora el problema es aun peor ahora no lee lada y se va directamente a la subrutina timeout


ya encontré mi error y no eran ni conexiones ni nada era un problema con una instrucción de basic que todavía es la hora y no se por que no trabaja bien.
 
Atrás
Arriba