Autor Tema: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28  (Leído 3313 veces)

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

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« en: 04 de Julio de 2015, 20:07:09 »
Saludos amigos del foro

Estoy leyendo la trama GPRMC que entrega el módulo GPS SIM28; ya apliqué todas las recomendaciones que encontré en el foro, pero no logro resolver el problema, configuré el módulo GPS para que solo me envíe la trama GPRMC a 9600 baudios.
El problema que tengo es el siguiente: Leo la trama por interrupción de la USART correctamente, pero cuando intento devolver dicha trama al hiperterminal, parece que la USART se bloquea (deja de transmitir), he intentado todos los trucos pero siempre me pasa lo mismo, sospecho que el buffer de salida se está saturando. Les pego el código por lo que me puedan colaborar. Gracias

Código: [Seleccionar]
#INCLUDE <16f1937.h>
#USE DELAY(CLOCK=16000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#BYTE OSCCON = 0x99
#BYTE PIR1 = 0x11
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 portb,0

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////

int1 flag=0;
int1 flag1=0;
char trama[70];
char trama1[70];
char trama2[70];
char dato;
int8 adres_trama;

 #int_RDA
  void serial_isr()
   {
   if (bit_test(PIR1,5))
   {
   bit_set(led3);
   dato=getc();
   switch(dato)
   {
   case 13:
   adres_trama=0;
   flag=1;
   break;
   
   case 10:
   break;
   
   default:
   trama[adres_trama]=dato;
   adres_trama++;
   trama[adres_trama]=0;
   break;
 
  }
 }
}
 

 void main()
   {
   char dato,serial, e=0;
   int xbuff=0;
      int contador, unid, decena, centena, n, i, j,k=0;
      OSCCON = 0b01111011; //RELOJ INTERNO A 18MHz
      TRISA = 0X01; //RA0 Entradntena,n,i,j;a.
      ADCON0 = 0B00000001; //Chanel AN0
      ADCON1 = 0XA0; //ADFM = 1 Justificado a la derecha ADCS = 010; Fosc / 32 Garantiza el tiempo de conversion minimo
      ANSELA = 0X01; //ANSA0 = 1 AN0 es entrada analoga.
      ANSELB = 0;
      TRISB = 0X0F;
      TRISC = 0B10100000; // 8 bits para enviar el dato al LCD
      TRISD = 0X00;
      TRISE = 0;
      PORTE = 0;
      PORTD = 0;
      PORTB = 0;

      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);

while(true)
   {
     bit_clear(led3);
     bit_set(led1);
      if (flag == 1)
     {
       if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='V')
         {
            strcpy(trama1,trama);
            printf( "%s \n\r", trama1 );
            flag=0;
         
            }
          }
        }
     }

Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #1 en: 05 de Julio de 2015, 17:28:21 »
No soy para nada experto pero tratare de ayudarte.

ay unas cosas ke no entiendo en el codigo ke escribiste:

Código: [Seleccionar]
#USE DELAY(CLOCK=16000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
segun lo anterior estas usando un cristal externo de 16 megas, pero en el codigo despues pones:

Código: [Seleccionar]
OSCCON = 0b01111011; //RELOJ INTERNO A 18MHzy lo ke le pones a OSCCON no coincide con lo ke defines en los FUSES, y eso puede generar problemas con el puerto serial.


si el problema es ek el buffer se esta saturando, hay una forma de solusionarlo, a mi me funciono, una ves tube un problema paresido al tuyo, yo no me di por vencido jamas me costo mucho trabajo pero asi lo arregle:
Código: [Seleccionar]
#use rs232(baud=9600, Parity=N, Bits=8, ERRORS, TIMEOUT=200)creo que si uno define los pines, entonses el pic usa el puerto serial por sofwar, y eso es malo es mejor el puerto serial por hadwar. "ERRORS" lo qe ase es ke si el puerto serial se satura, el pic lo repara. y "TIMEOUT=200" sirve para ke el puerto serial no se kede sentado esperando datos eternamente.

