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

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

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

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

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

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.