TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: ivan_1980 en 17 de Junio de 2008, 21:43:12
-
Hola a todos, he leido mucho su foro y ahora yo vengo con una duda. Primeramente quiero decirles que soy novato en todo esto.
Esta es mi problematica:
quiero recibir la cadena $GPGGA de un GPS y guardarla en un microcontrolador para despues mandarla a un lcd.
ya tengo toda la circuiteria y la describo en el siguiente parrafo:
El gps tiene una salida TX, esa salida la conecto al RX del microcontrolador y despues envio por 4 bits al lcd.
La señal que envia el GPS es TTL y el micro si la soporta ya que es un 18f452. la patilla rx del 18f452 se encuentra en el puerto C en la patilla 7 y los bits de salida hacia el lcd estan en el puerto b del micro ( de RB7 a RB4) y los bits de control para el lcd estan tambien en el puerto B (rb2 y rb3 para el Rs y E del lcd respectivamente).
El programa para el micro lo estoy haciendo en proton ide y es el siguiente:
device = 18f452
dim cad1 as string *66
dim X as byte
serin portc.7,16468,[wait("$GPGGA"),cad1[0]]
loop:
cls
for X=1 to 65
serin portc.7,16468,[cad1[X]]
next
print cad1
delayms 4000
goto loop
segun yo estoy bien , pero a la hora de probarlo me manda caracteres al lcd que no son los de la cadena y ni siquiera son numeros o letras con un orden , si no que son puros caracteres raros, la verdad ya no se me ocurre nada. cabe mencionar que el GPS trabaja a 9600 baudios con 8 bits de datos , sin paridad y un bit de parada.
Espero que alguien me pueda ayudar.
De antemano muchas gracias. :o
-
Es preferible que en vez de narrar nos pongas el circuito. Y en proton te conviene usar en vez de serin, rsin.
Este te puede almacenar o recibir los caracteres de mejor forma, mira en este ejemplo de matriz de leds (http://www.todopic.com.ar/foros/index.php?topic=14856.msg144072#msg144072), el rsin lo uso para recibir la cadena desde la PC.
-
Gracias navaismo por tu pronta respuesta , ahorita a la mano no tengo la imagen del circuito, pero la hago y la pongo, una pregunta, el micro lo activo con un cuarzo a 4mhz fisicamente y no se si en el programa le tengo que poner xtal 4 no se si sea necesario , si tu ves que le hace falta algo para completar el programita te agredeceria si lo pones en el foro para verlo, en este momento revisare la instruccion rsin para usarla...
te recuerdo que apenas estoy empezando a utilizar micros y como que algunas cosas se me dificultan,. y la verdad no se si lleve esa estructura el programa o si me hace falta declarar algo, no lo se ..
espero tu respuesta y gracias nuevamente
-
Si es necesario que declares el XTAL, sobre la estructura en general esta bien. Me surgen algunas dudas, ya habias hecho algo con LCD's? Es decir, ya estas seguro de como enviar mensajes a un LCD y como poner las variables o el valor de las variables en los LCD's.
El hecho de que seas novato no tiene nada de malo, por ejemplo la idea esta muy bien plasmada falta que las instrucciones se lleven a cabo, te recomiendo leas la ayuda de proton para que te saques de dudas con respecto a los comandos. No olvides mirar el ejemplo pues es muy similar yo recibo la cadena de un PC y la muestro en una matriz, y tu la recibes de un Celular y la pintas en un LCD.
Saludos
-
Saludos Ivan, bienvenido al foro!
Una pregunta... qué módulo GPS estás usando?
Y otra cosa... estás seguro que esa es la velocidad de transmisión? Ese 16468 lo veo un poco raro... tú qué opinas navaismo?
Has intentado conectar el gps a la PC a través de un MAX232 y ver si envía la cadena correctamente?
Ok nos leemos! :mrgreen:
-
hola NAVAISMO Y FIREPIC , la verdad no se a que te refieres con modulo GPS, pero estoy usando un GPS reb12r7 de royaltek, ya he conectado el gps a un pc con un max232 y con una hyperterminal, y sí me envia las cadenas correctamnete. Yo no habia trabajado antes con lcd, lo unico que hice fue mandar mensajes para verificar que el lcd estuviera bien conectado y si esta bien.
firepic , lo que me comentas de la velocidad (16468), me fije en la ayuda de proton en los comandos serin y serout, y ahi viene una tabla con los valores para varios tipos de velocidades , y para 9600 , dice que ponga 16468 o 84 , lo he probado con los dos y obtengo el mismo resultado... en un rato mas agragare esa tabla para que la vean. gracias
-
Ya entiendo lo del "16468"... estás usando el número de "modo de transmisión" que tiene Pic Basic...
Pero tampoco encuentro "16468", lo que sí veo es un "16486" que corresponde a una tasa de baudios de 9600, invertida, sin paridad... que no entiendo por qué usas la inversión si dices que el GPS te da valores TTL...
Ahora bien, cuando monitoreaste con la pc usaste el hyperterminal de windows?
Qué valor de baud rate has colocado en la hyperterminal?
Yo creo que deberías probar con algo así como:
serin portc.7,T9600,[wait("$GPGGA"),cad1[0]]
Si estoy en lo correcto al decir que no hace falta inversión...
Ese es el problema de los caracteres raros, es cuando no configuras la rata de baudios apropiada para el dispositivo emisor, entonces el receptor recibe pero no interpreta correctamente los datos...
Prueba eso que te digo a ver qué tal... debe arreglarse así.
Ok saludos, nos leemos! :mrgreen:
-
Hola FIREPIC ya he probado la instrucción poniendo T9600 y al momento de compilar me marca un error:
variable 'T9600' not found
yo tambien creo que el error esta ahi , pero no he encontrado solución seguiré intentando, pero si sabes algo te agradecería mucho si lo comentas por aqui
gracias...espero tu respuesta :)
-
No el error no esta ahi, como lo pones esta bien, pues como lo explica la ayuda es valido usar esa nomenclatura para el baudaje. Y eso forma de definir el baudaje es de PBP cuando incluyes el "modedefs.bas"
Yo creo que lo que pasa es cuando quieres recibir la cadena el serin no da para mas, te lo digo porque cada que yo quiero recibir una cadena serin no me daba el ancho. En PBP tenia que usar SERIN" y en proton RSIN ya que estos pueden recibir despues del "wait" la cantidad de caracteres que desees y estos se depositan en el arreglo de tu variable.
Digo no me gusta ser pedante ni repetir los ejemplos pero de verdad deberias intentarlo como te decia, no por molestar mas bien por que a mi siempre me ha funcionado asi.
-
saludos navaismo, gracias por responder y no te preocupes todos los consejos son bienvenidos, bueno acabo de leer como se usa el rsin y segun yo deje el programa asi:
device = 18f452
xtal 4
dim cad1 as string *254
dim X as byte
DECLARE RSIN_PIN PORTc.7
DECLARE SERIAL_BAUD 9600
loop:
cls
print "detectando"
RSIN WAIT( "$GPGGA" ) , cad1[0]
cls
print "correcto"
delayms 1000
cls
for X=1 to 253
rsin cad1[X]
next
print cad1
delayms 4000
goto loop
pero tampoco me funciono :( , no se si sea la forma correcta de usar el rsin ¿como ves tu ?
-
A bueno si estás programando en protón ahí sí no sé... :D
En basic no más he trabajado con Pic Basic Pro...
Y eso forma de definir el baudaje es de PBP cuando incluyes el "modedefs.bas"
Sé que es correcto, yo mismo también usé esa forma algunas veces... ahora bien, no sé si las definiciones de proton sean distintas (supongo que sí), porque si fuera pic basic estaría incorrecto así. Por lo que mencioné acá:
Pero tampoco encuentro "16468", lo que sí veo es un "16486" que corresponde a una tasa de baudios de 9600, invertida, sin paridad... que no entiendo por qué usas la
Entonces te dejo este hilo a tí navaismo, porque tú si eres experto en proton... yo de proton no sé un comino :D
Saludos, nos leemos! :mrgreen:
Ivan, te deseo éxito en tu proyecto! :P
-
Amigo Ivan:
A Mi me sale así
DECLARE HSERIAL_BAUD = 9600 ' Set baud rate to 9600
DECLARE HSERIAL_RCSTA = %10010000 ' Enable serial port and continuous receive
DECLARE HSERIAL_TXSTA = %00100100 ' Enable transmit and asynchronous mode
DECLARE HSERIAL_CLEAR = ON ' Enable Error clearing on received characters
DECLARE LCD_TYPE = 0
DECLARE LCD_DTPIN PORTB.0
DECLARE LCD_RSPIN PORTB.4
DECLARE LCD_ENPIN PORTB.5
DECLARE LCD_LINES 2
DECLARE LCD_INTERFACE 4
DIM cad1[18] AS BYTE
CLS
PRINT AT 1,1, "detectando.."
'Espera hasta Recibir $GPGGA, lo que venga detras de eso lo guarda en la variable cad1
' En el Ejemplo: *RaraAvis-TodoPic* y lo muestra en el LCD.
HSERIN [WAIT( "$GPGGA" ) , STR cad1]
PRINT AT 1,1, "Recibido: "
PRINT AT 2,1,STR cad1
STOP
(http://www.todopic.com.ar/foros/imgtiny/jtp72o.jpg)
Adjunto archivo zip con .Hex, el source .bas y la simulacion en Proteus 7.2
Saludos :)
-
Raraavis, el detalle es que una cadena NMEA GPGGA tiene unos 50 caracteres...
No sé si sirva esa solución...
Aunque yo lo he hecho de forma parecida en C y me ha funcionado de maravilla...
Así que, como dice el maestro RedPic: "a probar que no se quede!"
Saludos, nos leemos! :mrgreen:
-
Hola amigo firepic
Creo que con la cantidad de Caracteres no va a tener problemas, yo he transmitido cadenas de 101 caracteres de Pic a Pic con este método sin problemas.
En el ejemplo, solo envié unos pocos caracteres porque el display es de 20 posiciones y si mandase 60 no los podria ver todos. :D
Saludos. Luis