saludos.

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #2 en: 06 de Julio de 2015, 21:01:25 »
Gracias Rodrigo por su respuesta

Decepcionado, los problemas persisten, a veces me trabaja bien por un tiempo y se bloquea, sobre todo cuando intento imprimir la trama (siempre se bloquea); cuando intento imprimir un letrero diferente a la trama me trabaja bien, pero por un tiempo.

Sobre el reloj, decidí trabajar con el oscilador externo (20Mhz). Parece que problema es de hardware. Les pego el nuevo código con otras cosas más que le agregué.  La configuración del serial no me funcionó. Gracias

Código: [Seleccionar]
#INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>

#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#BYTE OSCCON = 0x99
#BYTE PIR1 = 0x11
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 portb,0

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////

int1 flag=0;
int1 flag1=0;
char trama[70];
char trama1[70];
char trama2[70];
char dato;
int8 gradosLa, minutosLa, gradosLo, minutosLo, gradosLa2, gradosLo2, minutosLa2, minutosLo2;
int16 segundosLa, decimal, segundosLo, segundosLa2, segundosLo2;
float distancia;
//char Config_GPS[]="$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
int8 adres_trama;

 #int_RDA
  void serial_isr()
   {
   if (bit_test(PIR1,5))
   {
   bit_set(led3);
   dato=getc();
   //putc(dato);
   switch(dato)
   {
   case 13:
   adres_trama=0;
   flag=1;
   break;
   
   case 10:
   break;
   
   default:
   trama[adres_trama]=dato;
   adres_trama++;
   trama[adres_trama]=0;
   break;
   //}
   //gets(trama);
   //bit_set(led3);
   //flag=1;
  }
 }
}
 

 void main()
   {
   char dato,serial, e=0;
   int xbuff=0;
      int contador, unid, decena, centena, n, i, j,k=0;
      //OSCCON = 0b01111011; //RELOJ INTERNO A 18MHz
      TRISA = 0X01; //RA0 Entradntena,n,i,j;a.
      ADCON0 = 0B00000001; //Chanel AN0
      ADCON1 = 0XA0; //ADFM = 1 Justificado a la derecha ADCS = 010; Fosc / 32 Garantiza el tiempo de conversion minimo
      ANSELA = 0X01; //ANSA0 = 1 AN0 es entrada analoga.
      ANSELB = 0;
      TRISB = 0X0F;
      TRISC = 0B10000000; // 8 bits para enviar el dato al LCD
      TRISD = 0X00;
      TRISE = 0;
      PORTE = 0;
      PORTD = 0;
      PORTB = 0;
   
      Printf("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\n\r");
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);

while(true)
   {
     bit_clear(led3);
   
     
      bit_set(led1);
      if (flag == 1)
     {
       if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='A')
         {
           if (!bit_test(portb,0) )
           {
            strcpy(trama1,trama);
            printf("DISTANCIA \n\r ");
            //printf("\n\r %s " trama1);
            bit_set(led4);
            flag=0;
           }
           else if(!bit_test(portb,1))
           {
            strcpy(trama2,trama);
           
            //distancia = sqrt((segundosLa - segundosLa2)*1.11 / 0.036) + ((segundosLo - segundosLo2)*1.11 / 0.036)*((segundosLo - segundosLo2)*1.11 / 0.036);
            //printf("Distancia= %3.3fMts", distancia);
           }
         }
            else
            printf("Sin senal \n\r ");
          }
        }
   }

 
 

 
   
   
 
   
   
 
   

   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #3 en: 06 de Julio de 2015, 22:33:45 »
Como conectas 3 UART juntas? o tenes algo mas que te lo aisle del GPRS y la PC ?, lo cual ahi veo que solo tenes definido uno solo.

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #4 en: 07 de Julio de 2015, 11:34:51 »
Gracias KILLERJC

