Autor Tema: GPS AL PIC  (Leído 2332 veces)

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

Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
GPS AL PIC
« 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


Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
Re: GPS AL PIC
« Respuesta #1 en: 17 de Septiembre de 2006, 13:24:32 »
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.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: GPS AL PIC
« Respuesta #2 en: 18 de Septiembre de 2006, 13:32:23 »
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;
Código: [Seleccionar]
">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

Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
Re: GPS AL PIC
« Respuesta #3 en: 19 de Septiembre de 2006, 20:00:36 »
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.








Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: GPS AL PIC
« Respuesta #4 en: 21 de Septiembre de 2006, 12:11:30 »
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

Desconectado santipic_9

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 36
Re: GPS AL PIC
« Respuesta #5 en: 21 de Septiembre de 2006, 15:56:31 »
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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: GPS AL PIC
« Respuesta #6 en: 21 de Septiembre de 2006, 19:51:58 »
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
« Última modificación: 21 de Septiembre de 2006, 19:53:34 por badtzdizzy »