Cara Membuat Program Microcontroller

Jika sudah mempelajari tentang seluk-beluk pemrograman bahasa C langkah selanjutnya adalah “ mulailah mencoba” atau saatnya beraksi. Permasalahan klasiknya adalah “dari mana dulu??”. Nah lo.. dari mana?. “ apa dulu yang di kerjakan?.. “ nulis apa dulu?”. oke.. oke.. gak usah bingung. Mari kita bahas satu-persatu. Membuat program / code pada dasarnya adalah untuk memecahkan masalah. Panjang pendeknya program dan bentuk program tidak dipermasalahkan yang terpenting adalah program tersebut dapat menyelesaikan masalah yang ada. Lalu masalahnya apa?. Contoh : Membuat led menyala berjalan: masalahnya adalah bagaimana membuat beberapa buah lampu led agar seolah-olah menyala berjalan !!!. setelah mengetahui masalahnya selanjutnya kita identifikasi masalah tersebut, kita harus membuat/ mengetahui/membayangkan skematik hardwarenya. Misal:

Dari skema diatas dapat di identifikasi 8 buah led terhubung di PORTC.0 sampai PORTC.7 led akan menyala jika output PORT berlogika 1. ditambah ada 3 saklar di PORTB.0, PORTB.1 dan PORTB.2 (tambahan saja). PORT yang ke tombol akan berlogika 0 jika tombol ditekan. Hardware dah tau.. terus?. Langkah selanjutnya adalah membuat/membayangkan/memikirkan/melamunkan logika berfikir cara kerjanya. Kita harus berfikir sistematis bagaimana 8 led tersebut agar nampak menyala berjalan. misal Logikanya adalah seperti ini: pertama matikan semua led kemudian tunda beberapa saat. Selanjutnya nyalakan led di PORTC.0 kemudian tunda dulu beberapa saat. Setelah itu matikan led di PORTC.0 dan nyalakan Led di PORTC.1 kemudian tunda lagi beberapa saat.. lanjut matikan led di PORTC.1 dan nyalakan led di PORTC.2 tunda lagi beberapa saat.. dan seterusnya sampai led di PORTC.7 menyala kemudian tunda, selanjutnya ulangi lagi dari langkah pertama.. begitu seterusnya selamanya..

1

