Friday, July 18, 2014

Membuat jam digital LCD 2 X16 tanpa RTC ATmega8

Assalamualaikum Selamat malam sahabat microver's...kabar baik semua kan? Di malam yang mendekati lebaran 2014 ini saya akan sharing tentang bagaimana mambuat jam digital dengan LCD 2 X16 tanpa RTC dan dengan software Code vision AVR.

Ini adalah penampakan hasil jam nya :D


 Lalu apa itu RTC?
 RTC /Real Time Clock merupakan suatu chip (IC) yang memiliki fungsi sebagai penyimpan waktu dan tanggal. RTC DS1307 merupakan Real-time clock (RTC) yang dapat meyimpan data-data detik, menit, jam, tanggal, bulan, hari dalam seminggu, dan tahun valid hingga 2100. 56-byte, battery-backed, RAM nonvolatile (NV) RAM untuk penyimpanan. RTC DS1307 merupakan Real-time clock (RTC) dengan jalur data parallel yang memiliki Antarmuka serial Two-wire (I2C), Sinyal luaran gelombang-kotak terprogram (Programmable squarewave), Deteksi otomatis kegagalan-daya (power-fail) dan rangkaian switch, Konsumsi daya kurang dari 500nA menggunakan mode baterai cadangan dengan operasional osilator. Tersedia fitur industri dengan ketahana suhu: -40°C hingga +85°C. Tersedia dalam kemasa 8-pin DIP atau SOIC.

 Ok langsung saja menuju ke proyek,Jujur untuk source code program jam digital ini adalah hasil dari editan program yang telah di buat orang h3x..tapi dari sini kita akan lebih mengerti dan memahami tentang source code dalam program tersebut. Mari kita buat .... let's go.....

  1. Untuk langkah pertama kita buka software CAVR.
  2. Pilih menu File>>New, dan pilih option Project, OK
  3. Nanti ada kotak konfirmasi,apakah kamu akan dipandu dengan wizard apa tidak mau,saya sarankan anda menggunakan nya karena nanti dalam pemograman agar lebih urut dan gampang dalam menganalisa suatu kesalahan pemograman.tampilan nya sebagai berikut : (Pilih Yes)
  4. lalu muncul kotak dialog berikut,pilih OK 
  5. Setelah itu akan muncul tampilan seperti gambar di bawah ini. Pada tab Chip, pilih chip ATmega8, dan Clock 12 MHz (Dalam hal ini bisa menyesuaikan dengan sismin yang anda pakai). 
  6. Pilih menu Ports dan setting port yang akan digunakan.karena saya menggunakan portD sebagai output  maka saya pilih yang port D,oiya jangan lupa mensetting data direction nya menjadi OUT karena nanti kita akan menggunakan port D tersebut sebagai output ke tampilan LCD 2x16
  7. Didalam program ini,saya menggunakan 3 buah tombol sebagai input untuk mensetting jam tersebut yaitu tombol SET,UP,DOWN lihat sesuai gambar.
  8. Sedangkan agar Fungsi LCD sesuai dengan program maka kita konfigurasi LCD tersebut seperti gambar dibawah ini,dalam proyek kali ini saya menggunakan minsis ATmega8 mas Bebit Deartha atau bisa kunjungi situs beliau disini
  9. Untuk langkah selanjutnya kita akan mensetting timer,hal ini sangat perlu dan penting karena disini kita akan menentukan waktu 1 detik nya.setting sesuai gambar dibawah ini.
  10. Bila sudah kita click Program>>Generate,Save and exit lalu akan muncul jendela penyimpanan,beri nama file project sesuka anda dan siap untuk menuliskan source code jam. 
  11. Ketika muncul jendela untuk menuliskan souurce code,disitu sudah terdapat beberapa code program yang sudah terinisialisasi oleh code wizard AVR,maka untuk lebih cepatnya anda bisa menghapus semua tulisan itu,lalu copy paste kan program ini di situ tadi :
  12. /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :
    Version :
    Date    : 13/07/2014
    Author  : REY
    Company : UMT
    Comments:


    Chip type               : ATmega8
    Program type            : Application
    AVR Core Clock frequency: 12,000000 MHz
    Memory model            : Small
    External RAM size       : 0
    Data Stack size         : 256
    *****************************************************/
    unsigned char temp[6];
    int detik=0, menit=0, jam=12, indeks=6;

    #include <mega8.h>
    #include <stdlib.h>
    #include <delay.h>



    // Alphanumeric LCD functions
    #include <alcd.h>

    // Timer1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Reinitialize Timer1 value
    TCNT1H=0xD23A >> 8;
    TCNT1L=0xD23A & 0xff;
    detik++;

    }

    void jam_digital()
    {
    if (detik==60)
          {
             lcd_clear();
             detik=0;
             menit++;
          }   
          
           if (menit==60)
          {
            lcd_clear();
            menit=0;
            jam++;
          }
            
          if (jam==24)
          {
            lcd_clear();
            jam=0;
          }
    }

    void tampil_lcd()
    {
          lcd_gotoxy(0,0);
          lcd_putsf("Jam Digital REY");
         
          itoa(jam,temp); //menampilkan JAM di LCD
          lcd_gotoxy(4,1);
          lcd_puts(temp);
         
          itoa(detik,temp); //menampilkan DETIK di LCD
          lcd_gotoxy(10,1);
          lcd_puts(temp);   
         
          lcd_gotoxy(9,1); //menampilkan :
          lcd_putsf(":");                 
         
          itoa(menit,temp); //menampilkan MENIT di LCD
          lcd_gotoxy(7,1);
          lcd_puts(temp); 
                        
          lcd_gotoxy(6,1); //menampilkan :
          lcd_putsf(":");  
         
          lcd_gotoxy(1,1); //menampilkan <<
          lcd_putsf("<<"); 
         
          lcd_gotoxy(13,1); //menampilkan :
          lcd_putsf(">>");
    }

    void set_jam()
    {
    if (PINB.0==0 && indeks==6)
       {   
            TIMSK=0x00; //MENGHENTIKAN TIMER
            delay_ms(300);
            indeks=5;
            while (PINB.0==1 && indeks==5)
            {      
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            jam=jam+10;
                            if (jam>=24)
                                    {
                                            jam=23;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            jam=jam-10; 
                            if (jam<=9)
                            {
                            lcd_clear();
                            if (jam<0)
                                    {
                                            jam=0;
                                    }   
                            }
                    }      
            }
       }
      
    if (PINB.0==0 && indeks==5)
       {      
            delay_ms(300);
            indeks=4;
            while (PINB.0==1 && indeks==4)
            {          
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            jam=jam+1;  
                            if (jam>=24)
                                    {
                                            jam=23;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            jam=jam-1;
                            if (jam<=9) 
                            {
                            lcd_clear();
                            if (jam<0)
                                    {
                                            jam=0;
                                    } 
                            }
                    }      
            }
       }
      
    if (PINB.0==0 && indeks==4)
       {      
            delay_ms(300);
            indeks=3;
            while (PINB.0==1 && indeks==3)
            {                    
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            menit=menit+10;  
                            if (menit>=60)
                                    {
                                            menit=59;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            menit=menit-10;
                            if (menit<=9)
                            { 
                            lcd_clear();
                            if (menit<0)
                                    {
                                            menit=0;
                                    }
                            }
                    }      
            }
       }

    if (PINB.0==0 && indeks==3)
       {      
            delay_ms(300);
            indeks=2;
            while (PINB.0==1 && indeks==2)
            {           
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            menit=menit+1;
                            if (menit>=60)
                                    {
                                            menit=59;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            menit=menit-1;
                            if (menit<=9)  
                            {
                            lcd_clear();
                            if (menit<0)
                                    {
                                            menit=0;
                                    }
                            }
                    }      
            }
       }

    if (PINB.0==0 && indeks==2)
       {      
            delay_ms(300);
            indeks=1;
            while (PINB.0==1 && indeks==1)
            {              
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            detik=detik+1;
                            if (detik>=60)
                                    {
                                            detik=59;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            detik=detik-1;
                            if (detik<=9)
                            {
                            lcd_clear();
                            if (detik<0)
                                    {
                                            detik=0;
                                    }
                            }
                    }      
            }
       }

    if (PINB.0==0 && indeks==1)
       {      
            delay_ms(300);
            indeks=0;
            while (PINB.0==1 && indeks==0)
            {        
            tampil_lcd();
                    if (PINB.1==0)
                    {
                            delay_ms(300);
                            detik=detik+1;
                            if (detik>=60)
                                    {
                                            detik=59;
                                    }
                    }
           
                    if (PINB.2==0)
                    {
                            delay_ms(300);
                            detik=detik-1;
                            if (detik<=9)
                            {
                            lcd_clear();
                            if (detik<0)
                                    {
                                            detik=0;
                                    }
                            }
                    }             
            }
            indeks=6;
            TIMSK=0x04; //MEMULAI LAGI TIMER
            delay_ms(450);
       }
    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=P State1=P State0=P
    PORTB=0x07;
    DDRB=0x00;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTD=0x00;
    DDRD=0xFF;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 11,719 kHz
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: On
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x05;
    TCNT1H=0xD2;
    TCNT1L=0x3A;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x04;

    // USART initialization
    // USART disabled
    UCSRB=0x00;

    // 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;

    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTD Bit 2
    // RD - PORTD Bit 0
    // EN - PORTD Bit 3
    // D4 - PORTD Bit 4
    // D5 - PORTD Bit 5
    // D6 - PORTD Bit 6
    // D7 - PORTD Bit 7
    // Characters/line: 16
    lcd_init(16);

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

    while (1)
          {
          jam_digital();     
          tampil_lcd();
          set_jam();


          }
    }
     
  13. Lalu click project >> check syntax,jika program diatas benar maka tidak akan muncul tanda error,,hal ini adalah sebuah instruksi dari CAVR untuk mengecheck penulisan dalam program yang kita buat tadi.
  14. Lalu click Project >> Compile
  15. Lalu click Project >> Build All 
  16. Nah program sudah menghasilkan file hex yang siap untuk dimasukkan ke dalam chip microcontroller..
Selamat mencoba dan berkarya
Keep calm rek..

7 comments:

Unknown said...

kang kalo buat timer hitung mundur listingnya bagaimana? mohon penjelasannya akang :)

Agus Suratno said...

Mantab bro kode langsung berjalan, thank,s.
Ijin copas ya .....

Unknown said...

gan ada simulasi di proteusnya gak?

Unknown said...

rangkaian proteusnya gimana mas?

Anak Pertama Official said...

skema rangkaian nya minta dong pak, hehe trims.

bill said...

kok pas saya coba 1 detik nya bukan 1 detik tapi baru 1 detik pas sudah 10 detik ya ?

ferdhi ardhiyansah-13-13180379 said...

mas kok kodingan saya ga jalan

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by KAMPUS UMT TANGERANG | Supported by Bebit Deartha - Ristu Sadewa | Kota Tangerang