PENGENALAN MIKROKONTROLLER


Apa itu mikrokontroler?
Sesuai namanya mikrokontroler adalah kontroler berukuran kecil (mikro). Karena ukurannya yang kecil, maka satu kekurangan nya yang pasti adalah ia rentan terhadap kerusakan secara fisik. Namun demikian meski ukurannya kecil, bukan berarti ia memiliki fungsi yang kecil atau sedikit.

Selanjutnya pengenalan mikrokontroler secara teknis.
Apa saja isinya mikrokontroler, dan mengapa ia punya kemampuan mengontrol?
Untuk yang sudah familiar dengan isi komputer, mikrokontroler tak lain adalah komputer kecil dengan fungsi dan bagian-bagian yang terintegrasi.

Mikrokontroler punya prosesor untuk memproses data, memori (RAM) untuk mengingat data, dan yang port I/O untuk input dan output data. 3 hal ini adalah bagian yang pasti dimiliki setiap komputer.

Merek produsen mikrokontroler yang cukup dikenal dan digunakan saat ini:
PIC dari Microchip
AVR, ATmega, Xmega, dari Atmel
ZilogDAFTAR

Dalam pemrograman mikrokontroler ada beberapa hal penting yang perlu diketahui:
1. Port
2. Register
a. A (accumulator)
b. B
c. General Purpose Register
d. Special Function Register
3. RAM

Fitur tambahan dari mikrokontroler yang memudahkan kita
4. Timer
5. USART
6. WatchDog Timer
7. dll

PORT

Pada keluarga mikrokontroler 8051, biasanya dikenal 4 port yakni P0, P1, P2, P3. Masing-masing port terdiri atas 8 pin yang diwakili oleh satu bit tiap-tiap port nya. Jadi karena ada 4 port dan masing-masing terdiri atas 8 pin, maka ada 32 pin pada mikrokontroler yang dapat kita gunakan untuk Input atau Output (I/O). Masing-masing pin dinamai sesuai dengan nomor urutnya misalnya P0 dari msb (most significant bit) ke lsb (least significant bit) adalah sebagai berikut:
P0.7; P0.6; P0.5; P0.4; P0.3; P0.2; P0.1; P0.0
Tiap tiap port ini dapat diprogram sesuai dengan kebutuhan. Satu hal yang penting jika menghendaki port sebagai input, maka ia harus di program untuk selalu “high”.

(Apa itu high, dan apa itu port?)

Port adalah sekumpulan pin yang dapat berfungsi sebagai input atau output (I/O). Sedangkan pin adalah kaki fisik dari mikrokontroler. (Kalau lihat fisik nya mikrokontroler ada kaki-kaki logamnya tuh itu dia namanya pin) Fungsi pin ini macam-macam, mulai dari tempat sumber tegangan (+/Vcc), acuan tegangan (-/Ground), pin input dan output (I/O yang kalau dikumpulin jadilah satu port/8 pin), dan fungsi-fungsi lainnya.

Apa itu “High” dan “Low”
Dalam dunia digital, kita hanya mengenal 1 dan 0. Maka, 1 sering direpresentasikan dengan “high” dan 0 sering direpesentasikan dengan “low”


Nah hubungan antara High, Low ini dengan pin apa donk?
High (1) direpresentasikan dengan hadirnya tegangan 5V pada pin (terhadap ground)
Low (0) direpresentasikan dengan hadirnya tegangan 0V pada pin (terhadap ground)

Tegangan high tidak harus persis 5 volt atau 0 volt. Mereka memiliki rentang (5-4,5 volt misalnya), bahkan untuk mikrokontroler lain (selain keluarga 8051) definisi high-nya bisa jadi berbeda pula, biasanya definisi high nya sesuai dengan besarnya tegangan supply (Vcc) sedangkan definisi low biasanya gak jauh-jauh dari 0 (ground).

