Subscribe! Follow me! Add me Facebook! Plus me Google!
Showing posts with label AT Mega 16. Show all posts
Showing posts with label AT Mega 16. Show all posts

Wednesday, December 12, 2012

Source Code GPS EM-411 to Microcontroller



Dibawah ini adalah source code untuk mengakses GPS EM-411 menggunakan Microcontroller ATMega16.


#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <stdio.h> 
#include <stdlib.h>
#include <delay.h>

unsigned char data[60];
unsigned char sendx1[5],sendx2[12],sendy1[5],sendy2[12],valid[5];
unsigned char jam[2],menit[2],detik[2],kec[4];
unsigned char tanggal[6],tinggi[4];
int i,ln1,lt1,a,b=0;
float ln2,lt2,speed;
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xD23A >> 6;
TCNT1L=0xD23A & 0xff;
a++;
}

void main(void)
{
TCCR1A=0x00;
TCCR1B=0x04;
TIMSK=0x04;
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x8F;

lcd_init(16);

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

while (1)
      {
      valid[0]=' ';
        valid[1]=' ';  
        i=0;  
        do{                  
            i++;
            data[i]=getchar();
            valid[1]=data[i];  
            if(data[i]=='')
                break;
            if(data[i-4]=='G' && data[i-3]=='P' && data[i-2]=='R' && data[i-1]=='M' && data[i]=='C')
            {            
                i=0;
                do{     
                    data[i]=getchar();
                    valid[1]=data[i];
                    if(data[i]=='')
                        break;                                                                    
                    i++;
                }while(data[i]!=0x0D);  
                sprintf(kec,"%c%c%c%c",data[39],data[40],data[41],data[42]);
                sprintf(sendx1,"%c%c",data[14],data[15]);
                sprintf(sendx2,"%c%c%c%c%c%c%c",data[16],data[17],data[18],data[19],data[20],data[21],data[22]);
                sprintf(sendy1,"%c%c%c%",data[26],data[27],data[28]);
                sprintf(sendy2,"%c%c%c%c%c%c%c",data[29],data[30],data[31],data[32],data[33],data[34],data[35]);  
                valid[0]=data[12]; 
                if(data[50]==',')
                    sprintf(tanggal,"%c%c%c%c%c%c",data[51],data[52],data[53],data[54],data[55],data[56]);
                if(data[49]==',')
                    sprintf(tanggal,"%c%c%c%c%c%c",data[50],data[51],data[52],data[53],data[54],data[55]); 
                sprintf(jam,"%c%c",data[1],data[2]);
                sprintf(menit,"%c%c",data[3],data[4]);
                sprintf(detik,"%c%c",data[5],data[6]);
            }    
           
        }while(data[i]!='$');
        
        i=0;  
        do{                  
            i++;
            data[i]=getchar();
            valid[1]=data[i];  
            if(data[i]=='')
                break;  
            if(data[i-4]=='G' && data[i-3]=='P' && data[i-2]=='G' && data[i-1]=='G' && data[i]=='A')
            {            
                i=0;
                do{     
                    data[i]=getchar();
                    valid[1]=data[i];
                    if(data[i]=='')
                        break;                                                                    
                    i++;
                }while(data[i]!=0x0D);  
                if(data[58]=='M')
                    sprintf(tinggi,"%c%c%c",data[54],data[55],data[56]);
                if(data[57]=='M')
                    sprintf(tinggi,"%c%c%c%c%c%c",data[53],data[54],data[55]); 
            }
        }while(data[i]!='$');
        
        if(valid[1]=='')
        {          
            data[i]=' ';
            valid[0]=' ';
            valid[1]=' ';
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_putsf("Disconnected");
            for(i=12;i<=15;i++)
            {                               
                lcd_gotoxy(i,0);
                lcd_putsf(".");
                delay_ms(800);    
                PORTC.3=0;
                delay_ms(700);    
                PORTC.3=1;  
            }
        }                                                                     
        if(valid[0]=='V')
        {                
            valid[0]=' ';
            valid[1]=' ';
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_putsf("Wait");
            for(i=4;i<=7;i++)
            {                               
                lcd_gotoxy(i,0);
                lcd_putsf(".");
                delay_ms(800);    
                PORTC.3=0;
                delay_ms(700);    
                PORTC.3=1;  
            }  
        }                  
        if(valid[0]=='A')
        { 
            if(b==0)
            {      
            lt1=atoi(sendx1);
            lt2=atof(sendx2);
            lt2=(lt2/60)+lt1;
            sprintf(sendx2,"%0.6f",lt2);
            lcd_clear();    
            lcd_gotoxy(0,0);
            lcd_putsf("Lt: -");
            lcd_gotoxy(5,0);
            lcd_puts(sendx2);
            lcd_gotoxy(15,0);
            lcd_putsf("S");
        
            ln1=atoi(sendy1);
            ln2=atof(sendy2);
            ln2=(ln2/60)+ln1;
            sprintf(sendy2,"%0.6f",ln2);
            lcd_gotoxy(0,1);
            lcd_putsf("Ln: ");
            lcd_gotoxy(4,1);
            lcd_puts(sendy2);      
            lcd_gotoxy(15,1);
            lcd_putsf("E");  
            if(a>=5)
            {        
                b=1;
                a=0;
            } 
            }   
             if(b==1)
            {      
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts(tanggal);
            
            lcd_gotoxy(0,1);
            lcd_puts(jam);
            lcd_gotoxy(2,1);
            lcd_putsf(":");
            lcd_gotoxy(3,1);
            lcd_puts(menit);
            lcd_gotoxy(5,1);
            lcd_putsf(":");
            lcd_gotoxy(6,1);
            lcd_puts(detik); 
            lcd_gotoxy(8,1);
            lcd_putsf("  ");
            
            if(a>=10)
            {        
                b=2;
                a=0;
            }
            } 
             if(b==2)
            {       
            speed=atof(kec);
            speed=speed*1.852;
            sprintf(kec,"%0.3f",speed);
            lcd_clear();    
            lcd_gotoxy(0,0);
            lcd_putsf("Speed:");
            lcd_gotoxy(7,0);
            lcd_puts(kec);
            lcd_gotoxy(10,0);
            lcd_putsf("km/jam");
              
            lcd_gotoxy(0,1);
            lcd_putsf("Tinggi:");
            lcd_gotoxy(8,1);
            lcd_puts(tinggi);      
            lcd_gotoxy(11,1);
            lcd_putsf("meter");
            
            if(a>=5)
            {        
                b=0;
                a=0;
            }
            }
        }  
      };
}

