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

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

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

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

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

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer: Get 4 months of Scribd and The New York Times for just $1.87 per week!

Master Your Semester with a Special Offer from Scribd & The New York Times