Autor Tema: Control GPS desde PC  (Leído 4665 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Control GPS desde PC
« en: 28 de Septiembre de 2006, 11:53:28 »
Hola a todos, quiero compartir con ustedes algo que hice modificando el código de RedPic (espero no se moleste). Con esto he logrado obtener ciertos datos de un gps trimble usando el protocolo TAIP. Ya está probado y funciona muy bien.
Código: [Seleccionar]
///////////////////////////////////////////////////////
////
////  Programa control PIC - GPS por RS232
////  Fecha: 08/09/06
////
///////////////////////////////////////////////////////

#include <18f4320.h>
#use delay(clock=8000000)
#fuses INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use rs232(baud=4800, xmit=PIN_B0,rcv=PIN_B1,stream=GPS)
#use rs232(baud=38400, xmit=PIN_C6,rcv=PIN_C7,stream=PC)

int const lenbuff=40;  // Tamaño del buffer de recepción

int  xbuff=0;       // Índice: siguiente char en cbuff
char cbuff[lenbuff];   // Buffer
char gpsbuff[lenbuff]; // Buffer GPS
char rcvchar=0;     // Ultimo caracter recibido
int1 flagcommand=0;    // Flag para indicar comando disponible

void presmenu(void);   // Presenta el menú
void inicbuff(void);   // Borra buffer
int  addcbuff(char c); // añade caracter recibido al buffer
void echos(char c);    // Eco selectivo sobre RS232
void comando(void);    // Procesa comando

#int_rda
void serial_isr()
{                    // Interrupción recepción serie USART
rcvchar=0;                       // Inicializo caracter recibido
if(kbhit(PC))
{                        // Si hay algo pendiente de recibir ...
rcvchar=fgetc(PC);      // lo descargo y ...
addcbuff(rcvchar);   // lo añado al buffer y ...
echos(rcvchar);      // hago eco (si procede).
}
}

void presmenu(void)
{                   // Presenta el menú --------------------
delay_ms(25);
fprintf(PC,"\r\n");
fprintf(PC,"** PIC-GPS POR RS232 **\r\n\n");  // Presenta menú
fprintf(PC,"** Control del buffer:\r\n");
fprintf(PC,"[Enter]  Procesa comando\r\n");
fprintf(PC,"[Escape] Borra todo el buffer\r\n");
fprintf(PC,"[Delete] Borra ultimo caracter del buffer\r\n");
fprintf(PC,"\n");
fprintf(PC,"** Comandos GPS:\r\n");
fprintf(PC,"/? Presenta Menu\r\n");
fprintf(PC,">QPV< Posicion y Velocidad\r\n");
fprintf(PC,">QTM< Hora, Fecha y No. de Satelites\r\n");
fprintf(PC,">QVR< Numero de Version\r\n");
fprintf(PC,">QST< Estado\r\n");
fprintf(PC,"\n");
delay_ms(25);
}

int addcbuff(char c)
{                  // Añade a cbuff -----------------------
switch(c)
{
case 13:                    // Enter -> Habilita Flag para procesar
flagcommand=1;             // Comando en Main
break;
case 8:                    // Del   -> Borra último caracter del Buffer
if(xbuff>0)
cbuff[--xbuff]=0;
break;
case 27:                   // Esc   -> Borra el Buffer completamente
inicbuff();
break;
default:
cbuff[xbuff++]=c;          // Añade caracter recibido al Buffer
if(xbuff>lenbuff)
xbuff=lenbuff;
}
}

void echos(char c)
{                    // Echo selectivo ----------------------
int i;
switch(c)
{
case 13:
fprintf(PC,"\r\n");       // Si he pulsado la tecla [Intro]
break;
case 8:
fprintf(PC,"\r%s \b",cbuff); // Si he pulsado la tecla [Retroceso]
break;
case 27:
fprintf(PC,"\r");         // Si he pulsado la tecla [Escape]
for(i=0;i<lenbuff;i++)
{
fprintf(PC," ");        // Borra display (en la longitud del buffer)
}
fprintf(PC,"\r");
break;
default:   
fputc(rcvchar,PC);        // Echo de cualquier otro caracter
}
}

void inicbuff(void)
{                   // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++)
{             // Bucle que pone a 0 todos los
cbuff[i]=0;                   // caracteres en el buffer
gpsbuff[i]=0;
}
xbuff=0;             // Inicializo el indice de siguiente caracter
}

void inicia_gps(void)
{
int i,j;
inicbuff();
do
{
fprintf(GPS,">QST<");

while(!kbhit(GPS));
{
for(i=0;i<8;i++)
{
gpsbuff[i]=fgetc(GPS);
}

// Estado GPS
fprintf(PC,"Estado GPS:");
for(i=4;i<7;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
delay_ms(8000);
}
while(gpsbuff[5]!='0');
output_high(PIN_A1);
fprintf(PC,"GPS Listo!\r\n");
}

void main()
{
setup_oscillator(OSC_8MHZ | OSC_INTRC);
delay_ms(100);
fprintf(PC,"Iniciando GPS...\r\n");
delay_ms(15000); // Retardo para inicio interno del GPS

// Configuracion inicial GPS
fprintf(GPS,">SRM;FR_FLAG=F;ID_FLAG=F;CS_FLAG=F;EC_FLAG=F;CR_FLAG=F<");

delay_ms(1000);
inicia_gps(); // Funcion que inicia el GPS hasta que esta listo para usarse
delay_ms(1000);
inicbuff();                         // Borra buffer al inicio
presmenu();                         // Presenta el menú
enable_interrupts(int_rda);         // Habilita Interrupción RDA
enable_interrupts(global);          // Habilita interrupciones
delay_ms(25);
do
{
if(flagcommand)
comando();       // Si hay comando pendiente
                 // de procesar ... lo procesa.
}
while (TRUE);
}

void comando(void)
{
int  i,j,u,h;
int1 flagvalido=0;                  // Flag para detectar comandos invalidos
char arg[lenbuff];                  // Argumento de comando (si lo tiene)
disable_interrupts(int_rda);        // Dehabilito Interrupción RDA durante procesado
flagcommand=0;                      // Desactivo flag de comando pendiente.
for(i=0;i<lenbuff;i++)
{             // Limpia el argumento (por si lo hay)
arg[i]=0;
}

// Comando /?

if(cbuff[0]=='/'&&cbuff[1]=='?')
{   // Comparo inicio del buffer con comando "/?"
flagvalido=1;                    // Marco comando válido
presmenu();                      // Presenta el menú
}

// Comando >QPV<

if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='P'&&cbuff[3]=='V'&&cbuff[4]=='<')
{   // Comparo inicio del buffer con comando ">QPV<"
flagvalido=1;                    // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QPV<");

while(!kbhit(GPS));
{
for(i=0;i<30;i++)
{
gpsbuff[i]=fgetc(GPS);
}

//// Latitud
fprintf(PC,"Latitud:");
for(i=9;i<17;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);

//// Longitud
fprintf(PC,"Longitud:");
for(i=17;i<26;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);

//// Velocidad
fprintf(PC,"Velocidad:");
for(i=26;i<29;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}

// Comando >QTM<

if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='T'&&cbuff[3]=='M'&&cbuff[4]=='<')
{   // Comparo inicio del buffer con comando ">QTM<"
flagvalido=1;                    // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QTM<");

while(!kbhit(GPS));
{
for(i=0;i<28;i++)
{
gpsbuff[i]=fgetc(GPS);
}

// Hora
fprintf(PC,"Hora:");
for(i=4;i<6;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(':',PC);
for(i=6;i<8;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);

// Fecha
fprintf(PC,"Fecha:");
for(i=13;i<15;i++)
{
fputc(gpsbuff[i],PC);
}
fputc('/',PC);
for(i=15;i<17;i++)
{
fputc(gpsbuff[i],PC);
}
fputc('/',PC);
for(i=17;i<21;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);

// No. de Satelites
fprintf(PC,"Satelites:");
for(i=24;i<26;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}

// Comando >QVR<

if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='V'&&cbuff[3]=='R'&&cbuff[4]=='<')
{   // Comparo inicio del buffer con comando ">QVR<"
flagvalido=1;                    // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QVR<");

while(!kbhit(GPS));
{
for(i=0;i<35;i++)
{
gpsbuff[i]=fgetc(GPS);
}

// Version GPS
fprintf(PC,"Version GPS\r\n");
for(i=16;i<40;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}

// Comando >QST<

if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='S'&&cbuff[3]=='T'&&cbuff[4]=='<')
{   // Comparo inicio del buffer con comando ">QST<"
flagvalido=1;                    // Marco comando válido
inicia_gps();
}

// Retorno error o comando invalido

if(!flagvalido)
fprintf(PC,"¿%s?\r\n",cbuff);
inicbuff();                         // Borro buffer.
enable_interrupts(int_rda);         // Habilita de nuevo Interrupción RDA

}

Espero les sirva, cabe señalar que para que funcione su gps debe estar configurado con entrada/salida TAIP.

Saludos a todos desde México
« Última modificación: 28 de Septiembre de 2006, 19:37:14 por badtzdizzy »

Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
Re: Control GPS desde PC
« Respuesta #1 en: 28 de Septiembre de 2006, 15:09:47 »
Hola Badtzdizzy,  gracias por tus respuestas anteriores, espero que no te haya molestado por haber cambiado el post de lugar, pero ví que el lugar más adecuado era el espacio del c  ( sos en control de buffer) para  aprender a manejar el buffer, despues aplicarlo en lo que fuera. Ya digo espero no te haya molestado, sino te pido disculpas.

Como has podido ver yo tambien usé el codigo de Red-Pic, adaptandolo a mi manera y con una pincelada  muy importante de Nocturno.

Gracias tambien porque me habias comentado que cuando pudieses pondrias tu ejemplo, esto es muy importante el no tener problemas en compartir la información, ójala yo tuviera ya un buen nivel para hacer lo mismo.

Por cierto veo en tu código unos cuadradillos, que me supongo que serán errores al insertarlo en el foro. Red_ Pic me indicó la manera de hacerlo   
Código: C
  1. .........
      sin espacios en blanco donde estan los puntos ( donde va el código). Mi primera inserción fué peor porque  al parecer faltaba código. Cuando te sea posible, por favor, ponlo así que así lo vemos mejor. gracias.
La verdad que me puse muy contento al  poder ver recibida y transmitida una trama y por cierto tambien me acordé de tí. Gracias.

Chao Badtzdizzy, que viva Mexico, Espña y Todopic.
Desde A Coruña, España, para el MundoPIc, saludos de:
Santi

Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
Re: Control GPS desde PC
« Respuesta #2 en: 28 de Septiembre de 2006, 15:13:04 »
Losiento Badtzdizzy pero sale transformada ya la forma de insertar el c´digo , pero lo tienes en el post de Red- Pic de asunto "sos de control del buffer" en la zona de código c.

chao

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Control GPS desde PC
« Respuesta #3 en: 28 de Septiembre de 2006, 19:39:13 »
No te preocupes, ya modifiqué el código para que lo puedan entender mejor.

Saludos

Desconectado rashii

  • PIC10
  • *
  • Mensajes: 39
Re: Control GPS desde PC
« Respuesta #4 en: 08 de Agosto de 2007, 18:44:02 »
Hola, me inteseraria saber que gps funcionarian con ese codigo que has puesto...todos tienen el protocolo TAIP que usas para el envio de tramas? Un saludo.

Desconectado santi.sl

  • PIC10
  • *
  • Mensajes: 26
Re: Control GPS desde PC
« Respuesta #5 en: 12 de Agosto de 2007, 13:46:02 »
Hola, yo he usado hace meses  los modulos de  Trimble .   Por defecto sacan por el rs 232 las tramas nmea. Si configuras el módulo tambien trabaja con el protocolo TAIP, pero yo no le he usado.
Es muy simple le das alimentación y por el rs232 te empieza a echar  las tramas cada segundo ( según los programes), despues puedes recibirlas por el rs232( físico o por software) del pic como bien indica en el ejemplo Badtzdizzy tratandolo en un buffer.
Tengo poca experiencia seguro que habrá alguien que te pueda indicar más.

Desconectado rashii

  • PIC10
  • *
  • Mensajes: 39
Re: Control GPS desde PC
« Respuesta #6 en: 12 de Agosto de 2007, 14:34:38 »
Gracias santi.sl, me podrias decir que modelo tienes y donde lo compraste? Ya que en España segun he visto es dificil conseguirlos no? Un saludo.


 

anything