Para transmitir del micro al PC uso una interface FT323RL (RS232 a USB) y los datos del GPS al micro y viceversa, lo hago directamente, simplemente realizo el intercambio manual con cables de conexión, cuando lo necesito.

Trataré de organizar mejor las conexiones, puede ser esto lo que me está generando el problema.  De todas maneras, no soy muy ducho en esto del C, pero creo que lo estoy haciendo bien, acudo al foro para que tantos experimentados que hay en esta maravillosa fuente de consulta, me den sus recomendaciones.  Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #5 en: 07 de Julio de 2015, 16:04:57 »
Pero RS232 no es hotplug, no lo podes andar conectando y desconectando a gusto xD como si fuera un pendrive.

Lo que podes hacer es si tu PIC tiene solo un puerto UART, es crear un UART por software, el CCS usa esta misma directiva:

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)

en la que creo que se le pone la opcion force_sw  y elegis los otros pines de salida, y para comunicarte con las 2, le das un nombre "stream" a cada una, entonces suponete que funcione con las opciones que doy (por que no las se )

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,stream=GPS)
#use rs232(baud=9600, xmit=pin_A0, rcv=pin_A1,stream=PC)          // Al detectar que no posee UART en esos pines lo crea por software.


en ves de usar putc(dato) para enviar un dato usas fputc(dato,stream) ejempo enviarle 0x40 al gps y 0x50 a la PC

fputc(0x40,GPS);
fputc(0x50,PC);

Pero esto es la vaga idea que tengo de CCS, asi que no lo tomes como que ES ASI, sino como que se puede y que deberias buscar un poco mas de info

Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #6 en: 07 de Julio de 2015, 20:22:21 »
ponlo asi:

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,ERRORS, TIMEOUT=200)

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #7 en: 07 de Julio de 2015, 21:35:29 »
Gracias Rodrigo

El problema continúa, no es problema de hardware.  Explicaré con más detalle lo que está pasando: La rutina de interrupción se ejecuta perfectamente (guarda la trama), el main también se ejecuta bien, mientras el if
Código: [Seleccionar]
if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='V'),

no se cumpla, si se mete al if, y se pulsa RB0 o RB1, debe imprimir cualquier cosa
Código: [Seleccionar]
if (!bit_test(portb,0) )
           {
            strcpy(trama1,trama);
            printf("DISTANCIA \n\r ");
            //printf("\n\r %s " trama1);
            bit_set(led4);
            flag=0;
           }
y ahí es donde la USART no recibe más datos (se bloquea). No se si falta configurar algo de la USART o que puede ser lo que pasa. La única trama, el módulo GPS la transmite cada segundo, o sea que hay suficiente tiempo para recibirla.  Buscando en el foro encontré que el bit OERR del registro RCSTA, indica cuando se presenta un error en la recepción, pero, si hay error qué puede ser?. Nuevamente pego el código que me presenta el error
Código: [Seleccionar]
#INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>

#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
//#fuses NOMCLR
//#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,ERRORS, TIMEOUT=200)
#use fast_io(c)
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#BYTE OSCCON = 0x99
#BYTE PIR1 = 0x11
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 portb,0

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////

