Kamis, 14 Februari 2013

Membuat Display Counter Up- Down dengan Mikrokontroller ATmega16



Sebenarnya agak bingung mulai dari mana enaknya nulis kata-katanya, oh iya maaf banget kawan-kawan sudah lumayan lama saya gak posting lagi. Maklum kemaren banyak banget kendalanya dimulai kebanjiran, sakit dan ngerjain Project “ Sistem Reader ID magnetic  ditambah LCD TFT 230X400 yang lumayan cukup menyita waktu berfikir saya, dan Alhamdulillah sekarang sudah ada titik terang. Amiien..

  • Begini kawan postingan kali ini sedikit berbeda, karena saya akan coba menjawab permintaan kawan kita “ Todalife” pada Postingan Membuat Skematik Counter  UpDown," beliau meminta di buatkan contoh Counter Updown dengan menggunkan mikrokontroller dan ditampilkan dengan 7 segment. Project ini saya beri judul “ Membuat Display Counter Up- Down dengan Mikrokontroller ATmega16”.

Untuk lebih memudahkan kita dalam memahami Project ini, saya akan bagi menjadi tiga bagian yaitu :




Bagian Input : Tombol Push button.
Dalam project kali ini saya mengunakan Push button sebagai input, karena saya pikir komponennya cukup murah dan gampang banget didapatkan, jika ada dari kawan-kawan yang mau nyoba mempraktekan itu bisa lebih memudahkan, tentunya bagian input ini bisa kita modifikasi dengan komponen lain sesuai kebutuhan kita misalnya dengan sensor infra Red , Sensor gerak, Optokopler dan lain sebagainya sesuai kebutuhan kita. Tombol push button ini berfungsi sebagai tombol input untuk Up, down dan reset.
Jika kawan – kawan belum mengerti  mengenai Tombol Push Button Silahkan Baca Postingan Saya sebelumya ”Tombol Push Button”.

Bagian Proses: Mikrokontroller dan Program
Bagian Proses ini kita akan menggunakan mikrokontroller AVR ATmega 16, fitur yang akan kita gunakan adalah timer/counter 1 16 bit (dapat menghitung maksimal 65536), letak timer / counter1 ini berada pada PORTB.1 yang difungsikan sebagai UP, dan PORTA.0 sebagai DOWN.

Bagian Output: 7segment 
Pada bagian output kita akan menggunakan 7segment, yang berfungsi untuk menampilkan nilai counter ke 7segment, sistem  pemograman yang akan digunakan adalah dengan menggunakan sistem scaning, yaitu sistem pemograman dengan pengiriman data perbagian (satu persatu per 7segment) keunggulan sistem ini kita tidak perlu memerlukan port yang bayak untuk mengontroll banyak komponen dibanding dengan sistem pemograman standar .
Oke sepertinya sudah terlalu panjang dan lebar pembahasannya , entar jenuh lagi  he… kita langsung  saja ke gambar skematiknya, skematiknya seperti berikut ini kawan:

Gambar: Skematik Counter Up Down Menggunakan Mikrokontroller ATmega16

Untuk listing Programnya seperti berikut ini:

//  -----------------------------------------------------------------------
//                              LES ELEKTRONIKA BLOG
//                          " Padepokan Pendekar Solder "
//  Kunjungi blog Les ELektronika Untuk Mendapatkan Pengetahuan Elektronika
//                 di: -==> http://leselektronika.blogspot.com/
//               Sharing melalui e-mail di: munandar89@yahoo.com
//  -------------------------------------------------------------

#include // memasukan fungsi ic mikrokontroller
#include  // memasukan fungsi delay/jeda

#define yes 1;
#define no  0;

int data, data_temp, tampil;
int status_in;
char ribuan=0, ratusan=0, puluhan=0, satuan=0, ubah;

void data_counter();
void Display_7segment();



void data_counter()
{
    if (TCNT1==10000){TCNT1=0;}//jika counter bernilai 10000 maka kembali lagi ke 0000
   
  
    if (PINA.0==1)
    { status_in=1;
    }
    if ((PINA.0==0)&&(status_in==1))
    { status_in=0;
     if(TCNT1>=1){
                    TCNT1--;    }
     if(TCNT1<=0){
                    TCNT1=0;    }              
    }
    data=TCNT1;//nilai dari register counter1 diumpankan ke data
  
   
}

