avatar_BİDİL

GPS Saat,Tarih,Enlem,Boylam,Hız vs. Bilgileri Lcd Ekranda Gösterme

Başlatan BİDİL, 15 Ocak 2013, 13:31:26

BİDİL

16F877 ile daha önce yine bu forumda verilen programı denemeye karar verdim ve bir adte mause tipi PS2 bağlantılı RS232 destekleyen bir Gps modül aldım. Bilgi alıp Lcd ekrana yazıyor ama bazen gereksiz bilgileri gereksiz yerlerde veriyor. Örneğin 15/01/13 gibi tarih 10 sn düzgün gösteriliyor, 5 sn 41/16/00 gibi bir rakam çıkıyor. Tabiiki bu rakamlar yine NMEA 0183 formatı içinde yer alan geçerli bilgiler.
Saniyede bir aşağıdaki bilgiyi GPS çekiyor.

$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43

Kırmızı yazılı alanımız Saat kısmı 09:27:50
Yeşil olan alanımız ise Tarih Bölümü 28-05-11

$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45

Bir sn sonraki değişikliği görebilirsiniz.  09:27:51

Yukarıdaki bilgileri Lcd ekrana taşımak mümkün ve program çalışıyor. Bu  kesin ancak kullanılan Gps modülün haberleşme protokolü değişkenlik gösteriyor. Kullandığım Gps , 9600 bps/N/1 protokolü kullanıyor ve benim takıldığım nokta tam olarak bu Pic16F877A ya bu bilgiler nasıl tanımlanır.
Bilgisi olan arkadaşlardan yardım bekliyorum.

BİDİL

cihazın haberleşme hızı ile alakalı bir düzeltme yapmam lazım
Set Baud Rate 4800, Data Bit: 8, Parity: None, Stop Bit: 1, Flow Control: None
şeklinde tanımlamam lazım

ete

Bu iş için PicMultiCalc.exe isimli programı kullanabilirsin. Nette ara ve bul.
Orada seçenkler arasında yer alan USART seçeneğini seçersen karşına gelen ekranda gerekli yerleri doldurursan gerekli ayarlar ya clipboard a yada basic komut satırı olarak hafızaya alınacaktır.
Ben senina dına yaptım ancak işlemci frekansıda bu işte önem kazanmaktadır. Ben 4 Mhz için bunları tespit ettim.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 12  ' 4800 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Bu arada mesajlarını büyük harfle yazma lütfen. !!!!!!!!!!!!

Ete

BİDİL


runhek


umitco

Kullandığınız modülün fiyatı , modeli ve bağlantılarını paylaşabilirmisiniz rica etsem ?

BİDİL

kullandığım modülün markası ublox max-6Q serisi dahili rtc  mevcut  (eğer 3 volt ile bckp ederseniz)
30 Euro fiyatı var datasheetine buradan ulaşabilirsiniz. Basic dilinde programı mevcut forumda paylaşılmış durumda ancak css kodları yok sanırım.http://www.kayraelektronik.com/download/gps-moduller/max/MAX-6_DataSheet_GPSG6-HW-10106.pdf

runhek

http://www.denizelektronik.com/pdf/SiRFStar3_GPS_Modulu.pdf 
gps modülünü aldım. ttl-usb dönüştürücü ile bilgisayara veri alabiliyorum fakat pic ile bir türlü bağlantı sağlayamadım. ttl çıkışını direk rx'e bağladım olmadı, rs232 çıkışına max232 bağlayıp rx'e verdim gene olmadı. Ne yapabilirim? Kod olarak aşağıdakini denedim.

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>   // lcd.c dosyası tanıtılıyor
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7,parity=N, stop=1, ERRORS)

int k,i=0,basla=0;
char input[80];


#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
       printf(lcd_putc,"\f 111 CCS C1"); // LCD'ye veri gönderiliyor.
      delay_ms(1000); // 1 sn gecikme
    static unsigned char c;
   
    c=getchar();
   
    if(c==30){basla=1; printf(lcd_putc,"%c",c);}
   
    if(basla==1)
    {   
      input=c;
      i++;
    }
   
    if(i=48) { i=0;basla=0;}
}

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   
   
    enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
    set_tris_a(0x01);   // TX,RX uçlarının hangi pinler olacağını tanımlıyor
    delay_ms(3000);     // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor
    output_high(pin_c5);// RC5 çıkışı ilk anda sıfırlanıyor
    output_low(pin_A0); // RC5 çıkışı ilk anda sıfırlanıyor
    lcd_init();         // LCD'yi hazırla