untuk penjelasannya, silahkan tanyakan saja :D

Friday, September 28, 2012

RFID to Microcontroller (AT Mega 16)

Cara membaca data RFID (Radio Frecuency Identification) pada mikrokontroller lalu menampilkan ke LCD 16 x 2 persiapkan alat - alat sebagai berikut:
1. Sistem minimum microcontroller termasuk LCD 16 x 2.

2. RFID Reader yang support ID-12 (ex : RFID Starter Kit)



3. RFID (transponder).



Source Code :


#include <mega16.h>
#include <delay.h>
#include <string.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here
int i=0;
char data[50],convert[50],gbg[50],temp;
void main(void)
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);

while (1)                 
      {        
        i=0;          
        while(data[i]!=0x0A){     
            temp=getchar();
            if(temp=='' || temp==0x0D || temp==0x0A|| temp==0x03)
                break;
            if(temp!=0x02){
                i++;                 
                data[i]=temp;
                sprintf(gbg,"%c",temp);
                strcat(convert,gbg); 
            }                
        }                     
        lcd_gotoxy(0,0);
        lcd_puts(convert);
      };
}

Monday, May 7, 2012

AT Command dengan Microcontroller (Code Vision AVR / CVAVR)


             Disini akan diuraikan bagaimana cara pembacaan at command menggunakan Codevision AVR, mulai dari perintah - perintah AT command yang sering dipakai sampai pembuatan dan pemrograman AT Command pada Codevision AVR.