Ada satu istilah lagi yang tidak jauh jauh dari pin, namanya “Active Low
Istilah ini artinya kalau kita punya pin, dimana pin ini aktif kalau dia memiliki nilai low (0) fungsinya macam macam, contohnya pin reset, jika pin reset ini memiliki karakteristik active low, maka mikrokontroler hanya dapat berjalan dengan normal ketika nilai pin ini high (1 / bertegangan 5V) dan mikrokontroler akan ter-reset jika pin ini bernilai low (0 / bertegangan 0V). Istilah ini nantinya akan sangat berguna, karena gak hanya dipakai di pin dan port saja, terkadang juga dipakai di register dan pemrograman (nanti akan kita bahas ini)
Contoh pemrograman ASM pada port:
Mov P0, #0FFh
Artinya port P0 akan dimasukan nilai FF heksa desimal

(apa itu heksa desimal?)
Supaya gampang heksa desimal adalah seperti berikut:
Karena satu port mengandung 8 pin, maka dia memiliki 8 digit biner
1111 1111b = FFh
gimana cara ngitungnya?
biner = heksa desimal
0001b = 1h
0010b = 2h
0011b = 3h
0100b = 4h
0101b = 5h
1111b = Fh

Kalau kita mau dapat input dari port misal P0, dengan jumlah pin 8 buah, maka begini contohnya:
Mov A, P0

Maka nilai dari port 0 (sekumpulan pin dari port 0) dari mikrokontroler akan diambil dari port terkait, kemudian dimasukan dalam register A.

Contohnya, ketika port 0 dijadikan input. Maka seperti sudah dibahas di atas, jika ingin menjadikan suatu port sebagai input. Port tersebut harus diberi nilai high. Dengan menggunakan perintah berikut:

Mov P0, #0FFh ;masukkan nilai high ke semua pin pada port 0
Mov A, P0 ; ini sama dengan yang di atas ya.


Kalau nilai dari port 0 itu 1111 1011b maka nilai ini akan diambil oleh mikrokontroler dan dimasukan ke register A.

Sekilas tentang A

(Accumulator) adalah suatu register (memori) yang dapat melakukan semua operasi perhitungan dan semua instruksi yang dimiliki oleh prosesor dari mikrokontroler.
Contohnya adalah operasi perkalian, penjumlahan, pengurangan, dan instruksi pengaksesan register lainnya, atau pengaksesan RAM.



REGISTER

Sedikit berbeda dengan memori (RAM) yang hanya memiliki fungsi menyimpan.
Register memiliki fungsi menyimpan, sekaligus sebagai tempat “bekerja” dari prosesor.(Accumulator)
Register juga memiliki fungsi lain jika tidak sebagai tempat untuk bekerja, ia juga sebagai tempat menyimpan “cepat” dimana hanya butuh satu instruksi agar data dapat langsung disimpan pada register. (General Purpose Register)
Register sebagai penghubung antara prosesor dengan RAM
Register sebagai penghubung antara prosesor dari mikrokontroler ke fitur tambahannya (Timer, USART, WatchDog Timer, dll)

Contoh register sebagai tempat “bekerja”:
Mov A, #34h ; register A diisi nilai 34 heksadesimal
Mov B, #45h ; register B diisi nilai 45 heksadesimal
Add A, B ; isi dari register A dan B dijumlahkan, kemudian hasilnya ditaruh pada register A


Pada contoh di atas, baris pertama dan baris kedua. Baik register A dan register B berfungsi menyimpan suatu “nilai” atau “angka”. Namun pada baris ketiga, register A khususnya, berfungsi sebagai tempat bekerja dari prosesor (ALU) untuk menjumlahkan nilai yang terdapat pada register A dan B.

Contoh register sebagai tempat simpan “cepat”
; (lanjutan contoh sebelumnya)
Mov R1, A ; isi dari register A disimpan dulu di register R1


