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

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

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

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

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

Sign up to vote on this title
UsefulNot useful