Cara Membuat Program Microcontroller

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

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

Cancel anytime.