.5 // tunda 0. Untuk input : PIN < NAMA PORT > atau PIN < NAMA PORT >.7 // tunda 0.5 detik // matikan led di PORC. .0 saja.Buka software codevisionAVR. PORTC=0b00000001.1 sampai PORTC.0 s/d PORTD.. PORTC=0b00100000.7 = 1). CONTOH: DDRA=0x0f. // DDRC=0xff. jika ada yang sebagai input. delay_ms(500). PORTC=0b10000000. CONTOH LAGI: DDRA.3 // tunda 0.artinya (PORTD. delay_ms(500). hapus saja semua tetapi sisakan header dan void main() nya saja. PORTA=0xf0. .3 nyalakan led di PORC.0 nyalakan led di PORC. = DDRC=0b11111111.1 nyalakan led di PORC. Perintah PORTC digunakan untuk akses keseluruhan (8 bit PORTC).1=0.Artinya keluarkan logika 0 di PORTA. . Bagai mana mengubah arah nyalanya led? Misal ini menyala kekanan bagaimana supaya menyala kekiri?. kemudian di coba / disimulasikan.5 detik // nyalakan led di PORC. PORTD=0xf0. Cara penulisan : DDR<NAMAPORT> atau DDR<NAMA PORT>. Buatlah new project. PORTC=0b00001000.5 detik // matikan led di PORC. PORTA.6 nyalakan led di PORC.5 detik // matikan led di PORC. */ // <-------.6 = output |_ _ _ PORTC.<NOMOR PORT> CONTOH : PORTA. delay_ms(500).artinya variable data bernilai PIND. untuk mengaktifkan resistor pull-up internal. delay_ms(500). PORTC=0b00000100.0 = output | |_ _ _ _ PORTC. }.4 // tunda 0.h> // ini untuk perintah tundaan.// <------end void main. bingung?.4 s/d PORTD. (PORTD.artinya keluarkan Ob11110000 di PORTD.< NOMOR PORT > CONTOH: data=PIND. delay_ms(500). lagi : DDRC=0b01001001.0 s/d PORTD.5 nyalakan led di PORC. Setelah disimpan. tunda selama 100 millisecond // delay_us(100).1 // tunda 0.perulangan tiada henti. tunda selama 100 microsecond void main(void) { //pertama kita membuat inisialisasi port DDRC=0xff.5 detik // matikan led di PORC. Jika satu port saja cara penulisan: PORT<NAMA PORT>.5 detik // matikan led di PORC.5 detik // matikan led di PORC.1=0. .3 = 0 dan PORTD. /* Catatan: dalam bahasa pemrograman C setiap menulis pernyataan harus diakhiri dengan tanda ” .1=1. DDR adalah register untuk mengatur i/o sebagai input atau output. PORTC=0b00010000.3 = sebagai output. contoh programnya sesuai logika berfikir di postingan sebelumnya: #include <mega16. // matikan semua led // tunda 0.5 detik // matikan led di PORC. data=PIND. 2 . #include <delay. /* | | |_ _ _ PORTC. delay_ms(500).7 = output DDR = data direction.Artinya variabel data bernilai dari semua PORTD. PORTC=0b00000010.h> // ini library untuk chip ATmega 16. delay_ms(500). delay_ms(500).4 nyalakan led di PORC. }.7 = sebagai input). untuk mengatur port sebagai input atau dijadikan output */ // setelah inisialisasi selanjutnya kita realisasikan logika berfikirnya while (1){ PORTC=0b00000000.2 // tunda 0. delay_ms(500).0 // tunda 0. PORTC=0b10110110. nah lo. PORTC=0b01000000.4 s/d PORTD.5 detik // <------sampai disini program diulangi lg dari while (1) Build program diatas.2 nyalakan led di PORC.0. .1 saja. dan PORTD.6 // tunda 0. ”. // delay_ms(100). kita tambahkan perintah PORT di bawahnya yang nilainya kebalikan dari DDR.<NOMOR PORT> CONTOH: DDRA=0x0f.

