10 Apr 2013

GPS LEADTEK LR9540 DENGAN CAVR

Akhirnya setelah ada waktu yang menuntut, gps ini bisa diprogram juga.
Selamat Mencoba
Sebelum memprogram gps ini, pertama kita harus tau dulu format gps nya. format GPS LEADTEK LR9548S
Tegangan outputnya sudah TTL. Jadi kita sebenarnya ga perlu merancang atau menambahkan ic maxim pada rangkaian kita. Langsung aja kaki TX GPS dihubungkan ke kaki RX1(karna pada program ini menggunakan USART1).
Dan hati2 jangan terbalik memasang +5v dan GND gan. Bisa rusak ntar GPSnya. Kalo kaki TX RX nya ga apa2 kebalik. Kalo kebalik paling datanya aja ga keluar. Tinggal di balik aja. Kl supply yang kebalik,, wah saya ga brani ngebayangin.





Bagi yang ingin membuat board pcb untuk tempat pin GPS Leadtek 9540(tanpa menggunakan kit dari DT-Sense yang lebar sekali), dapat menggunakan referensi rangkaian berikut.


Perhatikan dengan sangat teliti dimana pin 1 dan dimana pin 19 berada, dimana pin regulator 3.3 volt, vcc dan ground. Jangan sampai salah atau terbalik karena dapat merusak GPS anda. Kalau pin TX atau RX yang terbalik, itu tidak masalah. Saya membuat rangkaian ini dan hasilnya normal, selama anda tidak salah dalam pembuatan pcb nya.
Tapi kalo anda menggunakan kit DT-Sense, pada J11,
kaki 1 ke ground
kaki 2 ke vcc
kaki 3 ke RX
kaki 4 ke TX


GPS Leadtek ini merupakan sebuat receiver satelit. Jadi hanya menerima saja. Ya sudah, kalau begitu tinggal ambil datanya, pilah-pilah datanya, lalu di proses.
Protokol yang digunakan GPS ini adalah NMEA. Dan dalam pembahasan kali ini, NMEA output Message yang digunakan adalah GPGGA. Untuk lebih lengkapnya, dapat anda baca sendiri pada datasheetnya.
Berikut penggalan format data GPGGA
Karakter pertama NMEA output diawali oleh $.
UTC terdiri dari 10 karakter
Latitude terdiri dari 9 karakter
North/South terdiri dari 1 karakter
Longitude terdiri dari 10 karakter
West/East terdiri dari 1 karakter
Cukup itu dahulu data yang akan diambil dan diolah. Dan mikrokontroler yang digunakan adalah ATMega128. Mengapa harus 128? Tidak harus atmega128. ATMega32 juga bisa. Apalagi ATMega64. 

#include <mega128.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
yang biru dibawah tu inisialisasi USART1 dari library codevision. 
#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8

#define TXB8 0
#endif

#ifndef UPE

#define UPE 2
#endif

#ifndef DOR

#define DOR 3
#endif

#ifndef FE

#define FE 4
#endif

#ifndef UDRE

#define UDRE 5
#endif

#ifndef RXC

#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART1 Receiver buffer

#define RX_BUFFER_SIZE1 100
char rx_buffer1[RX_BUFFER_SIZE1];

#if RX_BUFFER_SIZE1 <= 256

unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
#else
unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;
#endif

// This flag is set on USART1 Receiver buffer overflow

bit rx_buffer_overflow1;

// USART1 Receiver interrupt service routine

interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1[rx_wr_index1++]=data;
#if RX_BUFFER_SIZE1 == 256
   // special case for receiver buffer size=256
   if (++rx_counter1 == 0)
      {
#else
   if (rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
   if (++rx_counter1 == RX_BUFFER_SIZE1)
      {
      rx_counter1=0;
#endif
      rx_buffer_overflow1=1;
      }
   }
}

// Get a character from the USART1 Receiver buffer