Pada keluarga 8051 GPR ada 8 buah R0-R7. Fungsi GPR ini sebagian besar adalah sebagai tempat simpan cepat. Pertanyaannya kenapa GPR ini dibutuhkan? Karena register yang dapat berfungsi sebagai tempat bekerja Prosesor (ALU) biasanya hanya satu atau dua buah. Seperti pada keluarga mikrokontroler 8051 ini, hanya 2 register yang memiliki kemampuan “serba bisa” seperti bisa mengerjakan instruksi ADD, SUBB, MUL, DIV, MOV, XMOV, dan instruksi lainnya. Register lainnya belum tentu bisa mengerjakan instruksi yang rumit seperti yang telah disebutkan sebelumnya. Agar register A dapat digunakan untuk kegiatan lain, maka data dalam register A harus dipindahkan terlebih dahulu ke register lain. Data dapat juga dipindahkan ke RAM, jika data yang dipindahkan tidak diperlukan lagi dalam waktu dekat. Karena prosedur untuk mengakses RAM cenderung lambat dan rumit, jika dibandingkan akses ke GPR (terutama pada mikroprosesor dengan RAM yang relatif besar dan menggunakan DRAM). Serta kemampuan RAM yang hanya berfungsi sebagai tempat menyimpan, sedangkan GPR memiliki kemampuan mengerjakan instruksi sederhana seperti INC, DEC.
 
Contoh perhitungan matematika sederhana (mengapa kita memerlukan tempat simpan cepat)
Misal kita mau menghitung (10+11)*(12+14) (dalam heksa desimal) maka kira-kira begini cara buat programnya:
Mov A, #10h ; masukkan nilai 10h ke A
Mov B, #11h ; masukkan nilai 11h ke B
Add A, B ; jumlahkan nilai pada A dengan nilai pada B
Mov R1, A ; simpan hasil penjumlahan pada R1, karena A akan dipakai pada perhitungan berikutnya
Mov A, #12h
Mov B, #14h
Add A, B
Mov B, R1 ; Panggil lagi nilai penjumlahan sebelumnya
Mul A, B ; kalikan nilai A dengan nilai B (hasilnya ada pada A dan B, dimana A adalah LSB dan B adalah MSB)

Sekilas tentang istilah pada heksa desimal, bit, byte, lsb, msb, LSB, MSB, dan kawan kawannya
1 Byte = 8 bit

Jika berada dalam singkatan, Byte biasanya diwakili dengan “B” huruf besar sedangkan bit diwakili “b” huruf kecil. Penggunaannya juga berbeda. Byte biasanya digunakan untuk mengukur kapasitas suatu alat yang memiliki kapasitas besar. Contohnya pada HDD, memori flash, DRAM (Dynamic RAM). Sedangkan bit biasanya digunakan pada kecepatan koneksi suatu jaringan, atau kapasitas alat yang kecil. Contohnya pada kecepatan koneksi internet, LAN, WAN, EEPROM, SRAM (Static RAM).

Byte = 1 Byte
Word = 2 Byte
Dword = 4 Byte (Double Word)
Qword = 8 Byte

Biasanya digunakan untuk mengukur basis bilangan maksimum dari suatu sistem, atau pada saat membuat program. Pada mikrokontroler 8051, basis bilangan yang digunakan adalah byte, meskipun pada instruksi perkalian mikrokontroler ini masih mampu menghasilkan bilangan sebesar word. Pada komputer yang biasa kita gunakan (32 bit) maka basis bilangan nya adalah Dword. Pada mikroprosesor 32bit ini baik instruksi maupun datanya biasanya berbasis bilangan dword atau 32 bit, namun jika mikroprosesor tersebut memiliki instruksi SSE yang memiliki instruksi sebesar 64 bit dan data 64 bit maka instruksi ini akan diproses dalam 2 siklus mesin pada mikroprosesor 32 bit biasa.

msb, lsb, MSB, LSB
msb = most significant bit
lsb = least significant bit
MSB = Most Significant Byte
LSB = Least Significant Byte

Untuk mendapatkan pengertian “mendalam” dari ke-empat istilah di atas harus baca dari awal dari quotation ini. Karena harus tau apa bedanya bit dan Byte.