printf(lcd_putc,"\f     ana C"); // LCD'ye veri gönderiliyor.
      delay_ms(1000); // 1 sn gecikme
   enable_interrupts(int_rda);//int_rda KESME AKTİF
   
     

    disable_interrupts(int_rda); // int_rda kesmesini pasif yap

     
   
   
    printf("%c %c %c",input[10],input[11],input[12]);
    delay_ms(3000);     
    putc(13); delay_ms(1000);
    putc(26);
   
}



pwm3434

eğer  mesajım fazla  konu dışı  olmuş ise afedersiniz. pc'de Application Uygulamasını kullanarak  pc ile pıc  seri iletişim  yapmak için ve  açmış olduğunuz asıl  konu  olan gps cihazları gibi  diğer  çevresel birimlerle  iletişimi sağlamak için  hangi   programlama dilini  tavsiye  edersiniz.

ento

Uzun zaman önce Picbasic ile yapmış olduğum Gps'ten gelen NMEA bilgilerini LCD üzerinde gösteren çalışmam yararlı olur diye tahmin ediyorum. Kolaya gelsin.

pwm3434

ento aşağıdaki   komut  satırları eklediğin rardaki bas'dan alıntıdır. skip kelimesinin görevi nedir. değişkenlerin  tanımlandığı  satırda  skip  adında  bir  değişken   tanımlanmamış,bildiğim  kadarıyla da   skip diye  pbp komutu  yok  asm  dili ile  bağlantılı değil  gibi  çünkü @ tanımlaması  gerekli.

GPS:
SerIn2 GPSin,baudGPS,[wait("$GPRMC"),skip 10,DEC1 digit,DEC1 digit1,DEC1 digit2,dec1 digit3,skip 1,dec1 digit4,dec1 digit5,skip 3,dec1 digit6,dec1 digit7,dec1 digit8,dec1 digit9,dec1 digit10,skip 1,dec1 digit11,dec1 digit12]
    pause 1000

ento

ÖRNEK NMEA KODU aşağıdaki gibi olsun.
$GPRMC,130133,A,3522.631,N,03023.637,E,013.4,254.9,251106,000.0,E*72
wait("$GPRMC")

kodundan sonra skip 10 deyince
,130133,A,
bilgilerini atlar. Sayarsan burada 10 adet bilgi var. Bundan sonra
3522.631,N
bilgisi yani LAT bilgisi digit değişkenlerine kaydedilir.
Kısacası "skip" istemediğiiz bilgileri atlamaya yarar.

pwm3434

$GPRMC,130133,A,3522.631,N,03023.637,E,013.4,254.9,251106,000.0,E*72
ento bu yukarıdaki  satırda   8 tane bilgi  sayabiliyorum  nasıl  10  tane  bilgi  sayacacağız. neyse ento skip'in kullanılmasını anladım ama  pııc'ler skip'i nasıl  tanıyabiliyorki  şunu  anlamış  değilim skip bir  komutmu  değilmi.nerden  çıktı  bu  skip'de  diyebilirim şunu  söyleyim  bu  nerden  çıktı  kelimesi kaba bir kelime olarak  yanlış  anlaşılmasın  sadece ancak  bu  şelikde  bir  ifade ile  soruyu  sormada kullandım.

ento

SERIN2 komutu açıklamasına bakarsan anlayacaksın.

SKIP followed by a count will skip that many characters in the input stream. For example, SKIP 4 will skip 4 characters..


ete

Skip bir komut parametresidir. Her zaman kullanılmaz. Gerektiğinde kullanırsın. Genelde birden fazla bilgi okunan yerlerde sana ilk baştan bi iki tanesi lazım ise gerisini skip yapıp atlayabilirsin.
Örnek vereyim. Bir ds1302 saat entegresinden okuma yaptığın zaman sn den başlayıp yıl değerine kadar okuman gerekir. Sen sadece sn ve dak ile ilgileniyorsan ilk ikisini okuyup gerisini skip yapabilirsin. Yapmazsan dünya baymaz ama ya sn - dak ve yıl bilgisini kullanıyor isen ne olacak. İki alternatifin var. Birincisi tüm registerleri sırası ile okumak ikincisi işine yaramayanları skip yapmak.

Ete

Powered by EzPortal