GPS modülü ile hız ölçer

Başlatan soneal, 10 Aralık 2010, 01:24:38

soneal

Selam arkadaşlar,
Ben GPS modülü,PIC16F877A ve LCD den oluşan devre elemanlarıyla hız ölçer yapmaya çalışıyorum. devre konusunda bir sıkıntım yok hepsinin birbiri ile bağlantısını kurdum fakat kod konusunda sıkıntı yaşamaktayım. compiler da hata vermiyor fakat PIC yükleyip çalıştırmaya kalktığımda doğru düzgün çalışmıyor. compiler olara CCS C programını kullanıyorum. NMEA stringlerinden de GPVTG yi kullanmaya çalıştım.direk hız bilgisi mevcut olduğu için. hata ya da başka bir öneriniz varsa arkadaşlar çok sevinirim.teşekkürler şimdiden.

devre elemanlarımda şunlar:

GPS modulü olarak="RCB-4H Antarıs 4 programmable GPS receiver board with supersense"
PIC olarak= "16F877A"
LCD ekran="Atm 1602a"

kod da yazdığım kadarıyla şu şekilde;

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#device *=16            // This enables use of all RAM.
#use delay (clock=20000000)
#use fast_io(b)
#define use_portb_lcd TRUE
#include<lcd.c>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8, ERRORS)
#define BUFFER_SIZE 96

BYTE       buffer[BUFFER_SIZE];  // implemented as a circular buffer

int comma = 0;
int dataLen;
int start, end, speedLen=0;
int i;
char speed[10];
char c;

short      ReadSerial = 0;
short      startok = 0;
int8       index,x;


double parseData()   // this function parses the  $GPVTG data strings to find the speed information
            {
                  dataLen = strlen(buffer);
                  for (i=0; i<dataLen; i++)
                  {
                        if (buffer[i] == ',')
                            comma++;
                        if (comma == 7)
                        {
                           i++;
                           start = i;
                           while (buffer[i] != ',')
                           {
                              speedLen++;
                              i++;
                           }
                        end = i-1;
                        break;
                        }
                  }

                  for (i=start; i<=end; i++)
                     {
                           speed[i-start] = buffer[i];
                     }
                  speed[i] = '\0';
                  return atof(speed);
         }


#int_rda
void gps_isr()
{/// note this routine needs to as short as possible since it is called
/// for each char received from GPS

c=getc() ;

putc(c);
   if (c=='$')
    {
    index = 0;
     startok = 1;
    }
   buffer[index] = c;
   index++;
   if (index>BUFFER_SIZE)
    {
     index = 0;
    }
   if ((index>62) && (startok==1) && (buffer[3]=='V') && (buffer[4]=='T') && (buffer[5]=='G'))
    {
    startok=0;
    disable_interrupts(int_rda);
    readserial = 1;
    }
}

#separate
void reset_serial()
 {
  ReadSerial = 0;
  index = 0;
  for(x=0;x<BUFFER_SIZE;x++) buffer[x]=' ';       // reset input buffer
  enable_interrupts(int_rda);
 }


int main(){

  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED, 0, 1);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_CCP1(CCP_OFF);
  setup_CCP2(CCP_OFF);

  enable_interrupts(GLOBAL);

  reset_serial();

  set_tris_b(0x00);       // set the b port to the output



      while(1)
             {

               if ( readserial == 1 )

               {

               lcd_init();        // initialize the lcd
               lcd_send_byte(0,0x0d);
               lcd_gotoxy(1,2);
               printf(lcd_putc,"\f SPEED = %f",parseData());
               delay_ms(1000);

               reset_serial();

               }

             }
}

Everlast

Doğru düzgün çalışmıyor la kastın nedir? daha iyi yardımcı olabilmek açısından soruyorum...
- - - Check it Out - - -

soneal

Öncelikle SPEED=0.00000 'dan başka bir rakam göremedim LCD de. bir diğer sorunda bazen gösteriyor bazen göstermiyor. her seferinde de açık alanda denedim. bir türlü anlam veremedim.

iyildirim

GPS üzerinde hangi mesajlar enable durumda bilmiyorum.  Ama modülü konfigüre etmedi isen GPVTG dışında ki diğer mesajlarda gelecektir.

görebildiğim kadarıyla; kod da olabilecek tek hata GPVTG için gelen mesaj boyunun en az 62  byte olmasını beklemen. VTG mesajının  62 byte uzunluğunda gelmesi de gördüğüm kadarı ile zor.
yapabileceklerin;
ya beklediğin mesaj boyunu kontrol et, düzelt. Yada sadece mesaj boyunda bakmak yerine $GPVTG'yi algıladıktan sonra "*" veya <CR><LF> bekleyip mesajı belirle ve parse et.





Everlast

#4
kodun main kısmına şunu ekleyebilirmisin, bakalım sana gelen data nedir... bu debugu yaptıktan sonra aldıgın datadan mı parse tarafında mı nerede hata oldugu açığa cıkacaktır.

açık alanda yanına laptop alabilirsin.