Berikut adalah pengecekan perintah - perintah AT Command yang digunakan :
1. AT , perintah yang dipakai untuk memerintah apakah AT Command sudah terkoneksi
2. AT+CMGF , untuk jenis format yang dipakai apakah berupa teks atau PDU.
3. AT+CMGL , untuk membuka daftar SMS pada SIM card.
4. AT+CMGR , untuk membaca SMS.
5. AT+CMGD , untuk menghapus SMS.
6. AT+CPMS , untuk mengatur memori yang digunakan apakah HP atau SIM card.
7. AT+CBC , untuk mengecek batere HP.
8. AT+CUSD , untuk mengecek pulsa.



Berikut komponen yang digunakan :
1. Sistem minimim mikrokontroler AT Mega16 tanpa RS232.
2. LCD 16x2
3. HP Sony Ericsson T630 (bisa juga untuk seri T610)
4. Headset Sony Ericsson.
4. USB to serial (jika ingin mencoba apakah AT command pada HP berhasil atau tidak)

Berikut langkah - langkah pembuatannya :
1. Persiapkan semua komponen diatas, tanpa itu semua kemungkinan kesalahan bisa terjadi.
2. Buat posisi pin headsetnya hanya RX,TX,GND yang dipakai.





Pin
Name
Description
1
ATMS
Audio to mobile
2
AFMS/RTS
Audio from mobile/RTS (connected to GND in cable?)
3
CTS/ONREQ
CTS/Mobile Station On REQuest (connected to GND in cable?)
4
Data in
Data to mobile (Rx)
5
Data out
Data from mobile (Tx)
6
ACC in
Accessory control to mobile. Used as Rx in some models for flashing.
7
ACC out
Accessory control from mobile/handsfree sense. Used as Tx in some models for flashing
8
AGND
Audio signal ground + 0V reference
9
Flash
Flash memory voltage + Service (shorted to pin 11 in service cable)
10
DGND
Digital ground
11
Vcc
DC + for battery charging + External accessory powering



3. Buka Codevision AVR.
4. New Project.


5. Untuk program serialnya pilih option yang tertera sesuai gambar dibawah ini :


Berikut listing program untuk terima sms dan kemudian mengirim balik statusnya :


#include <mega16.h>
#include <delay.h>                
#include <stdio.h>
#include <lcd.h>
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm

unsigned char cek[100];
unsigned int a,i;
void main(void)

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
lcd_init(16);

