Autor Tema: GPS PARALLAX LCD PIC16F876  (Leído 2693 veces)

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

Desconectado GAMCH333

  • PIC10
  • *
  • Mensajes: 8
GPS PARALLAX LCD PIC16F876
« en: 15 de Junio de 2011, 17:32:05 »
 :( :( :( :( :( :(

Reciba usted un cordial saludo, permítanme presentarme mi nombre es Gustavo Mtz, soy estudiante en México, la razón del presente mensaje es el de solicitar de la manera mas atenta su ayuda, ya que se presenta la situación de que necesito hacer un proyecto para detectar los caracteres de un modulo Parallax GPS Receiver Module 28146, en que este transmite ya la trama completa NMEC atreves de un solo pin, y se desea enviarlas a la computadora utilizando un PIC 16F876, via el protocolo rs232, la captura de la cadena de datos del GPS es por el pin C1, este es un código que estando probando pero no obtengo algún dato significativo, este es el código que estamos usando en la Escuela.
-------------------------------------------------------------------------------------
#include <16f876.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT

//SE DEFINE EL FORMATO PARA LA Tx a 9600 BAUDS VIA RS-232 STANDAR, DADO QUE SON LAS
//PROPIAS LIBRERIAS DEL COMPILADOR CCS, (VER EL LIBRO DE GARDER "PIC C")
//CON UN OSC. 4MHZ Vtx=1200 BAUDS , PARA UN OSC. 10MHZ  Vtx=9600

#use delay (CLOCK=20000000)
#use rs232 (BAUD=4800, XMIT=PIN_C6, RCV=PIN_C7)

// SE DEFINE LA DIRECCION DEL PUERTO B COMO ELEMENTO DE ENTRADA SALIDA.
// ASI COMO LA DIRECCION DE MEMORIA DE CADA UNO DE LOS DEMAS PUERTOS A,B,C.
// DICHA INFORMACION SE ENCUENTRA ESPECIFICADA EN EL REGISTRO DE MEMORIA DEL PIC.
// (MAYOR INFORMACIÓN DATA SHEET DE MICROCHIP WWW.MICROCHIP.COM

#use fast_io (b)
#byte porta = 5
#byte portb = 6
#byte portc = 7

// SE INCLUYE EL ENCABEZADO DE LA LIBRERIA PARA LA OPERACION DEL LCD
// POR EL PUERTO B,OBSERVAR PROGRAMA lcd_b.c

#include <lcd_b.c>
#use standard_io(C)
#use standard_io(A)

int j=0;
char cadena[71];
char *buffer=cadena; // UNION entre el puntero y el vector

#int_rda

void recepcion_serie() // Rutina de interrupción por recepción serie
  {   
   buffer[j] = getc();
   j++;
 
 
  }

void main()
{
lcd_init();
lcd_putc("\fPreparando...\n"); 
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(true)
   {if(cadena[17]=='V')
    { printf(lcd_putc,"\f ERROR DE\n\t RECEPCION");
     delay_ms(10);
    }
   else
      {If(input(pin_a1)==1)
         {printf(lcd_putc,"\fTiempo=%c%c:%c%c",cadena[7],cadena[8],cadena[9],cadena[10]);//imprime el tiempo
         printf(lcd_putc,"\nFecha=%c%c/%c%c/%c%c",cadena[55],cadena[56],cadena[57],cadena[58],cadena[59],cadena[60]);//imprime la fecha
         delay_ms(10);
         }
      else
         {printf(lcd_putc,"\fLat=%c%c%c%c.%c%c%c%c%c%c",cadena[20],cadena[21],cadena[22],cadena[23],cadena[25],cadena[26],cadena[27],cadena[28],cadena[29],cadena[30]); // imprime la latitud
          printf(lcd_putc,"\nLon=%c%c%c%c%c.%c%c%c%c%c%c",cadena[32],cadena[33],cadena[34],cadena[35],cadena[36],cadena[38],cadena[39],cadena[40],cadena[41],cadena[42],cadena[43]);//imprime la longitud
          printf(lcd_putc,"\n%d",j);
          delay_ms(10);
         }
      }
   if(j>=71)
      {buffer[71]=(0);
      j=0;
      }
   }
}


------------------------------------------------------------------------------------

Como podrá ver son escasos mis conocimientos en Lenguaje C, pero mi preocupación es que no completo algún programa de prueba para leer los datos y  enviarlos tanto al LCD   


Por lo anterior quisiera pedirle su ayuda, si me podría ayudar a completar o efectuar dicha función, en algún programa con código en C atreves del código CCS 4.0 con que cuento, para cumplir dicha tarea de capturar los datos del gps via el puerto serie, o bien agrdeceria que me pudieran proporcionar algun ejemplo en codigo c para desplegar losdatos en un lcd de 2x16

Sin más por el momento, agradeceré cualquier ayuda, con algún tipo de programa, y me encuentro a sus órdenes en el buzón de correo. gamartinezch@yahoo.com.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: GPS PARALLAX LCD PIC16F876
« Respuesta #1 en: 15 de Junio de 2011, 18:05:32 »
Hola amigo!
Una solucion seria hacer esto:
Citar
#USE RS232(BAUD= 4800,XMIT= PIN_B0,RCV= PIN_B0,FLOAT_HIGH,TIMEOUT=3000)


void main()
{
   char data[30];
   char flag;
   int i;
   delay_ms(2000);
   lcd_init();
  
   while(true)
   {
      flag=getch();
      
      if(flag=='G')
      {
         flag=getch();
         if(flag=='G')
         {
            flag=getch();
            if(flag=='A')
            {
               for(i=0;i<30;i++)
               {
                  data=getc();
                  if(data==',')
                     data=getc();
               }    
                  lcd_gotoxy(1,1);
                  printf(lcd_putc,"%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]);
                  lcd_gotoxy(1,2);
                  printf(lcd_putc,"%c%c %c%c%c%c%c%c%c %c",data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
                  lcd_gotoxy(1,3);
                  printf(lcd_putc,"%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
                  lcd_gotoxy(1,4);
                  printf(lcd_putc,"%c, %c%c",data[27],data[28],data[29]);
            }
         }    
      }      
   }
}  
  
El programa basicamente espera por una trama de datos especifica en mi caso es la GGA luego comienso a almacenar los datos que necesito, para luego mostrarlos en la lcd.
Otro detalle es como utilizas un pin del gps para recibir y enviar datos lo mas conveniente es declararlo como float, porque se corre el riesgo de producir un corto circuito  :mrgreen:

Hay cositas que estan demas pero funciona porque yo lo probe  :mrgreen:
Espero te sirva el empujoncito  :D
Saludos
« Última modificación: 15 de Junio de 2011, 18:31:52 por RALF2 »

Desconectado GAMCH333

  • PIC10
  • *
  • Mensajes: 8
Re: GPS PARALLAX LCD PIC16F876
« Respuesta #2 en: 16 de Junio de 2011, 17:37:03 »

Nuevamente  muchas  gracias por su ayuda,les estoy muy agraecido,muchas gracias, la razon del presente mensaje es el de solicitar una vez mas su ayuda, ya que gracias a su codigo, el sitema esta funcionando, no obstante al contar con un LCD DE 2X16, los datos que se me muestran son los siguientes.

2,N,09914.11,

Lo que no se si debo de adquirir algun lcd de 4x16, o bien estoy intepretando algo mal en lo referente al modo de colocar los caracteres a la salida del LCD, ya que lo que me solicitan es obtener algo asi.

LAT    3714.126, N
LONG  01959.172,W

Por lo que agradeceria que por favor me orientaran, sobre que cosa de hacer, si buscar un LCD de 4x16 que no se francamente donde se consiguen en mi pais, o si es algo de la programacion que deba de correjirse.A continuacion les muestro el codigo que se esta usando, y que fue el utilizado para mostrar ya algo de los datos que me piden.






include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

// SE INCLUYE EL ENCABEZADO DE LA LIBRERIA PARA LA OPERACION DEL LCD
// POR EL PUERTO C,OBSERVAR PROGRAMA lcd_b.c
#include <ce_lcd.c>


// SE DEFINE LA DIRECCION DEL PUERTO A,B,C COMO ELEMENTO DE ENTRADA SALIDA.
// ASI COMO LA DIRECCION DE MEMORIA DE CADA UNO DE LOS DEMAS PUERTOS A,B,C.
// DICHA INFORMACION SE ENCUENTRA ESPECIFICADA EN EL REGISTRO DE MEMORIA DEL PIC.
// (MAYOR INFORMACIÓN DATA SHEET DE MICROCHIP WWW.MICROCHIP.COM

#use fast_io (b)
#byte porta = 5
#byte portb = 6
#byte portc = 7


// SE DEFINE LA DIRECCION DEL PUERTO BO PARA ENTRDA GPS PARALLAX .

#USE RS232(BAUD= 4800,XMIT= PIN_B0,RCV= PIN_B0,FLOAT_HIGH,TIMEOUT=3000)

void main()
{
   char data[30];
   char flag;
   int i;
   delay_ms(2000);
   lcd_init();
   
   while(true)
   {
      flag=getch();
     
      if(flag=='G')
      {
         flag=getch();
         if(flag=='G')
         {
            flag=getch();
            if(flag=='A')
            {
               for(i=0;i<30;i++)
               {
             
                  data =getc();
                  if(data==',')
                     data=getc();
               }     
               lcd_gotoxy(1,1);
               printf(lcd_putc,"%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
               printf(lcd_putc,"%c, %c%c",data[27],data[28],data[29]);
               delay_ms(10);
                //  lcd_gotoxy(1,1);
                  //printf(lcd_putc,"%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
                  //lcd_gotoxy(1,2);
                 // printf(lcd_putc,"%c, %c%c",data[27],data[28],data[29]);
            }
         }     
      }       
   }



Nuevamente muchas gracias por su ayuda, les t





Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: GPS PARALLAX LCD PIC16F876
« Respuesta #3 en: 16 de Junio de 2011, 20:57:10 »
Buenas
Amigo trate de conseguirse una lcd mas grande de 16x4 te podria servir  :mrgreen:
El problema es que tu lcd es muy pequeña y no te aparece todo o sino tendras que recortar el codigo para que solo te muestre la latitud y longitud.

En mi caso me muestra la hora mundial, latitud, longitud, fix quality y el numero de satelites adquiridos :mrgreen:
Claramente no caben en una lcd de 2x16  :?

Saludos

Desconectado GAMCH333

  • PIC10
  • *
  • Mensajes: 8
Re: GPS PARALLAX LCD PIC16F876
« Respuesta #4 en: 17 de Junio de 2011, 14:19:43 »
Senor nuevamente muchas gracias por contestarme,si me lo perrmite le puedo comentar, que al estar preguntando por las tiendas de electronica en Mexico, lamentablemente por la tardanza o porque carezco de un provedor externo, tardaria de 2 a 3 semanas, en contar con uno de estos, por  lo que de momento no encuentro un un Lcd de 16x4 o de 20X4, por lo que le pregunte a mi Maestro la situacion y me recomendo que sacra los datos por el puerto serrie de  la PC  a la hiperterminal, y  usando un max 232 y conectandolo al pic16f876, comprobamos que si funciona y en la hiperterminal aprace el programa hola Crayola.,.

Ahora bien si me lo permite, le puedo comentar que se me hizo facil cambiar las instrucciones de


 lcd_gotoxy(1,1);
                  printf(lcd_putc,"%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]);
                 lcd_gotoxy(1,2);
                  printf(lcd_putc,"%c%c %c%c%c%c%c%c%c %c",data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
                  lcd_gotoxy(1,3);
                printf(lcd_putc,"%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
                lcd_gotoxy(1,4);
                 printf(lcd_putc,"%c, %c%c",data[27],data[28],data[29]);


Por estas otras.

                 printf("%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]);
                 
                  printf("%c%c %c%c%c%c%c%c%c %c",data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
                 
                 printf("%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
               
                 printf("%c, %c%c",data[27],data[28],data[29]);
            }

al momento de probar el programa no se imprime ningun dato  en la Hiperterminal, y suponia que deberia de mandarse los datos por lo que mi amigos comenttan que esta mal dada las instrucciones, por lo que ahora no se que hacer,pues se suponen que son caracteres nada mas lo que se trata de enviar a la hiperteminal o bien son nbytes o bits, no se que es exactamente lo que debo de hacer,

Por lo anterior quisiera pedirle una ayudadita, este es el codigo usado


#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

// SE DEFINE LA DIRECCION DEL PUERTO A,B,C COMO ELEMENTO DE ENTRADA SALIDA.
// ASI COMO LA DIRECCION DE MEMORIA DE CADA UNO DE LOS DEMAS PUERTOS A,B,C.
// DICHA INFORMACION SE ENCUENTRA ESPECIFICADA EN EL REGISTRO DE MEMORIA DEL PIC.
// (MAYOR INFORMACIÓN DATA SHEET DE MICROCHIP WWW.MICROCHIP.COM

#use fast_io (b)
#byte porta = 5
#byte portb = 6
#byte portc = 7


// SE DEFINE LA DIRECCION DEL PUERTO BO PARA ENTRDA GPS PARALLAX .

#use RS232(BAUD=4800,XMIT=PIN_B0,RCV=PIN_B0,FLOAT_HIGH,TIMEOUT=3000)

// SE DEFINE LA DIRECCION DEL PUERTO C PARA TX RS232 A  PC

#use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)



void main()
{
   char data[30];
   char flag;
   int i;
   delay_ms(2000);

   
   while(true)
   {
      flag=getch();
     
      if(flag=='G')
      {
         flag=getch();
         if(flag=='G')
         {
            flag=getch();
            if(flag=='A')
            {
               for(i=0;i<30;i++)
               {
             
                  data =getc();
                  if(data==',')
                     data =getc();
               }     
                 
                  printf("%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]);
                 
                  printf("%c%c %c%c%c%c%c%c%c %c",data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
                 
                 printf("%c%c%c %c%c%c%c%c%c%c %c",data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[24],data[25],data[26]);
               
                 printf("%c, %c%c",data[27],data[28],data[29]);
            }
         }     
      }       
   }



De antemano le ofrezco una disculpa, y le ruego por favor me pueda seguir apoyando.

Muchas Gracias

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: GPS PARALLAX LCD PIC16F876
« Respuesta #5 en: 17 de Junio de 2011, 16:58:23 »
Y no te va a funcionar porque tienes mal definido el rs232
debes hacerlo asi por ejemplo:

#use rs232(baud=4800, xmit=PIN_A1, rcv=PIN_A0, bits=8, stream=GPS)
#use rs232(baud=4800, xmit=PIN_B2, rcv=PIN_B1, bits=8, stream=CENTRAL)

y utilizar fprintf en vez de printf.
A y todo los datos te van a salir pegados colocales un espacio  :mrgreen:

Saludos