SRAM, cara pengaksesannya: Immediate, Direct, Indirect access, External, dan External code

Keluarga 8051 awalnya hanya memiliki SRAM sebanyak 128 byte saja, dengan alamat 00h-7Fh. Alamat 80h diberikan untuk register register khusus (SFR/ Special Function Register). Cara pengaksesannya sangat mudah yakni:

mov A, #78h
mov 45h, A

2 baris program di atas digunakan untuk mengisi nilai 78 heksadesimal ke dalam SRAM beralamat 45h. Pada keluarga 8051, kedua baris di atas bisa langsung digantikan dengan satu baris “immediate” di bawah ini. pada beberapa jenis / keluarga mikrokontroler lain, Prosedur penyimpanan ke dalam memori (SRAM) seringkali harus menggunakan 2 kali seperti di atas (contohnya pada keluarga AVR).
mov 45h, #78h


Pada beberapa contoh kode ASM, kita sering melihat tanda “#” pada kolom ketiga dari baris yang mengandung instruksi “mov” mari kita lihat apa bedanya:

mov A, #45h ; Artinya nilai 45 heksa desimal disimpan dalam register A
mov A, 45h ; Artinya nilai yang tersimpan dalam SRAM beralamat 45h disimpan dalam register A (jika melihat contoh kode program sebelumnya, nilai yang tersimpan dalam SRAM beralamat 45h adalah 78h)

Instruksi yang memiliki karakter “#” dinamakan immediate. atau “langsung/seketika” immediate addresing
Instruksi pada baris kedua merupakan direct addresing
Pengalamatan SRAM tidak langsung indirect addresing:


Pada pengalamatan SRAM indirect kita akan mengenal karakter “@” mode ini memiliki kegunaan yang sangat banyak. Contohnya pada mikrokontroler AT89S52 yang memiliki SRAM sebanyak 256 byte, alamat RAM mulai 128 (80h) tidak dapat dialamatkan secara langsung seperti contoh sebelumnya, karena akan merujuk pada SFR. Ingat khan mulai alamat 80h itu alamat SFR. Nah kalau begitu bagaimana kita mengakses alamat SRAM 80h dan seterusnya? gunakan indirect addresing / pengalamatan tidak langsung. pengalamatan tidak langsung ini dapat berlaku pada SEMUA alamat SRAM tidak hanya 80h ke atas saja. Langsung saja lihat contohnya.


mov R0, #45h ; alamat SRAM yang ingin dituju disimpan dalam R0
mov A, #78h ; nilai yang ingin disimpan pada SRAM yang dituju disimpan dalam A
mov @R0, A ; penulisan secara “tidak langsung” dilakukan disini


Pada contoh di atas, dilakukan penulisan ke alamat SRAM 45h. Pada tahap pertama alamat yang dituju disimpan dalam R0. Kemudian nilai yang ingin disimpan dalam SRAM yang dituju disimpan dalam A. Pada baris ketiga inilah instruksi indirect addressing dilakukan, yakni penulisan ke alamat SRAM yang dituju.

mov R0, #45h
mov A, @R0

Contoh di atas memiliki fungsi kebalikan dari contoh sebelumnya. Jika contoh sebelumnya berfungsi menyimpan nilai secara tidak langsung ke alamat SRAM yang dituju maka contoh di atas berfungsi mengambil nilai secara tidak langsung dari alamat SRAM yang dituju.



Selain berfungsi mengakses alamat SRAM 80h ke atas indirect addresing ini memiliki fungsi lainnya. Yakni memudahkan kita untuk menulis ke alamat RAM tertentu secara rekursif (berulang ulang) tanpa menulis program berulang ulang (yang sering bikin program pasti tau istilah LOOPING khan?) gimana cara pakainya? kita akan pelajari ini pada post berikutnya mengenai “percabangan” alias branch (bahasa kerennya di mikroprosesor)


Komentar

Postingan Populer