while (1)
    {                
    printf("ATE0");            // perintah agar tidak ada echo
    putchar(0x0D);             // enter    
    while(getchar()!= 'K'){};  // tunggu sampai menerima K / OK
    while(getchar()!=0x0A){};  // tunggu sampai newline / garis baru
    
    reload:      
      printf("AT+CPMS=");      // penempatan memori sms
      putchar('"');
      printf("ME");
      putchar('"');
      putchar(0x0D);             
      while(getchar()!= 'K'){};
      while(getchar()!=0x0A){};   
      printf("AT+CMGF=1");
      putchar(0x0D);             
      while(getchar()!= 'K'){};  
      while(getchar()!=0x0A){};
      printf("AT+CMGL=");      // perintah untuk melihat semua isi sms  
      putchar('"');
      printf("all");
      putchar('"');
      putchar(0x0D);         
      while(getchar()!=0x0A){};
      a=0;
      do{               
        a++;
        cek[a]=getchar();
      }while(cek[a]!=0x0A);   // isi cek[a] dengan no. HP dll selama bukan newline     
      
      if(cek[1]=='O')         // jika tidak ada sms
      {
        for(a=0;a<70;a++){cek[a]=' ';}   // pengosongan array         
        delay_ms(50);
        goto reload;
      }
         
      a=0;
      do{               
        a++;
        cek[a]=getchar();
      }while(cek[a]!=0x0A);  // isi cek[a] dengan isi sms selama bukan newline
                                                                                                     
      if(cek[1]=='R' && cek[2]=='I' && cek[3]=='D' && cek[4]=='L' && cek[5]=='A')  
      {    
        printf("AT+CMGD=1");     // perintah hapus sms di index 1
        putchar(0x0D);
        while(getchar()!='K'){}; 
        while(getchar()!=0x0A){};
        printf("AT+CMGD=1");
        putchar(0x0D);
        while(getchar()!='K'){}; 
        while(getchar()!=0x0A){};
        printf("AT+CMGF=1");
        putchar(0x0D);             
        while(getchar()!= 'K'){};  
        while(getchar()!=0x0A){};
        printf("AT+CMGS=");        // perintah kirim sms
        putchar('"');
        printf("08xxxxxxxxxx");    // no HP tujuan
        putchar('"');
        putchar(0x0D);   
        while(getchar()!=0x3E){};  // tunggu sampai muncul karakter ">"
        delay_ms(5);
        printf("AT Command berhasil");  
        putchar(0x1A);             // CTRL + Z
        while(getchar()!='K'){};   
      }  
       
      else  
      {              
        printf("AT+CMGD=1");
        putchar(0x0D);
        while(getchar()!='K'){}; 
        while(getchar()!=0x0A){};
        printf("AT+CMGD=1");
        putchar(0x0D);
        while(getchar()!='K'){}; 
        while(getchar()!=0x0A){};
        printf("AT+CMGF=1");
        putchar(0x0D);             
        while(getchar()!= 'K'){};  
        while(getchar()!=0x0A){};
        printf("AT+CMGS=");
        putchar('"');
        printf("08xxxxxxxxxx");    // no hp tujuan
        putchar('"');
        putchar(0x0D);   
        while(getchar()!=0x3E){};
        delay_ms(10);
        printf("Format Pesan Salah");
        putchar(0x1A);             
        while(getchar()!='K'){}; 
      }       
      delay_ms(50);           
    };
}

Keterangan : Jika pada alat tidak memakai LCD 16x2, program lcd untuk uji coba jangan dulu dihapus.

Tuesday, April 10, 2012

Clock internal pada mikrokontroler

       Mikrokontroler didesign dengan clock yang cepat hitungan perdetik (Hertz). Pada beberapa tipe board mikrokontroler sering dipasang clock eksternal atau sering disebut xtal, dengan kata lain penambahan clock xtal adalah untuk mempercepat kerja mikrokontroler. Tapi pada keadaan tertentu seperti saat kita hanya membuat program yang tidak begitu rumit atau pin xtal pada mikrokontrolernya bergabung dengan pin input output dan bisa juga pada mikrokontrolernya tidak menyediakan pin xtal, maka kita dapat menggunakan clock internal pada mikrokontrloer tersebut.

Berikut cara untuk membangunkan clock internal pada mikrokontroler.
       Biasanya setiap mikrokontroler memiliki clock internal tersendiri dan sudah terlampir pada datasheetnya. Disini yang digunakan adalah mikrokontroler jenis Atmel ATMega16.



           Lakukan konfigurasi seperti diatas. pada option Program Fuse Bit(s) jika diberi tanda centang bernilai 0 jika tidak maka bernilai 1. Pada kasus ini yang dibutuhkan adalah bagaimana kita membangunkan clock yang ada didalam mikrokontroler. clock yang disediakan sekitar 2Mhz sampai 8Mhz.
        Perubahan nilai clock yaitu tergantung CKSEL yang kita pilih, mulai dari CKSEL0, CKSEL1, CKSEL2. Untuk bit pada CKSEL yang akan menentukan berapa clock yang dibuat semuanya terlampir pada datasheet masing-masing mikrokontroler. Untuk jenis ATtiny13 biasanya yang dirubah adalah tombol CKSEL0-2, SUT0-1, dengan CKDIV.
           Setelah pemilihan bit selesai maka lakukan lah proses downloading ke mikrokontrolernya, kemudian setelah didownload lakukan proses pengecekan fuse bit agar proses yang dilakukan memang sudah benar.





Peringatan : Hati - hati jika mikrokontroler yang dipakai jenisnya tidak memiliki pin untuk xtal terus salah memilih option fuse bit, akibatnya mikrokontroler tidak dapat dipakai lagi (misal jenis ATTiny13)!