int1 flag=0;
int1 flag1=0;
char trama[70];
char trama1[70];
char trama2[70];
char dato;
int8 gradosLa, minutosLa, gradosLo, minutosLo, gradosLa2, gradosLo2, minutosLa2, minutosLo2;
int16 segundosLa, decimal, segundosLo, segundosLa2, segundosLo2;
float distancia=3.1416;
//char Config_GPS[]="$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
int8 adres_trama;

 #int_RDA
  void serial_isr()
   {
   if (bit_test(PIR1,5))
   {
   bit_set(led3);
   dato=getc();
   switch(dato)
   {
   case 13:
   adres_trama=0;
   flag=1;
   break;
   
   case 10:
   break;
   
   default:
   trama[adres_trama]=dato;
   adres_trama++;
   trama[adres_trama]=0;
   break;
  }
 }
}
 

 void main()
   {
   char dato,serial, e=0;
   int xbuff=0;
      int contador, unid, decena, centena, n, i, j,k=0;
      TRISA = 0X01; //RA0 Entradntena,n,i,j;a.
      ADCON0 = 0B00000001; //Chanel AN0
      ADCON1 = 0XA0; //ADFM = 1 Justificado a la derecha ADCS = 010; Fosc / 32 Garantiza el tiempo de conversion minimo
      ANSELA = 0X01; //ANSA0 = 1 AN0 es entrada analoga.
      ANSELB = 0;
      TRISB = 0X0F;
      TRISC = 0B10000000; // 8 bits para enviar el dato al LCD
      TRISD = 0X00;
      TRISE = 0;
      PORTE = 0;
      PORTD = 0;
      PORTB = 0;
   
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);

while(true)
   {
     bit_clear(led3);
   
     
      bit_set(led1);
      if (flag == 1)
     {
       if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='V')
         {
           if (!bit_test(portb,0) )
           {
            strcpy(trama1,trama);
            printf("DISTANCIA \n\r ");
            //printf("\n\r %s " trama1);
            bit_set(led4);
            flag=0;
           }
           else if(!bit_test(portb,1))
           {
            strcpy(trama2,trama);
           
            printf("Distancia= %1.4fMts", distancia);
            flag=0;
           }
         }
            else
            printf("Sin senal \n\r ");
            flag=0;
          }
        }
   }

 
 

 
   
   
 
   
   
 
   

   
   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #8 en: 07 de Julio de 2015, 22:36:28 »
Segun recibis, haces esto:

   trama[adres_trama]=dato;
   adres_trama++;
   trama[adres_trama]=0;

Por que pones ese 0 ?, no sera un '\0' ?

es lo que vi recien.

Otra cosa veo que estas iniciando la trama cuando encontras un '\r' , puede ser que envie un "\r\n" al final, lo cual tu forma del if no entraria..
Proba antes del if largo ese que tenes, ponerle un printf("%s",trama); y Ver exactamente que recibiste.


Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #9 en: 08 de Julio de 2015, 15:40:41 »
en realidad creoe qe  '\0'  es lo mismo que poner 0

creo ke este codigo para restaurar el puerto serial de foma manual te pede ayudar

Código: [Seleccionar]
void reset_uart(void)
{
   unsigned char temp;

   CREN = 0;
   while(kbhit()){temp = getc();}

   OERR = 0;
   FERR = 0;
   CREN = 1;

   return;
}


como tu PIC es el 16f1937 debes poner las direcsiones adecuadas de los bits.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #10 en: 08 de Julio de 2015, 20:13:00 »
Bueno, voy a volver a repetir lo mismo y es la ultima ves que lo hago.
No podes meter 2 UART, no va a funcionar como vos queres, Si queres simularlo, directamente conecta el converser USB-RS232 al PIC y desde ahi mandale el string, TAL CUAL te lo manda el GPS.

En tu codigo:

Código: C
  1. if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='V')
  2.          {
  3.            if (!bit_test(portb,0) )
  4.            {
  5.             strcpy(trama1,trama);
  6.             printf("DISTANCIA \n\r ");
  7.             //printf("\n\r %s " trama1);
  8.             bit_set(led4);
  9.             flag=0;
  10.            }

Es insensato pensar que tengas tiempo para cambiar manualmente los cables de la UART, desde que se entro al if y llego al printf... que son 200us (exagerando por que es menos) para cambiar un cable? nada.  :lol:

Si tenes errores en la UART es por que o no se atendieron rapido (no lo creo posible cuando lo haces por una interrupcion OERR, es decir un overrun, por que esta lleno el buffer), o seguro que hay algo malo con la velocidad/envio por que no se detecto el bit de stop a tiempo. ( FERR Bastante Posible cuando vos desconectas los cables a tu antojo ). Recorda que cada "byte" (frame) de la UART es 1bit de start +5a9 bits de info + 1/2 bit de stop.

Si queres tomar algo desde el micro y luego pasarlo a la PC para ver que llega o llego deberias:

-Conecta el GPS a la PC, recibi datos desde el GPS, para obtener una muestra, hacer el cambio de cables y conectar PIC-PC. Enviar solo Solo un string. Y aca tu PC simularia exactamente lo que es el GPS. Lo arreglas para que funcione todo y luego unis PIC-GPS. Fin

- La otra que se me ocurre pero no me gusta es la de cambiarlos como estas haciendo, pero tener 2 botones para deshabilitar/limpiar comlpetamente la UART, cambiar los cables y volver a habilitarlo, esto te llevaria a tener al menos 2 botones para indicar a cual e estas comunicando, Si PC o GPS, para que no ocurra de mandarle los datos al GPS y no la PC. O un boton de start/reset y otro para eleigr cual, y en ambos casos unos leds para indicar si esta activo la UART y a donde se dirige (2 leds). Y no conte el codigo agregado por culpa de eso.

- Hace una UART por software y comunicarse con ambos. al mismo tiempo.

- Cuando se termine de transimitir una trama completa, detener la UART e interrupcion, quedarse esperando por un boton indicado por un led, cambiar los cables y presionar el boton, el cual activa nuevamente la UART, pero no la interrupcion, esto es para debug nomas pero es mas engorroso que todo lo demas.

« Última modificación: 08 de Julio de 2015, 20:24:02 por KILLERJC »

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #11 en: 08 de Julio de 2015, 21:10:59 »
Gracias por su colaboración

El programa a este momento ya me está funcionando con los pines RB0 y RB1, simplemente lo que hice fue deshabilitar la interrupción en el momento que se está transmitiendo la trama, luego un retardo de 200ms y vuelvo a habilitar. Sobre el cero que coloco adelante de cada dato, es para que cuando se esté imprimiendo la trama y se encuentre el cero que un NULL, la impresión termina.

Respecto al cambio manualmente del puerto, tal vez no me hice entender, normalmente no hago ningún cambio, simplemente la trama que envía el GPS se la ingreso al PIC directamente por el RX y el TX del PIC se la envío al PC a través de la interface FT232, para ver la respuesta del PIC en el PC.  Cuando necesito verificar que el GPS si me está enviando la trama, pues desenergizo el circuito y hago el cambio, el TX del GPS se lo conecto al RX del FT232 y puedo ver la trama en el PC.  De todas manera todavía falta bastante trecho, por que lo que se sigue son los cálculos de raíz cuadrada y elevar al cuadrado, cosa que nunca he realizado en el CCS, por que lo que se trata es de calcular una distancia entre dos puntos utilizando las coordenadas que envía el módulo GPS; en visual C++ me trabaja bien ingresándole las dos coordenadas manualmente, intenté hacer los cálculos en el CCS y el PIC se bloquea, próximamente les pediré ayuda sobre esta tarea, porque la instrucción POW (elevar al cuadrado) el CCS no la reconoce. Les pego el último código que me funcionó:

Código: [Seleccionar]
#INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>

#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
//#fuses NOMCLR
//#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,ERRORS, TIMEOUT=200)
#use fast_io(c)
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#BYTE OSCCON = 0x99
#BYTE PIR1 = 0x11
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 portb,0

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////

int1 flag=0;
int1 flag1=0;
char trama[70];
char trama1[70];
char trama2[70];
char dato;
int8 gradosLa, minutosLa, gradosLo, minutosLo, gradosLa2, gradosLo2, minutosLa2, minutosLo2;
int16 segundosLa, decimal, segundosLo, segundosLa2, segundosLo2;
float distancia=3.1416;
//char Config_GPS[]="$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
int8 adres_trama;

 #int_RDA
  void serial_isr()
   {
   if (bit_test(PIR1,5))
   {
   bit_set(led3);
   dato=getc();
   switch(dato)
   {
   case 13:
   adres_trama=0;
   flag=1;
   break;
   
   case 10:
   break;
   
   default:
   trama[adres_trama]=dato;
   adres_trama++;
   trama[adres_trama]=0;
   break;
  }
 }
}
 

 void main()
   {
   char dato,serial, e=0;
   int xbuff=0;
      int contador, unid, decena, centena, n, i, j,k=0;
      TRISA = 0X01; //RA0 Entradntena,n,i,j;a.
      ADCON0 = 0B00000001; //Chanel AN0
      ADCON1 = 0XA0; //ADFM = 1 Justificado a la derecha ADCS = 010; Fosc / 32 Garantiza el tiempo de conversion minimo
      ANSELA = 0X01; //ANSA0 = 1 AN0 es entrada analoga.
      ANSELB = 0;
      TRISB = 0X0F;
      TRISC = 0B10000000; // 8 bits para enviar el dato al LCD
      TRISD = 0X00;
      TRISE = 0;
      PORTE = 0;
      PORTD = 0;
      PORTB = 0;
   
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);

while(true)
   {
     bit_clear(led3);
   
     
      bit_set(led1);
      if (flag == 1)
     {
       if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='A')
         {
           if (!bit_test(portb,0) )
           {
           disable_interrupts(INT_RDA);
           disable_interrupts(GLOBAL);
            strcpy(trama1,trama);
            //printf("DISTANCIA \n\r ");
            printf("\n\r %s " trama1);
            bit_set(led4);
            flag=0;
            delay_ms(200);
            enable_interrupts(INT_RDA);
            enable_interrupts(GLOBAL);
           }
           if(!bit_test(portb,1))
           {
            disable_interrupts(INT_RDA);
            disable_interrupts(GLOBAL);
           strcpy(trama2,trama);
           
            printf("\n\r %s " trama2);
            flag=0;
            enable_interrupts(INT_RDA);
            enable_interrupts(GLOBAL);
           }
           }
            else
            printf("Sin senal \n\r ");
            flag=0;
          }
        }
   }
   


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #12 en: 08 de Julio de 2015, 22:27:50 »
A2 = A * A