#pragma used+
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1++];
#if RX_BUFFER_SIZE1 != 256
if (rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#endif
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-
// Declare your global variables here
unsigned char utc[10]; utc nya ditampung sebanyak 10 karakter termasuk tanda titik(.) nya
unsigned char lat[9];  latitude ditampung dalam arra 9 karakter
char NS;
unsigned char longt[10]; begitu juga dengan longitude
char EW;
int hour;
nah ni jam ini, kan UTC dalam format array. Sedangkan data utc itu sendiri adalah caracter. Oleh sebab itu, untuk melakukan proses penjumlahan atau pengurangan, harus kita lakukan dengan ASCII. Seperti program di bawah , (utc[0]-48). ASCII 0 adalah 48. Jadi misalnya data utc[0] adalah 5, maka (utc[0]-48) adalah 5-0.Sebelumnya kita tau format UTC GPS nya hhmmss.ssss dan jam nya bukan WIB. Kalo mau di ubah ke dalam wib, kita harus menambahkan jam nya +7.
Nah untuk itu, utc[0] dan utc[1] kita tambah 7. utc[0]sebagai puluhan maka kita kali 10 dan utc[1] sebebagai satuan. 
Dan jangan lupa untuk mengembalikan data perhitungan tadi kembali ke utc[o] dan utc[1]
void jam()
{       
hour=(((utc[0]-48)*10)+(utc[1]-48))+7;
if (hour>24)
hour=hour-24;
                
utc[0]=((hour/10)+48);
utc[1]=((hour%10)+48);
                
lcd_gotoxy(0,0); lcd_putsf("JAM"); lcd_gotoxy(0,1);
lcd_putchar(utc[0]);lcd_putchar(utc[1]);
lcd_putsf(" : ");
lcd_putchar(utc[2]);lcd_putchar(utc[3]);
lcd_putsf(" : ");
lcd_putchar(utc[4]);lcd_putchar(utc[5]);
}
menampilkan latitude
void latitude()
{
if (NS=='N')
{
lcd_gotoxy(0,0); lcd_putsf("North");
lcd_gotoxy(0,1); lcd_puts(lat);
}
else if (NS=='S')
{
lcd_gotoxy(0,0); lcd_putsf("South");
lcd_gotoxy(0,1); lcd_puts(lat);  
}
else
{
lcd_gotoxy(0,0); lcd_putsf("Are you lost?");
}
}
menampilkan longitude
void longitude()
{
if (EW=='E')
{
lcd_gotoxy(0,0); lcd_putsf("East");
lcd_gotoxy(0,1); lcd_puts(longt);
}
else if (EW=='W')
{
lcd_gotoxy(0,0); lcd_putsf("West");
lcd_gotoxy(0,1); lcd_puts(longt);  
}
else
{
lcd_gotoxy(0,0); lcd_putsf("Are you lost?");
}
}
program nya ini gan
void main(void)
{
// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud Rate: 4800
UCSR1A=0x00;
UCSR1B=0x98;
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x81;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1)
{
Sebagai tambahan, datanya tidak harus selalu $GPGGA, tetapi tergantung kebutuhan. Bisa saja $GPGLL, $GPGSA, dll
Sebagai tambahan lagi gan, getchar itu cuma per karakter. Maksud saya cuma mengambil 1 karakter. jadi ga bisa langsung ngambil berjibun gt, sehingga ambil 1 trus tampung dst.

if (rx_counter1>0)
{       
ch= getchar1();
if (ch=='$')
{      
ch= getchar1();
if (ch=='G')
{      
ch= getchar1();
if (ch=='P')
{   
ch= getchar1();
if (ch=='G')
{    
ch= getchar1();
if (ch=='G')
{     
ch= getchar1();
if (ch=='A')

ch=getchar1();
if (ch==',')
{
Nah dari pada kita pake banyak variabel untuk inisualisasi ini itu, kita pake array aja. Sehingga lebih simple. Bisa sih lebih simpe lagi program nya. Pake logika if aja bisa sih. Tapi buat nebelin laporan lumayan lah. Ssstttttt
utc[0]=getchar1();
utc[1]=getchar1();
utc[2]=getchar1();
utc[3]=getchar1();
utc[4]=getchar1();
utc[5]=getchar1();
utc[6]=getchar1();
utc[7]=getchar1();
utc[8]=getchar1();
utc[9]=getchar1();
getchar1();// , 
lat[0]=getchar1();
lat[1]=getchar1();
lat[2]=getchar1();
lat[3]=getchar1();
lat[4]=getchar1();
lat[5]=getchar1();
lat[6]=getchar1();
lat[7]=getchar1();
lat[8]=getchar1();
getchar1(); // ,Ini tu data yang diterima tanda koma (,). Nah kan di format GPS nya utc dan latitude ada dipisahin tanda koma(,).Kalo masih bingung dengan penjelasan ini, coba perhatikan dengan seksama format data GPS nya. 
NS=getchar1();
getchar1(); // ,
longt[0]=getchar1();
longt[1]=getchar1();
longt[2]=getchar1();
longt[3]=getchar1();
longt[4]=getchar1();
longt[5]=getchar1();
longt[6]=getchar1();
longt[7]=getchar1();
longt[8]=getchar1();
longt[9]=getchar1();
getchar1(); // , 
EW=getchar1();
nah tinggal dipanggil aja void untuk menampilkan data GPS nya.
Di sini kita tambahkan delay agar tampilan data nya bergantian. Kan lcd nya cuma 2x16 doank.
jam(); 
delay_ms(1000); lcd_clear(); 
latitude();  
delay_ms(1000); lcd_clear(); 
longitude(); 
delay_ms(1000); lcd_clear(); 
}
}
}
}
}                 
}

Untuk sementara, sampai disini dulu gan. belum duiproses lebih lanjut.
Sebenarnya, asal kita tau format GPS nya, kita dapat menggunakan konsep program ini.


2 komentar:

Anonim mengatakan...

gan,bisa mnta gambar rangkaiannya untuk pengaplikasian GPS leadtek LR9540.tolong kirim ke email ane gan gambar rangkaianx bserta ulsan lengkapnya gan.ane perlu bwt tgs akhir ane.thanks sebelumnya gan.

OdongkerZ mengatakan...

Siap gan. Nanti malam saya update lagi yang lebih rinci. BTW agan memakai kit dari DT-Sense atau cuma LR9540 nya saja ya?