void Display_7segment()
{
      PORTC=ribuan;//mengirimkan data ribuan
      PORTD=0b11110111;//menyalakan digit1
      delay_ms(5);

      PORTC=ratusan;//mengirimkan data ratusan
      PORTD=0b11111011;//menyalakan digit2
      delay_ms(5);

      PORTC=puluhan;//mengirimkan data puluhan
      PORTD=0b11111101;//menyalakan digit3
      delay_ms(5);

      PORTC=satuan;//mengirimkan data satuan
      PORTD=0b11111110;//menyalakan digit4
      delay_ms(5);
      //lamanya waktu scanning ditentukan oleh intruksi delay
}

void Convert_ke_7segment()//fungsi untuk mengubah kedalam format 7segment
{
      if (ubah==0){tampil=0xc0;}
      if (ubah==1){tampil=0xf9;}
      if (ubah==2){tampil=0xa4;}
      if (ubah==3){tampil=0xb0;}
      if (ubah==4){tampil=0x99;}
      if (ubah==5){tampil=0x92;}
      if (ubah==6){tampil=0x82;}
      if (ubah==7){tampil=0xf8;}
      if (ubah==8){tampil=0x80;}
      if (ubah==9){tampil=0x90;}
}

void Kirim_data_Perdigit()
{
      data_temp=data;
      satuan=data_temp%10;//sisa dari pembagian disimpan di variabel satuan
      ubah=satuan;
      Convert_ke_7segment();//panggil fungsi mengubah kedalam format 7segment
      satuan=tampil;

      data_temp=data_temp/10;
      puluhan=data_temp%10;
      ubah=puluhan;
      Convert_ke_7segment();
      puluhan=tampil;

      data_temp=data_temp/10;
      ratusan=data_temp%10;
      ubah=ratusan;
      Convert_ke_7segment();
      ratusan=tampil;

      data_temp=data_temp/10;
      ribuan=data_temp%10;
      ubah=ribuan;
      Convert_ke_7segment();
      ribuan=tampil;
}

void main(void)
{
PORTA=0xff;
DDRA=0xff;

PORTC=0xff;
DDRC=0xff;

PORTD=0x0f;
DDRD=0x0f;

// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x06;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

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

status_in=0;

while (1)
      {
      data_counter();
      Kirim_data_Perdigit();
      Display_7segment();
      };
}

Untuk file program lengkap dan File Simulasi dengan proteusnya silahkan download Disini.

Mungkin ini Saja dulu Postingan dari saya semoga bisa terbantu dan bermanfaat...
Kalo ada kekurangan dari tulisan saya atau ada yang mau sharing, silahkan share di kolom komentar... 

