Pemrograman Mikrokontroller
Kita sering mendengarkan kata mikroprosesor, namun mungkin jarang yang pernah dengar kata mikrokontroller. Mahluk apakah mikrokontroller itu ? Hampir tiap hari kita bertemu dengan benda yang di sebut personal komputer. Apapun itu bentuknya, pada prinsipnya suatu komputer pasti memerlukan komponen Input, Prosesor (pemroses), penyimpan (memory) dan Output. Input pada komputer PC dapat berupa keyboard, mouse, gamepad, scanner dll.. sedangkan komponen output contohnya Monitor, Printer, Projector dll. Prosesor berfungsi untuk mengolah suatu input, berdasarkan program dan data yang telah diberikan sebelumnya dan disimpan di Memory (RAM, ROM, Harddisk, USB dll). Tanpa program, komputer merupakan benda mati yang tidak ada gunanya, tidak dapat merespon input maupun menghasilkan output. Komputer di desain sebagai suatu sistem yang upgradeable. Harddisk dan memory dapat di tingkatkan kapasitasnya dengan mudah, input dapat berbentuk USB, serial, PS2 demikian juga dengan output.
Lalu apa hubungannya personal komputer dengan mikrokontroller? mikroprosesor merupakan pengolah utama pada PC dan tidak dapat berdiri sendiri, ia memerlukan memory, komponen input dan output. Sedangkan pada mikrokontroller komponen memory dan I/O telah berada pada satu chip. Sehingga sangat praktis sebagai perangkat pengendali, oleh karena itu mikrokontroller sering digunakan pada embeded system. Hampir setiap perangkat yang kita temukan sehari-hari menggunakan mikrokontroller. TV, HP, kalkulator, penerjemah elektronik, remote controll, AC, Referigerator, ECU mobil, dll menggunakan mikrokontroller sebagai pengendali utamanya.
Salah satu tipe mikrokontroller adalah keluarga mcs-51 yang awalnya diproduksi oleh Intel. Diawali dengan versi 8031 yang merupakan mikrokontroller tanpa ROM internet, dan dikembangkan dengan versi lain yang lebih lengkap. salah satu keluarga MCS-51 yang sangat populer adalah 8051 dan diikuti oleh sekitar 20 vendor dengan memproduksi mikrokontroller yang kompatibel dengan 8051.
Hampir seluruh kaki pada suatu mikrokontroller adalah port I/O yang dapat digunakan untuk mengendalikan sesuatu. Mengingat perangkat ini adalah komponen digital, maka output yang dihasilkan maupun input yang dibaca oleh mikrokontroller berbentuk logika high atau low (biner 1 atau 0). Dari keluaran 1 dan 0 tersebut yang dihubungkan ke suatu driver untuk mengendalikan perangkat lain dengan standar yang berbeda. Gambar pinout dari suatu IC 8051 dapat dilihat disini
Agar mikrokontroller dapat bekerja sesuai dengan keinginan, maka diperlukan langkah untuk melakukan pemrograman. Pemrograman dilakukan dengan cara mengisi mikrokontroller 8051 dengan kode-kode hexadesimal yang merupakan hasil dari kompilasi pemrograman dengan bahasa assembly, C, Basic atau yang lain. Pada pembahasan ini kita akan mempelajari pembuatan program 8051 menggunakan bahasa assembly.
ASSEMBLER 8051
Bahasa assembly sering disebut sebagai bahasa tingkat menengah karena instruksi-instruksi yang digunakan lebih dekat dengan bahasa mesin, namun masih dapat dipahami oleh manusia. Untuk mempermudah pemahaman dalam menggunakan bahasa Assembly 8051 kita akan pelajari secara bertahap disetai dengan contoh.
Register 8051
Register merupakan suatu variabel yang berfungsi sebagai penyimpan sementara. Jika pada pemrograman tingkat tinggi kita dengan mudah membuat suatu variabel dengan nama bebas, tetapi pada assembly terdapat batasan-batasan yang harus di ikuti. Variabel pada 8051 terdiri dari 2 bagian yaitu variabel 16 Bit, yang dapat menyimpan 16 bit data (4 digit bilangan hexa) yaitu variabel DPTR serta beberapa variabel umum 8 bit yaitu variabel A, B, R0,R1,R2 .. R7. Beberapa variabel builtin telah dipetakan pada suatu alamat dengan fungsi tertentu. Misalkan variabel p0,p1,p2,p3 yang telah dihubungkan ke keluaran ke 4 port yang masing-masing terdiri dari 8 bit.
MOV
Perintah MOV merupakan perintah untuk memindahkan suatu nilai ke variabel, atau dari suatu variabel ke variabel lain. Contoh :
- MOV A,B : memindahkan isi variabel B ke variabel A.
- MOV A,#10: memindahkan nilai 10 ke variabel A
- MOV A,10 : memindahkan isi memory pada alamat 10 ke variabel A
Berikut contoh penggunaannya :
MOV B,#40 ; memindahkan nilai 40 desimal ke variabel B
MOV P1,#FFH ; memindahkan nilai FF ke port 1
MOV R1,#10000000B ; memindahkan data nilai 128 ke variabel R1
Contoh pemrograman sederhana 8051.
Misalkan kita ingin agar mikrokontroller 8051 dapat mengendalikan LED, maka kita perlu mendesain rangkaian terlebih dahulu.
Rangkaian yang dibentuk adalah sebagai berikut :
Pada rangkaian tersebut Port 0 yang terdiri dari 8 pin (1 byte) P0.0 sampai P0.7 masing-masing dihubungkan ke led. Sehingga jika output port berlogika tinggi (logika TTL) maka led akan menyala, sebaliknya lampu akan mati jika output suatu port berlogika rendah. Oleh karena itu dengan memahami bahwa suatu port terdiri dari 1 byte data (8bit) dan Masing-masing kaki dari port 0 bertanggung jawab terhadap 1 bit data, kita dapat mengendalikan lampu dengan cara sebagai berikut:
Jika kita ingin seluruh lampu menyala, maka secara logika p0.0 sampai p0.7 atau seluruh port harus berlogika tinggi. Dapat dituliskan sebagai P0=11111111B (jika dalam format biner) atau dengan mengkonversi angka tersebut menjadi hexadesimal diperoleh P0=FFH, atau P0=255 (desimal 2^8). Dalam bahasa assembly dituliskan :
MOV P0,#FFH ; pindahkan nilai FF Hexa (11111111 biner) ke port 0.
Dengan perintah tersebut seluruh led akan menyala. Demikian pula jika kita ingin agar yang menyala hanya led A dan H, maka yang harus dikirim ke port 0 adalah nilai 10000001 biner atau 129 desimal atau 41Hexa. Dalam assembly dituliskan:
MOV P0,#41H ;pindahkan nilai 41H ke port 0 atau
MOV p0,#10000001B ;atau
MOV P0,#129
Ketiga perintah diatas akan menghasilkan keluaran yang sama. Ingat bahwa nilai dapat dituliskan dalam format desimal, biner maupun hexa.
Bagaimana jika kita ingin agar nyala lampu tersebut dapat bergantian ? Seperti penulisan program umumnya, program dalam bahasa assembly selalu diurutkan dari atas ke bawah, sehingga baris perintah paling atas akan di eksekusi terlebih dahulu. Dengan demikian misalnya kita ingin agar led menyala berurutan dari A sampai G dapat kita buat program assembly sebagai berikut (nilai dalam format biner):
Start:
MOV P0,#00000001B
MOV P0,#00000010B
MOV P0,#00000100B
MOV P0,#00001000B
MOV P0,#00010000B
MOV P0,#00100000B
MOV P0,#01000000B
MOV P0,#10000000B
end
(bersambung)