int i = 0;
      while(1)
      {

            if ( readserial == 1 )
            {

               lcd_init();        // initialize the lcd
               lcd_send_byte(0,0x0d);
               lcd_gotoxy(1,2);
               //------------------------------------
               // Burda herhangi bir uart kullanıp PC ye bağlayabilirsin. Daha rahat çalışırsın.   
               putc('D');putc('E');putc('B');putc('U');putc('G');putc('\n');
               putc('B');putc('U');putc('F'); putc('F');putc('E');putc('E');putc('R');putc('\n');
               putc('=');putc('=');putc('=');putc('=');putc('=');putc('=');putc('=');putc('=');   putc('\n');
            
               for(i = 0; i<BUFFER_SIZE; i++ )
               {
                  putc( buffer (i) );

                  if(i % 16 == 0 )
                     putc('\n');
            
               }
               //----------------------------------
            
            
               printf(lcd_putc,"\f SPEED = %f",parseData());
               delay_ms(1000);

               reset_serial();

               }

     }
- - - Check it Out - - -

soneal

Teşekkür ederim arkadaşlar ilginiz için. denemeye çalışacağım 2nizin önerisini de. haftasonu araya girmesi kötü oldu çünkü laboratuvarda yapmaya çalışıyordum okulda. nese elimden geldiğince en kısa sürede deneyip, çıkan sonuçları yazarım burdan.tekrar teşekkür ederim..

X-Fi

hangi bölümde okuyorsunuz kaçıncı sınıf.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

soneal

Elektrik-elektronik müh. 4. sınıf son dönem diyelim :))

matador

bu moduller ile iki cihazi haberlestirmek mumkun mu?

salih18200

ilk önce lcd ye basmak yerine parse ettiğin datayı picten rs232 ile bilgisayar terminaline basarak hatan varsa bunları ayıkla, yoksa kapalı bir kutuda ne olup bittiğini anlayamazssın belki yazdığın kodda mantık hatası vardır, belki gözden kaçırdığın püf noktaları vardır, belki donanımsal problemlerin vardır, belkide ... uzar gider. Yazdım çalışır mantığını bir köşeye bırakarak  yazdığın kodu adım adım debug ederek sorunraları tespit etmeni öneririm.

oooben

merhaa bu gps sensörünü nereden ve kaça bulabilirim teşekkürler

OptimusPrime

bence şöyle yap;

1) gps modülünü pc ye bağla
- nmea mesajlarını pc de kontrol et. hız bilgisi bu mesajın içinde var mı? yoksa boşuna sorunu kodda arama. gerekiyorsa modüle pc üzerinden göndereceğin bir kod ile hız bilgisini de almasını sağla
2) elde ettiğin mesajları kaydet
- pc den okuduğun mesajları bir kenara kaydet
3) proteus ile lcd, pic ve rs232 içeren devreni kur
- bu devreyi kurduktan sonra rs232 mesajlarına daha önce kaydettiğin nmea mesajlarını yaz
4) kod geliştirme ortamı hazır
- artık nmea mesajlarını almak için geliştireceğin kodları proteus üzerinden deneyeceksin.

hem donanımdan da o kadar emin olma belki orada da bir sorun vardır. yazılımdan emin olduktan sonra programı yükleyip donanımı da kontrol edebilirsin...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Kabil ATICI

hepsini bir anda yapmaya çalışacağına projeni parçaları ayır.
Ekrana görüntü geliyor bu konu tamam. Ekrana gelen görüntünün senin istediğin görüntü olduğundan emin ol. Bunun için ekrana sabit sayılar basabilirsin.
Eğer buda istediğin gibiyle sonra ekrana asıl gönderdiğin sayıyı basmaya çalış. Yani çevirici bölümün varsa onun girişine ne gelmesi gerekiyorsa o sayıyı sabit olarak ver ve onu bastır.

GPS için bunun için gelen verinin analizini düzgün yapman gerekir ki,en iyi seri port (RS232) ile veriyi bir bilgisayarda ayıklamaktır. Hatta doğrudan GPS alıcını bilgisayar üzerinden analız etmen yerinde olur.
Bu adım tamamsa, işlemcinin gps alıcıdan gelen veriyi alıp işlemek için zamanı olduğunu onaylaman gerekecek.  (saat kristali iletişim için hata vermeyecek bir değerde seçilebilir).
Bunun için GPS alıcıdan aldığın değeri bilgisayara göndermek değer teyidi için gerekli olabilir.

Herşey tamamsa ancak tümünü bir araya getirip deneyebilirsin.

Yazılanlar arasında kararlı bir çalışma sorunundan bahsetmişsin, bu durum işlemcinin çalışmasında, konnektör bağlantılarında veya GPS sisteminin alıcı sisteminin verimli çalışmamasından kaynaklanabilir.
ambar7

berat23

başlığı açan üye muhtemelen okulu bitirmiş, belki yüksek lisans yapmış,hatta askere gitmiş belkide evlenmiştir :)

LukeSkywalker

:D

Sensörü soran arkadaş , dealextremeden getirtebilirsin.