i++){ // program di dalam for ini akan di jalankan 8 kali. while (1){ PORTC=0x00. tanpa mengubah kode utamanya. unsigned char nyala[9]= {0b00000000. /* array diatas mempunyai nama " nyala" dengan jumlah indek 9 (dari 0-8) dengan type data unsigned char. Program pertama (yang banyak itu) kita ubah pakai array. semakin panjang dan banyak program yang ditulis maka memori yang digunakan juga semakin besar. PORTC=0b00000001<<i. beda sama sebelumnya.0b00000100. DDRC=0xff. 0b00001000.5 s for(i=0. Memori mikrokontroller terbatas misal di Atmega16 hanya 16Kilobyte saja. 0b00000010. // ini variable i dengan type data integer. // dimuali dari i=0 sampai i=7..i<8. Contoh: #include <mega16. Dengan array ini kita bisa mengatur nyala led sesuka kita.0b00000001. // ini variable i dgn type data integer.0b10000000}. 3 ..h> #include <delay. } // tunda 0.0b01000000. Atmega 8535 hanya 8kilobyte. ???. Kok sedikit sekali ya. } // kembali ke while }.h> int i. Sehingga optimasi code sangat diperlukan agar memori yang digunakan bisa digunakan semaksimal mungkin.h> #include <delay.Program disini tertulis lebih dari 10 baris ( tanpa komentar ). hanya dengan mengubah nilai di dalam array itu. void main(void) { // komentar lama sudah di hapus.gak usah nanya lagi.5 s // kembali ke for lagi sampai i=7. Tapi hasilnya sama kan?. // tunda 0.0b00010000. delay_ms(500). // matikan semua led delay_ms(500).h> int i. 0b00100000. Misal kita ubah menjadi: #include <mega16. // PORTC = 0b00000001 digeser kekiri sejauh i.

tidak usah tanya lagi.. Sama juga kan hasilnya???. silahkan di pahami..nyala[0]= nyala ke 0 diberi nilai 0b00000000 nyala[1]= nyala ke 1 diberi nilai 0b00000001 . }.i++){ // ulangi i=0 sd i-8 PORTC=nyala[i].. }. DDRC=0xff.0b01000000.0 di tekan makan 4 . }. while (1){ for(i=0.0b00000001. void led_jalan(){ for(i=0.h> int i. sesuai kreatifitas masing-masing. }. Contoh: #include <mega16. artinya jika tombol PINB.1 .0b00010000. // ini variable i dgn type data integer. jadi kalo programnya tidak sama dengan yang lain. } } Hayo. Lanjut. 0b00001000. dst nyala[8]= nyala ke 8 diberi nilai 0b10000000 */ void main(void) { // komentar lama sudah di hapus.i<9. Tiap orang logika berfikirnya pasti berbeda .beda.. unsigned char nyala[9]= {0b00000000.i<9.h> #include <delay. Tombol terhubung dengan ground.. ya.0b10000000}. apanya yang berubah???.0b00000100. void main(void) { // komentar lama sudah di hapus. Yang penting masalah terselesaikan.i++){ // ulangi i=0 sd i-8 PORTC=nyala[i]. while (1){ led_jalan().tidak usah tanya lagi.. // PORTC = data "nyala" ke "i" delay_ms(500). itu bukan masalah. }.. // PORTC = data "nyala" ke "i" delay_ms(500). 0b00000010.0 dan PINB. Kita gunakan tombol yang ada di PINB. Terakhir kita modifikasi supaya bisa berubah arah nyala lednya jika tombol di pencet... 0b00100000. Mari kita belajar penggunaan prosedur. DDRC=0xff.

0b00000010. // panggil prosedur led_jalan(nilai arah = 1).0b00000100.0b10000000}.h> #include <delay. unsigned char nyala[9]= {0b00000000. } } }.0 berlogika 0.3 sbg input PORTB=0b00000111.0b00000001. void led_jalan(unsigned char arah){ for(i=0.PORTB. void main(void) { DDRC=0xff. PORTC=nyala[8-i]. // variable jalan awalnya bernilai 0 while (1){ if (PINB. // PORTC = data "nyala" ke "8 dikurangi i" } delay_ms(500). Jika tidak di tekan PINB.0 atau PINB. 0b00001000. }else if(jalan==1){ led_jalan(1). }. DDRB=0b11111000. Contoh: #include <mega16. if (PINB.0 ditekan jalan=0.1==0){ // jika tombol di PINB. }.0b01000000.h> int i. 5 .0b00010000. // aktifkan resistor pull-up internal jalan=0.PINB.i++){ // ulangi i=0 sd i-8 if (arah == 0){ // jika nilai arah =0.1 ditekan break. // variable jalan diberi nilai 0 } if (PINB. 0b00100000. Supaya ketika tidak di tekan berlogika 1.1 ditekan jalan=1. // variable jalan diberi nilai 1 } if (jalan==0){ // jika variable jalan = 0 led_jalan(0). }. // variable i dan jalan dgn type data integer.0==0 || PINB.0 tidak berlogika apa-apa (mengambang). // panggil prosedur led_jalan(nilai arah = 0). // PORTB.jalan. // PORTC = data "nyala" ke "i" }else{ // jika nilai bukan =0.1==0){ // jika tombol PINB.i<9. PORTC=nyala[i].0 .0==0){ // jika tombol di PINB. // keluar dari for. Maka kita perlu mengaktifkan resistor pull-up internal.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.