TODOPIC
FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: santipic_9 en 16 de Septiembre de 2006, 15:41:28
-
Hola a todos, por favor, podriais poner algun ejemplo como se captura la señal del gps al pic.
Puesto que el GPS echa en un segundo varios formatos de tramas, cómo se se haría la comprobación de la trama que queremos, por ejemplo: para la $GPGGAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx que tiene sobre 70 caracteres como puedo comprobar del buffer el principio y el final.
Gracias a todos, espero algún día poder aportar algo al este estupendo foro y no estar siempre preguntado.Muchas gracias y saludos desde España.
Santi
-
Hola a todos, disculpa Badtzdizzy aunque el anterior post no lo he dirijido a tí, creo que has hecho algo con tramas en binario o taip. Por favor, podrias echarme una mano con algun ejemplo. gracias
Tengo ahora un receptor de trimble y lo podría configurar de esa forma.
Muchas gracias y saludos.
-
Hola
Te voy a ir echando la mano pero ya verás que tu puedes sacar lo que quieras.
Yo uso el ACE III de Trimble, y para que no te esté mandando cadenas de forma "automática" es preciso mandar el siguiente comando;
">SRM;FR_FLAG=F;CR_FLAG=F<"
El FR_FLAG es para que el gps no responda automaticamente y el CR_FLAG es para que no envie un retorno de carro y un salto de linea. Yo los tengo configurados así porque así me conviene.
Describe un poco mas lo que llevas y te voy ayudando con el código.
Saludos
-
Hola Badtzdizzy, gracias, ya he probado 8 ejemplos de recepción pero no conseguido nada, alguno me echa los datos del buffer cuando quiere y no todos ni en el mismo orden.
Las tramas que lanza supongo que ya las conoces, lo he programado para que salga solo esta y la echa cada segundo:
$GPGGA,204358.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*6D
$GPGGA,204400.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*67
$GPGGA,204402.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*65
$GPGGA,204404.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*63
$GPGGA,204406.0,4319.143,N,00823.041,W,1,04,1.85,00047,M,019,M,,*61
$GPGGA,204408.0,4319.142,N,00823.040,W,1,04,1.85,00047,M,-019,M,,*6F
Al menos me evito todas las demás.
Pongo tambien el último ejemplo que estoy utilizando ( tomado de un código del fenomenal Red_Pic, por cierto REd-Pic ya sé que lo he roto, ¡¡no me eches a los leones!!!!!!!!pero es con intención de aprender), ya le hice muchos cambios pero no me va.
Trato de leer dos G y luego meter el resto en el buffer, pero seguro que esoy haciendo algo mal.
El ejemplo es el siguiente:
#include <18F2550.h> // Definiciones del PIC 16F876A
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=8000000) // Oscilador a 4 Mhz
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
#use fast_io(A)
#use fast_io(b)
#use fast_io(c)
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=90; // Longitud de buffer, Ajustar
// a lo que desees (o te sea posible)
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último caracter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
// Declaración de Funciones ///////////////////////////////////////////////////
void inicbuff(void); // Borra buffer
int addcbuff(char c); // añade caracter recibido al buffer
void procesa_comando(void); // Procesa comando
// INTERRUPCIONES /////////////////////////////////////////////////////////////
#int_rda
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc();
if (rcvchar == 'G')
{
{
addcbuff(rcvchar);
rcvchar=0x00;}
if (rcvchar == 'G'){
addcbuff(rcvchar);
rcvchar=0x00;}
do{
rcvchar=getc();
addcbuff(rcvchar);
}
while(rcvchar == 0x0d);
}
}
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
cbuff=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
int addcbuff(char c){ // Añade a cbuff -----------------------
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
flagcommand=1;
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
inicbuff(); // Borra buffer al inicio
printf("\r\n\** RS232 Buffered **\r\n\r\n"); // Presenta menú
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand) procesa_comando(); // Si hay comando pendiente
// de procesar ... lo procesa.
} while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////
void procesa_comando(void){
int i;
char arg[lenbuff]; // Argumento de comando (si lo tiene)
flagcommand=0; // Desactivo flag de comando pendiente.
printf("\r\nProcesando "); // Monitorizo procesando ...
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
arg=0x00; // caracteres en el argumento
}
do{ // Extraemos argumento del buffer
arg[0]=cbuff; //
}while(cbuff[++i]!=0x00);
printf("Escribiendo ",arg);//
// Monitorizamos el argunmento.
inicbuff(); // Borro buffer.
}
Pues ya ves Badtzdizzy, espero que alguien me pueda ir encendiendo alguna luz porque sino los tortazos que me voy a dar me van a dejar secuelas.
Bueno a ver como veis esto.
Saludos y gracias Badtzdizzy, gracias a todos.
-
Hola Santipic
Mira, el comando que yo te di es para cuando tienes configurado tu gps con entrada y salida TAIP, por eso es que no te sirve para el NMEA. De hecho yo no trabajo con NMEA y pues lo que te puedo recomendar es que uses el programa de redpic ya que yo me base en el mismo para hacer mi comunicación y me ha funcionado.
Saludos
-
Gracias de todas maneras Badtzdizzy. voy a seguir intentandolo con nmea.
De todas maneras ya he visto muchos errores en el codígo que he puesto, debo de quitar cosas de la interrupción y cambiar la lógica pues así no funciona.
Saludos desde España-
Santi
-
En terminos generales puedes cargar el buffer con un número determinado de bytes, despues buscas algun caracter que te delimite tu cadena y despues solo tienes que manipularla para obtener los datos que quieres. Si tengo un tiempo pruebo con nmea y veo que pasa. Ayudate con la funcion "gets" ya que esta espera al final de la cadena un retorno de carro y un salto de linea, mismos que son mandados por el nmea al final de cada cadena.
Saludos