67 komentar:

  1. mas boleh tanya donk, saya tertarik membuat rangkaian untuk kebutuhan papan score...
    sebelumnya saya adalah lulusan teknik informatika untuk mslh program bsa dipelajari..
    lah untuk mslh mikrokontroller AVR ATmega 16 ini menghubungkan dengan PC gmn ya? kan haru dihubungkan ke PC dlu untuk diflash programnya???

    makasih banyak mas.. :)

    BalasHapus
    Balasan
    1. Sama- sama mas....
      Kalau untuk memasukan program flashnya ke mikrokontroller dengan menggunakan bantuan alat khusus namanya " DOWNLOADER " mas...
      saya kira itu semoga bisa sedikit terbantu....

      Hapus
    2. mas bisa minta program dan rangkaian papan scorenya gak??

      Hapus
    3. maaf mas untuk programnya dan rangkaiannya saya belum buat,,, tapi kalau mas mau buat tinggal rubah saja.. kalau rangkain tinggal tambahin input... untuk program modifikasi saja dari program di atas,,,,

      Hapus
  2. mas bisa tolongin buat program up down counter dengan atmega16 dengan output lcd dong mas

    BalasHapus
    Balasan
    1. boleh insyaallah nanti kalau ada kesempatan saya coba postingin mas...

      Hapus
    2. ok mas di tunggu postingan nya...

      Hapus
    3. untuk tutorial counter updown yang display lcd sudah saya postingin..
      mang di cek...

      --> http://leselektronika.blogspot.com/2013/07/counter-up-down-display-lcd.html?showComment=1374227033312

      semoga bisa terbantu...

      Hapus
    4. ok mas maksih bantuan nya....

      Hapus
    5. ya sama-sama mas bekti... semoga bisa terbantu dan bermanfaat..

      Hapus
  3. mas. waktu saya burn ke atmega16 ny keluarnya EEEE pas di start. itu kenapa y? mohon bantuan ny.

    BalasHapus
    Balasan
    1. uploadnya (burn) menggunakan software apa mas...?. itu keluar EEEE itu dimananya mungkin masnya bisa lebih diperjelas...

      Hapus
  4. mas saya tertarik mau bikin ini, tapi di segmen yg ratusan+sibuan mau saya ganti jadi satuan puluhan ,, gimana ya mas ?? mohon pencerahanya ...

    BalasHapus
    Balasan
    1. kalau mau jadi angka satuan + puluhan... ya tinggal rubah yang di tampil 7 segmentnya,, jadi satuan dan puluhan...

      Hapus
  5. Mas broo mau nanya dong, untuk pemula enaknya belajar mikrokontroler pake bahasa C, assembler , codevision atau pake bascom yaa??

    Pemula nih baru mau belajar padahal alat, atmega16, downloader dan sgala macem udah beli tapi belom bisa digunain.. Hehee
    Monggo dijawab...

    Thanks ya sebelumnya...

    BalasHapus
    Balasan
    1. maaf Kang Rivaldi saya baru bisa bales Sekarang..

      - Pada dasarnya untuk memprogram mikrokontroller bisa menggunakan bahasa pemograman apa saja, asalkan ada compilernya (program yang merubah bahasa pemograman ke .hex). karena yang diproses dimikrokontroller (dimasukan kemikrokontroller) bukan bahasa pemogramannya melaikan bahasa mesin (hexadecimal / biner).

      - Mengenai bahasa pemograman yang digunakan dari pengalaman saya sih untuk assembler sepertinya lumayan sulit untuk dipelajari he... sementara untuk C sepertinya lebih mudah apalagi otodidak ditambah tutorial di internet juga lumayan banyak....

      - kemudian jika menggukan basaha C software yang digunakannya bisa menggunakan codevision. kelebihan Codevision ada setingan codewizard untuk inisialisasi awal hardwarenya. walaupun banyak compiler yang lain seperti AVR studio, ATMEL Studio, Arduino, dll. sementara Bascom itu harus menggunakan bahasa Basic.

      - Jika mau nyoba tapi hardwarenya belum ada, akang bisa menggunakan software simulasi ISIS PROTEUS. saya kira begitu Kang, semoga dapat terbantu...

      Hapus
    2. Waduhh kang aris baik bgt mau berbagi, semoga barokah ilmu nya kang...

      Makasih balesanya jd makin semangat dan makin mantap buat milih codevision utk belajar...

      Kalo ada contekan tolong kirim email dong kang buat coding kontrol servo yg langsung puter kiri-kanan dan seterusnya ya kang..
      Rencana mau bikin robot-robotan kang pake 2 servo
      Maap ya kalo ngerepotin..
      Rivaldi89@yahoo.com

      Hapus
    3. Amien... Maju terus pantang mundur kang.... he... semoga robotnya cepet jadi...

      Hapus
  6. PA..,izin bertanya..,untuk meng-up dan meng-down kan 7 segment dengan sekali tekan push button up atau down push button down itu bagaimana..?,apakah bisa..,bisa di share program nya pa...?
    terimakasih di tunggu jawabannya

    BalasHapus
    Balasan
    1. yang maksud kang Sahlan kalau ditekan tombol down sekali jadi count down (turun terus) atau sebaliknya. begitu bukan kang maksudnya?.
      jika benar, ya bisa saja, akang tinggal rubah sedikit program inputnya jadi seolah-olah neken terus, saya kira begitu kang... semoga bisa terbantu...

      Hapus
    2. ..,saya udah coba mengganti program inputnya supaya up down nya berfungsi otomatis tapi tetap tidak bisa ..,kalau menurut mas apa yg harus di ubah ya di bagian inputnya

      Hapus
    3. kang sahlan coba aja programnya di posting dulu.. barang kali saya bisa bantu kalau belum melihat program yang kang sahlan jadi agak susah...
      --> Semangat terus kang belajarnya... he...

      Hapus
  7. maaf mas saya ingin buat project ini, tpi 2 digit, yg di rubah apa ya mas?
    terus segment yg di gunakan anodha apa catodha mas...mohon pencerahanya :)

    BalasHapus
    Balasan
    1. untuk kang danang silah coba saja yang dirubanya..
      - variable ratusan dan ribuan dibuang z.

      data_temp=data_temp/10;
      ratusan=data_temp%10;
      ubah=ratusan;
      Convert_ke_7segment();
      ratusan=tampil;

      data_temp=data_temp/10;
      ribuan=data_temp%10;
      ubah=ribuan;
      Convert_ke_7segment();
      ribuan=tampil;

      PORTC=ribuan;//mengirimkan data ribuan
      PORTD=0b11110111;//menyalakan digit1
      delay_ms(5);

      PORTC=ratusan;//mengirimkan data ratusan
      PORTD=0b11111011;//menyalakan digit2
      delay_ms(5);


      - if (TCNT1==10000){TCNT1=0;} dirubah jadi if (TCNT1==100){TCNT1=0;}


      untuk 7segmentnya menggunakan comond anoda kang..
      semoga bisa terbantu...

      Hapus
  8. gan mau nanya saya mau bikin papan skor ne ada ngak cntoh program.skematik dan proteusnya makasih sebelumnya

    BalasHapus
    Balasan
    1. kalau untuk programnya saya belum ada kang, tapi kalau mau buat bisa saja, untuk skematik kurang lebih hampir sama dengan di atas, paling tiggal tambahin 2 tombol lagi, kemudian kalau mau menggunakan 7segment yang ukuran besar (tegangan >= 12 V) pin A-H dan PIN D0-D3 ditambah ULN2803. untuk programnya tinggal edit dari program diatas konsepnya hampir sama. saya kira begitu kang ridho...

      Hapus
  9. mau tanya mas.. saya coba bikin sperti yang di atas.. sukses namun display 7 segment nya kedap kedip gtu? gmna supaya ga kedap kedip ya mas? makasih

    BalasHapus
    Balasan
    1. rancangan display di atas menggunakan sistem scaning, yaitu menampilkan nilai di 7segment secara bergantian dari 7segment 1 ke yang lainnya, proses pergantiannya itu yang menyebabkan kedip, untuk kedipnya supaya tidak tampak oleh mata kita, maka intervalnya dipercepat, dengan kata lain, nilai delaynya diperkecil. saya kira begitu kang alan semoga bisa terbantu.

      Hapus
    2. kang aris, ini permasalahannya. ketika delay saya perbesar(delay_ms(100)) yang terjadi nilai di 7 segment bergantian lambat(segment 1,2,3,4) namun teratur penghitungannya (1-2-3-dst) tapi ketika delay saya perkecil(delay_ms(2)) yang terjadi nilai di 7segmentnya berkedip alias bergantian cepat(segment 1,2,3,4) tapi penghitungannya agak ngawur kang. jadi gak urut seperti ketika delay diperbesar tadi gan. gimana solusinya agar ketika delay itu diperkecil(ttep delay_ms(2)) tapi berurutan perhitungannya(1-2-3-4-5-dst)? mohon petunjuk kang...trims

      Hapus
    3. ini dicoba di pcb atau hanya di simulasi, harusnya kalau di aplikasikan di pcb dengan delay 2 ms itu sudah bagus kang, nilai akan stabil, tetapi kalau di simulasi proteus ada kemungkinan displaynya kurang stabil akibat dari kemampuan memori komputer yang lambat, atau jika masih belum bisa coba di portc di clear dulu sebelum nampilin datanya, saya kira begitu kang fuady semoga bisa terbantu.

      Hapus
  10. mas mau tanya, jika counternya di tambah alarm bisa g? maksudnya bisa di set pada hitungan tertentu atau angka tertentu akan menyalakan alarm atau lampu.

    BalasHapus
    Balasan
    1. bisa aja kang, tinggal tambahin aja programnya biar di anggka yang sudah ditentukan nanti bunyi alarm atau menyalakan lampu.

      Hapus
    2. mas, bisa bantu programnya kalo setiap kelipatan 10 alarm berbunyi? terimakasih..

      Hapus
    3. insyallah nanti kalo senggang kang, saya coba.

      Hapus
  11. kalau dibuat papan skor dengan penampilan 2 seven segment tiap tim dan 4 push button,, program.a gmna gan, bisa bantu kah ?

    BalasHapus
    Balasan
    1. bisa aja kang, tinggal tambahin tombolnya, dan display dipisah. kemudian buat variable baru untuk counter satunya lagi. untuk logic programnya hampir sama dengan contoh diatas, saya kira begitu kang...

      Hapus
  12. Mas, cara bikin program counter dengan arduino gmn ya mas? saya sudah bikin 7segment yg disusun menggunakan LED,. gini mas cara kerjanya saya untuk inputnya menggunakan program vb6. misal yg nilai d textbox 100 akan di tampilkan di 7segmentnya 100 juga, rencana saya mau masukin inputan tiap segment ke arduino mas..

    BalasHapus
    Balasan
    1. gimana ya, agak susah kalo dijelasin.. he....
      mungkin gini kali mas.. nanti dari VB nya kirim data ke arduino menggunakan serial (UART), kemudian datanya ditampilin di 7 segment.. untuk logika penampilan datanya bisa menggunakan logic di atas. cuman di instruksi pemogramannya agak beda nanti, saya kira bigutu mas.. maaf kalo kurang jelas.. he,...

      Hapus
  13. MAAF SAYA MAU NANYA UNTUK PIN TOMBOL UP DOWN DAN RESET NYA PIN BERAPA YA MAS ITU THKNS

    BalasHapus
    Balasan
    1. silahkan lihat langsung aja di skematiknya kang..

      Hapus
  14. mas kalau boleh minta nanya neh.klo outputnya dibikin sendiri untuk satuan sampe ribuan gimana listing programnya. jadi ntar pake 4 ic driver untuk seven segmenya.jadi atmega 16 ngeluarin 4 unit port BCD.trima kasih

    BalasHapus
    Balasan
    1. ya bikin aja mas, per 1 display 4 pin, tampilinnya tetap gantian..

      Hapus
  15. ok mas thank.saya ada tanya lagi lewat email.

    BalasHapus
  16. mas kalo boleh tanya, gmna yah bikin rangkaian untuk odometer pengukur jarak?

    BalasHapus
    Balasan
    1. untuk yang sederhana mungkin bisa menggunakan sensor reedsweet yang dipasang di ban, utuk menghitung jarak. pertama hitung dulu keliling lingkaran ban. jika sudah setiap sensor yang kedetek (satu putaran) dikali dengan keliling tadi. berarti jarak yang ditempuh = jumlah putaran ban x keliling lingkaran ban. semoga bisa terbantu...

      Hapus
  17. mas mau nanya dong, contoh program counter rgb led matriks 16x5 gimana ya?

    BalasHapus
  18. salam kenal Mas Aris,counter up/down diaplikasikan ke radio komunikasi bisa nggak,kebetulan radio saya kenwood tm 7930 displaynya dari lcd mati.kalau bisa saya ingin rubah pakai 7segmen 4digit berbasis microcontroler atmega,mohon penjelasannya.sugeng.

    BalasHapus
  19. mas aris kalau pin yg tersisa supaya keluar biner untuk 3 digit itu nulisnya gimana mas trims

    BalasHapus
  20. linknya mati mas nggak bisa didownload

    BalasHapus
  21. Ass bg, salam kenal.
    Kalau yg hanya menggunakan satu 7 segment ada gak ya bg, masih menggunakan atmega 16, sekalian dngan program nya.
    Trimakasih.

    BalasHapus
  22. gan bisa ga ini dipake atmega52 ?

    BalasHapus
  23. gan kalau inputnya sensor ultrasonik bagaimana ya?

    BalasHapus
  24. Gan . Mahu codes dan proteusnya bisa ngak. Yg di atas tk bisa download. Pliss gan

    BalasHapus
  25. Mas bisa menggunakan bahasa bascom avr. Tks

    BalasHapus
  26. Mas tolong yang bisa bantu saya kemaren sudah coba buat tapi kendalanya ada 1 komponen TR2N3702 tidak ada jadi kalo saya ganti bisa diganti tipe apa mas ? / bagaimana solusinya? Tmks

    BalasHapus
  27. mas link untuk proteusnya rusak, bisa kirim ke email ini 15524073@students.uii.ac.id

    BalasHapus
  28. Kaka....Apakah coding di atas bisa diapload ke arduino uno atau tidak bisa?

    BalasHapus
  29. nunggu postingan counternya di tambah alarm kapan mas, maksudnya bisa di set pada hitungan tertentu atau angka tertentu akan menyalakan alarm atau lampu.

    BalasHapus
  30. seumpama di ganti atmega 8 apa yang drubah mas

    BalasHapus
  31. Gan,link nya di perbaharui dong

    BalasHapus

Silahkan tinggalkan komentar kawan - kawan, baik berupa pertanyaan ataupun saran yang sifatnya membangun. komentar kawan - kawan sangat berharga untuk kemajuan blog ini. kalau bisa mohon hindari penggunaan Anonim. Semoga bermanfaat untuk kita semua...
Terimakasih....