MIKROKONTROLER
Oleh
SUHENDRI (K11109023)
TULUS PRANATA (K11109025)
1. Keluarga MCS51
Mikrokontroler ini termasuk dalam keluarga mikrokontroler CISC. Sebagian
besar instruksinya dieksekusi dalam 12 siklus clock. Mikrokontroler ini
berdasarkan arsitektur Harvard dan meskipun awalnya dirancang untuk aplikasi
mikrokontroler chip tunggal, sebuah mode perluasan telah mengizinkan sebuah
ROM luar 64KB dan RAM luar 64KB diberikan alamat dengan cara jalur
pemilihan chip yang terpisah untuk akses program dan memori data. Salah satu
kemampuan dari mikrokontroler 8051 adalah pemasukan sebuah mesin
pemroses boolean yang mengijikan operasi logika boolean tingkatan-bit dapat
dilakukan secara langsung dan secara efisien dalam register internal dan RAM.
Karena itulah MCS51 digunakan dalam rancangan awal PLC (programmable
Logic Control).
2. AVR
Mikrokontroler Alv and Vegards Risc processor atau sering disingkat AVR
merupakan mikrokonktroler RISC 8 bit. Karena RISC inilah sebagian besar kode
instruksinya dikemas dalam satu siklus clock. AVR adalah jenis mikrokontroler
yang paling sering dipakai dalam bidang elektronika dan instrumentasi. Secara
umum, AVR dapat dikelompokkan dalam 4 kelas. Pada dasarnya yang
membedakan masing-masing kelas adalah memori, peripheral dan fungsinya.
Keempat kelas tersebut adalah keluarga ATTiny, keluarga AT90Sxx, keluarga
ATMega dan AT86RFxx.
3. PIC
Pada awalnya, PIC merupakan kependekan dari Programmable Interface
Controller. Tetapi pada perkembangannya berubah menjadi Programmable
Intelligent Computer. PIC termasuk keluarga mikrokonktroler berarsitektur
Harvard yang dibuat oleh Microchip Technology. Awalnya dikembangkan oleh
Divisi Mikroelektronik General Instruments dengan nama PIC1640. Sekarang
Microhip telah mengumumkan pembuatan PIC-nya yang keenam PIC cukup
popular digunakan oleh para developer dan para penghobi ngoprek karena
biayanya yang rendah, ktersediaan dan penggunaan yang luas, database
aplikasi yang besar, serta pemrograman (dan pemrograman ulang) melalui
hubungan serial pada komputer.
2. Mikrokontroler PIC
PIC merupakan keluarga mikrokontroler tipe RISC buatan Microchip
Technology yang bersumber dari PIC1650 yang dibuat oleh Divisi
Mikroelektronika General Instruments. Teknologi Microchip tidak menggunakan
PIC sebagai akronim, melainkan nama brandnya, yaitu PICmicro. Hal ini karena
PIC singkatan dari Peripheral Interface Controller sedangkan General
Instruments mempunyai akronim PIC1650 sebagai Programmable Intelligent
Computer.
PIC pada awalnya dibuat menggunakan teknologi General Instruments 16
bit CPU, yaitu CP1600. PIC dibuat pertama kali pada tahun 1975 untuk
meningkatkan perfoma sistem pada I/O. Saat ini PIC telah dilengkapi dengan
EPROM dan komunikasi serial, UAT, kernel, control motor, dan lain lain serta
memori program dari 512 word hingga 32 word. Satu word dalam hal ini sama
dengan satu instruksi bahasa assembly yang bervariasi dari 12 hingga 16 bit,
tergantung dari tipe PICmicro tersebut.
3. Mikrokontroler Maxim
Maxim merupakan salah satu produsen chip yang fokus pada komponen
digital dan komunikasi, seperti mikrokontroler, akuisisi data, dan komponen RF
(Radio Frekuensi). Maxim cukup inovatif dengan meluncurkan mikrokontroler
yang mendukung jaringan komputer antara lain, 80C400 dengan kecepatan
tinggi.
2. Arsitektur Harvard
Arsitektur Harvard memiliki dua memori yang terpisah satu untuk program
(ROM) dan satu untuk data (RAM). Intel 80C51, keluarga Microchip PIC16XX,
Philips P87CLXX dan Atmel AT89LSXX adalah contoh dari mikroprosesor yang
mengadopsi arsitektur Harvard.
2.3 Clock
Peran clock bagi mikrokontroler ibarat jantung bagi manusia. Manusia tanpa
detak jantung tidak akan hidup. Mikrokontroler tanpa detak clock juga tidak akan
berfungsi. Pulsa clock mengambil peran penting dalam menentukan kecepatan
dan sikronisasi kerja Central Processing Unit (CPU) mikrokontroler.
2.4 Reset
Proses Reset merupakan proses untuk mengembalikan sistem ke kondisi
semula. Reset tidak mempengaruhi internal program memory. Reset terjadi jika pin
RST bernilai high selama minimal 2 machine cycle lalu kembali bernilai low.
Power-on reset merupakan proses reset yang berlangsung secara otomatis
pada saat sistem pertama kali diberi daya. Proses ini mempengaruhi semua
register dan internal data memory.
Rangkaian reset sama fungsinya dengan rangkaian reset pada komputer.
Fungsi reset di mikrokontroler yaitu untuk merestart program, sehingga kembali ke
program awal. Penggunaan reset pada mikrokontroler opsional, bisa di pake atau
nggak tergantung si pengguna.
BAB 3
ARSITEKTUR MIKROKONTROLER
3.1 Arsitektur
Arsitektur mikrokontroler MCS-51 diotaki oleh CPU 8 bit yang terhubung melalui
satu jalur bus dengan memori penyimpanan berupa RAM dan ROM serta jalur I/O
berupa port bit I/O dan port serial. Selain itu terdapat fasilitas timer/counter
internal dan jalur interface address dan data ke memori eksternal.
- MODE 0.
Mode 0 adalah timer/counter 13 bit. Mode ini disediakan terutama untuk
menjaga kompatibilitas dengan prosesor 8048. Pada mode 0, register TLx (TL0
atau TL1) hanya digunakan 5 bit terendah saja sedangkan register THx (TH0
atau TH1) tetap selebar 8 bit. TLx akan bertambah hingga bernilai 1Fh. Saat ada
perubahan nilai TLx dari 1Fh ke 00h, THx akan bertambah 1. Nilai maksimal THx
dan TLx adalah FF1Fh (THx = FFh dan TLx = 1Fh). Overflow akan terjadi jika ada
perubahan dari FF1Fh ke 0000h. Nilai THx dan TLx dapat diubah oleh user
setiap saat dalam program.
Gambar Timer/Counter mode 0
- MODE 1
Mode 1 pada dasarnya serupa dengan mode 0. Namun pada mode 1 semua
bit TLx digunakan, sehingga mode 1 merupakan timer/counter 16 bit. TLx akan
bertambah hingga bernilai FFh. Saat ada perubahan nilai TLx dari FFh ke 00h,
THx akan bertambah 1. Nilai maksimal THx dan TLx adalah FFFFh (THx = FFh
dan TLx = FFh). Overflow akan terjadi jika ada perubahan dari FFFFh ke 0000h.
Nilai THx dan TLx dapat diubah oleh user setiap saat dalam program.
- MODE 2
Mode 2 adalah timer/counter 8 bit dengan fasilitas auto reload. TLx
bertindak sebagai timer/counter 8 bit. Sedangkan THx berisi suatu nilai tertentu.
Auto reload adalah fasilitas dimana nilai TLx setelah overflow tidak kembali ke
00h namun nilai TLx akan diambil dari nilai THx.
Misalkan THx berisi 47h dan TLx berisi FFh. Jika ada overflow pada TLx, nilai TLx
akan berubah dari FFh ke 47h, sesuai dengan nilai THx. Proses tersebut
dikerjakan secara otomatis secara hardware sehingga user tidak perlu
memeriksa apakah nilai TLx sudah overflow dan tidak perlu mengisi ulang
dengan nilai yang baru. Mode 2 ini juga digunakan untuk menghasilkan baud
rate.
Gambar Timer/Counter mode 2
- MODE 3
Pada mode 3, Timer/Counter 0 akan menjadi dua timer/counter 8 bit,
sedangkan Timer/Counter 1 akan berhenti. TL0 akan menjadi timer/counter 8 bit
yang dikendalikan oleh bit kontrol Timer/Counter 0 (meliputi GATE, C/T , TR0,
INT0, dan TF0). TH0 akan menjadi timer 8 bit (bukan counter) yang dikendalikan
oleh bit kontrol Timer/Counter 1 (meliputi TR1 dan TF1). Jadi TR1 mengendalikan
TH0 dan Timer/Counter 1 secara bersamaan.
Proses inisialisasi adalah proses menentukan nilai semua register yang berkaitan
dengan Timer/Counter yang akan digunakan agar Timer/Counter dapat berfungsi
sebagaimana yang dikehendaki. Register yang harus diatur terlebih dahulu meliputi :
3. IE dan/atau IP
Jika Timer/Counter yang diprogram akan digunakan sebagai sumber
interrupt, maka IE dan/atau IP juga harus diatur. Misalnya kedua Timer/Counter
digunakan sebagai sumber interrupt dengan prioritas Timer/Counter 1, maka
instruksinya adalah sebagai berikut :
MOV IP, #00001000b
MOV IE, #10002020b
atau
MOV IP, #08h
MOV IE, #8Ah
atau
SETB PT1
SETB ET1
SETB ET0
SETB EA
Intruksi MOV A,$7F merupakan contoh sebuah intruksi dasar yang sangat
spesifik, MOV merupakan kata kerja yang memerintahkan peng-copy-an data,
merupakan predikat dalam kalimat perintah ini. Sedangkan objeknya adalah data
yang di-copy-kan, dalam hal ini adalah data yang ada di dalam memori nomor $7F
di-copy-kan ke Akumulator A.
Penyebutan data secara langsung (direct addressing mode), cara ini dipakai
untuk menunjuk data yang berada di dalam memori dengan cara menyebut nomor
memori tempat data tersebut berada : MOV A,$30. Contoh instruksi ini
mempunyai makna data yang berada di dalam memori nomor $30 di-copy-kan ke
Akumulator. Sekilas intruksi ini sama dengan instruksi data konstan di atas,
perbedaannya instruksi di atas memakai tanda # yang menandai $20 adalah
data konstan, sedangkan dalam instruksi ini karena tidak ada tanda # maka $30
adalah nomor dari memori.
Penyebutan data secara tidak langsung (indirect addressing mode), cara ini
dipakai untuk menunjuk data yang berada di dalam memori, kalau memori
penyimpan data ini letaknya berubah-rubah sehingga nomor memori tidak disebut
secara langsung tapi di-titip-kan ke register lain : MOV A,@R0. Dalam instruksi ini
register serba guna R0 dipakai untuk mencatat nomor memori, sehingga instruksi
ini mempunyai makna memori yang nomornya tercatat dalam R0 isinya di-copy-
kan ke Akumulator A. Tanda @ dipakai untuk menandai nomor memori disimpan
di dalam R0. Bandingkan dengan instruksi penyebutan nomor memori secara
langsung di atas, dalam instruksi ini nomor memori terlebih dulu disimpan di R0
dan R0 berperan menunjuk memori mana yang dipakai, sehingga kalau nilai R0
berubah memori yang ditunjuk juga akan berubah pula. Dalam instruksi ini register
serba guna R0 berfungsi dengan register penampung alamat (indirect address
register), selain R0 register serba guna R1 juga bisa dipakai sebagai register
penampung alamat.
Selain itu, masih dikenal pula perintah MOVX, yakni perintah yang dipakai
untuk memori data eksternal (X singkatakan dari External). Perintah ini hanya
dimiliki oleh anggota keluarga MCS51 yang mempunyai memori data eksternal,
misalnya AT89C51 dan lain sebagainya, dan jelas tidak dikenal oleh kelompok
AT89Cx051 yang tidam punya memori data eksternal. Hanya ada 6 macam
instruksi yang memakai MOVX, instruksi-instruksi tersebut adalah:
MOVX A,@DPTR
MOVX A,@R0
MOVX A,@R1
MOVX @DPTR,A
MOVX @R0,A
MOVX @R1,A
Perintah SUBB
Isi Akumulator A dikurangi dengan bilangan 1 byte berikut dengan nilai bit
Carry, hasil pengurangan akan ditampung kembali dalam Akumulator. Dalam
operasi ini bit Carry juga berfungsi sebagai penampung limpahan hasil
pengurangan. Jika hasil pengurangan tersebut melimpah (nilainya kurang dari
0) bit Carry akan bernilai 1, kalau tidak bit Carry bernilai 0.
SUBB A,R0 ; A = A - R0 - C
SUBB A,#$23 ; A = A - $23
SUBB A,@R1
SUBB A,P0
Perintah DA
Perintah DA (Decimal Adjust) dipakai setelah perintah ADD; ADDC atau
SUBB, dipakai untuk merubah nilai biner 8 bit yang tersimpan dalam
Akumulator menjadi 2 buah bilangan desimal yang masing-masing terdiri dari
nilai biner 4 bit.
Perintah MUL AB
Bilangan biner 8 bit dalam Akumulator A dikalikan dengan bilangan biner 8
bit dalam register B. Hasil perkalian berupa bilangan biner 16 bit, 8 bit
bilangan biner yang bobotnya lebih besar ditampung di register B, sedangkan
8 bit lainnya yang bobotnya lebih kecil ditampung di Akumulator A.
Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai
hasil perkalian yang ada dalam register B. Bit OV akan bernilai 0 jika register
B bernilai $00, kalau tidak bit OV bernilai 1.
MOV A,#10
MOV B,#20
MUL AB
Perintah DIV AB
Bilangan biner 8 bit dalam Akumulator A dibagi dengan bilangan biner 8 bit
dalam register B. Hasil pembagian berupa bilangan biner 8 bit ditampung di
Akumulator, sedangkan sisa pembagian berupa bilangan biner 8 bit ditampung
di register B.
Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai
sebelum pembagian yang ada dalam register B. Bit OV akan bernilai 1 jika
register B asalnya bernilai $00.
5. Instruksi LJMP
Kode untuk instruksi LJMP adalah $02, nomor memori-program baru yang
dituju dinyatakan dengan bilangan biner 16 bit, dengan demikian instruksi ini
bisa menjangkau semua memori-program MCS51 yang jumlahnya 64 KiloByte.
Instruksi LJMP terdiri atas 3 byte, yang bisa dinyatakan dengan bentuk umum
02 aa aa, aa yang pertama adalah nomor memori-program bit 8 sampai
dengan bit 15, sedangkan aa yang kedua adalah nomor memori-program bit 0
sampai dengan bit 7.
Pemakaian instruksi LJMP bisa dipelajari dari potongan program berikut :
LJMP TugasBaru
ORG $2000
TugasBaru:
MOV A,P3.1
6. Instruksi AJMP
Nomor memori-program baru yang dituju dinyatakan dengan bilangan
biner 11 bit, dengan demikian instruksi ini hanya bisa menjangkau satu daerah
memori-program MCS51 sejauh 2 KiloByte. Instruksi AJMP terdiri atas 2 byte,
byte pertama merupakan kode untuk instruksi AJMP (00001b) yang digabung
dengan nomor memori-program bit nomor 8 sampai dengan bit nomor 10, byte
kedua dipakai untuk menyatakan nomor memori-program bit nomor 0 sampai
dengan bit nomor 7. Berikut ini adalah potongan program untuk menjelaskan
pemakaian instruksi AJMP:
ORG $800
AJMP DaerahIni
AJMP DaerahLain
ORG $900
DaerahIni:
...
ORG $1000
DaerahLain:
...
7. Instruksi SJMP
Nomor memori-program dalam instruksi ini tidak dinyatakan dengan
nomor memori-program yang sesungguhnya, tapi dinyatakan dengan
pergeseran relatip terhadap nilai Program Counter saat instruksi ini
dilaksanakan.
Pergeseran relatip tersebut dinyatakan dengan 1 byte bilangan 2s
complement, yang bisa dipakai untuk menyakatakan nilai antara 128 sampai
dengan +127. Nilai minus dipakai untuk menyatakan bergeser ke instruksi-
instruksi sebelumnya, sedangkan nilai positip untuk menyatakan bergeser ke
instruksi-instruksi sesudahnya.
Meskipun jangkauan instruksi SJMP hanya 128 sampai +127, tapi instruksi
ini tidak dibatasi dengan pengertian daerah memori-program 2 KiloByte yang
membatasi instruksi AJMP.
ORG $0F80
SJMP DaerahLain
...
ORG $1000
DaerahLain:
MOV A,#0
JNZ BukanNol
JZ Nol
...
BukanNol:
...
Nol :
...
Dalam contoh program di atas, MOV A,#0 membuat A bernilai nol, hal ini
mengakibatkan instruksi JNZ BukanNol tidak akan pernah dikerjakan (JNZ
artinya Jump kalau nilai A<>0, syarat ini tidak pernah dipenuhi karena saat
instruksi ini dijalankan nilai A=0), sedangankan instruksi JZ Nol selalu
dikerjakan karena syaratnya selalu dipenuhi.
Instruksi JC / JNC
Instruksi JC (Jump on Carry) dan instruksi JNC (Jump on no Carry) adalah
instruksi jump bersyarat yang memantau nilai bit Carry di dalam Program
Status Word (PSW).
Instruksi JB / JNB / JBC
Instruksi JB (Jump on Bit Set), instruksi JNB (Jump on not Bit Set) dan
instruksi JBC (Jump on Bit Set Then Clear Bit) merupakan instruksi Jump
bersyarat yang memantau nilai-nilai bit tertentu. Bit-bit tertentu bisa
merupakan bit-bit dalam register status maupun kaki input mikrokontroler
MCS51.
Kelompok Instruksi proses dan test
Instruksi-instruksi Jump bersyarat yang dibahas di atas, memantau kondisi
yang sudah terjadi yang dicatat MCS51. Ada dua instruksi yang melakukan dulu
suatu proses baru kemudian memantau hasil proses untuk menentukan apakah
harus Jump. Kedua instruksi yang dimaksud adalah instruksi DJNZ dan instruksi
CJNE.
Instruksi DJNZ
Instruksi DJNZ (Decrement and Jump if not Zero), merupakan instruksi yang
akan mengurangi 1 nilai register serbaguna (R0..R7) atau memori-data, dan
Jump jika ternyata setelah pengurangan 1 tersebut hasilnya tidak nol.
Contoh berikut merupakan potongan program untuk membentuk waktu
tunda secara sederhana :
MOV R0,#$23
DJNZ R0,$
Instruksi MOV R0,#$23 memberi nilai $23 pada R0, selanjutnya setiap kali
instruksi DJNZ R0,$ dikerjakan, MCS51 akan mengurangi nilai R0 dengan 1,
jika R0 belum menjadi nol maka MCS51 akan mengulang instruksi tersebut
(tanda $ dalam instruksi ini maksudnya adalah kerjakan kembali instruksi ini).
Selama mengerjakan 2 instruksi di atas, semua pekerjaan lain akan tertunda,
waktu tundanya ditentukan oleh besarnya nilai yang diisikan ke R0.
Instruksi CJNE
Instruksi CJNE (Compare and Jump if Not Equal) membandingkan dua nilai
yang disebut dan MCS akan Jump kalau kedua nilai tersebut tidak sama!
MOV A,P1
CJNE A,#$0A,TidakSama
...
SJMP EXIT
;
TidakSama:
...
Instruksi MOV A,P1 membaca nilai input dari Port 1, instruksi CJNE
A,#$0A,Tidaksama memeriksa apakah nilai Port 1 yang sudah disimpan di A
sama dengan $0A, jika tidak maka Jump ke Tidak Sama.
1. DIRECT JUMP
Merupakan proses dimana program akan melompat ke alamat tertentu. Alamat
ini dapat berlokasi sebelum ataupun sesudah alamat saat ini. Direct Jump ini
umumnya digunakan untuk melompat
daerah Interrupt Vector Address atau melompat ke awal rutin loop.
Contoh :
AJMP Start
Start: MOV ,#.....
MOV ,# ......h
MOV ,#.....h
2. CONDITIONAL BRANCHING
Merupakan proses dimana sebuah program memiliki dua pilihan alur dimana
alur yang melewati tergantung dari persyaratan yang diperiksa. Jika
persyaratan terpenuhi, program akan melompat ke
suatu alamat tertentu. Jika persyaratan tidak terpenuhi, program akan
berlanjut ke baris berikutnya atau melompat ke suatu alamat lain.
Contoh:
CJNE R7, #60H, NOT_EQ
; ;R7=60H
NOT_EQ: JC REG_LOW
; ;R7>60H
REG_LOW: ;R7<60H
3. DIRECT CALL
Adalah proses memanggil sebuah subrutin pada alamat tertentu. Saat MCS-51
mengeksekusi Direct Call, PC akan disimpan ke dalam stack dan program
melompat ke subrutin yang di panggil untuk di proses subrutin tersebut.
Contoh:
ACALL Delay
Delay: .h
PUSH 06h
PUSH 05h
MOV .,#........h
5. INTERRUPT
Adanya Interrupt membuat program utama terhenti sebentar untuk
menjalankan Interrupt Service Rountine. Pada dasarnya proses mengeksekusi
interrupt sama dengan melakukan Direct Call ke
Interrupt Vector Addres dan Return From Subroutine pada akhirnya Interrupt
Service Routine. Perbedaannya adalah pada penggunaan RETI dan bukan RET.
Contoh:
INTER0: MOV P1,#0H
SETB P1.0
LCALL LDELAY
CLR P1.0
RETI
6.3 Perulangan
1. IF THEN
Dengan pernyataan ini kita dapat menguji sebuah kondisi tertentu dan
kemudian menentukan tindakan yang sesuai dengan kondisi yang diinginkan.
Sintak penulisannya adalah sebagai berikut:
Sintak diatas digunakan jika hanya ada satu kondisi yang diuji dan hanya
melakukan satu tindakan. Jika melakukan lebih dari satu tindakan maka
sintaknya harus ditulis sebagai berikut:
<Pernyataan ke-1>
<Pernyataan ke-2>
<Pernyataan ke-n>
END IF
2. SELECT CASE
END SELECT
3. WHILE WEND
<Pernyataan>
WEND
4. DO LOOP
Do
<Blok pernyataan>
Loop
Do
<Blok pernyataan>
5. FOR NEXT
Next
6. EXIT
Perintah ini digunakan untuk keluar secara langsung dari blok program
For... Next, Do... Loop, Sub... Endsub, While... Wend. Sintak penulisannya adalah
sebagai berikut:
7. GOSUB
Dengan perintah GOSUB program akan melompat ke sebuah label dan
akan menjalan-kan program yang ada dalam rutin tersebut sampai menemui
perintah Return. Perintah Return akan mengembalikan program ke titik setelah
perintah Gosub.
8. GOTO
Perintah GOTO digunakan untuk melakukan percabangan, perbedaannya
dengan GOSUB ialah Perintah GOTO tidak memerlukan perintah Return
sehingga programnya tidak akan kembali lagi ke titik dimana perintah GOTO itu
berada. Berikut ini adalah sintak perintah GOTO:
GOTO label
Label:
1. Register Addressing
Register Addressing adalah proses mengakses memori dengan label antara R0
hingga R7
Contoh : MOV A, R1
Jika register bank yang digunakan adalah register bank 0, maka nilai pada
alamat 01h (R1) akan diisika ke Accumulator.
2. Direct Addressing
Sesuai dengan namanya, Direct Addressing adalah mengakses sebuah lokasi
memori secara langsung dengan menggunakan alamatnya.
Contoh : MOV A, 47h
Isi dari alamat 47h akan langsung dipindah ke Accumulator.
3. Indirect Addressing
Indirect Addressing adalah proses mengakses alamat secara tak langsung.
Contoh: MOV A, @R0
Misalkan R0 berisi 35h dan alamat 35h berisi 60h. Pada saat instruksi tersebut
diproses. CPU akan memeriksa isi R0. Karena R0 berisi 35h, maka CPU akan
mengambil isi dari alamat 35h tersebut kemudian diisikan ke Accumulator. Di
akhir proses Accumulator akan menyimpan nilai 60h.
4. Immediate Addressing
Immediate Addressing adalah proses mengisi suatu alamat memori dengan
suatu nilai tertentu.
Contoh : MOV A, #30h
Nilai 30h akan langsung diisikan ke dalam Accumulator.
5. Relative Addressing
Relative Addressing digunakan pada instruksi untuk melompat ke alamat
tertentu. Pada Relative Addressing. sebuah Relative Address atau Offset selebar
8 bit akan dijumlahkan dengan Program Counter sehingga menjadi alamat yang
dituju. Karena Relative Address hanya selebar 8 bit, maka Relative-Addressing
hanya dapat dipakai untuk melompat dalam jangkauan 128 byte ke belakang
hingga 127 byte ke depan (-l28 s/d+ 127).
Contoh : SJMP SINI
sedangkan alamat label SINI adalah 1120h. Setelah instruksi tersebut diproses,
PC meniadi bernilai 1102h. Berarti Relative Address-nya bernilai Fh (1102h +
000Fh = 1120h). Jika alamat label SINI 10F2h, maka Relative Address-nya
bernilai -16 atau F0h. Dalam perhitungannya F0h akan diubah dalam 16 bit
hingga menjadi FFF0h (1102h + FFF0h = 10F2h).
Relative Addressing lebih fleksibel dipakai karena tidak terpengaruh oleh lokasi
memori, namun jangkauannya terbatas.
6. Absolute Addressing
Absolute Addressing adalah melompat atau memanggil alamat yang dituju
dengan menyatakan lokasi alamatnya secara langsung (tidak menggunakan
offset). Absolute Addresing hanya digunakan dalam AJMP dan ACALL. Kapasitas
internal program memory sebesar 64 KB dibagi menjadi 32 pages dengan
kapasitas masing-masing page sebesar 2 KB (0000h - 07FFh, 0800h - 0FFFh,
dst.). Alamat yang dituju langsung dinyatakan dalam 16 bit dimana 5bit teratas
menunjukkan 2 KB page dan 11 bit terbawah menunjukkan alamat dalam 2 KB
page tersebut. Saat Absolute Addressing digunakan, bagian yang berubah
hanyalah 11 bit terbawah, sedangkan 5 bit teratas tetap.
Contoh : AJMP SINI
Misalkan alamat instruksi tersebut berada pada 1810h (0001100000010000b)
dan 1811h (0001100000010001b) sedangkan alamat label SINI adalah 1F1Fh
(0001111100011111b). Semua alamat memiliki 5 bit teratas yang sama
(00011) sedangkan l1 bit sisanya bernilai sesuai alamat yang dituju, yaitu
11100011111. Jangkauan Absolute Addressing lebih jauh dari pada Relative
Addressing, namun jangkauannya hanya dalam 2 KB page yang sama. Oleh
karena itu Absolute Addressing tidak dapat digunakan untuk melompat dari
alamat 07F0h (0000011111110000b) ke alamat 0810h (0000100000010000b)
meskipun jarak keduanya hanya sebesar 20h.
7. Long Addressing
Long Addressing adalah melompat atau memanggil alamat yang dituju
dengan menyatakan lokasi alamatnya secara langsung (tidak menggunakan
offset). Long Addressing hanya digunakan dalam LJMP dan LCALL. Alamat yang
dituju dinyatakan dalam 16 bit yang dapat dipakai semuanya sehingga dapat
melompat sejauh mungkin dalam jangkauan 64 KB.
Contoh : LJMP SINI
8. Indexed Addressing
Indexed Addressing adalah proses mengakses suatu alamat dengan
menggunakan indeks dan register basis (berupa DPTR atau PC). Instruksi yang
menggunakan Indexed Addressing adalah : MOVC A, @A+<register basis> dan
JMP @A+DPTR.
Contoh : MOVC A, @A+DPTR
Misalkan DPTR berniat 1000h, Accumulator bemilai 2h, dan alamat 1002h
menyimpan nilai FFh. Saat instruksi tersebut diproses, CPU akan mengambil
data pada alamat 1002h (1000h + 2h) dan mengisikannya ke Accumulator.
Diakhir proses, Accumulator akan menyimpan nilai FFh.
Indexed Addressing ini umumnya digunakan untuk mengakses lookup table.
Dengan menetapkan nilai register basis terlebih dahulu, user hanya perlu
mengubah nilai Accumulator untuk mendapatkan nilai-nilai dalam tabel.
2. INC
Perintah yang digunakan untuk melakukan penambahan 1
Contoh :
3. JMP (JUMP)
Perintah yang digunakan untuk melompat ke suatu label yang dituju
Contoh :
Sjmp anda : lompat atau jalankan langsung program pada label anda
Sjmp proses : lompat atau jalankan langsung program pada label proses
Ljmp 500h : lompat atau jalankan langsung program pada alamat
memori 100h
JMP 0203 : lompat ke arah lokasi memori offset:0203
CMP BX,0230 : membandingjan BX dengan 0230
4. ADD
Perintah yang digunakan untuk operasi penambahan
Contoh :
5. SUB
Perintah yang digunakan untuk pengurangan
Contoh :
6. DEC
Perintah yang digunakan untuk melakukan pengurangan 1
Contoh :
7. MUL
Perintah yang digunakan untuk melakukan operasi perkalian
Contoh :
8. DIV
Perintah yang digunakan untuk melakukan operasi pembagian
Contoh :
9. ANL
Perintah yang digunakan untuk operasi logika AND
COntoh :
10.ORL
Perintah yang digunakan untuk operasi logika OR
Contoh:
ORL A, 07H : proses OR terhadap Akumulator ke 07H
ORL A, @R0 : Proses OR terhadap A ke RAM
ORL A,#60H : Proses OR terhadap A ke data pada alamat memori 60H
ORL 08H, A : Proses OR terhadap 08H ke Akumulator
ORL 09H, #03H : Proses OR terhadap 09H ke 03H
11.XRL
Perintah yang digunakan untuk operasi logika XOR
Contoh:
12.CLR
Perintah yang digunakan untuk mereset data
Contoh:
13.CPL
Perintah yang digunakan untuk mengkomplemenkan data
Contoh:
14.RR/RL
Perintah yang digunakan untuk menggeser posisi sebanyak 1 bit
Contoh:
15.SETB
Perintah yang digunakan untuk memberikan logika 1 pada suatu port
Contoh:
16.JB/ JNB
Perintah yang digunakan untuk lompat ke label subprogram bila nilai port x.y
berlogika LOWatau mempunyai nilai nol
Contoh :
Jnb p1.0, go : ke label subprogram bila nilai port 1.0 berlogika LOW
Jnb p2.0, go : ke label subprogram bila nilai port 2.0 berlogika LOW
Jnb p3.0, go : ke label subprogram bila nilai port 3.0 berlogika LOW
Jnb p4.0, go : ke label subprogram bila nilai port 4.0 berlogika LOW
Jnb p5.0, go : ke label subprogram bila nilai port 5.0 berlogika LOW
17.JZ/JNZ
Perintah yang digunakan untuk mengurangi nilai isi data pada register x dan
bila nilainya belumtercapai maka akan dilakukan lompatan ke label
subprogram
Contoh:
Mov B,#00H : Jika Nilai akumulator A adalah 00H Jump Ke alamat untuk
eksekusi Mov B,#00H
JNZ R7, gaul : kurangi nilai isi data pada register R7 dan bila nilainya
belumtercapai 0 maka dilakukan lompatan subprogram dengan label
GAUL
JNZ R10, coba : kurangi nilai isi data pada register R10 dan bila
nilainyabelum tercapai 0 maka dilakukan lompatan subprogram dengan
label COBA
JNZ R12, klik : kurangi nilai isi data pada register R12 dan bila nilainya
belumtercapai 0 maka dilakukan lompatan subprogram dengan label
KLIK
JNZ R3, pilih : kurangi nilai isi data pada register R3 dan bila nilainya
belumtercapai 0 maka dilakukan lompatan subprogram dengan label
PILIH
18.CJNE
perintah yang digunakan untuk membandingkan apakah nilai data sama
dengan nilai xyz , bilanilainya tidak sama maka lompat ke label subprogram
Contoh:
1. MODE 0
Mode 0 adalah 8 bit shift register dimana data dikirimkan dan diterima melalui
pin RXD sedangkan clock dikirimkan dan diterima melalui pin TXD. Pengiriman
data 8 bit dilakukan dengan
mengirimkan Least Significant Bit (LSB) terlebih dahulu. Pada mode 0, baud
rate yang gunakan adalah sebesar 1/12 dari frekuensi osilator.
2. MODE 1
Pada mode 1, jumlah data yang dikirimkan sebanyak 10 bit yang terdiri dari
start bit, 8 bit data (LSB terlebih dahulu), dan stop bit. Ada proses penerimaan,
nilai stop bit akan dimasukkan ke RB8 secara otomatis. Pada proses
pengiriman, stop bit akan diberi nilai 1 secara otomatis. Pada mode 1, baud
rate yang digunakan dapat diatur melalui Timer 1.
3. MODE 2
Pada mode 2, jumlah data yang dikirimkan sebanyak 11 bit yang terdiri dari
start bit, 8 bit data (LSB terlebih dahulu), bit ke-9, dan stop bit. Pada proses
pengiriman, nilai bit ke 9 dapat diatur dengan mengisi nilai TB8. Pada proses
penerimaan, bit ke 9 akan dimasukkan ke RB8 secara otomatis.
Pada mode 2, baud rate yang dapat digunakan adalah sebesar 1/64 frekuensi
osilator atau 1/32 frekuensi osilator jika SMOD bernilai 1.
4. MODE 3
Mode 3 hampir sama dengan mode 2. Perbedaannya terdapat pada baud rate
yang digunakan. Jika mode 2 menggunakan baud rate yang pasti, mode 3
menggunakan baud rate yang dihasilkan oleh Timer 1.
2. DAC
Fungsi DAC adalah merubah besaran digital (biasanya tegangan) ke
bilangan analog. Kebalikan dari ADC seperti diatas
3. Analog Comparator
Komparator analog atau komparator tegangan adalah suatu devais yang
dapat membandingkan dua tegangan input. Komparator analog dapat
digunakan sebagai alarm angin puting beliung/tornado jika salah satu inputnya
dihubungkan dengan anemometer. Komparator analog juga dapat digunakan
sebagai pengukur waktu pengisian muatan pada kapasitor jika dihubungkan
dengan sebuah mikrokontroler.
Komparator analog pada dasarnya adalah suatu Op-Amp (Operational
Amplifier). Sepertihalnya Op-Amp, komparator analog memiliki pin input tak
membalik (non-inverting input), input membalik (inverting input), output,
voltase sumber positif (V+) dan sumber negatif (V-). Input tak membalik (+)
berfungsi sebagai voltase referensi (Vref), sedangkan voltase input (Vin)
dihubungkan dengan pin input membalik (-). Jika (+) > (-), voltase output (Vo)
akan mendekati V+. Dan sebaliknya jika (+) < (-), Vo bernilai di sekitar V.
Eksperimen ini menggunakan LF353P (Texas Instrument) yang merupakan
dua buah unit Op-Am yang dikemas dalam sebuah chip. Menurut datasheet,
voltase sumber positif (V+) yang dibutuhkan adalah 3.5V-18V. Sedangkan V-
dihubungkan dengan 0 V (ground). Eksperimen inibertujuan untuk mengetahui
karakteristik komparator analog LF353P pada tegangan kerja, yaitu V+.
Jumper pada.rangkaian gambar diatas digunakan untuk memilih sumber reset. Jika
jumper menghubungkan pin 1 dan 2, maka minimum system berada pada mode
download dimana sumber reset bukan dari DS 1812 melainkan dari sumber di luar
minimum system. Jika jumper menghubungkan pin 2 dan 3, maka minimum
system berada dalam mode stand alone dimana proses reset akan dilakukan oleh
DS 1812 dan minimum system akan langsung mengeksekusi program yang telah
di-download.
Minimum system yang baik memiliki kemampuan untuk mengakses external
memory. Untuk menghubungkan antara mikrokontroler dan memori dibutuhkan
sebuah IC latch. Komponen yang sering digunakan sebagai latch adalah 74L5573.
Selain itu, minimum system juga memiliki rangkaian overlap. Hal ini bertujuan
untuk mempermudah proses pengembangan program dan menghemat waktu
karena program lebih mudah dituliskan ke external memory daripada dituliskan ke
dalam 89C51. Untuk menuliskan program ke dalam 89C51 user masih harus
melepas IC tersebut. Sedangkan untuk menuliskan program ke external memory,
user tidak perlu melepas IC apapun. Komponen yang sering digunakan sebagai
overlap adalah 74LS08.
2. Common Katoda
Merupakan kebalikan dari Common Anoda. Disini semua katoda disatukan secara
parallel dan dihubungkan ke GROUND. Karena seluruh katoda dihubungkan ke
GROUND, maka COMMON KATODA ini berada pada kondisi AKTIF HIGH (led akan
menyala/aktif bila diberi logika 1).
Prinsip Kerja :
Prinsip kerja seven segmen ialah input biner pada switch dikonversikan masuk ke
dalam decoder, baru kemudian decoder mengkonversi bilangan biner tersebut
menjadi decimal, yang nantinya akan ditampilkan pada seven segment.
Seven segment dapat menampilkan angka-angka desimal dan beberapa karakter
tertentu melalui kombinasi aktif atau tidaknya LED penyusunan dalam seven
segment. Untuk memudahkan penggunaan seven segment, umumnya digunakan
sebuah decoder( mengubah/ mengkoversi input bilangan biner menjadi decimal)
atau seven segment driver yang akan mengatur aktif tidaknya led-led dalam
seven segment sesuai dengan nilai biner yang diberikan.
Dekoder BCD ke seven segment digunakan untuk menerima masukan BCD 4-bit
dan memberikan keluaran yang melewatkan arus melalui segmen untuk
menampilkan angka desimal. Jenis dekoder BCD ke seven segment ada dua
macam yaitu dekoder yang berfungsi untuk menyalakan seven segment mode
common anoda dan dekoder yang berfungsi untuk menyalakan seven segment
mode common katoda. Contoh IC converter BCD to Seven Segment untuk 7-
segment Common Anoda pake decoder IC TTL 7447 untuk Common Katoda pakai
IC TTL 7448.
void rolling()
{
enable4=1;enable1=0;
set=hit[sat_mnt];
delay_ms(x);
if(sat_mnt>9){sat_mnt=0;pul_mnt++;}
enable1=1;enable2=0;
set=hit[pul_mnt];
delay_ms(x);
if(pul_mnt>5){pul_mnt=0;sat_jam++;}
enable2=1;enable3=0;
set=hit[sat_jam];
delay_ms(x);
if(sat_jam>9){sat_jam=0;pul_jam++;}
enable3=1; enable4=0;
set=hit[pul_jam];
delay_ms(x);
if(pul_jam>=4&&sat_jam==2){sat_jam=0;pul_jam=0;}
void setting()
{
while(1)
{
if (tombol1==0)
{
delay_ms(200);
while(tombol1==0);
a++;
if(a==1)
{ for(;;)
{
enable4=1;enable1=0;;set=hit[sat_mnt];
if(tombol2==0){ delay_ms(200); while(tombol2==0);sat_mnt+
+;if(sat_mnt>9)sat_mnt=0;}
else if(tombol1==0){break;};
};
}
else if(a==2)
{ for(;;)
{
enable1=1;enable2=0;;set=hit[pul_mnt];
if(tombol2==0){ delay_ms(200); while(tombol2==0);pul_mnt+
+;if(pul_mnt>5)pul_mnt=0;}
else if(tombol1==0){break;};
};
}
else if(a==3)
{ for(;;)
{
enable2=1;enable3=0;;set=hit[sat_jam];
if(tombol2==0){ delay_ms(200); while(tombol2==0);sat_jam+
+;if(sat_jam>9)sat_jam=0;}
else if(tombol1==0){break;};
};
}
else if(a==4)
{ for(;;)
{
enable3=1; enable4=0;;set=hit[pul_jam];
if(tombol2==0){delay_ms(200); while(tombol2==0);pul_jam+
+;if(pul_jam>2)pul_jam=0;}
else if(tombol1==0){break;};
};
}
else if(a>4){a=0;goto lanjut;};
}
else if(a==0)break;
lanjut:
void jalan()
{
for (detik=1;detik<60;detik++)
{
DDRB.4=DDRB.5=1;
PORTB.5=1;
PORTB.4=1;
for (y=0;y<=24;y++)
{
rolling();
setting();
};
PORTB.4=0;
PORTB.5=0;
for (y=0;y<=24;y++)
{
rolling();
setting();
};
};
sat_mnt++;
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
set=hit[0];
delay_ms(10);
while(1)
{ jalan(); }
Konsep Dasar
Sinyal PWM pada umumnya memiliki amplitudo dan frekuensi dasar yang
tetap, namun memiliki lebar pulsa yang bervariasi. Lebar Pulsa PWM berbanding
lurus dengan amplitudo sinyal asli yang belum termodulasi. Artinya, Sinyal PWM
memiliki frekuensi gelombang yang tetap namun duty cycle bervariasi (antara 0%
hingga 100%)
Pulse Width Modulation (PWM) merupakan salah satu teknik untuk
mendapatkan signal analog dari sebuah piranti digital. Sebenarnya Sinyal PWM
dapat dibangkitkan dengan banyak cara, dapat menggunakan metode analog
dengan menggunakan rankaian op-amp atau dengan menggunakan metode
digital.
Dengan metode analog setiap perubahan PWM-nya sangat halus, sedangkan
menggunakan metode digital setiap perubahan PWM dipengaruhi oleh resolusi dari
PWM itu sendiri. Resolusi adalah jumlah variasi perubahan nilai dalam PWM
tersebut. Misalkan suatu PWM memiliki resolusi 8 bit berarti PWM ini memiliki
variasi perubahan nilai sebanyak 2 pangkat 8 = 256 variasi mulai dari 0 255
perubahan nilai yang mewakili duty cycle 0 100% dari keluaran PWM tersebut