La raiz cuadrada vas a tener que buscar alguna funcion de CCS, o usar la libreria math de C o imlpementar un algoritmo: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots


Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #13 en: 08 de Julio de 2015, 23:45:59 »
te voy a a yuda, creo que ya se cual es el problema, coloca el use rs232 asi:

Código: [Seleccionar]
#use rs232(baud=9600, UART1, ERRORS, TIMEOUT=200)
estava asiendo pruebas con el bluetoth inalambrico HC-05 y estaba teniendo problemas parecidos al tuyo, le agrege el UART1 y se arreglo

 depronto tu tienes el mismo problema

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: PROBLEMAS CON LECTURA DE MÓDULO GPS SIM28
« Respuesta #14 en: 10 de Julio de 2015, 19:22:14 »
La dicha me duró muy poco, hoy lo revisé varias veces y nuevamente se bloqueó.  Lo que estoy creyendo es que debido a tantas interrupciones repetitivas, el contador de programa (CP) se carga con un valor erróneo y retorne a una parte del programa donde no hay líneas de código y esto es lo que hace que se pierda. Esto se soluciona activando el perro guardián (WDT), es bastante engorroso esto pero tacará hacerlo, es lo único que saca al pic de un bloqueo (lo lleva a un reset).  Me estoy decepcionando de éste compilador (CCS), estos problemas no se me presentan en assembler, que es el lenguaje en el que siempre he programado; me pasé al C por los cálculos matemáticos que en assembler son tediosos, aunque la MICROCHIP brinda en sus notas de aplicación, todas las rutinas matemáticas habidas y por haber; en el foro también se encuentran.

En mi caso, la mayoría de mis proyectos son para comercializar, por lo que no pueden fallar, pero esto me está decepcionando.  :5]