This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
1. Mahasiswa memahami rangkaian mikrokontroller untuk menghidupkan dan mematikan LED.
2. Mahasiswa dapat memahami program assembly untuk menghidupkan dan mematikan LED.
3. Mahasiswa memahami beberapa instruksi assembly dasar, MOV, Setb, Clr, RL dan RR.
4. Mahasiswa memahami pembuatan instruksi waktu tunda GAMBAR:
D1
P0.0..P0.7
D8
VCC
J3
EN LED12
Gambar 1.1 Rangkaian Display LED
Perhatikan pada gambar 1.1 tersebut. Delapan buah LED terhubung ke port 0, yang difungsikan sebagai output. Pada konfigurasi tersebut LED akan nyala bila diberi logika LOW ‘0’ melalui port 0, dan LED akan padam bila diberi logika HIGH ‘1’ melalui port 0. Agar Display LED ini dapat aktiv maka jumper EN LED harus dihubungkan singkat.
Percobaan 1.1. Menghidupkan LED dengan Instruksi MOV Pada percobaan 1.1 ini LED akan dihidupkan atau dimatikan dengan mengirimkan data tertentu pada port 0. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper pada LED_EN, untuk mengaktifkan 8 buah LED 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Percobaan 1.2. Pembuatan Subrutine Waktu Tunda Pada percobaan ini, 8 LED akan berkedip secara kontinu, yang diakibatkan oleh pemberian waktu tunda. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 1.5. Diagram alir percobaan 1.2
4. Ketik program berikut ini:
Org 0h Start: Mov P0,#11111111b ; Kirim data biner 11111111 ke P0 Call Delay ; Memanggil waktu tunda Mov P0,#00000000b ; Kirim data biner 00000000 ke P0 Call Delay ; Memanggil waktu tunda Sjmp start ; lompat ke start ; Delay: mov R1,#255 ; Isi 255 ke R1 Del1: mov R2,#255 ; Isi 255 ke R2 Del2: djnz R2,del2 ; Dec. R2 dan lompat ke del2 if NZ djnz R1,del1 ret end
5. Simpanlah program yang anda ketik dan beri nama : prog12a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
8. Lakukan pengamatan pada LED 9. Gantilah data tersebut untuk mengedipkan sebuah LED, dua buah LED dan
seterusnya,sesuai tabel berikut ini.
D0 D1 D2 D3 D4 D5 D6 D7 LED YANG PADAM
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 0
1 1 1 1 1 0 0 0
1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
Percobaan 1.3. Instruksi Setb dan Clr Pada percobaan ini, sebuah LED atau lebih dapat dihidupkan atau dimatikan dengan perintah setb dan clr. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 4. Ketik program berikut ini:
Org 0h Start: Clr P0.0 ; Kirim logika ‘0’ ke P0.0 Clr P0.1 ; Kirim logika ‘0’ ke P0.1
Clr P0.2 ; Kirim logika ‘0’ ke P0.2 Clr P0.3 ; Kirim logika ‘0’ ke P0.3 Clr P0.4 ; Kirim logika ‘0’ ke P0.4
Clr P0.5 ; Kirim logika ‘0’ ke P0.5 Clr P0.6 ; Kirim logika ‘0’ ke P0.6 Clr P0.7 ; Kirim logika ‘0’ ke P0.7 Call Delay ; Memanggil waktu tunda
Setb P0.0 ; Kirim logika ‘1’ ke P0.0 Setb P0.1 ; Kirim logika ‘1’ ke P0.1 Setb P0.2 ; Kirim logika ‘1’ ke P0.2 Setb P0.3 ; Kirim logika ‘1’ ke P0.3 Setb P0.4 ; Kirim logika ‘1’ ke P0.4 Setb P0.5 ; Kirim logika ‘1’ ke P0.5 Setb P0.6 ; Kirim logika ‘1’ ke P0.6 Setb P0.7 ; Kirim logika ‘1’ ke P0.7
Call Delay ; Memanggil waktu tunda Sjmp start ; lompat ke start ; Delay: mov R1,#255 Del1: mov R2,#255 Del2: djnz R2,del2 djnz R1,del1
ret end 5. Simpanlah program yang anda ketik dan beri nama : prog13a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
8. Lakukan pengamatan pada LED 9. Rencanakan program untuk mengedipkan dua buah LED, tiga buah LED dan seterusnya dengan instruksi Setb dan Clr.
Percobaan 1.4. LED Berjalan dengan Instruksi RL/ RR ( Rotate Left dan Right ) Pada percobaan ini, sebuah LED akan berjalan dari kiri ke kanan dan sebaliknya, program ini memanfaatkan instruksi RL dan RR. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 1.6. Diagram alir percobaan 1.3
4. Ketik program berikut ini:
Org 0H Start: Mov A,#11111110b;isi A dengan 11111110b Mov R0,#7 ;isi R0 dengan 7 Kiri: Mov P0,A ;copy A ke P0 Call Delay ;panggil sub rutine delay
RL A ;data A diputar ke kiri DEC R0 ;data R0 dikurangi 1 CJNE R0,#0,Kiri ;bandingkan R0 dg 0, if NE jump kiri ; Mov R0,#7 Kanan: Mov P0,A Call Delay RR A ;data A diputar ke kanan DEC R0 ;data RO dikurangi 1 CJNE R0,#0,Kanan ;bandingkan R0 dg 0, if NE jump kanan Sjmp Start ; Delay: mov R1,#255 Del1: mov R2,#255 Del2: djnz R2,del2 djnz R1,del1 ret end 5. Simpanlah program yang anda ketik dan beri nama : prog14a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
8. Lakukan pengamatan pada LED Soal Tantangan:
1. Lakukan perubahan pada program tersebut untuk menjalankan/ menggerakkan dua buah LED kekiri dan kekanan,
2. Lakukan modifikasi program 1.4. tersebut dengan mengganti instruksi CJNE dan DEC dengan instruksi DJNZ.
Pada gambar 2.2.a tersebut tampak rangkaian push button, bila saklar ditekan maka port sesuai dengan bit tersebut akan mendapat logika low ‘0’ dan sebaliknya bila saklar tidak ditekan maka port tersebut akan mendapat logika high ‘1’.
Percobaan 2.1. Mengambil Data Saklar dan Mengeluarkan ke LED Pada percobaan ini, LED akan nyala bila saklar ditekan sesuai dengan bit saklar yang ditekan. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Buka jumper pada EN_DAC apabila sedang terhubung. 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Start
Ambil Data SaklarA P2
Komplemen A
A:= NOT A
Output data ke LED
P0 A
Gambar 2.3. Diagram alir percobaan 2.1
5. Ketik program berikut ini:
Org 0h Start: Mov A, P2 ;copy data P2 dan Simpan ke A CPL A ;Komplemen/ Invert terhadap A Mov P0, A ;Kirim data A ke P0 sjmp start ;lompat ke start end 6. Simpanlah program yang anda ketik dan beri nama : prog21a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada LED.
Saklar Kondisi LED yang Nyala (D1-D2-D3-D4-D5-D6-D7-D8 SW1
Percobaan 2.2. Mengatur Arah Gerak LED Ke Kanan-Kiri dengan Saklar Push Button P2.0 dan P2.1 Pada percobaan ini, LED akan berjalan kekanan atau kekiri mengikuti penekanan tombol P2.0 (arah kiri) atau P2.1 (arah kanan). Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 2.4. Diagram alir percobaan 2.2
4. Ketik program berikut ini:
org 0h CekP20: JB P2.0,CekP21 ; Menguji bit P2.0, apakah adalah logika '1' call RLeft ; Jika P2.0=0, maka LED putar kiri ; sjmp CekP20 ; jump forever to CekP20 CekP21: JB P2.1,CekP20 ; Menguji bit P2.1, apakah adalah logika '1' call RRight ; Jika P2.1=0, maka LED putar kanan sjmp CekP20 ; jump forever to CekP2.0 ;====================================================== ;Subrutin ini digunakan untuk menggerakkan LED Ke Kanan ;====================================================== RLeft: mov A,#11111110b ;send data 11111110 to Acc RLeft1: mov P0,A ;send data A to P0 call delay ;call delay time JB P2.1,RLeft2 ;Menguji bit P2.1, apakah adalah logika '1' sjmp EndRLeft ;Jika P2.1=0, maka lompat ke EndRLeft RLeft2: RL A ;data A di putar ke kiri sjmp RLeft1 ;lompat ke Rleft1 EndRLeft: ret ;
;==================================================== ;Subrutin ini digunakan untuk menggerakkan LED Ke Kiri ;==================================================== RRight: mov A,#01111111b ;send data to Acc RRight1: mov P0,A ;send data to P0 call delay ;call delay time JB P2.0,RRight2 ;Menguji bit P2.0, apakah adalah logika '1' sjmp EndRRight ;Jika P2.0=0, maka lompat ke EndRRight RRight2: RR A ;data A putar ke kanan sjmp RRight1 ;lompat ke Rright1 EndRRight: ret ;============================================= ;subroutine delay time ;============================================= delay: mov R1,#255 del1: mov R2,#255 del2: djnz R2,del2 djnz R1,del1 ret end 5. Simpanlah program yang anda ketik dan beri nama : prog22a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
8. Lakukan pengamatan pada LED. Soal Tantangan:
1. Lakukan modifikasi pada percobaan 2.2. tersebut sesuai dengan dengan mengganti port dengan P2.2 ( putar kanan ) dan P2.3 ( putar kiri ).
2. Buatlah suatu percobaan untuk menghidupkan dan mematikan sebuah led yang terhubung ke P0.0, dengan menggunakan sebuah saklar P2.0, sehingga apabila saklar ditekan sekali, LED nyala, dan ditekan berikutnya maka LED akan padam.
Percobaan 2.3. Setting Up/Dn dan Enter dengan display LED Pada percobaan ini, LED yang ON akan bertambah atau berkurang mengikuti penekanan tombol P2.1 (UP) atau P2.2 (DN). LED akan berhenti bertambah atau atau berkurang bila ditakan tombol P2.0 ( ENTER). Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 2.5. Diagram alir percobaan 2.3 4. Ketik program berikut ini: org 0h start: mov R7,#1 ;inisialisasi data setting Setup: mov A,R7 ;simpan data R7 ke A cpl A ;komplemen A, mov P0,A ;output data ke LED jnb p2.0,getout;bila sw1(P2.0) ditekan mk getout(selesai) jb P2.1,SetDn ;bila sw2(P2.1) ditekan mk INC R7 inc R7 ;R7:=R7+1 acall delay ;waktu tunda, antar penekanan tombol cjne R7,#100d,setup;deteksi apakah setting=100d mov R7,#1 ;reset R7 -> 1 sjmp Setup ; SetDn: Mov A,R7 ;simpan data R7 ke A cpl A ;komplemen A, mov P0,A ;output data ke LED
jnb P2.0,getout;bila sw1(P2.0) ditekan mk getout(selesai) jb p2.2,Setup ;bila sw2(P2.1) ditekan mk INC R7 dec R7 ;R7:=R7-1 acall delay ;waktu tunda lama penekanan tombol cjne R7,#0d,setDn;deteksi apakah setting=0d mov R7,#1d ;reset R7 -> 1 sjmp Setdn getout: sjmp getout ; delay: mov R0,#255 delay1: mov R2,#255 djnz R2,$ djnz R0,delay1 ret end 5. Simpanlah program yang anda ketik dan beri nama : prog23a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
8. Lakukan pengamatan pada LED. Soal Tantangan:
1. Lakukan modifikasi pada percobaan tersebut sesuai dengan dengan mengganti port tersebut dengan P2.5 (Setting UP), P2.6 (Setting Dn) dan P2.7 (Enter).
TUJUAN: 1. Mahasiswa memahami rangkaian interface mikrokontroller dengan 7 segmen 2. Mahasiswa dapat memahami program assembly untuk menampilkan data ke 7 segment 3. Mahasiswa memahami beberapa instruksi assembly dasar, MOV, Setb, Clr, dan waktu
tunda.
VCC
aa
VCC
ee
c
FCS 9013
PNP
7 x 220 ohm
d
f
FCS 9013
b
Common Anoda
PNP
FCS 9013
VCC
FCS 9013
VCC
P0.6..P0.0
FCS 9013
PNP
VCC
FCS 9013
PNP
g
Y7..Y0
g
f
VCC
FCS 9013
PNP
c
8 x 1k ohm
VCC
PNP
d
FCS 9013
VCC
b
PNPPNP
(a)
VCC
P3.6 U8
74LS138
123
645
15141312111097
ABC
G1G2AG2B
Y0Y1Y2Y3Y4Y5Y6Y7
P3.5
R28
10K
J2
EN 7 SEGMEN12
Y7..Y0
P3.7
VCC
(b)
Gambar 3.1. (a) Rangkaian display 7 segmen (b) rangkaian dekoder 74ls138
Pada tabel kebenaran tersebut tampak bahwa seven segmen yang hidup tergantung pada output dari dekoder 74LS138, yang sedang mengeluarkan logika low ”0”, sehingga dari 8 buah
display tersebut, selalu hanya satu display yang akan dihidupkan. Agar display tampak nyala secara bersamaan maka ketiga display tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu. Pada gambar tersebut seven segment commont anoda dikendalikan dengan menggunakan transistor PNP melalui decoder 74LS138, apabila ada logika low pada basis transistor, maka 7 segment akan nyala dan sebaliknya akan padam.
Gambar 3.2 Modul 7 Segment tunggal Tabel 3.2. Data Display 7 Segmen
P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 g f e d c b a
Display
1 0 0 0 0 0 0 0
1 1 1 1 0 0 1 1
0 1 0 0 1 0 0 2
0 1 1 0 0 0 0 3
:
:
0 0 0 1 0 0 0 A
0 0 0 0 0 1 1 b
1 0 0 0 1 1 0 C
:
Pada tabel tersebut tampak bahwa untuk menghidupkan sebuah segmen, harus dikirimkan data logika low ”0” dan sebaliknya untuk mematikan segmen, harus dikirimkan data logika high ”1”.
Percobaan 3.1. Tulis Karakter “A” pada 7 Segmen ( Display 1 ) Pada percobaan ini, karakter ‘A’ akan ditampilkan pada 7 Segmen Display 1 Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
start: clr P3.5 ; P3.5 = ‘0’ clr P3.6 ; P3.6 = ‘0’ clr P3.7 ; P3.7 = ‘0’ mov P0,#10001000b ; isi P0 dg. 10001000. Cetak Karakter 'A' sjmp start ; Lompat ke start end 6. Simpanlah program yang anda ketik dan beri nama : prog31a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada 7 segmen. 10.Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter Posisi Display 1 C Display 2
2 E Display 5
3 3 Display 8
Percobaan 3.2. Tulis Tiga Karakter ”AbC” pada 7 Segmen Pada percobaan ini, karakter ‘AbC’ akan ditampilkan pada 7 Segmen Display 1, Display 2 dan Display 3 secara berturutan Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
; clr P3.5 ; P3.5 = '0' setb P3.6 ; P3.6 = '1' clr P3.7 ; P3.7 = '0' mov P0,#11000110b ; Cetak Karakter 'C' call delay ; Panggil Waktu Tunda ; sjmp start ; Lompat ke start ;============================================= ;subroutine delay created to rise delay time ;============================================= delay: mov R1,#25 del1: mov R2,#25 del2: djnz R2,del2 djnz R1,del1 ret end 6. Simpanlah program yang anda ketik dan beri nama : prog32a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada 7 segmen. 10.Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter Posisi Display 1 EFG Display 1, Display 2, Display 3
2 HJL Display 3, Display 4, Display 5
3 1A3 Display 6, Display 7, Display 8
Percobaan 3.3. Tulis 8 Karakter pada 7 Segmen Pada percobaan ini, karakter ‘12345678’ akan ditampilkan pada 7 Segmen Display 1, Display 2 dan Display 3 s/d Display 8 secara berturutan : Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini:
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada 7 Segmen. 10. Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter 1 A b C d E F G H
2 9 8 7 6 5 4 3 2
3 J K L n O P r S
Soal Tantangan:
1. Buatlah tulisan data pada 7 Segmen, dan buatlah tulisan tersebut berjalan ke kanan. 2. Buatlah tuisan Surabaya pada 7 segmen, dan buatlah tulisan tersebut berjalan ke kiri.
Percobaan 3.4. Setting Up/ Dn dan Enter dengan Display ke 7 Segmen. Pada percobaan ini, akan dibuat suatu simulasi setting UP (P2.1)/ DN (P2.2) dan penekanan tombol Enter (P2.0), dan di displaykan ke display 7 Segmen. Data display akan bertambah dari 00 s/d 99 atau berkurang dari 99 s/d 00, sesuai dengan penekanan pada tombol UP/ DN.Bila ditekan tombol Enter, maka tombol UP/ DN tidak akan berfungsi lagi. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
TUJUAN: 1. Mahasiswa memahami rangkaian interface mikrokontroller dengan LCD Karakter 2 x 16 2. Mahasiswa dapat memahami program assembly untuk menampilkan data ke LCD Karakter
2 x 16 3. Mahasiswa memahami beberapa instruksi assembly dasar, MOV, Setb, Clr, dan waktu
tunda. 4. Mahasiswa memahami mencetak karakter pada posisi baris dan kolom tertentu
VSS
2
1116
7VCC
D2
EN
LCD Character
3
14
D5
8
1
GND
10k
Potensio Multiturn
D1
P3.7
D74
13
12
9BPL
6
P0.7..P0.0
2 X 16
VCC
D4
J3
EN LCD 1 2
10
D1
RSP3.6
D3
D6
D0
15
Gambar 4.1. Rangkaian interface ke LCD Karakter 2 x16
Modul LCD Character dapat dengan mudah dihubungkan dengan mikrokontroller seperti AT89S51. LCD yang akan kita praktikumkan ini mempunyai lebar display 2 baris 16 kolom atau biasa disebut sebagai LCD Character 2x16, dengan 16 pin konektor, yang didifinisikan sebagai berikut:
5 R/W Read/ Write, to choose write or read mode 0 = write mode 1 = read mode
6 E Enable 0 = start to lacht data to LCD character 1= disable
7 DB0 LSB
8 DB1 -
9 DB2 -
10 DB3 -
11 DB4 -
12 DB5 -
13 DB6 -
14 DB7 MSB
15 BPL Back Plane Light
16 GND Ground voltage
Display karakter pada LCD diatur oleh pin EN, RS dan RW:
Jalur EN dinamakan Enable. Jalur ini digunakan untuk memberitahu LCD bahwa anda sedang mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka melalui program EN harus dibuat logika low “0” dan set pada dua jalur kontrol yang lain RS dan RW. Ketika dua jalur yang lain telah siap, set EN dengan logika “1” dan tunggu untuk sejumlah waktu tertentu ( sesuai dengan datasheet dari LCD tersebut ) dan berikutnya set EN ke logika low “0” lagi.
Jalur RS adalah jalur Register Select. Ketika RS berlogika low “0”, data akan dianggap sebagi sebua perintah atau instruksi khusus ( seperti clear screen, posisi kursor dll ). Ketika RS berlogika high “1”, data yang dikirim adalah data text yang akan ditampilkan pada display LCD. Sebagai contoh, untuk menampilkan huruf “T” pada layar LCD maka RS harus diset logika high “1”.
Jalur RW adalah jalur kontrol Read/ Write. Ketika RW berlogika low (0), maka informasi pada bus data akan dituliskan pada layar LCD. Ketika RW berlogika high ”1”, maka program akan melakukan pembacaan memori dari LCD. Sedangkan pada aplikasi umum pin RW selalu diberi logika low ”0”.
Pada akhirnya, bus data terdiri dari 4 atau 8 jalur ( bergantung pada mode operasi yang dipilih oleh user ). Pada kasus bus data 8 bit, jalur diacukan sebagai DB0 s/d DB7.
Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD Character,
Function Set Mengatur interface lebar data, jumlah dari baris dan ukuran font karakter
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 1 DL N F X X
CATATAN: X : Don’t care DL: Mengatur lebar data
DL=1, Lebar data interface 8 bit ( DB7 s/d DB0) DL=0, Lebar data interface 4 bit ( DB7 s/d DB4)
Ketika menggunakan lebar data 4 bit, data harus dikirimkan dua kali N=1, Display dua baris N=0, Display satu baris
Entry Mode Set Mengatur increment/ decrement dan mode geser
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 0 1 I/D S
Catatan: I/D: Increment/ decrement dari alamat DDRAM dengan 1 ketika kode karakter dituliskan ke
DDRAM. I/D = “0”, decrement I/D= “1”, increment S: Geser keseluruhan display kekanan dan kekiri S=1, geser kekiri atau kekanan bergantung pada I/D S=0, display tidak bergeser
Display On/ Off Cursor Mengatur status display ON atau OFF, cursor ON/ OFF dan fungsi Cursor Blink
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 1 D C B
D : Mengatur display D = 1, Display is ON D = 0, Display is OFF Pada kasus ini data display masih tetap berada di DDRAM, dan dapat ditampilkan kembali
C : Menampilkan kursor C = 1, kursor ditampilkan C = 0, kursor tidak ditampilkan B : Karakter ditunjukkan dengan kursor yang berkedip B=1, kursor blink
Clear Display Perintah ini hapus layar
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 0 0 0 1
Geser Kursor dan Display Geser posisi kursor atau display ke kanan atau kekiri tanpa menulis atau baca data display. Fungsi ini digunakan untuk koreksi atau pencarian display
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 1 D/C R/L X X
Catatan : x = Dont care
D/C R/L Note
0 0 Geser posisi kursor ke kiri
0 1 Geser posisi kursor ke kanan
1 0 Geser keseluruhan display ke kiri
1 1 Geser keseluruhan display ke kanan
Memori LCD 1. DDRAM ( Display Data RAM ) Memori DDRAM digunakan untuk menyimpan karakter yang akan ditampilkan. Semua teks yang kita tuliskan ke modul LCD adalah disimpan didalam memory ini, dan modul LCD secara berturutan membaca memory ini untuk menampilkan teks ke modul LCD itu sendiri.
Pada peta memori tersebut, daerah yang berwarna kuning ( 00 s/d 0F dan 40 s/d 4F ) adalah display yang tampak. Sebagaimanan yang anda lihat, jumlahnya sebanyak 16 karakter per baris dengan dua baris. Angka pada setiap kotak adalah alamat memori yang bersesuaian dengan posisi dari layar. Demikianlah karakter pertama di sudut kiri atas adalah menempati alamah 00h. Posisi karakter berikutnya adalah alamat 01h dan seterusnya.
Akan tetapi, karakter pertama dari baris 2 sebagaimana yang ditunjukkan pada peta memori adalah pada alamat 40h. Dimikianlah kita perlu untuk mengirim sebuah perintah ke LCD untuk mangatur letak posisi kursor pada baris dan kolom tertentu. Instruksi Set Posisi Kursor adalah 80h. Untuk ini kita perlu menambahkan alamat lokasi dimana kita berharap untuk menempatkan kursor.Sebagai contoh, kita ingin menampilkan kata ”World” pada baris ke dua pada posisi kolom ke sepuluh. Sesuai peta memori, posisi karakter pada kolom 11 dari baris ke dua, mempunyai alamat 4Ah, sehingga sebelum kita tulis kata ”World” pada LCD, kita harus mengirim instruksi set posisi kursor, dan perintah untuk instruksi ini adalah 80h ditambah dengan alamat 80h+4Ah =0Cah. Sehingga dengan mengirim perintah Cah ke LCD, akan menempatkan kursor pada baris kedua dan kolom ke 11 dari DDRAM.
Sebelum kita dapat menggunakan modul LCD, kita harus melakukan inisialisasi dan mengkonfigurasikannya. Hal ini dijalankan dengan mengirimkan sejumlah instruksi ke LCD. Antara lain: pengaturan lebar data interface 8 bit atau 4 bit data bus, pemilihan ukuran font karakter 5x8 atau 5x7 dan lain-lain, dengan instruksi sebagai berikut.
Init_lcd: mov r1,#00000001b ;Display clear call write_inst ;EN=pulse dan RS=0 mov r1,#00111000b ;Function set, ;Data 8 bit,2 line font 5x7 call write_inst ;Set bit EN=pulse dan RS=0 mov r1,#00001100b ;Display on, ;cursor off,cursor blink off call write_inst ;EN=pulse dan RS=0 mov r1,#00000110b ;Entry mode, Set increment call write_inst ret
Percobaan 4.1. Tulis Sebuah Karakter pada LCD Karakter Pada percobaan ini, karakter ‘A’ akan ditampilkan pada LCD Karakter Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper LCD_EN, yang berfungsi untuk memberikan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Write_inst: clr P3.6 ; P3.6 = RS =0 mov P0,R1 ; copy R1 ke P0 setb P3.7 ; P3.7 =EN = 1 call delay ; call delay time clr P3.7 ; P3.7 =EN = 0 ret ; Write_data: setb P3.6 ; P3.6 = RS =1 mov P0,R1 ; copy R1 ke P0 setb P3.7 ; P3.7 =EN = 1 call delay ; call delay time clr p3.7 ; P3.7 =EN = 0 ret ; delay: mov R0,#0 delay1:mov R7,#0fh djnz R7,$ djnz R0,delay1 ret ; end 6. Simpanlah program yang anda ketik dan beri nama : prog41a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada karakter yang tercetak pada LCD. 10. Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter Posisi Display 1 1 Row 1, Col 2
2 Z Row 1, Col 8
3 & Row 2, Col 12
Percobaan 4.2. Tulis Delapan Karakter pada LCD Karakter Pada percobaan ini, kalimat ” Welcome” akan ditampilkan pada LCD Karakter pada baris 1 dan colom 1 Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper LCD_EN, yang berfungsi untuk memberikan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini:
6. Simpanlah program yang anda ketik dan beri nama : prog42a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada display LCD Karakter 10.Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter Posisi Display 1 Selamat Datang Baris 1, Colom 1
2 Mikrokontroller Baris 2, Colom 1
Percobaan 4.3. Tulis Karakter Dengan Look Up Table Pada percobaan ini, kalimat ”Welcome home” akan ditampilkan pada layar LCD Karakter dengan menggunakan look up table. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper LCD_EN, yang berfungsi untuk memberikan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini:
org 0h
call init_LCD start: call write_char stop: sjmp stop ; write_char: mov dptr,#word1 ;DPTR = [ address word1 ] mov r3,#16 ;R3=16,number character to be display mov r1,#80h ;R1=80h,address DDRAM start position call write_inst ; write1:clr a ; A = 0 movc a,@a+dptr ; A = [A+ DPTR] mov r1,A ; R1 = A inc dptr ; DPTR = DPTR +1 call write_data; djnz r3,write1 ; R3 = R3-1, ret ; Init_lcd: mov r1,#00000001b ;Display clear call write_inst ; mov r1,#00111000b ;Function set, Data 8 bit,2 line font 5x7 call write_inst ; mov r1,#00001100b ;Display on, cursor off,cursor blink off call write_inst
mov r1,#00000110b ;Entry mode, Set increment call write_inst ret ; Write_inst: clr P3.6 ; P3.6 = RS =0 mov P0,R1 ; copy R1 ke P0 setb P3.7 ; P3.7 =EN = 1 call delay ; call delay time clr P3.7 ; P3.7 =EN = 0 ret ; Write_data: setb P3.6 ; P3.6 = RS =1 mov P0,R1 ; copy R1 ke P0 setb P3.7 ; P3.7 =EN = 1 call delay ; call delay time clr p3.7 ; P3.7 =EN = 0 ret ; delay: mov R0,#0 delay1:mov R7,#0fh djnz R7,$ djnz R0,delay1 ret ; word1: DB ' Welcome Home '; Karakter yang disimpan di ROM end 6. Simpanlah program yang anda ketik dan beri nama : prog43a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada LCD. 10. Lakukan modifikasi pada program tersebut untuk mencetak karakter lain, sesuai tabel:
No Nama Karakter Posisi Display 1 Selamat Datang Baris 1, Colom 1
2 Mikrokontroller Baris 2, Colom 1
Soal Tantangan: 1. Dengan memanfaatkan instruksi shift display dan cursor, cetaklah kata Surabaya yang
dapat bergeser kekanan sebanyak 10 x dan bergeser kekiri sebanyak 10x dan berhenti. 2. Buatlah interaksi geser karakter ke kanan dan ke kiri, dengan menggunakan tombol
P2.0, P2.1, untuk mengatur geser ke kanan dan ke kiri, untuk dengan kata Surabaya
TUJUAN: 1. Mahasiswa memahami rangkaian interface mikrokontroller dengan ADC 0804 2. Mahasiswa memahami setting tegangan referensi Vref ADC0804 3. Mahasiswa memahami perhitungan tegangan resolusi ADC0804 4. Mahasiswa dapat memahami program assembly untuk menampilkan data ADC ke 7
Segmen 5. Mahasiswa dapat memahami program assembly untuk menampilkan data ADC ke LCD
Karakter 2 x 16
VCC
D1
3V
G 74LS244
P3.2
10k
P3.3
P3.4
VCC
10
10k
VCC
VCC
150p
13
2
13
2
10k
8
R6
220
ADC0804
67
9
1112131415161718
194
5
123
+IN-IN
VREF/2
DB7DB6DB5DB4DB3DB2DB1DB0
CLKRCLKIN
INTR
CSRDWR
20P1.7..P1.0
PROG
RUN/ EN ADC
65
4
32
1
Gambar 5.1 Rangkaian ADC0804
DASAR TEORI Konverter A/D tersedia secara komersial sebagai rangkaian terpadu dengan resolusi 8 bit sampai dengan 16 bit. Pada percobaan ini akan memperkenalkan ADC0801, yaitu sebagai sebuah konverter A/D 8 bit yang mudah diinterfacekandengan sistem mikrokontroller. A/D ini menggunakan metode approksimasi berturut-turut untuk mengkonversikan masukan analog (0-5V) menjadi data digital 8 bit yang ekivalen. ADC0801 mempunyai pembangkit clock internal dan memerlukan catu daya +5V dan mempunyai waktu konversi optimum sekitar 100us.
Gambar 5.2 Konfigurasi pin ADC0804 Diagram konfigurasi pin ADC0804 ditunjukkan pada gambar 5.2. Pin 11 sampai 18 ( keluaran digital ) adalah keluaran tiga keadaan, yang dapat dihubungkan langsung dengan bus data bilamana diperlukan. Apabila CS ( pin 1 ) atau RD (pin2) dalam keadaan high (“1”), pin 11 sampai 18 akan mengambang ( high impedanze ), apabila CS dan RD rendah keduanya, keluaran digital akan muncul pada saluran keluaran. Sinyal mulai konversi pada WR (pin 3). Untuk memulai suatu konversi, CS harus rendah. Bilamana WR menjadi rendah, konverter akam mengalami reset, dan ketika WR kembali kepada keadaan high, konversi segera dimulai. Konversi detak konverter harus terletak dalam daereh frekuensi 100 sampai 800kHz. CLK IN ( pin 4) dapat diturunkan dari detak mikrokontroller, sebagai kemungkinan lain, kita dapat mempergunakan pembangkit clock internal dengan memasang rangkaian RC antara CLN IN ( pin 4) dan CLK R ( pin 19). Pin 5 adalah saluran yang digunakan untuk INTR, sinyal selesai konversi. INTR akan menjadi tinggi pada saat memulai konversi, dan akan aktiv rendah bila konversi telah selesai. Tepi turun sinyal INTR dapat dipergunakan untuk menginterupsi sistem mikrokontroller, supaya mikrokontroller melakukan pencabangan ke subrutine pelayanan yang memproses keluaran konverter. Pin 6 dan 7 adalah masukan diferensial bagi sinyal analog. A/D ini mempunyai dua ground, A GND (pin 8) dan D GND ( pin10). Kedua pin ini harus dihubungkan dengan ground. Pin 20 harus dihubungkan dengan catu daya +5V A/D ini mempunyai dua buah ground, A GND ( pin 8 ) dan D GND ( pin 10). Keduanya harus dihubungkan dengan catu daya, sebesar +5V.
Pada A/D 0804 REFV merupakan tegangan referensi yang digunakan untuk offset suatu
keluaran digital maksimum. Dengan persamaan sebagai berikut:
maksVV INREF 21=
255
MAKSVV IN
RESOLUSI =
Misalnya anda menginginkan masuk analog maksimum sebesar 4 V, maka:
5 4 1111 1111 A/D ini dapat dirangkai untuk menghasilkan konversi secara kontinu. Untuk melaksanakannya, kita harus menghubungkan CS, dan RD ke ground dan menyambungkan WR dengan INTR seperti pada gambar dibawah ini. Maka dengan ini keluaran digital yang kontinu akan muncul, karena sinyal INTR menggerakkan masukan WR. Pada akhir konversi INTR berubah menjadi low, sehingga keadaan ini akan mereset konverter dan mulai konversi. Tabel 5.1 Koneksi Interface ADC ke Mikrokontroller
ADC Mikrokontroller
/INTR P3.2
/WR P3.3
/RD P3.4
D0 s/d D7 P1.0 s/d P1.7
Tabel 5.2. Instruksi logika pada pin kontrol A/D 0804
Percobaan 5.1. ADC0804 dan Display ke 7 Segmen Pada percobaan ini, Data ADC yang telah diubah dalam desimal ( ratusan, puluhan dan satuan) akan ditampilkan pada 8 x 7 Segmen pada Display 1, Display 2, dan Display 3 yang masing-masing menampilkan data ratusan, puluhan dan satuan.
(a)
VCC
P3.6 U8
74LS138
123
645
15141312111097
ABC
G1G2AG2B
Y0Y1Y2Y3Y4Y5Y6Y7
P3.5
R28
10K
J2
EN 7 SEGMEN12
Y7..Y0
P3.7
VCC
(b)
Gambar 5.3. Interface rangkaian display 7 segmen
Tabel 5.1. kebenaran 74LS138
SELEKTOR ENABLE OUTPUT C B A G1 /G2A /G2B Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Pada tabel kebenaran tersebut tampak bahwa seven segmen yang hidup tergantung pada output dari dekoder 74LS138, yang sedang mengeluarkan logika low ”0”, sehingga dari 8 buah display tersebut, selalu hanya satu display yang akan dihidupkan. Agar display tampak nyala
secara bersamaan maka ketiga display tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pada saat langkah pemrograman posisikan saklar togle ke posisi PROG 2. Posisikan saklar togle ke RUN untuk mengaktifkan ADC0804 CS=0 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 5.4. Diagram alir rutin utama percobaan 5.1
mov A,satuan mov DPTR,#Data7segmen movc A,@A+DPTR mov P0,A Setb P3.5 ; Setb P3.6 Setb P3.7 call delay ret ; delay: mov R0,#0 delay1:mov R2,#0fh djnz R2,$ djnz R0,delay1 ret ; ;======================================== ;Subrutin ini untuk merubah data biner ke desimal ;menjadi 3 digit = ratusan-puluhan-satuan ;========================================= Bin2Dec: mov b,#100d div ab mov ratusan,a mov a,b mov b,#10d div ab mov puluhan,a mov satuan,b ret ; Data7segmen: db 11000000b,11111001b,10100100b,10110000b,10011001b db 10010010b,10000010b,11111000b,10000000b,10010000b ; end 7. Simpanlah program yang anda ketik dan beri nama : prog51a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
Soal Tantangan: 1. Lakukan modifikasi pada program tersebut dengan manambahkan kata SUHU, pada
Display1, 2, 3 dan 4 diikuti dengan data ADC.( contoh: SUHU 255 ) 2. Lakukan modifikasi pada program tersebut dengan manambahkan kata UOLT, pada
Display5, 6, 7dan 8 setelah data ADC.( contoh: 255 UOLT)
Percobaan 5.2. ADC0804 dan Display ke LCD Karakter 2x16 Pada percobaan ini, Data ADC dalam desimal akan ditampilkan pada LCD Karakter 2x16 pada Baris 1, Colom 1, 2 dan 3, yang masing-masing menampilkan data ratusan, puluhan dan satuan.
VSS
2
1116
7VCC
D2
EN
LCD Character
3
14
D5
8
1
GND
10k
Potensio Multiturn
D1
P3.7
D74
13
12
9BPL
6
P0.7..P0.0
2 X 16
VCC
D4
J3
EN LCD 1 2
10
D1
RSP3.6
D3
D6
D0
15
Gambar 5.8. Rangkaian Interface LCD Karakter Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pada saat langkah pemrograman posisikan saklar togle ke posisi PROG 2. Posisikan saklar togle ke RUN untuk mengaktifkan ADC0804 CS=0 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 5.9 Diagram alir utama percobaan 5.2 6. Ketik program berikut ini:
clr P3.7 ; EN = 0 = P2.1 ret ; Write_data: setb P3.6 ; RS = P2.0 = 1, write mode data mov P0,R1 ; D7 s/d D0 = P0 = R1 setb P3.7 ; EN = 1 = P2.1 call delay ; call delay time clr p3.7 ; EN = 0 = P2.1 ret ; delay: mov R0,#0 delay1:mov R2,#0fh djnz R2,$ djnz R0,delay1 ret ; word1: DB ' Data ADC0804 ' end
7. Simpanlah program yang anda ketik dan beri nama : prog52a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan modifikasi pada program tersebut dengan manambahkan kata SUHU: , pada Baris 2 diikuti dengan data ADC.
Percobaan 5.3. Aplikasi program komparator dengan memanfaatkan instruksi aritmatika dan instruksi lompatan untuk pengaturan suhu dengan display LCD Karakter Dalam dunia elektronika, rangkaian komparator, umumnya diwujudkan dengan memanfaatkan rangkaian op-amp yang dibangun sebagai komparator. Sesuai dengan prinsip kerja komparator, membandingkan dua buah tegangan yang masuk pada input INV dan NON INV, untuk menghasilkan suatu output tegangan saturasi. Dengan memanfaatkan instruksi aritmatika SUBB dan instruksi lompatan JZ dan JC, maka rangkaian analog ini dapat digantikan dengan menggunakan pemrograman assembly.
Gambar 5.10 Rangkaian komparator analog dengan IC OP-AMP
Apabila tegangan yang masuk pada VREF lebih besar daripada tegangan yang masuk pada VIN maka VOUT akan mengeluarkan tegangan ~0 volt. Dan sebaliknya bila tegangan yang masuk pada VREF lebih kecil dari pada VIN maka VOUT akam mengeluarkan tegangan VSAT. ControlSuhu:
mov a,dataSetting ; contoh dataSetting=50 mov b,dataADC ; contoh dataADC=30 clr c subb a,b jnz OnHeater ret
OnHeater: jc OffHeater call HeaterOn ;Instruksi hidupkan heater ret
OffHeater: Call HeaterOff ;Instruksi matikan heater ret ;
Pada instruksi tersebut diambil selisih antara dataSetting dan dataADC dengan menggunakan instruksi SUBB, pengurangan ini akan menghasilkan tiga keadaan yaitu: NOL, NEGATIF atau POSITIF. Hasil-hasil inilah yang harus dideteksi, keadaan NEGATIF dapat dideteksi dengan memantau bit C (carry ), keadaan NOL dapat dideteksi dengan memantau register A (accumulator). Apabila diberikan keadaan input sesuai dengan contoh tersebut maka: A=dataSetting=50 B=dataADC=30 SUBB A,B A=50-30 =20 (keadaan POSITIF) Sesuai dengan instruksi diatas maka program akan menuju ke Ret OnHeater, pada baris ini dilakukan proses pengujian keadaan, dengan instruksi JC, karena keadaan POSITIF maka C=0 (clear) sehingga program akan memanggil HeaterOn Apabila diberikan keadaan input sesuai dengan contoh tersebut maka: A=dataSetting=50 B=dataADC=50 SUBB A,B A=50-50 =00 (keadaan NOL) Sesuai dengan instruksi diatas maka program akan menuju ke Ret. Apabila diberikan keadaan input sesuai dengan contoh tersebut maka: A=dataSetting=50 B=dataADC=51 SUBB A,B
A=50-51 =-1 (keadaan NEGATIF) Sesuai dengan instruksi diatas maka program akan menuju ke OnHeater, pada baris ini dilakukan proses pengujian keadaan, dengan instruksi JC, karena keadaan NEGATIF maka C=1 (clear) sehingga program akan memanggil label OffHeater Pada percobaan 5.3. ini indikator heater On dan Off, ditunjukkan pada layar LCD Karakter pada baris 1. seperti yang ditunjukkan pada pemrograman berikut ini: 1. Pada saat langkah pemrograman posisikan saklar togle ke posisi PROG 2. Posisikan saklar togle ke RUN untuk mengaktifkan ADC0804 CS=0 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Start
Subrutin Control Suhu
Subrutin Konversi Bin2Dec
Ratusan-Puluhan-Satuan
Inisialisasi LCD
Subrutin ADC
Inisialisasi DataSetting
dataSetting 50
Subrutin Display2LCD
Start
Simpan dataSetting
A dataSetting
Simpan dataADC
B dataADC
Reset bit C
C 0
SUBB A,B
A=0 ?
C=1 ?
NO End
YES
NO
End End
YES
(a) (b)
Heater On Heater Off
Gambar 5.11. Diagram alir (a) rutin utama (b) subrutin kontrol suhu pada percobaan 5.3. dataSetting equ 30h dataADC equ 31h ratusan equ 32h puluhan equ 33h satuan equ 34h org 0h mov dataSetting,#50d; contoh datasetting=50 call init_lcd start: call ADC call ControlSuhu call bin2dec call Display2LCD sjmp start ;
mov r1,#00000001b ;Display clear call write_inst mov r1,#00111000b ;Function set,Data 8 bit,2 line font 5x7 call write_inst mov r1,#00001100b ;Display on, cursor off,cursor blink off call write_inst mov r1,#00000110b ;Entry mode, Set increment call write_inst ret ; write_inst: clr P3.6 ; RS = P2.0 = 0, write mode instruction mov P0,R1 ; D7 s/d D0 = P0 = R1 setb P3.7 ; EN = 1 = P2.1 call delay ; call delay time clr P3.7 ; EN = 0 = P2.1 ret ; Write_data: setb P3.6 ; RS = P2.0 = 1, write mode data mov P0,R1 ; D7 s/d D0 = P0 = R1 setb P3.7 ; EN = 1 = P2.1 call delay ; call delay time clr p3.7 ; EN = 0 = P2.1 ret ; delay: mov R0,#0 delay1:mov R2,#0fh djnz R2,$ djnz R0,delay1 ret end 6. Simpanlah program yang anda ketik dan beri nama : prog53a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan modifikasi pada program tersebut dengan manambahkan kata SUHU: , pada Baris 2 diikuti dengan data ADC.
Percobaan 5.4. Kalibrasi dataADC ke suhu dengan menggunakan metode Look Up Table.
Kenapa kita membutuhkan look up table?: Look up table adalah suatu cara yang digunakan untuk menghindari proses perkalian dan pembagian yang bertele-tele dan memusingkan bila dilakukan dengan menggunakan bahasa assembly, yang tentunya harus dilakukan bila kita akan kalibrasi suatu alat ukur. Contoh kalibrasi Termometer dengan menggunakan persamaan persamaan berikut ini: Suhu = DataADC * 100/ 255 oC.
Contoh table untuk konversi data ke besaran suhu ( dengan menggunakan program Microsoft Excell ). Karena data decimal maksimal adalah 255 dan suhu maksimal 100 maka Data look up tablenya adalah 255/100.
Pada percobaan 5.4, kalibrasi dilakukan untuk perubahan range desimal (0 s/d 255) menjadi range suhu(000.0 s/d 100.0 oC) 1. Pada saat langkah pemrograman posisikan saklar togle ke posisi PROG 2. Posisikan saklar togle ke RUN untuk mengaktifkan ADC0804 CS=0 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program dataADC equ 30h org 0h start: call ADC call Display2SevenSegmen sjmp start ;
mov DPTR,#Data7segmen movc A,@A+DPTR mov P0,A Setb P3.5 ; Setb P3.6 Setb P3.7 call delay ret ; delay: mov R0,#0 delay1:mov R2,#0fh djnz R2,$ djnz R0,delay1 ret ; Pecahan: db 0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5 db 9,3,7,1,5,9,3,6,0,4,8,2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4 db 8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6,0,4,8,2,6,0,4,7,1,5,9,3 db 7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2 db 6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1 db 5,9,3,7,1,5,9,3,6,0,4,8,2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0 db 4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6,0 ; Satuan: db 0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4 db 4,5,5,6,6,6,7,7,8,8,8,9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9 db 9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9,0,0,0,1,1,2,2,2,3,3,3,4 db 4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9 db 9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4 db 4,4,5,5,6,6,6,7,7,8,8,8,9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9 db 9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0 ; puluhan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 db 1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 db 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4 db 4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 db 5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7 db 7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 db 8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0 ; Ratusan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ; Data7segmen:
1. Mahasiswa memahami rangkaian interface mikrokontroller dengan DAC0808 2. Mahasiswa memahami setting arus referensi pada DAC 3. Mahasiswa memahami perhitungan output tegangan 4. Mahasiswa memahami pemrograman assembly DAC
Vr+
A7 R22K5
8
4
A4
A3
VCC
A2
16
-12V
Vr-
R14 10K
1 3
2
A1
C1
15pF
7
9
NC
-12V
COMP
12V
13
VCC
A5
VCC
P2.0..P2.7
DAC0808
14
R3
5K
10
J3
EN DAC12
11
J3
IREF
1 2
IOUT
Voutput2
15
VEE
1
+
-
U3
3
26
74
GND
A6
A8
6
12
3
5
Gambar 6.1. Rangkaian DAC0808
TEORI DASAR DAC0808 merupakan salah satu contoh kenverter D/A. IC ini tidak mahal dan digunakan secara luas dalam beberapa aplikasi, D/A ini menerapkan metode tangga R-2R 8 bit yang dilengkapi dengan sumber arus acuan dan delapan buah transistor saklar untuk mengarahkan arus biner. Suatu tegangan dan hambatan eksternal dipergunakan untuk mengatur arus acuan pada nilai yang lazim berlaku yaitu 2 mA. DAC0808 mempunyai waktu pemantapan 150ns
dan ketelitian relatif LSB21± .
Konfigurasi pin ditunjukkan seperti pada gambar 6.2. dengan penjelasan sebagai berikut. Pin 1 tidak dipakai ( NC singkatan dari no connection ). Pin 2 adalah penghubung ke ground. Pin 3 (
EEV ) harus dipasang pada -12V. Pin 4 adalah saluran balik dari ground, yang sifatnya sebagi
output pembalik. Pin 5 s/d 12 merukan 8 bit masukan data. Pin 13 ( CCV ) harus dipasang pada
catu daya +5V. Pin 14 dihubungkan dengan catu daya positif melalui hambatan R14, dan pin 15 dihubungkan ke ground melalui hambatan R15. Akhirnya sebuah kapasitor antar pin 16 dan pin 13 berfungsi untuk memberi kompensasi frekuensi bagi IC ini.
Gambar 6.2. Pin konfigurasi
Percobaan 6.1. Mengeluarkan Tegangan Tertentu pada DAC Pada percobaan ini, suatu tegangan tertentu akan dikeluarkan melalui DAC Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper pada konektor EN_DAC untuk mengaktifkan rangkaian DAC 2. Atur arus IREF dengan menghubungkan konektor dengan menggunakan ampermeter, atur
potensio R14 untuk memberikan referensi arus tertentu sekitar 2mA 3. Pasang jumper pada konektor IREF 4. Hubungkan modul Microcontroller Trainer dengan power supply +5V 5. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 6. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Percobaan 6.2. Mengeluarkan Tegangan Tangga 0 s/d 10V Pada percobaan ini, tegangan tertentu akan dikeluarkan melalui DAC Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper pada konektor EN_DAC untuk mengaktifkan rangkaian DAC 2. Atur arus IREF dengan menghubungkan konektor dengan menggunakan ampermeter, atur
potensio R14 untuk memberikan referensi arus tertentu sekitar 2mA 3. Pasang jumper pada konektor IREF 4. Hubungkan modul Microcontroller Trainer dengan power supply +5V 5. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 6. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
start: mov P2,A ; copy A ke P2 inc A ; A:=A+1 call delay ;panggil waktu tunda cjne A,#255,start ;bandingkan A dg 255 jump start if NE mov A,#0 ;isi A dg. 0 sjmp start ;lompat ke start
TUJUAN: 1. Mahasiswa memahami rangkaian interface keypad 4x4 dengan mikrokontroller 2. Mahasiswa memahami bahasa assembly untuk pengambilan data keypad 3. Mahasiswa memahami bahasa assembly untuk pengambilan data keypad dan
mengeluarkan ke LED 4. Mahasiswa memahami bahasa assembly untuk pengambilan data keypad dan
mengeluarkan ke 7 Segmen 5. Mahasiswa memahami bahasa assembly untuk pengambilan data keypad dan
mengeluarkan ke LCD Karakter
2
KEYPAD 4 X 4
5
7
3
9
P2.7..P2.0
0
6
1
8
4
Gambar 7.1 Rangkaian interface keypad 4x4
Keypad serig digunakan sebagi suatu input pada beberapa peralatan yang berbasis mikroprosessor atau mikrokontroller. Keypad sesungguhnya terdiri dari sejumlah saklar, yang terhubung sebagai baris dan kolom dengan susuan seperti yang ditunjukkan pada gambar 7.2. Agar mikrokontroller dapat melakukan scan keypad, maka port mengeluarkan salah satu bit dari 4 bit yang terhubung pada kolom dengan logika low “0” dan selanjutnya membaca 4 bit pada baris untuk menguji jika ada tombol yang ditekan pada kolom tersebut. Sebagai konsekuensi, selama tidak ada tombol yang ditekan, maka mikrokontroller akan melihat sebagai logika high “1” pada setiap pin yang terhubung ke baris.
7.1. Percobaan scan data keypad 1x4, COR-MEN-UpArrow-DnArrow Pada percobaan ini, akan dilakukan scan data keypad COR-MEN-UpArr.- DnArr. Seperti yang ditunjukkan pada gambar 7.3 dan mengeluarkan data ke LED. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Buka jumper pada DAC_EN, apabila sedang terpasang. 2. Hubungkan jumper pada LED_EN. 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer
D1
P0.0..P0.7
D8
VCC
J3
EN LED12
Gambar 7.4. Display LED sebagai Output Data Keypad 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
;================================ ;The end of Keypad 4x4 subroutine ;================================ delay: mov R0,#0 delay1:mov R2,#50 djnz R2,$ djnz R0,delay1 ret end 7. Simpanlah program yang anda ketik dan beri nama : prog71a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan modifikasi pada program tersebut diatas untuk scan data keypad 3-6-9-ENT 11. Lakukan modifikasi pada program tersebut diatas untuk scan data keypad 2-5-8-0 12. Lakukan modifikasi pada program tersebut diatas untuk scan data keypad 1-4-7-CAN
7.2. Percobaan scan data keypad 4x4 dan mengeluarkan ke LCD Pada percobaan ini, akan dilakukan scan data keypad dan mengeluarkan data ke LCD Karakter. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Pasang jumper EN_LCD 2. Buka jumper pada EN_DAC, apabila sedang terpasang 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer
VSS
2
1116
7VCC
D2
EN
LCD Character
3
14
D5
8
1
GND
10k
Potensio Multiturn
D1
P3.7
D74
13
12
9BPL
6
P0.7..P0.0
2 X 16
VCC
D4
J3
EN LCD 1 2
10
D1
RSP3.6
D3
D6
D0
15
Gambar 7.7. Rangkaian LCD Karakter 2x16 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
TUJUAN 1. Mahasiswa mamahami rangkaian interface mikrokontroller dengan motor stepper 2. Mahasiswa memahami rangkaian driver motor stepper ULN2003 3. Mahasiswa memahami bahasa assembly untuk mengatur arah putaran motor stepper 4. Mahasiswa memahami bahasa assembly untuk mengatur arah putaran motor stepper
dengan menggunakan saklar.
O3
9
I1
VCC
O4
VCC
I6
O1
I4
16
8
MOTOR STEPPER
I3
I2
GND VCC
P0.3..P0.0
I5
O2
O7
O5
1
I7
ULN2003
O6
Gambar 8.1. Rangkaian interface motor stepper dengan driver ULN2003
DASAR TEORI Pada Motor DC biasa, akan berputar dan berputar terus selama power supply ada. Tidak ada rangkaian cerdas tertentu yang diperlukan untuk mengendalikan motor tersebut, kecuali hanya memperlambat putaran atau membalik putaran, dengan menerapkan polaritas balik. Motor stepper adalah sangat berbeda. Jika anda memberikan power pada motor ini, maka motor ini akan berada dalam keadaan diam, agar motor dapat berputar, anda harus merubah sinyal yang masuk ke motor. Sebagai ilustrasi, dapat dibayangkan sebuah kompas dengan elektromagnet disekitarnya. Sebagaimana digambarkan pada gambar 2.2., apabila power yang diberikan pada elektromagnet diganti, maka akan merubah posisi jarum dari kompas.
Gambar 8.2. Ilustrasi sebuah kompas dengan elektromagnet
Dengan empat buah elektromagnet maka gerakan akan melompat secara kasar. Sekarang bayangkan susunan yang sama dengan 100 elektromagnet yang mengitari kompas. Dengan mangatur energi yang mengalir pada setiap elektromagnet dalam berurutan, maka jarum akan memerlukan sebanyak 100 langkah untuk melakukan satu kali putaran. Tetapi dengan pengaturan 100 elektromagnet secara individu, akan memerlukan elektronika yang kompleks.
Gambar 8.3. Ilustrasi motor stepper dengan jarum kompas dengan elektromagnet
Pada ilustrasi tersebut, huruf-huruf yang melingkar mewakili elektromagnet. Semua magnet dengan huruf yang sama berada dalam keadaan koneksi. Ketika anda memberi arus pada rangkaian tersebut, maka semua elektromagnet dengan huruf yang sama akan on pada saat itu, untuk menggerakkan kompas, maka elektromaget berikutnya harus dialiri arus, sehingga akan menimbulkan gerakan. Table 8.1. Full Step Mode
Percobaan 8.1. Menggerakkan Motor Stepper Searah Jarum Jam Pada percobaan ini, motor stepper akan berputar searah jarum jam, terus menerus Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan kabel parallel antara P0 dengan motor stepper 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 8.6. Diagram alir percobaan 8.1
5. Ketik program berikut ini: org 0h start: call StepCW sjmp start ; StepCW: mov P0,#11101111b ; Turn on driver 1. isi P0 dg 11101111b call delay ; call delay time mov P0,#11011111b ; Turn on driver 2. isi P0 dg 11011111b call delay ; call delay time mov P0,#10111111b ; Turn on driver 3. isi P0 dg 10111111b call delay ; call delay time mov P0,#01111111b ; Turn on driver 4. isi P0 dg 01111111b call delay ; call delay time ret StepCCW:
mov P0,#01111111b ; Turn on driver 1 call delay ; call delay time mov P0,#10111111b ; Turn on driver 2 call delay ; call delay time mov P0,#11011111b ; Turn on driver 3 call delay ; call delay time mov P0,#11101111b ; Turn on driver 4 call delay ; call delay time ret delay: mov R0,#255 delay1:mov R2,#255 djnz R2,$ djnz R0,delay1 ret end 6. Simpanlah program yang anda ketik dan beri nama : prog81a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan arah putaran motor stepper apakah sudah sesuai ? 10. Lakukan modifikasi program tersebut diatas, untuk putaran motor yang berlawanan arah
jarum jam CCW.
Percobaan 8.2 Pengaturan Arah Putaran CW/ CCW Motor Stepper Melalui Saklar Pada percobaan ini, motor stepper akan berputar searah jarum jam, atau berlawanan arah jarum jam bergantung pada posisi push button yang ditekan ( P2.0 atau P2.1 ) secara terus menerus.
SW1
SW8
P2.7..P2.0
Gambar 8.7. Rangkaian pushbutton Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan kabel parallel antara P0 dengan motor stepper 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer
TUJUAN 1. Mahasiswa memahami fungsi timer dan counter pada mikrokontroller 2. Mahasiswa memahami rangkaian interface untuk aplikasi timer dan counter 3. Mahasiswa dapat memanfaatkan fungsi counter untuk mencacah pulsa 4. Mahasiswa dapat memanfaatkan fungsi timer untuk membangkitkan clock dengan periode
tertentu. FUNGSI COUNTER Pada keluarga MCS-51 terdapat dua buah timer/ counter 16 bit, yang dapat dikonfigurasikan sebagai timer atau counter, 8 bit, 13 bit atau 16 bit sesuai dengan mode yang dipilih. Gambar berikut merupakan contoh aplikasi Counter 8 bit dengan menggunakan mode 3
Gambar 9.1 Diagram blok timer counter
Percobaan 9.1. Mencacah pulsa clock dengan aplikasi Mode 0 sebagai counter 13 it dengan output LED Pada percobaan ini, pulsa diambil melalui clock generator yang dibangkitkan oleh IC 555 yang mempunyai frekuensi 1 Hz, hasil cacahan biner pada register counter dari Timer 0 akan ditampilkan pada LED. Lakukan beberapa langkah percobaan sebagai berikut: 1. Hubungkan 1 buah kabel antara P3.4 dengan output astable/ clock IC 555 2. Hubungkan jumper konektor LED_EN
3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
; mode 0 counter 13 bit sebagai counter Setb TR0 ; TR0 = 1, start counting Get: Mov A, TL0 ; A = TL0 CPL A ; A = NOT A Mov P0, A ; P0 = A. Display ke LED Sjmp Get ; Looping Forever End
D1
P0.0..P0.7
D8
VCC
J3
EN LED12
Gambar 9.3. Rangkaian display LED
7. Simpanlah program yang anda ketik dan beri nama : prog91a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan pengamatan pada LED ? dan lengkapi tabel berikut.
Clock D 1 D 2 D 3 D 4 D 5 D 6 D 7 D 8 1
2
3
;
;
20
Percobaan 9.2. Mencacah pulsa clock dengan aplikasi Timer 0, Mode 3 sebagai counter 8 bit dengan output 7 Segmen Pada percobaan ini, pulsa diambil melalui clock generator yang dibangkitkan oleh IC 555 yang mempunyai frekuensi 1 Hz ( output astable ), hasil cacahan biner pada register counter akan ditampilkan pada 7 Segmen. Lakukan beberapa langkah percobaan sebagai berikut: 1. Hubungkan 1 buah kabel antara P3.5 dengan output clock IC 555 2. Hubungkan jumper konektor 7Segmen_EN 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Inisialisasi Timer0
Mode 0 sbg counter 13 bit
TMOD #00000100b
Start
Konversi Hex ke Desimal
Jalankan Timer
Setb TR0
Display ke 7 Segmen
Ambil data counter
A TL0
Gambar 9.4. Diagram alir percobaan 9.2 6. Ketik program berikut ini:
delay1: mov R2,#0fh djnz R2,$ djnz R0,delay1 ret ; Data7segmen: db 11000000b,11111001b,10100100b,10110000b,10011001b db 10010010b,10000010b,11111000b,10000000b,10010000b ; end 7. Simpanlah program yang anda ketik dan beri nama : prog92a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan pengamatan pada display 7 segmen ? dan lengkapi tabel berikut.
Clock ke Display 7 Segmen 1 2 3
4 5 ;
20 11. Lakukan modifikasi pada program tersebut untuk menampilkan data counter ke
LCD karakter. FUNGSI TIMER Pada keluarga MCS-51 terdapat dua buah timer/ counter 16 bit, yang dapat dikonfigurasikan sebagai timer atau counter, 8 bit, 13 bit atau 16 bit sesuai dengan mode yang dipilih. Gambar berikut merupakan contoh aplikasi Counter 16 bit dengan menggunakan mode 1
Gambar 9.5. Diagram blok timer counter mode 1 16 bit
Percobaan 9.3. Membangkitkan clock dengan aplikasi Timer 1, sebagai timer 16 bit dengan output LED Pada percobaan ini, clock akan dibangkitkan dengan menggunakan fungsi timer 16 bit, dengan periode 1 detik, Ton = 0,5 detik dan Toff = 0,5 detik, dengan tampilan LED
Gambar 9.6. Periode clock
Pada mode ini, dengan kristal 12MHz maka timer akan overflow setiap 65.536 udetik. Pada percobaan ini, untuk membangkitkan interupsi setiap 1000 udetik maka data yang harus diisikan pada register TL1 dan TH1 adalah sebagai berikut: 65536 - 10000 = 55536 d or D8F0h Maka interupsi TF1 akan segera dibangkitkan setiap 1000 x 1 udetik = 0,01 detik pada pemrograman ini, RO diimplementasikan sebagai counter software, Register R0 akan increment setiap Timer 1 overflow. Jika register R7 telah mendeteksi nilai 50 maka port P0.0 ( LED D0 ) akan nyala selama = 0,01 x 50 detik = 0,5 detik. Lakukan beberapa langkah percobaan sebagai berikut: 1. Lepas kabel yang menghubungkan antara P3.5 dengan output clock IC 555 2. Hubungkan jumper konektor LED_EN 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer
TUJUAN 1. Mahasiswa memahami rangkaian interface port serial 2. Mahasiswa memahami mengkonfigurasikan komunikasi serial pada port serial PC 3. Mahasiswa memahami penulisan bahasa assembly untuk konfigurasi port serial 4. Mahasiswa memahami penulisan pemrograman delphi untuk komunikasi dengan
mikrokontroller. Salah satu komunikasi yang paling ampuh untuk diimplementasikan dalam sistem komunikasi digital adalah komunikasi dengan memanfaatkan jalur serial RS232. Mikrokontroller 89s51 telah memiliki fasilitas UART, sehingga dapat melakukan komunikasi secara serial dengan level RS2322 antar peralatan atau dengan komputer. MAX232 merupakan IC yang difungsikan untuk merubah format TTL ke RS232 atau sebaliknya.
Gambar 10.1 Sistem komunikasi serial mikrokontroller dengan PC
Percobaan 10.1 Menghidupkan LED melalui komunikasi serial RS232 dengan Program Hyperterminal Pengujian sistem komunikasi antara mikrokontroller dengan port serial computer dapat dilakukan dengan memanfaatkan program hyperterminal pada sistem yang berbasis under windows ( 98, ME dan XP ). Kelebihan penggunakan program ini, tidak diperlukan suatu bahasa pemrograman dan kelemahannya, terbatas hanya pada proses pengujian. Pada percobaan ini LED dihidupkan dan dimatikan melalui pengiriman karakter (0 – 9 ) pada keyboard PC.
Gambar 10.1 Pemilihan menu communication pada Accessories
Gambar 10.2 Pemilihan menu HyperTerminal pada communication
(a) (b)
Gambar 10.3. (a) Pemberian nama koneksi (b) Pemilihan koneksi pada COM1
Gambar 10.4. (a) Properties serial komunikasi (b) windows HyperTerminal
D1
P0.0..P0.7
D8
J3
EN LED12
VCC
Gambar 10.5. Display LED
Lakukan beberapa langkah percobaan sebagai berikut: 1. Hubungkan jumper konektor ke LED_EN 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program Hyperterminal dan inputkan angka 0 s/d 9 pada keyboard PC
Gambar 10.6. (a) Diagram alir rutin utama (b) subrutine ambil karakter pada percobaan 10.1 5. Ketik program asembly berikut ini: org 0h nop call initserial gets:call inchar mov P0,a sjmp gets ; initserial: mov scon,#50h ; Konfigurasi komunikasi serial mode 1 mov tmod,#20h ; Baud rate 2400 BPS mov th1,#0F3h setb tr1 ret ; inchar: detect: jnb ri,detect ; Deteksi bit RI apakah data sudah diterima atau belum clr ri mov a,sbuf subb a,#30h ; merubah kode ascii menjadi integer cpl a ; komplemen A ret ; End 6. Simpanlah program yang anda ketik dan beri nama : hiper1a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
Soal Tantangan: 1. Rencanakan program assembly untuk pengambilan data pada port serial dan lakukan
pendeteksian apakah tombol yang ditekan pada keyboard PC adalah ‘0’ dan ‘1’, bila tombol yang ditekan adalah ‘0’ maka LED yang terhubung pada P0 akan berputar ke kanan dan sebaliknya bila tombol yang ditekan adalah ‘1’ maka LED yang terhubung ke P0 akan berputara ke kiri.
2. Rencakan program assembly untuk mengambil data pada port serial dan lakukan pendeteksian apakah tombol yang ditekan pada keyboard PC adalah 0, 1,2 s/d 9. dan outputkan data tersebut pada 7 segmen, sesuai dengan angka yang ditekan.
3. Lakukan perhitungan pada baudrate port serial dengan kecepatan 9600 BPS, dan terapkan pada soal tantangan 2.
Percobaan 10.2a Mengambil data satu karákter pada mikrokontroller dengan Hyperterminal. Pada percobaan ini, data satu carácter akan dikirimkan dari mikrokontroller ke komputer melalui port serial dan ditampilkan pada layar Hyperterminal. Lakukan beberapa langkah percobaan sebagai berikut:
1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program Hyperterminal 4. Ketik program asembly berikut ini:
org 0h
nop call initserial mov A,#’1’ ; apa yang akan terjadi bila tanda petik dihilangkan
call sendout getout: sjmp getout ; initserial: mov scon,#42h ; Konfigurasi komunikasi serial mode 1 mov tmod,#20h ; Baud rate 2400 BPS mov th1,#0F3H setb tr1 ret ; Sendout: detecto: jnb ti,detecto; clr ti ; mov sbuf,a ; ret
Percobaan 10.2b Mengambil data karákter pada mikrokontroller dengan Hyperterminal. Pada percobaan ini, data akan dikirimkan dari mikrokontroller ke komputer melalui port serial dan ditampilkan pada layar Hyperterminal. Lakukan beberapa langkah percobaan sebagai berikut:
1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program Hyperterminal 4. Ketik program asembly berikut ini:
org 0h
nop call initserial mov dptr,#MyCharacter gets: clr A Movc A,@A+dptr cjne A,#0,Next sjmp getout Next: call sendout inc dptr sjmp gets getout: sjmp getout ; initserial: mov scon,#42h ; Konfigurasi komunikasi serial mode 1 mov tmod,#20h mov th1,#0F3H; Baud rate 2400 BPS setb tr1 ret ; Sendout: detecto: jnb ti,detecto; clr ti ; mov sbuf,a ; ret MyCharacter: DB ' Selamat Datang Di Laboratorium Mikrokontroller',13,10,0 End
5. Simpanlah program yang anda ketik dan beri nama : hiper2a.asm
6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
1. Rencanakan program untuk cetak angka 1 sebanyak 1x, angka 2 sebanyak 2x, dan angka 3 sebanyak 3x pada program hyperterminal, putunjuk pakai DJNZ
2. Rencanakan program untuk mengambil data mikrokontroller melalui port serial dan
ditampilkan pada layer Hyperterminal, dengan data-data sebagai berikut, secara berturutan: Nama : Budi Jenis Kelamin : Laki-Laki Tempat/ Tgl. Lahir : Surabaya, 12 September 1987
3. Rencanakan program untuk mengambil data saklar pada mikrontroller dan dikirimkan
melalui port serial dan ditampilkan pada layar Hyperterminal.
SW1
SW8
P2.7..P2.0
Dengan keterangan sebagai berikut: Bila sw0 s/d sw7 yang terhubung ke P2 pada mikrontroller, ditekan secara bergantian maka mikrontroller akan mengirimkan data ke PC sesuai dengan tombol yang ditekan, bila sw0 ditekan maka carácter 0 akan dikirim, bila sw1 ditekan maka carácter 1 akan dikirim ke PC secara serial, dan bila tidak ada tombol yang ditekan maka akan memunculkan carácter ‘X’ dan seterusnya. Dengan format tampilan sebagai berikut: Tombol yang sedang ditekan: X
4. Rencanakan program untuk mengambil data ADC pada mikrontroller dan dikirimkan
melalui port serial dan ditampilkan pada layar Hyperterminal
Dengan keterangan sebagai berikut: Data ADC yang diambil melalui port P2 ditampilkan pada 7 segmen, sehingga akan menampilan angka 000 s/d 255, selain ditampilkan ke 7 segmen data dari ADC juga ditampilkan pada program Hyperterminal, secara berkala setiap beberapa detik, dengan menggunakan delay. Dengan format tampilan sebagai berikut: Data ADC: 000
5. Rencanakan program untuk mengambil data counter pada mikrokontroller, dengan
Timer 0, mode 2 Autoreload sehingga akan mencacah dari 000 s/d 255, tampilkan data hasil cacahan tersebut pada 7 segmen dan kirim data hasil cacahan pada layer Hyperterminal, dengan format tampilan sebagai berikut: Data hasil cacahan: 000
6. Rencakan program untuk membuat jam digital dengan memanfaatkan Timer 0, mode
16 bit, mode1, dengan interupsi setiap 50.000 microsecond. Dengan tampilan pada 7 segmen, detik, menit dan jam, dengan format tampilan sebagai berikut:
Percobaan 10.3 Menghidupkan LED melalui komunikasi serial RS232 PC dengan Pemrograman Delphi Pada percobaan ini, data dikirimkan melalui port communication serial PC secara serial dan ditangkap oleh mikrokontroller untuk dioutputkan ke LED
D1
P0.0..P0.7
D8
J3
EN LED12
VCC
Gambar 10.7. Display LED
Lakukan beberapa langkah percobaan sebagai berikut:
1. Hubungkan jumper konektor ke LED_EN 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 10.8. (a) Diagram alir rutin utama (b) subrutine ambil karakter pada percobaan 10.1
org 0h nop call initserial gets: call inchar mov P0,a sjmp gets ; initserial: mov scon,#50h ; Konfigurasi komunikasi serial mode 1 mov tmod,#20h ; Baud rate 2400 BPS mov th1,#0F3 setb tr1 ret ; inchar: detect: jnb ri,detect ; Deteksi bit RI apakah data sudah diterima atau belum clr ri mov a,sbuf ret ; End
6. Simpanlah program yang anda ketik dan beri nama : prog101a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada nyala LED 10. Buka Program Delphi
Listing program Delphi: procedure TForm1.Button1Click(Sender: TObject); var data:byte; count:integer; begin data:=0; count:=1; comport1.write(data,count); end; procedure TForm1.Button2Click(Sender: TObject); var data:byte; count:integer; begin data:=255; count:=1; comport1.write(data,count); end;
12. Jalankan program delphi dengan menekan tombol F9 atau RUN 13. Lakukan penekanan pada tiap-tiap button dan lakukan pengamatan.
Percobaan 10.3. Mengendalikan arah gerakan LED melalui komunikasi serial RS232 dengan pemrograman Delphi Pada percobaan ini, arah gerakan LED kekiri atau kekanan, dikendalikan melalui komunikasi sercara serial RS232. Lakukan beberapa langkah percobaan sebagai berikut: 1. Pasang jumper LED_EN pada modul praktek 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
ret ; inchar: detect: jnb ri,detect ;detecting do data have been accepted or not yet.
clr ri mov a,sbuf ret ; delay: mov R0,#255 delay1:mov R2,#255 djnz R2,$ djnz R0,delay1 ret ; End 6. Simpanlah program yang anda ketik dan beri nama : prog102a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan pada nyala LED 10. Buka Program Delphi
Start
Inisialisasi
Serial Komunikasi
Baudrate=2400
Data 8 bit, no paritas, 1 stop bit
Kirim Data ke Port Serial
3F8h Data
Status THR=20h ?
Inisialisasi Data
Data := 1
End
Kirim Data ke Port Serial
3F8h Data
Status THR=20h ?
Inisialisasi Data
Data := 128
End
Pilih Putar Kanan Pilih Putar Kiri
Gambar 10.12 Diagram alir pemrograman delphi percobaan 10.2 11. Ketik Program Delphi berikut ini, untuk menjalankan komunikasi melalui port serial.
Gambar 10.13. Gambar tampilan program delphi untuk pengaturan LED procedure TForm1.Button1Click(Sender: TObject); var data:byte; count:integer; begin data:=0; count:=1; comport1.write(data,count); end; procedure TForm1.Button2Click(Sender: TObject); var data:byte; count:integer; begin data:=255; count:=1; comport1.write(data,count); end; 12. Simpanlah program yang anda ketik dan beri nama rotateserial.asm 13. Jalankan program delphi dengan menekan tombol F9 atau RUN 14. Lakukan penekanan pada tiap-tiap button dan lakukan pengamatan.
Percobaan 10.4. Pengambilan data SW melalui komunikasi serial RS232 PC dengan pemrograman Delphi Pada percobaan ini, arah gerakan LED kekiri atau kekanan, dikendalikan melalui komunikasi sercara serial RS232. Lakukan beberapa langkah percobaan sebagai berikut:
1. Hubungkan modul Microcontroller Trainer dengan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 4. Lakukan pengetikan program assembly sebagai berikut
org 0h
call initserial ; start: mov A,P2; ambil data dari SW call Sendout; kirim data ke PC sjmp start ; Sendout:
detect: jnb ti,detect; clr ti ; mov sbuf,a ; ret ; initserial: mov scon,#52h;initialize serial mode 1 mov tmod,#20h;timer1 mode 2 mov th1,#0F3h;Reload value for baud rate 2400 setb tr1 ret end
5. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
6. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
7. Lakukan pengamatan pada nyala LED 8. Buka Program Delphi, dan lakukan pemrograman Delphi dengan tampilan sebagai
berikut
7. Lakukan pengaturan pada properties dari object inspector berikut.
8. Pada Objeck Inspector pilih tabulasi Events, dan click dua kali pada OnRxChar.
9. Tampilan akhir program, sebagai berikut:
10. Lakukan pengetikan instruksi program, sebagai berikut:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var buff:string;y:integer; begin comport1.ReadStr(buff,count); y:=ord(buff[1]); edit1.text:=inttostr(y); end;
Percobaan 10.4 Pengambilan data ADC melalui komunikasi secara serial RS232 PC dengan pemrograman Delphi Pada percobaan ini, data ADC0804 diambil menggunakan port 1 mikrokontroller dan dikirimkan melalui port serial ke PC
Lakukan beberapa langkah percobaan sebagai berikut: 1. Pada saat langkah pemrograman posisikan saklar togle ke posisi PROG 2. Posisikan saklar togle ke RUN untuk mengaktifkan ADC0804 CS=0 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 10.15. Diagram alir utama percobaan 10.3
6. Ketik program berikut ini:
org 0h call initserial ; start: call ADC; ambil data dari adc call Sendout sjmp start ; ADC: clr P3.3 nop setb P3.3 eoc: jb P3.2,eoc clr P3.4 mov A,P1 setb P3.4 ret ; Sendout: detect: jnb ti,detect; clr ti ; mov sbuf,a ; ret ; initserial: mov scon,#52h;initialize serial mode 1 mov tmod,#20h;timer1 mode 2 mov th1,#0F3h;Reload value for baud rate 2400
setb tr1 ret end 7. Simpanlah program yang anda ketik dan beri nama : prog103a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Buka Program Delphi
Gambar 10.16. Diagram alir pemrograman delphi percobaan 10.3
11. Ketik Program Delphi berikut ini, untuk menjalankan komunikasi melalui port serial
Gambar 10.17. Tampilan program delphi pengambilan data ADC 12. Simpanlah program yang anda ketik dan beri nama adcserial.asm 13. Jalankan program delphi dengan menekan tombol F9 atau RUN 14. Lakukan pengamatan pada data tampilan. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var buff:string;y:integer;
begin comport1.ReadStr(buff,count); y:=ord(buff[1]); edit1.text:=inttostr(y); end; procedure TForm1.Button1Click(Sender: TObject); begin comport1.connected:=true; end;
10.5. Pengiriman karakter ke LCD Karakter melalui komunikasi serial RS232 dengan pemrograman Delphi Pada percobaan ini data karakter dikirimkan ke LCD Karakter melalui komunikasi secara serial, melalui pemrograman delphi. 1. Pasang jumper LCD_EN, yang berfungsi untuk memberikan power supply +5V 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 10.18 Diagram alir rutin utama percobaan 10.4
TUJUAN 1. Mahasiswa memahami sistem interupsi pada mikrokontroller 2. Mahasiswa dapat menerapkan sistem interupsi pada pembuatan jam digital 3. Mahasiswa dapat memahami penggunakan bahasa assembly untuk penggunakan sistem
interupsi Pada mikrokontroller menyediakan 5 buah sumeber interupsi, 2 buah interupsi eksternal, 2 buah interupsi timer, dan 1 buah interupsi serial. Agar interupsi dapat dilayani maka instruksi assembly harus ditempatkan pada alamat vektor berikut, sesuai dengan sumber interupsi yang akan digunakan.
Source Vector Address
IE0 0003H
TF0 000BH
IE1 0013H
TF1 001BH
RI + TI 0023H
Org 0000h
Ljmp Start
Org 000bh
Ljmp Timer0Interupt
Start: ; Instruksi Rutinitas
; Instruksi Rutinitas
; Instruksi Rutinitas
Sjmp Start; Looping Forever
;
Timer0Interupt:
:
:
Reti
End Pada contoh instruksi pemrograman tersebut tampak, apabila tidak ada interupsi maka program akan menuju ke start dan menjalankan rutinitas-rutinitas secara terus menerus, tetapi apabila suatu interupsi yang dibangkitkan oleh overflow timer 0 terjadi, maka program yang semula bersarang pada rutinitas akan melompat pada alamat vektor 0bh (alamat interupsi timer 0) dan melompat ke subrutine interupsi Timer0Interupt. Percobaan 11.1. Membangkitkan clock pada jam digital :DD dengan memanfaatkan interupsi timer 0. Pada percobaan akan dibangkitkan clock untuk jam digital, hanya bagian detik puluhan (display 1) dan detik satuan (display 2) pada 7 segmen
Pada mode ini, dengan kristal 12MHz maka timer akan overflow setiap 65.536 udetik. Pada percobaan ini, untuk membangkitkan interupsi setiap 50000 udetik maka data yang harus diisikan pada register TL0 dan TH0 adalah sebagai berikut: 65536 - 50000 = 15536 d or 3CB0h Maka interupsi TF0 akan segera dibangkitkan setiap 50000 x 1 udetik = 0,05 detik pada pemrograman ini, RO diimplementasikan sebagai counter software, Register R0 akan increment setiap Timer 0 overflow. Jika register R7 telah mendeteksi nilai 50 maka port P0.0 ( LED D0 ) akan nyala selama = 0,05 x 20 detik = 1 detik Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 11.1. (a) Diagram alir rutin utama, (b) subrutin interupsi, dan (c) subrutin display ke 7 segmen percobaan 11.1 5. Ketik program berikut ini: detik equ 30h detikpuluhan equ 31h detiksatuan equ 32h counter20 equ 33h
Setb P3.5 ; clr P3.6 Setb P3.7 call delay ret ; InitTimer: mov TMOD,#00000001b mov tl0,#0b0h mov th0,#03ch setb ET0 ;Enable Timer 0 Interrupt setb EA ;Master Interrupt Enable setb TR0 ;Clock start running ret ; ;=============================== ;subroutine delay time ;=============================== delay: mov R1,#2 del1: mov R2,#255 del2: djnz R2,del2 djnz R1,del1 ret ;=============================== ; L O O K U P T A B L E ; Decode to Seven Segmen -> g f e d c b a ;======================================== Decoder7Segmen: DB 11000000b,11111001b,10100100b,10110000b,10011001b DB 10010010b,10000010b,11111000b,10000000b,10010000b ; End 6. Simpanlah program yang anda ketik dan beri nama : prog111a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan untuk data waktu detik yang ditampilkan apakah sesuai dengan jam konvensional.
Percobaan 11.2. Membangkitkan clock pada jam digital MM:DD dengan memanfaatkan interupsi timer 0. Pada percobaan akan dibangkitkan clock untuk jam digital untuk detik dan menit pada 7 segmen Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini: detik equ 30h detikpuluhan equ 31h detiksatuan equ 32h menit equ 33h menitpuluhan equ 34h menitsatuan equ 35h counter20 equ 36h ; Org 0h sjmp Start Org 0bh Ljmp Interrupt_Timer0 ; Start: mov detik,#0 mov menit,#0 call InitTimer ; Forever: call ClockDisplay sjmp Forever ; ; Interrupt_Timer0: mov tl0,#0b0h mov th0,#03ch djnz Counter20, EndInterrupt mov Counter20,#20 call DoClock EndInterrupt: reti ; DoClock: inc detik mov A,detik cjne A,#60,Update
mov P0,A setb P3.5 ; Setb P3.6 clr P3.7 call delay ret ; InitTimer: mov TMOD,#00000001b mov tl0,#0b0h mov th0,#03ch setb ET0 ;Enable Timer 0 Interrupt setb EA ;Master Interrupt Enable setb TR0 ;Clock start running ret ; ;=============================== ;subroutine delay time ;=============================== delay: mov R1,#2 del1: mov R2,#255 del2: djnz R2,del2 djnz R1,del1 ret ;======================================== ; L O O K U P T A B L E ; Decode to Seven Segmen -> g f e d c b a ;======================================== Decoder7Segmen: DB 11000000b,11111001b,10100100b,10110000b,10011001b DB 10010010b,10000010b,11111000b,10000000b,10010000b ; End 6. Simpanlah program yang anda ketik dan beri nama : prog112a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
9. Lakukan pengamatan untuk data waktu yang ditampilkan.
Percobaan 11.3. Membangkitkan clock down MM:DD dengan memanfaatkan interupsi timer 0. Pada percobaan akan dibangkitkan clock dengan hitungan mundur dari menit 60 detik 60 untuk detik dan menit pada 7 segmen Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper 7Segmen_EN, untuk mengaktifkan Decoder 74LS138 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini: detik equ 30h detikpuluhan equ 31h detiksatuan equ 32h menit equ 33h menitpuluhan equ 34h menitsatuan equ 35h counter20 equ 36h ; Org 0h sjmp Start Org 0bh Ljmp Interrupt_Timer0 ; Start: mov detik,#60 mov menit,#59 call InitTimer ; Forever: call ClockDisplay sjmp Forever ; ; Interrupt_Timer0: mov tl0,#0b0h mov th0,#03ch djnz Counter20, EndInterrupt mov Counter20,#20 call DoClock EndInterrupt: reti ; DoClock: dec detik mov A,detik cjne A,#0,Update mov detik,#60 satumenit: dec menit
call delay ret ; InitTimer: mov TMOD,#00000001b mov tl0,#0b0h mov th0,#03ch setb ET0 ;Enable Timer 0 Interrupt setb EA ;Master Interrupt Enable setb TR0 ;Clock start running ret ; ;=============================== ;subroutine delay time ;=============================== delay: mov R1,#2 del1: mov R2,#255 del2: djnz R2,del2 djnz R1,del1 ret ;======================================== ; L O O K U P T A B L E ; Decode to Seven Segmen -> g f e d c b a ;======================================== Decoder7Segmen: DB 11000000b,11111001b,10100100b,10110000b,10011001b DB 10010010b,10000010b,11111000b,10000000b,10010000b ; End 10. Simpanlah program yang anda ketik dan beri nama : prog113a.asm
11. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
12. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
13. Lakukan pengamatan untuk data waktu yang ditampilkan.
1. Mahasiswa memahami rangkaian interface keyboard PC PS/2 2. Mahasiswa memahami bahasa pemrograman assembly pengambilan data keyboard PC 3. Mahasiswa dapat menampilan data keyboard PC ke berbagai macam display antara
lain, LCD Karakter dan 7 Segmen
TEORI
Antarmuka keyboard standard adalah hubungan komunikasi serial. “Serial” yang menandakan bahwa data dikirim satu bit pada suatu waktu tertentu pada satu jalur tunggal. Serial komunikasi dipilih untuk antara muka keyboard karena hal ini simple dan mudah diterapkan, dan tidak banyak data per detik yang harus dikirimkan pada antar muka keyboard.
Ada empat jalur yang menghubungkan keyboard dan PC. Dua dari ini adalah power supply dan ground, yang digunakan untuk memberikan daya ke rangkaian keyboard. Dua sinyal yang lain adalah sebagai berikut:
1. Data Keyboard: Disinilah jalur bit-bit data dan perintah yang akan dikirimkan ke sistem PC dari keyboard.
2. Clock Keyboard: Ini merupakan sinyal clock regular, dengan suatu nilai yang berosilasi dari logika “1” ke “0” dengan pola yang teratur. Tujuan dari sinyal clock ini adalah untuk mensinkronisasi keyboard dan sistem, sehingga merekan selalu bekerja secara bersamaan.
Keyboard PC AT yang terkoneksi, hanya menggunakan empat buah kabel, kabel ini ditunjukkan pada gambar dibawah, untuk 5 pin DIM dan PS/2.
Diagram dibawah ini menunjukkan kode scan yang menandai tombol individu. Kode scan ditunjukkan pada bagian bawah dari tombol. Contoh kode scan untuk tombol ESC adalah 76. Semua kode scan ditunjukkan dalam Hex.
Sebagaimana yang anda lihat, kode scan ditandai dengan kode yang random. Pada beberapa kasus, cara yang paling mudah untuk menerjemahkan kode scan ke ASCII adalah dengan menggunakan metode look up table.
Transmisi data, dari keyboard ke sistem, dilakukan dengan frame 11 bit. Bit pertama adalah bit start ( logika 0 ), diikuti dengan 8 bit data ( LSB first ), satau bit paristas ( paritas ganjil ) dan bit stop ( logika 1 ). Setiap bit harus dibaca pada sisi turun dari clock.
Percobaan 12.1. Pengambilan data karakter keyboard PC dan display ke LED Pada percobaan ini data keyboard PC diinterfacekan ke mikrokontroller dengan menggunaan port P3 bit 2 dan 3. Hasil pengambilan data keyboard selanjutnya ditampilkan pada LED. Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper keyboard dua kabel ke rangkaian mikrokontroller bit P3.2 dan bit P3.3. 2. Pasang jumper LED_EN 2. Hubungkan modul keyboard PC PS/2 ke konektor keybaord 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 12.6. Diagram alir (a) rutin utama, (b) subrutin ambil_keyboard pada percobaan 12.1
; ;============================================ ;Subrutine AmbilKeyboard ;Subrutine berikut berfungsi untuk mendeteksi apakah keyboard ;sedang ditekan atau dilepas. Bila tombol tidak dilepas maka ;akan menuju pada subrutine ;Kybd_tidakLepas ;dan memberi tanda pada bit C = 0 sehingga bila C = 0 ; maka data tidak akan dicetak ;Bila tombol keyboard dilepas maka data scan code diambil ;dan dikonversi ke dengan dengan menggunakan ; look up table serta menandai bit C = 1 ;=========================================== AmbilKeyboard: acall ambil_scancode cjne a,#0F0h,kybd_tidakLepas JB KbdClock,$ acall ambil_Scancode Setb C Acall Konversi_Scancode ret ; Kybd_tidakLepas: Clr C ret ; ;====================================================== ;Subrutine Konversi_ScanCode ;Pada subrutine ini digunakan untuk menerjemahkan scan code ke bentuk ;karakter dengan menggunakan look up table. ;====================================================== Konversi_ScanCode: Mov DPTR,#TableKeyboard movc A,@A+DPTR mov DataKeyboard,A ret ; ;========================== ;Subrutin deteksi tombol keyboard ;========================== Ambil_scanCode: clr A Jnb KbdClock,$ mov R0,#08h Ambil_ScanCode2: Jb KbdClock,$ Mov C,KbdData Rr A mov acc.7,C Jnb KbdClock,$ Djnz R0,Ambil_ScanCode2 Jb KbdClock,$ Jnb KbdClock,$
Jb KbdClock,$ Jnb KbdClock,$ ret ; delay: mov R5,#0 delay1:mov R4,#02fh djnz R4,$ djnz R5,delay1 ret TableKeyboard: DB 00 DB 0F9H DB 00 DB 0F5H,0F3H,0F1H,0F2H,0FCH DB 00H DB 0FAH,0F8H,0F6H,0F4H DB 0C0H DB '~' DB 00H DB 00H DB 0C1H DB 0C2H DB 00H DB 0C3H DB 'Q1' DB 00H,00H,00H DB 'ZSAW2' DB 00H,00H DB 'CXDE43' DB 00H,00H DB ' VFTR5' DB 00H,00H DB 'NBHGY6' DB 00H,00H,00H DB 'MJU78' DB 00H,00H DB ',KIO09' DB 00H,00H DB './L;P-' DB 00H,00H,00H DB 27H DB 00H DB '[=' DB 00H,00H DB 0C5H DB 0C6H DB 0AH DB ']' DB 00H DB '\' DB 00H,00H,00H,00H,00H,00H,00H,00H DB 08H
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 0DH DB 00H DB 0FBH DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 0F7H end 7. Simpanlah program yang anda ketik dan beri nama : prog122a.asm 8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex. 9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan) 10. Lakukan pengamatan untuk data keyboard yang ditampilkan.
Percobaan 12.1. Pengambilan data karakter keyboard PC dan display ke LCD Karakter Pada percobaan ini data keyboard PC diinterfacekan ke mikrokontroller dengan menggunaan port P3 bit 2 dan 3. Hasil pengambilan data keyboard selanjutnya ditampilkan pada layar LCD Karakter.
VSS
2
1116
7VCC
D2
EN
LCD Character
3
14
D5
8
1
GND
10k
Potensio Multiturn
D1
P3.7
D74
13
12
9BPL
6
P0.7..P0.0
2 X 16
VCC
D4
J3
EN LCD 1 2
10
D1
RSP3.6
D3
D6
D0
15
Gambar 12.8. Rangkaian interface LCD karakter 2x16 Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper keyboard dua kabel ke rangkaian mikrokontroller bit P3.2 dan bit P3.3. 2. Hubungkan modul keyboard PC PS/2 ke konektor keybaord 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 6. Ketik program berikut ini:
TableKeyboard: DB 00 DB 0F9H DB 00 DB 0F5H,0F3H,0F1H,0F2H,0FCH DB 00H DB 0FAH,0F8H,0F6H,0F4H DB 0C0H DB '~' DB 00H DB 00H DB 0C1H DB 0C2H DB 00H DB 0C3H DB 'Q1' DB 00H,00H,00H DB 'ZSAW2' DB 00H,00H DB 'CXDE43' DB 00H,00H DB ' VFTR5' DB 00H,00H DB 'NBHGY6' DB 00H,00H,00H DB 'MJU78' DB 00H,00H DB ',KIO09' DB 00H,00H DB './L;P-' DB 00H,00H,00H DB 27H DB 00H DB '[=' DB 00H,00H DB 0C5H DB 0C6H DB 0AH DB ']' DB 00H DB '\' DB 00H,00H,00H,00H,00H,00H,00H,00H DB 08H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H DB 0DH DB 00H DB 0FBH DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 0F7H End
7. Simpanlah program yang anda ketik dan beri nama : prog121a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan pengamatan untuk data keyboard yang ditampilkan. 11. Lakukan modifikasi program tersebut untuk menampilkan data keyboard PC lebih dari satu
karakter ke LCD karakter.
Percobaan 12.2. Pengambilan data karakter keyboard PC dan display ke 7 Segmen Pada percobaan ini data keyboard PC diinterfacekan ke mikrokontroller dengan menggunaan port P3 bit 2 dan 3. Hasil pengambilan data keyboard selanjutnya ditampilkan pada disply 7 Segmen
VCC
aa
VCC
ee
c
FCS 9013
PNP
7 x 220 ohm
d
f
FCS 9013
b
Common Anoda
PNP
FCS 9013
VCC
FCS 9013
VCC
P0.6..P0.0
FCS 9013
PNP
VCC
FCS 9013
PNP
g
Y7..Y0
g
f
VCC
FCS 9013
PNP
c
8 x 1k ohm
VCC
PNP
d
FCS 9013
VCC
b
PNPPNP
(a)
VCC
P3.6 U8
74LS138
123
645
15141312111097
ABC
G1G2AG2B
Y0Y1Y2Y3Y4Y5Y6Y7
P3.5
R28
10K
J2
EN 7 SEGMEN12
Y7..Y0
P3.7
VCC
(b)
Gambar 12.9. Rangkaian Display 8x7 segmen (a) dan rangkaian decoder (b)
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut: 1. Hubungkan jumper keyboard dua kabel ke rangkaian mikrokontroller bit P3.2 dan bit P3.3. 2. Hubungkan modul keyboard PC PS/2 ke konektor keybaord 3. Pasang jumper 7 SegmenEN 4. Hubungkan modul Microcontroller Trainer dengan power supply +5V 5. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 6. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 7. Ketik program berikut ini:
TUJUAN 1. Mahasiswa memahami rangkaian interface keyboard PC PS/2 2. Mahasiswa memahami bahasa pemrograman assembly pengambilan data keyboard PC 3. Mahasiswa dapat menampilan data keyboard PC ke berbagai macam display antara lain,
LCD Karakter dan 7 Segmen TEORI
Gambar 13.1. Pin Konfigurasi Printer Dot Matriks
Gambar 13.2. Penamaan sinyal pada printer DB25 Female
Selama operasi printer standart, cara data ditransmisikan melalui jalur parallel port adalah bervariasi, tetapi pada prinsipnya adalah sebagai berikut: 1. Untuk mengirimkan sebuah byte data, software mengeluarkan byte ke jalur data,
selanjutnya mengeluarkan pulsa STROBE. 2. Disisi lain Printer, menguji jalur BUSY, dan komputer menunggu untuk jalur busy sebelum
mengirimkan byte berikutnya. 3. Pada implemantasi yang lain, jalur ACK digunakan printer untuk menginformasikan PC
bahwa data telah diterima. 4. Jalur PAPER EMPTY adalah jalur untuk menginformasikan ke PC bahwa kertas telah
keluar. 5. Printer juga mengirim sinyal SELECTED ke PC untuk mengindikasikan bahwa printer
sedang on line dan siap untuk menerima data 6. Sinyal ERROR dari printer dapat digunakan untuk berbagai macam error yang akan
menyebabkan printer tidak dapat menerima data. 7. AUTOFEED, memberitahukan ke printer untuk secara automatik menyisipkan line feed
setelah carriage return 8. INIT, inisialisasi printer setelah pemberia catu daya
123
Reset
Connector DB25 Female PCB
1325122411231022
921
820
719
618
517
416
315
214
1
Busy
D0-D7
12345678
Strobe
Gambar 13.3. Koneksi interface printer
Percobaan 13.1 Cetak sebuah karakter dengan menggunakan printer dot matriks
Pada percobaan ini, satu karakter akan dicetak pada kertas dengan menggunakan sebuah printer melalui interface ke mikrokontroller. 1. Hubungkan konektor 8 bit ke P2 dan konektor 3 bit ke P3 2. Hubungkan modul printer ke konektor printer DB25 female 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer
5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
7. Simpanlah program yang anda ketik dan beri nama : prog132a.asm 8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex. 9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan modifikasi program tersebut untuk menampilkan data 3 kalimat ke printer dot matriks
Percobaan 13.2 Cetak dua buah kalimat dengan menggunakan printer dot matriks Pada percobaan ini, dua buah kalimat akan dicetak pada kertas dengan menggunakan sebuah printer melalui interface ke mikrokontroller. 1. Hubungkan konektor 8 bit ke P2 dan konektor 3 bit ke P3 2. Hubungkan modul printer ke konektor printer DB25 female 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
Gambar 13.5. (a) Diagram alir rutin utama (b) subrutin cetak satu karakter pada percobaan 13.2 6. Ketik program berikut ini: busy bit P3.0 strobe bit P3.1 portData equ P2 ; org 0h start: call word_Welcome ; to print ' Welcome To ' call enter ; new line feed call word_Lab ; to print ' Computer Laboratory ' call enter ; new line feed ; quit: sjmp Quit ; Hang Forever until reset pressed
; ;================================================= ;This subroutine is used to print single character ;trough Port Data ;before printing a character,a busy signal must be detected ;till a low logic received, than a strobe ( --__-- ) pulse ;must be generate to starts printing a character. ;================================================= Printchar: mov portData,A jb busy,$ setb strobe clr strobe acall delay Setb strobe acall delay ret ; delay: mov R7,#2 del1: mov R6,#20 DJNZ R6,$ DJNZ R7,del1 ret ;============================================= ;This subroutine is used to print a text ' Welcome To' ;this subroutine will print character by character till '$' ;character is detected, when this character is detected then ;It's indicated that a text has finished ;============================================= word_welcome: mov DPTR,#Text_welcome lagi1: clr A movc A,@A+DPTR cjne A,#'$',Print1 sjmp Out1 Print1: call Printchar inc dptr call delay sjmp lagi1 Out1: ret ; ;============================================= ;This subroutine is used to print a text ' Computer Laboratorium' ;this subroutine will print character by character till '$' ;character is detected, when this character is detected then ;It's indicated that a text has finished ;============================================== word_Lab: mov DPTR,#Text_lab lagi2: clr A movc A,@A+DPTR cjne A,#'$',Print2
sjmp Out2 Print2: call Printchar inc dptr call delay sjmp lagi2 Out2: ret ; Enter: mov A,#0dh call printchar call delay mov A,#0ah call printchar ret ; Text_welcome: DB ' Welcome To $' Text_Lab: DB ' Computer Laboratory $' ; end 7. Simpanlah program yang anda ketik dan beri nama : prog132a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
10. Lakukan modifikasi program tersebut untuk menampilkan data 3 kalimat ke printer dot matriks
TUJUAN 1. Mahasiswa memahami tentang real time clock 2. Mahasiswa memahami rangkaian interface RTC dengan mikrokontroller 3. Mahasiswa memahami pembuatan program pengambilan data RTC TEORI DASAR
Real Time Clock merupakan suatu chip (IC) yang memiliki fungsi sebagai penunjuk waktu. RTC DS 12C887 memiliki register yg dapat menunjukkan detik, menit, jam, tanggal, bulan dan tahun. RTC ini didesain memiliki 128 lokasi RAM yang terdiri dari 15 byte untuk data waktu serta kontrol, dan 113 byte sebagai RAM yang dapat digunakan sebagai RAM pada umumnya.
RTC DS 12C887 menggunakan bus yang termultipleks untuk menghemat pin. Timing yang digunakan untuk mengakses RTC dapat menggunakan intel timing atau motorola timing. RTC ini juga dilengkapi dengan pin IRQ untuk kemudahan dalam proses.
Operasi dari RTC
Berikut ini gambar pin-pin dari RTC DS 12C887, jumlah total pin-nya sebanyak 13
buah :
Gambar 14.1 Pin RTC DS 12C887
Berikut ini akan ditampilkan blok diagram dari RTC DALLAS 12C887. Terlihat dari blok diagram tersebut bawhwa RTC terbagi menjadi beberapa bagian utama dengan kontrol maupun I/O untuk operasinya.
Tabel 14.1. berikut ini menjelaskan fungsi masing-masing pin yang ada :
Nama Pin Keterangan
MOT Motorola / Intel timing
AD0-AD7 Bus DATA / ADDRESS yang termultipleks
CS Chip Select
AS Address Strobe
R/W Write Strobe
DS Data Strobe
RESET Inputan Reset
IRQ Interrupt Request Output
SQW Output Sinyal Kotak
VCC Catu tegangan +5 volt
Gnd Ground
RCLR Hapus RAM
Penjelasan dari masing-masing pin RTC DS12C887 dijelaskan berikut :
1. GND, VCC
Merupakan pin untuk power supply RTC. VCC diberikan input +5volt. Ketika tegangan 5 volt diberikan dalam batas yang normal, RTC bebas diakses dan data dapat ditulis atau dibaca. Sedangkan ketika Vcc dibawah 4.25 volt, maka proses baca dan tulis tidak dapat dilakukan. Akan tetapi, proses pewaktu (timekeeping) tetap dilakukan oleh RTC tanpa dipengaruhi oleh tegangan input yang rendah. Saat VCC turun dibawah 3 volt, catu daya untuk RAM dan pewaktu dipindahkan ke internal lithium batery yang terdapat pada RTC. Fungsi pewaktu dari RTC memiliki akurasi ± 1 menit per bulan pada suhu 250 C walaupun tanpa adanya catu pada VCC.
2. MOT (Mode Select)
Pin MOT memberikan kebebasan untuk memilih dua tipe bus. Ketika pin ini dihubungkan dengan VCC, maka motorolla bus timing yang dipilih, sedangkan ketika dihubungkan ke ground atau dibiarkan (tak dihubungkan) maka intel bus timing yang dipilih.
Pin ini memiliki pull down internal sebesar sekitar 20 kΩ.
3. SQW (Square Wave Output)
Pin SQW dapat mengeluarkan sinyal kotak, dari satu sampai 13 pembagian yang disediakan oleh 15 buah tingkat pembagi (divider) internal dari RTC. Frekuensi dari SQW dapat dipilih dengan memprogram register A seperti pada tabel. Sinyal SQW dapat dihidupkan dan dimatikan dengan mengatur bit SQWE pada register B. Sinyal SQW tidak hidup ketika VCC dibawah 4,25 volt.
4. AD0 – AD7 (Adrress/Data bus yang ter-multipleks dan bidirect)
Bus yang ter-multiplex menghemat penggunaan pin karena informasi address dan data waktu menggunakan jalur sinyal yang sama. Alamat muncul pada bagian pertama dari bus
cycle dan dengan pin yang sama pula digunakan untuk data pada bagian kedua dari bus cycle. Multipleksing antara data dan address tidak memperlambat waktu akses dari RTC karena perubahan dari address menuju data dilakukan pada saat akses RAM internal pada RTC. Address harus valid saat terjadi falling edge pada AS/ALE, yang kemudian RTC akan me-latch
address dari AD0 sampai AD6. Data valid yang akan dituliskan ke RTC harus valid dan dijaga stabil pada saat pin DS dan WR diberi pulsa. Pada proses pembacaan, RTC menghasilkan output 8 bit data pada saat pin DS dan RD diberi pulsa. Bus akan menjadi high impedance saat pulsa low diberikan pada pin DS (motorola) atau pulsa high diberikan pada pin RD (intel).
5. AS (Address Strobe Input)
Perubahan pulsa positif pada address strobe berguna untuk melakukan multipleks pada bus. Perubahan pulsa negatif pada AS akan menyebabkan address ter-latch. Perubahan positif selanjutnya akan menghapus address walaupun CS tidak diaktifkan. Perintah access
seharusnya dikirimkan secara bersamaan.
6. DS (Data Strobe or Read Input)
Pin DS/RD mempunyai 2 mode operasi tergantung pada tingkat yang diberikan kepada MOT. Ketika MOT dihubungkan ke VCC, motorola bus timing dipilih dan pada mode ini DS merupakan pulsa positif saat bagian lanjut dari bus cycle dan disebut sebagai data strobe. Saat proses pembacaan, DS menunjukkan bahwa RTC memiliki bus yang bidirectional. Pada proses penulisan, pulsa positif pada DS akan me-latch data yang ditulis. Ketika MOT dihubungkan ke ground, maka intel bus timing yang dipilih dan pin DS disebut sebagai read (RD). RD menjelaskan periode ketika RTC memperlakukan bus sebagai pembaca data. Sinyal RD mempunyai pengertian yang sama seperti sinyal Output Enable (OE) pada memori yang umum.
7. R/W (Read/Write Input)
Pin R/W juga memiliki 2 mode operasi. Ketika pin MOT dihubungkan ke VCC untuk motorola timing, R/W berada pada level yang menunjukkan apakah berada pada proses baca atau tulis. Proses baca ditunjukkan dengan level high pada R/W sementara DS juga high. Proses tulis ditunjukkan saat R/W low dan DS high. Ketika pin MOT dihubungkan ke ground untuk intel timing, sinyal R/W adalah sinyal active low dinamakan WR. Pada mode ini pin R/W mempunyai makna yang sama dengan sinyal Write Enable (WE) seperti pada RAM umum.
8. CS (Chip Select Input)
Sinyal chip select harus di hubungkan low untuk dapat mengakses bus cycle. CS harus dijaga pada posisi aktif saat DS dan AS pada motorola timing atau RD dan WR untuk intel timing. Bus cycle yang terjadi tanpa mengaktifkan CS akan me-latch address tapi tidak ada akses yang bisa dilakukan. Saat VCC dibawah 4,25 volt, RTC secara internal menghalangi akses dengan cara secara internal tidak mengaktifkan input CS. Proses ini akan melindungi baik data RTC maupun data pada RAM saat tidak ada catu daya.
9. IRQ (Interrupt Request Output)
Pin IRQ adalah keluaran active low dari RTC 12C887 yang digunakan sebagai masukan interupsi pada prosessor. Keluaran IRQ tetap low selama selama bit status menyebabkan interupsi terjadi dan bit yang berhubungan yaitu interrupt-enable di-set. Untuk menghapus interupsi biasanya dilakukan dengan membaca register C. Pin RESET juga menghapus interupsi yang dilakukan atau yang belum terjadi (pending). Ketika tidak terjadi interupt maka level IRQ berada pada kondisi high impedance. Beberapa peralatan interupsi dapat
dihubungkan dengan IRQ bus. Bus IRQ adalah keluaran open drain dan memerlukan tambahan resistor pull-up.
10. RESET (Reset Input)
Pin RESET tidak berpengaruh terhadap jam, kalender atau RAM. Pada saat penyalaan RTC, pin RESET dapat dijaga LOW untuk beberapa saat untuk menstabilkan catu daya. Lamanya waktu pin RESET diberikan low tergantung dari aplikasi yang digunakan. Akan tetapi jika reset digunakan saat power up (penyalaan), waktu RESET dijaga low harus melebihi 200 ms untuk meyakinkan bahwa timer internal dari RTC untuk penyalaan telah cukup. Ketika RESET low dan VCC diatas 4,25 volt, maka hal-hal yang terjadi adalah sebagai berikut :
a. Periodic Interrupt Enable (PEI) dihapus menjadi nol.
b. Alarm Interrupt Enable (AIE) dihapus menjadi nol.
c. Update Ended Interrupt Flag (UF) dihapus menjadi nol.
d. Interrupt Request Status Flag (IRQF) dihapus menjadi nol.
e. Periodic Interrupt Flag (PF) dihapus menjadi nol.
f. RTC tidak dapat diakses sampai RESET menjadi high.
g. Alarm Interrupt Flag (AF) dihapus menjadi nol.
h. Pin IRQ dalam kondisi high impedance.
i. Square Wave Output Enable (SQWE) dihapus menjadi nol.
j. Update Ended Interrupt Enable (UIE) dihapus menjadi nol.
Pada aplikasi umum, RESET dapat dihubungkan langsung VCC. Koneksi ini akan menjadikan RTC 12C887 dapat berfungsi saat terjadi kerusakan catu daya tanpa mempengaruhi register kontrol RTC.
Address Map dari RTC RTC mempunyai RAM internal didalamnya, dalam memori tersebut terbagi menjadi
beberapa register-register yang mempunyai fungsi dalam pengontrolan maupun pengambilan data RTC. Agar tidak terjadi kesalahan dalam pengontrolan maupun pengambilan data, peta alamat dari masing-masing register harus jelas.
Address map dari RTC terdiri dari 113 byte RAM yg dapat digunakan oleh pengguna RTC, 11 byte RAM yang berisikan data RTC berupa waktu, kalender dan alarm, dan 4 byte yang digunakan untuk kontrol dan status. Keseluruhan 128 byte ini dapat ditulis atau dibaca secara langsung kecuali pada keadaan berikut:
Informasi waktu dan kalender diperoleh dengan membaca byte memori yang sesuai. Waktu, kalender dan alarm di-set atau diinisialisasi dengan menulis ke byte RAM yang sesuai. Isi dari kesepuluh data kalender, waktu dan alarm dapat digunakan dalam mode biner atau BCD (Binary-Coded Decimal). Sebelum mengakses register kalender, waktu dan alarm, SET bit pada register B harus ditulis dengan level logika yang sesuai agar tidak mengganggu proses update yang dilakukan oleh RTC. Kesemua data kalender, waktu dan alarm harus menggunakan mode data yang sma (biner atau BCD), yaitu dengan cara menulis pada register B pada bit DM(Data Mode). Sekali di inisialisasi maka RTC akan terus menggunakan mode data yang dipilih sebelumnya. Tabel berikut menunjukkan mode data dari kalender, waktu dan alarm baik dalam mode biner atau BCD.
Tabel 14.2. Tabel data mode waktu, kalender dan alarm
Register Kontrol RTC RTC 12C887A mempunyai 4 buah register kontrol yang dapat diakses setiap saat,
walaupun pada saat RTC melakukan update cycle.
Register A
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
UIP – Update in progress adalah status bit yang dapat dimonitor, merupakan bit read only dan tidak dipengaruhi oleh reset. Ketika bit UIP 1, proses update akan segera berlangsung. Ketika
UIP 0, proses update tidak akan terjadi sekurangnya 244µs. Informasi kalender, waktu dan alarm yang ada pada RAM akan dapat diakses secara penuh ketika bit UIP nol.
DV2, DV1, DV0 – Ketiga bit ini digunakan untuk menghidupkan atau mematikan osilator dan me-reset rantai perhitungan. Pola 010 adalah satu-satunya kombinasi yang akan menghidupkan osilator dan menyebabkan RTC dapat menyimpan waktu. Pola 11x akan menghidupkan osilator tapi menahan rantai perhitungan dalam kondisi reset.
RS2, RS2, RS1, RS0 – Keempat bit ini akan memilih frekuensi atau mematikan pulsa kotak pada pin SQW. Pin SQW dapat berfungsi juga sebagai periodic interrupt. Keempat bit ini dapat dibaca/tulis dan tidak dipengaruhi oleh RESET. Untuk mengaktifkannya, dapat dilakukan sebagai berikut :
1. Mengaktifkan interupt dengan bit PIE.
2. Mengaktifkan keluaran SQW dengan bit SQWE.
3. Mengaktifkan keduanya dengan waktu dan frekuensi yang sama.
4. Tidak mengaktifkan keduanya.
Register B
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
SET PIE AIE UIE SQWE DM 24/12 DSE
SET – Ketika bit SET adalah 0, proses update berfungsi normal dengan menambahkan perhitungan sekali dalam satu detik. Ketika SET ditulis menjadi 1, semua proses update dihentikan sehingga program dapat menginisialisasi byte waktu dan kalender tanpa adanya proses update yang terjadi ditengah proses inisialisasi.
PIE – Periodic Interrupt Enable merupakan bit yang dapat dibaca/tulis yang akan menyebabkan bit Periodic Interrupt Flag (PF) pada register C mengatur pin IRQ menjadi low. Ketika bit PIE diset 1, interupt secara periodik dihasilkan dengan mengatur pin IRQ menjadi low dengan periode tertentu sesuai dengan bit RS3-RS0 (register A). Apabila PIE 0, ini akan menghalangi pengaturan pin IRQ oleh interupt periodik, tetapi bit PF masih di-set dengan periode tertentu. PIE tidak dapat dirubah secara internal oleh RTC, tetapi akan dihapus menjadi 0 pada saat RESET.
UIE – Update Ended Interrupt merupakan bit yang dapat dibaca/tulis yang akan meng-enable Update ended Flag (UF) pada register C untuk memasukkan IRQ. Pin RESET yang di “low” atau bit SET yang di “high” akan menghapus bit UIE.
SQWE – Ketika bit Square Wave Enable di-set menjadi 1, gelombang kotak dengan periode yang sudah ditentukan oleh bit RS3-RS0 akan dikeluarkan pada pin SQW. Ketika SQWE di-set menjadi 0, maka pin SQW tetap low. Bit SQWE dapat dibaca/tulis dan dapat dihapus oleh RESET. SQWE di-set menjadi 1 ketika Vcc dihidupkan.
DM – Bit Data Mode (DM) mengindikasikan apakah informasi waktu dan kalender mempunyai format biner atau BCD. Bit DM di-set oleh program dengan memberikan format yang sesuai dan dapat dibaca sesuai keperluan. Bit ini tidak dapat dirubah secara internal atau oleh RESET. ‘1’ pada DM menyatakan data biner sedangkan ‘0’ menyatakan DM mempunyai format BCD (Binary Coded Decimal).
24/12 – Bit ini digunakan untuk memilih mode jam, 24 atau 12. ‘1’ menunjukkan mode 24-jam dan ‘0’ menunjukkan mode 12-jam. Bit ini dapat dibaca/tulis dan tidak dipengaruhi secara internal atau RESET.
DSE – Merupakan bit khusus yang digunakan untuk merubah waktu ketika terjadi perubahan musim (biasanya terjadi pada negara dengan 4 musim). Ketika di-set 1, pada hari minggu pertama pada bulan april terjadi perubahan jam dari 1:59:59 AM menjadi 3:00:00 AM. Pada hari minggu terakhir bulan oktober saat waktu menunjukkan 1:59:59 AM berubah menjadi 1:00:00 AM. Hal ini tidak terjadi ketika DSE di-set 0. Bit ini tidak dipengaruhi secara internal atau RESET.
Register C
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
IRQF PF AF UF 0 0 0 0
IRQF – Interrupt Request Flag (IRQF) bit diset menjadi 1 ketika hal berikut terjadi :
PF = PIE = 1
AF = AIE = 1
UF = UIE = 1
Contoh: IRQF = (PF*PIE) + (AF*AIE) + (UF*UIE)
Saat ketika bit IRQF adalah 1, pin IRQ menjadi “low”. Bit flag PF, AF, dan UF di hapus detelah register C dibaca oleh program atau ketika pin RESET “low”.
PF – Periodic Interrupt Flag adalah bit read-only yang diset menjadi 1 ketika edge dideteksi pada tap yang dipilih pada rantai pembagian. Bit RS3 – RS0 menghasilkan frekuensi periodik. PF diset menjadi 1 tanpa dipengaruhi oleh bit PIE. Ketika PF dan PIE ‘1’ , sinyal IRQ aktif dan akan mengeset bit IRQF. Bit PF akan dihapus secara pembacaan software pada register C atau RESET.
AF – ‘1’ pada bit Alarm Interrupt Flag (AF) mengindikasikan waktu yang dicapai sesuai dengan waktu alarm. Jika bit AIE juga 1, pin IRQ akan menjadi low dan ‘1’ akan terjadi pada bit IRQF. RESET atau pembacaan register C akan menghapus AF.
UF – Bit Update Ended Interrupt Flag akan diset setelah tiap proses update. Ketika bit UIE diset menjadi 1, ‘1’ pada UF akan menyebabkan bit IRQF menjadi 1 dan akan mengaktifkan pin IRQ. UF dihapus dengan membaca register C atau RESET.
BIT 3 sampai BIT 0 – Bit ini tidak dipakai dan selalu bernilai 0.
Register D
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
VRT 0 0 0 0 0 0 0
VRT – Valid RAM Time mengindikasikan kondisi dari baterai yang dihubungkan ke pin VBAT. Bit ini tidak dapat ditulis dan selalu menjadi 1 ketika dibaca. ‘0’ akan terjadi ketika baterai internal telah rusak. Bit ini tidak dipengaruhi oleh RESET.
BIT 6 sampai BIT 0 - Bit ini tidak dipakai dan selalu bernilai 0.
Proses Update RTC 12C887 melaksanakan proses update sekali dalam satu detik walau tanpa
memperhatikan bit SET pada register B. Ketika bit SET pada register B di-set menjadi 1, maka informasi waktu, kalender, dan alarm akan berhenti dan tidak akan berubah pada saat terjadi penambahan waktu, tetapi rantai perhitungan waktu akan tetap terjadi dan disimpan pada buffer internal. Hal ini akan menjaga akurasi watu dari RTC saat terjadi proses pembacaan dan penulisan. Proses update ini juga akan membandingkan byte alarm dengan waktu yang terjadi sat itu.
Ada tiga metode untuk mengakses data pada RTC yang akan menghindari akses informasi waktu yang tidak konsisten. Metode pertama adalah menggunakan update ended
interrupt. Jika di enable, interupt akan terjadi tiap proses update selesai, dimana terdapat waktu 999 ms untuk membaca data waktu yang valid. Jika interupsi ini digunakan, bit IRQF pada register C harus dihapus sebelum meninggalkan proses interupsi.
Metode yang kedua adalah dengan menggunakan bit update in progress (UIP) yang terdapat pada register A yang menyatakan apakah proses update sedang berlangsung. Bit UIP akan mengeluarkan pulsa tiap satu detik. Setelah bit UIP menjadi high, maka proses update
akan terjadi 244 µs kemudian dan jika low terbaca pada bit UIP, maka pengguna mempunyai
waktu 244 µs sebelum data waktu/kalender akan berubah. Sehingga, pengguna harus
menghindari proses interupsi yang menyebabkan waktu pembacaan data melebihi 244 µs.
Gambar 14.3 Hubungan antara Update-Ended dan Periodic Interrupt
Metode yang ketiga adalah mengunakan periodic interrupt untuk menunjukkan apakah proses update sedang berlangsung. Bit UIP pada register A akan di-set high diantara pengaktifan dari bit PF pada register C. Periode interupt yang melebihi waktu tBUC akan menyebabkan data yang valid dapat dicapai pada setiap terjadinya interupsi. Pembacaan harus telah selesai dalam waktu (tPI/2 + tBUC) untuk memastikan data tidak dibaca saat proses update.
Timing Diagram Gambar-gambar berikut ini menjelaskan timing diagram untuk proses tulis dan baca yang dilakukan oleh RTC
Percobaan 14.1. Pengambilan data detik pada RTC DS12887 dengan display LED Pada percobaan ini, data detik RTC diambil dan dikeluarkan ke LED.
D1
P0.0..P0.7
D8
VCC
J3
EN LED12
Gambar 14.7
1. Hubungkan jumper LED_EN 2. Hubungkan kabel data dan kontrol pada board RTC 3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program
setb Write ; sinyal write = 1; ? ; setb Read clr Read ; sinyal read = 0 mov A,PortData ; Baca data dari alamat 00h = detik setb Read ; mov P0,A ; simulasi data ke LED = P0 sjmp start ; INIT_RTC: setb Read mov PortData,#RegisterA ; clr AS setb AS clr AS ; setb WRite clr Write mov PortData,#20h setb WRite ; mov PortData,#RegisterB clr AS setb AS clr AS ; setb WRite clr WRite mov PortData,#02h setb WRite ; RET ; end 7. Simpanlah program yang anda ketik dan beri nama : prog141a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
Percobaan 14.2. Pengambilan data detik dan menit pada RTC12887 dengan display LCD Karakter 2x 16. Pada percobaan ini, data detik dan menit diambil dan ditampilkan pada LCD Karakter 2x16.
Gambar 14.10. Diagram alir rutin utama percobaan 14.2 1. Hubungkan jumper LCD_EN 2. Hubungkan kabel data dan kontrol pada board RTC ke rangkaian mikrokontroller
3. Hubungkan modul Microcontroller Trainer dengan power supply +5V 4. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 5. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 6. Ketik program berikut ini: CS bit P3.3 ALE bit P3.2 Write bit P3.1 Read bit P3.0 PortRTC equ P2 RegisterA equ 10 RegisterB equ 11 Puluhan equ 30h Satuan equ 31h Detik equ 32h Menit equ 33h
Write2LCDMenit: mov r1,#0c2h call write_inst mov a,Puluhan add a,#30h mov r1,a call write_data ; mov r1,#0c3h call write_inst mov a,Satuan add a,#30h mov r1,a call write_data ret ; setMenit: setb Read mov PortRTC,#02h; clr ALE setb ALE clr ALE ; setb WRite clr Write mov PortRTC,#21d setb WRite ret ; setDetik: setb Read mov PortRTC,#00h; clr ALE setb ALE clr ALE ; setb WRite clr Write mov PortRTC,#00h setb WRite ret word1: DB ' My RTC Test '; here is the data to be look up end 7. Simpanlah program yang anda ketik dan beri nama : prog142a.asm
8. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
9. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
TUJUAN: 1. Mahasiswa memahami prinsip dasar PWM 2. Mahasiswa memahami rangkaian Driver Motor DC 3. Mahasiswa memahami pemrograman assembly untuk pengaturan PWM
Konsep Dasar PWM
Salah satu cara yang paling mudah untuk membangkitkan sebuah tegangnan analog dari sebuah nilai digital adalah dengan menggunakan pulse-width modulation (PWM). Dalam PWM gelombang kotak, frekuensi tinggi dibangkitkan sebagai output digital. Untuk contoh, sebuah port bit secara kontinyu melakukan kegiatan saklar on dan off pada frekuensi yang relatif tinggi. Selanjutnya, bila sinyal diumpankan pada LPF low pass filter, tegangan pada output filter akan sama dengan Root Mean Squere ( RMS ) dari sinyal gelombang kotak. Selanjutnya tegangan RMS dapat divariasi dengan mengubah duty cycle dari sinyal.
DUTY CYCLE menyatakan fraksi waktu sinyal pada keadaan logika high dalam satu siklus. Satu siklus diawali oleh transisi low to high dari sinyal dan berakhir pada transisi berikutnya. Selama satu siklus, jika waktu sinyal pada keadaan high sama dengan low maka dikatakan sinyal mempunyai DUTY CYCLE 50 %. DUTY CYCLE 20 % menyatakan sinyal berada pada logika 1 selama 1/5 dari waktu total
Gambar 15.1. Duty cycle 30 %
VCC R115k
+ C2
1000uFA
-
+
MG1MOTOR DC
12
+ C11uF
Q1TIP1201
23
R210k
D1
1N4001U1
ULN2003
1234567 10
161514131211
I1I2I3I4I5I6I7 O7
O1O2O3O4O5O6
VCC
Gambar 15.2. Aplikasi PWM pada setting kecepatan motor
Pada rangkaian tersebut menunjukkan sebuah DAC yang dibangun dengan metode PWM, yang digunakan untuk mengendalikan kecepatan motor DC dengan modulasi lebar pulsa. Bit 0 dari P0 mengemudikan sebut saklar transistor sebagaimana yang ditunjukkan pada gambar. Motor dihidupkan dan dimatikan untuk suatu periode tertentu
Bagian pada saat motor hidup disebut DUTY CYCLE. Pada program ini menggunakan sebuah byte untuk menyimpan lama waktu motor on, dari sejumlah 256 siklus. Bila duty cycle yang diberikan adalah 10 % maka program ini menyimpan data waktu ON selama 10 siklus dan OFF selama 246 siklus dari 256 siklus.
Berikutnya nilai duty cycle disimpan pada RAM internal yang diberi label dCycle. Komplemen dari duty cycle disimpan pada RAM internal dengan nama dCycleC. Pada perancangan software ini, Timer 0 diaplikasikan dalam mode 2, yaitu 8 bit timer auto reload, yang akan melakukan increment nilai register counter setiap siklus, dan bila terjadi overflow maka data yang berada pada TH0 akan diloadkan ke TL0 yang berfungsi sebagai counter 8 bit.
Bila frekuensi kristal yang digunakan adalah 12 Mhz, sehingga jika nilai reload adalah 0 maka timer 0 akan over flow setiap 256 udetik; dan jika nilai reload adalah FFh maka timer akan over flow setiap 1 udetik. Pertama kali program menghidupkan motor dan menempatkan nilai dCycle ke TH0 sebagai nilai reload. Setelah timer overflow, komplemen dari duty cycle dCycleC akan ditempatkan ke TH0 sebagai nilai reload dan motor berhenti berputar. Pada pemrograman ini keadaan motor dapat dilihat pada register yang dapat dialamati bit, yang ditandai sebagai motorFlag.
Percobaan 15.1. Setting kecepatan putaran motor DC dengan PWM Pada percobaan ini, putaran kecepatan motor kemudikan dengan menggunakan transistor TIP120 melalui metode PWM. PWM dikemudikan dengan menggunakan satu bit dari P0, seperti yang ditunjukkan pada gambar dibawah.
Gambar 15.3. Diagram alir (a) rutin utama (b) inisialisasi duty cycle dan (c) inisialisasi timer pada percobaan 15.1
Gambar 15.4. Diagram alir interupsi timer 0 pada percobaan 15.1 1. Hubungkan kabel data dan ke inputan rangkaian driver motor DC 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini: dCycle equ 30h dCycleC equ 31h PWM bit P0.0 MotorF bit 20h org 0h sjmp start org 0bh ljmp Interupsi_Timer0 ; start: call Init_Dcycle call init_Timer loop: sjmp loop ; Init_Dcycle:
mov dCycle,#45 ;inisialisasi data dCycle T_ON(256-45)ud dan ;T_OFF(256-211)ud
mov A,dCycle ;copy data ke A cpl A ;komplemen A mov dCycleC,A ;copy A ke dCycleC ret ; Init_Timer: anl TMOD,#0F0h ; orl TMOD,#2 ;Timer0 mode2 auto reload
mov TH0,dCycle ;Load data counter 8 bit setb ET0 ;enable interupsi timer0 setb EA ;enable all interupsi setb TR0 ;timer0 run ret ; Interupsi_Timer0: jb motorF,motorOff ;deteksi bit motorF setb PWM ;Hidupkan motor setb P0.7 ;TP pulsa PWM di osiloskop mov TH0,dCycle ;load data dCycle ke TH0 setb motorF ;beri tanda motorF=1-> motor ON reti motorOff: clr PWM ;matikan motor clr P0.7 ;TP pulsa PWM di osiloskop mov TH0,dCycleC ;load data cCycleC ke TH0 clr motorF ;beri tanda motorF=0-> motor OFF reti end 6. Simpanlah program yang anda ketik dan beri nama : prog151a.asm
7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.
8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)
Percobaan 15.2. Pengaturan kecepatan putaran motor DC dengan metode PWM melalui ADC Pada percobaan ini, ADC digunakan untuk membaca tegangan dari input pembagi tegangan 0-5 Volt, selanjutnya tegangan yang telah diuabah menjadi data digital, digunakan untuk mengatur PWM pada Motor DC. 1. Hubungkan kabel data dan ke inputan rangkaian driver motor DC 2. Hubungkan modul Microcontroller Trainer dengan power supply +5V 3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer 4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program 5. Ketik program berikut ini: dCycle equ 30h dCycleC equ 31h PWM bit P0.0 MotorF bit 20h org 0h sjmp start org 0bh ljmp Interupsi_Timer0 ; start: call init_Timer
Lampiran 1 Petunjuk Instalasi Komponen TComPort pada Delphi 6
1. Untuk melakukan antarmuka PC dengan perangkat ekternal dengan memanfaatkan port com atau port serial pada pemrograman delphi, diperlukan sebuah komponen untuk mengakses port serial communicatin RS232, untuk itu diperlukan komponen yang disebut cport.
2. Lakukan copy file Cport dari download di Internet atau Lab Microcontroller dan Paste ke folder Program Files – Borland – Delphi6.
3. Bukalah file DsgnCport6 dengan menggunakan Program Delphi
4. Click pada button Compile pada gambar berikut, untuk menghasilkan file dcu pada folder CPort.
M-IDE Studio adalah salah satu cara yang digunakan untuk menjalankan kompilasi untuk divais MCS-51. M-IDE Studio mempunyai beberapa fitur yang dapat digunakan untuk edit, compil, dan debug file.
The M-IDE Studio juga dapat digunakan untuk menulis program dalam bahasa C. Dengan menggunakan software ini, maka kita dapat melihat error pada report file LST.
Gambar 1.19. M-IDE Studio
Bila anda perhatikan pada menu toolbar dan menu pilihan, tampak terlihat disable. Hal ini karena file belum dibuat. Untuk membuat sebuah file, lakukan langkah-langkah berikut:
1. Membuat File Baru
Untuk membuat file baru, klik pada menu File atau short cut seperti yang ditunjukkan pada gambar, sehingga akan tampak halaman kosong.
2. Menulis sebuah program Tulis program assembly pada halaman kosong, dan lakukan penyimpanan file. Bila file telah tersimpan maka akan tampak teks instruksi yang berwarna-warni. Sebagaimana yang ditunjukan pada gambar 3.
Gambar 1.21 Menu penyimpanan file 3. Kompilasi Agar file dengan ekstensi ASM tersebut dapat diloadkan ke mikrokontroller, maka perlu dilakukan kompilasi dari file ASM ke HEX.
MAIN BOARD LAYOUT MIKROKONTROLLER 89S51 DEVELOPMENT BOARD
CATATAN: EN : Enable/ Aktif, bila dihubungkan singkat EN_ADC: SW Togle pada posisi RUN Target PEMROGRAMAN ISP: SW Togle pada posisi Programming VREF ADC: Pengaturan tegangan referensi ADC IREF DAC: Pengaturan arus referensi DAC TP IREF DAC: Pengukuran arus referensi DAC, hubungkan ke amperemeter untuk pengaturan arus referensi DAC, dan pasang jumper setelah proses pengukuran TP VREF ADC: Pengukuran tegangan referensi ADC Pada saat penggunaan tombol pushbutton atau keypad 4x4, buka jumper pada DAC_EN
MIKROKONTROLLER AT89SXXX Mikrokontroller 8 bit dengan 4K byte ISP
( In System Programmable )
FITUR: 1. Kompatibel dengan produk MCS-51 2. 4K byte In System Programmable Flas Memory
Dapat dilakukan pemrograman 1000 tulis dan hapus 3. Range catu daya 4,0V s/d 5,0V 4. Operasi statis: 0 Hz s/d 33 MHz 5. Tiga Tingkat Program memory lock 6. 128 x 8 bit RAM internal 7. 32 Programmable Jalur I/O 8. Dua 16 bit Timer/ Counter 9. Enam Sumber Interupsi 10. Full Duplex Serial Channel 11. Low Power Idle dan Mode Power Down 12. Watcht Dog Timer 13. Data Pointer 14. Power Off Flag 15. Fast Programming Time 16. Fleksibel ISP programming
DISKRIPSI AT89S51 mempunyai konsumsi daya rendah, mikrokontroller 8-bit CMOS dengan 4K byte momori Flash ISP ( in system programmable/ dapat diprogram didalam sistem).Divais ini dibuat dengan teknologi memori nonvolatile kerapatan tinggi dan kompatibel dengan standart industri 8051, set instruksi dan pin keluaran. Flash yang berada didalam chip memungkinkan memori program untuk diprogram ulang pada saat chip didalam sistem atau dengan menggunakan Programmer memori nonvolatile konvensional. Dengan mengkombinasikan CPU 8 bit yang serbaguna dengan flash ISP pada chip, ATMEL 89S51 merupakan mikrokontroller yang luarbiasa yang memberikan fleksibelitas yang tinggi dan penyelesaian biaya yang efektif untuk beberapa aplikasi kontrol. AT89S51 memberikan fitur-fitur standar sebagai berikut: 4K byte Flash, 128 byte RAM, 32 jalur I/O, Timer Wachtdog, dua data pointer, dua 16 bit timer/ counter, lima vektor interupsi dua level, sebuah port serial full dupleks, oscilator internal, dan rangkaian clock. Selain itu AT89S51 didisain dengan logika statis untuk operasi dengan frekuensi sampai 0 Hz dan didukung dengan mode penghematan daya. Pada mode idle akan menghentikan CPU sementara RAM, timer/ counter, serial port dan sistem interupsi tetap berfungsi. Mode Power Down akan tetap menyimpan isi dari RAM tetapi akan membekukan osilator, menggagalkan semua fungsi chip sampai interupsi eksternal atau reset hardware ditemui.
VCC Tegangan Supply GND Ground Port 0 Port 0, merupakan port I/O 8 bit open drain dua arah. Sebagai sebuah port,
setiap pin dapat mengendalikan 8 input TTL. Ketika logika “1” dituliskan ke port 0, maka port dapat digunakan sebagai input dengan high impedansi. Port 0 dapat juga dikonfigurasikan untuk multipleksing dengan address/ data bus selama mengakses memori program atau data eksternal. Pada mode ini P0 harus mempunyai pull up
Port 1 Port 1 merupakan port I/0 8 bit dua arah dengan internal pull up. Buffer output port 1 dapat mengendalikan empat TTL input. Ketika logika “1” dituliskan ke port 1, maka port ini akan mendapatkan internal pull up dan dapat digunakan sebagai input. Port 1 juga menerima alamat byte rendah selama pemrograman dan verifikasi Flash
Port Pin Fungsi Alternatif
P1.5 MOSI ( digunakan untu In System Programming )
P1.6 MISO ( digunakan untu In System Programming )
P1.7 SCK ( digunakan untu In System Programming ) Port 2 Port 2 merupakan port I/O 8 bit dua arah dengan internal pull up. Buffer
output port 2 dapat mengendalikan empat TTL input. Ketika logika “1” dituliskan ke port 2, maka port ini akan mendapatkan internal pull up dan dapat digunakan sebagai input.
Port 3 Port 3 merupakan port I/O 8 bit dua arah dengan internal pull up. Buffer output port 3 dapat mengendalikan empat TTL input. Ketika logika “1” dituliskan ke port 3, maka port ini akan mendapatkan internal pull up dan dapat digunakan sebagai input. Port 3 juga melayani berbagai macam fitur khusus, sebagaimana yang ditunjukkan pada tabel berikut:
Port Pin Fungsi Alternatif
P3.0 RXD ( port serial input )
P3.1 TXD ( port serial output )
P3.2 INT0 ( interupsi eksternal 0 )
P3.3 INT1 ( interupsi eksternal 1 )
P3.4 T0 ( input eksternal timer 0 )
P3.5 T1 ( input eksternal timer 1 )
P3.6 WR ( write strobe memori data eksternal)
P3.7 WR ( read strobe memori program eksternal) RST Input Reset. Logika high “1” pada pin ini untuk dua siklus mesin
sementara oscilator bekerja maka akan mereset devais. ALE/ PROG Address Latch Enale ( ALE ) merupakan suatu pulsa output untuk
mengunci byte low dari alamat selama mengakses memori eksternal. Pin ini juga merupakan input pulsa pemrograman selama pemrograman flash ( paralel ) Pada operasi normal, ALE mengeluarkan suatu laju konstan 1/6 dari frekuensi oscilator dan dapat digunakan untuk pewaktu eksternal.
PSEN Program Store Enable merupakan strobe read untu memori program
eksternal. EA/ VPP Eksternal Access Enable. EA harus di hubungkan ke GND untuk enable
devais, untuk memasuki memori program eksternal mulai alamat 0000H s/d FFFFH. EA harus dihubungkan ke VCC untuk akses memori program internal Pin ini juga menerima tegangan pemrogramman ( VPP) selama pemrograman Flash
XTAL1 Input untuk penguat oscilator inverting dan input untuk rangkaian internal clock
XTAL2 Output dari penguat oscilator inverting.
Arsitektur Microcontroller MCS-51
1.1. Organisasi Memori
Semua divais 8051 mempunyai ruang alamat yang terpisah untuk memori program dan memori data, seperti yang ditunjukkan pada gambar1.1. dan gambar 1.2. Pemisahan secara logika dari memori program dan data, mengijinkan memori data untuk diakses dengan pengalamatan 8 bit, yang dengan cepat dapat disimpan dan dimanipulasi dengan CPU 8 bit. Selain itu, pengalamatan memori data 16 bit dapat juga dibangkitkan melalui register DPTR. Memori program ( ROM, EPROM dan FLASH ) hanya dapat dibaca, tidak ditulis. Memori program dapat mencapai sampai 64K byte. Pada 89S51, 4K byte memori program terdapat didalam chip. Untuk membaca memori program eksternal mikrokontroller mengirim sinyal PSEN ( program store enable )
Gambar 1.1. Diagram blok mikrokontroller 8051
Memori data ( RAM ) menempati ruang alamat yang terpisah dari memori program. Pada keluarga 8051, 128 byte terendah dari memori data, berada didalam chip. RAM eksternal (maksimal 64K byte). Dalam pengaksesan RAM Eksternal, mikrokontroller mingirimkan sinyal RD ( baca ) dan WR ( tulis ).
Gambar 1.2. Arsitektur Memori Mikrokontroller 8051
1.1.1. Program Memory
Gambar 1.2. menunjukkan suatu peta bagian bawah dari memori program. Setelah reset CPU mulai melakukan eksekusi dari lokasi 0000H. Sebagaimana yang ditunjukkan pada gambar 1.3, setiap interupsi ditempatkan pada suatu lokasi tertentu pada memori program. Interupsi menyebabkan CPU untuk melompat ke lokasi dimana harus dilakukan suatu layanan tertentu.
Interupsi Eksternal 0, sebagi contoh, menempatai lokasi 0003H. Jika Interupsi Eksternal 0 akan digunakan, maka layanan rutin harus dimulai pada lokasi 0003H. Jika interupsi ini tidak digunakan, lokasi layanan ini dapat digunakan untuk berbagai keperluan sebagai Memori Program.
Gambar 1.3. Peta Interupsi mikrokontroller 8051
1.1.2 Memory Data
Pada gambar 1.2. menunjukkan ruang memori data internal dan eksternal pada keluarga 8051. CPU membangkitkan sinyal RD dan WR yang diperlukan selama akses RAM eksternal. Memori data internal terpetakan seperti pada gambar 1.2. Ruang memori dibagi menjadi tiga blok, yang diacukan sebagai 128 byte lower, 128 byte upper dan ruang SFR.
Alamat memori data internal selalu mempunyai lebar data satu byte. Pengalamatan langsung diatas 7Fh akan mengakses satu alamat memori, dan pengalamatan tak langsung diatas 7Fh akan mengakses satu alamat yang berbeda. Demikianlah pada gambar 1.4 menunjukkan 128 byte bagian atas dan ruang SFR menempati blok alamat yang sama, yaitu 80h sampai dengan FFh, yang sebenarnya mereka terpisah secara fisik
128 byte RAM bagian bawah dikelompokkan lagi menjadi beberapa blok, seperti yang ditunjukkan pada gambar 1.5. 32 byte RAM paling bawah, dikelompokkan menjadi 4 bank yang masing-masing terdiri dari 8 register. Instruksi program untuk memanggil register-register ini dinamai sebagai R0 sampai dengan R7. Dua bit pada Program Status Word (PSW) dapat memilih register bank mana yang akan digunakan. Penggunaan register R0 sampai dengan R7 ini akan membuat pemrograman lebih efisien dan singkat, bila dibandingkan pengalamatan secara langsung.
Semua pada lokasi RAM 128 byte paling bawah dapat diakses baik dengan menggunakan pengalamatan langsung dan tak langsung. 128 byte paling atas hanya dapat diakses dengan cara tak langsung, gambar 1.6.
Gambar 1.6. RAM internal 128 byte paling atas 1.1.3. Special Function Register Sebuah peta memori yang disebut ruang special function register ( SFR ) ditunjukkan pada gambar berikut. Perhatikan bahwa tidak semua alamat-alamat tersebut ditempati, dan alamat-alamat yang tak ditempati tidak diperkenankan untuk diimplementasikan. Akses baca untuk alamat ini akan menghasilkan data random, dan akses tulis akan menghasilkan efek yang tak jelas.
Accumulator
ACC adalah register akumulator. Mnemonik untuk instruksi spesifik akumulator ini secara sederhana dapat disingkat sebagai A.
Register B
Register B digunakan pada saat opersi perkalian dan pembagian. Selain untuk keperluan tersebut diatas, register ini dapat digunakan untuk register bebas.
Program Status Word
Register PSW terdiri dari informasi status dari program yang secara detail ditunjukkan pada Tabel 1.1.
Stack Pointer
Register Pointer stack mempunyai lebar data 8 bit. Register ini akan bertambah sebelum data disimpan selama eksekusi push dan call. Sementara stack dapat berada disembarang tempat RAM. Pointer stack diawali di alamat 07h setelah reset. Hal ini menyebabkan stack untuk memulai pada lokasi 08h.
Pointer Data (DPTR) terdiri dari byte atas (DPH) dan byte bawah (DPL). Fungsi ini ditujukan untuk menyimpan data 16 bit. Dapat dimanipulasi sebagai register 16 bit atau dua 8 bit register yang berdiri sendiri.
Gambar 1.7. Peta SFR Ports 0, 1, 2 dan 3 P0, P1, P2 dan P3 adalah SFR yang ditempati oleh Port 0, 1, 2 dan 3. Menulis suatu logika 1 terhadap sebuah bit dari sebuah port SFR ( P0, P1, P2 atau P3) menyebabkan pin output port yang bersesesuaian akan berada dalam kondisi logika high ‘1’. Dan sebaliknya
Buffer Data Serial
Buffer serial sesungguhnya merupakan dua buah register yang terpisah, buffer pemancar dan buffer penerima. Ketika data diisikan ke SBUF, maka akan menuju ke buffer pemancar dan ditahan untuk proses transmisi. Ketika data diambil dari SBUF, maka akan berasal dari buffer penerima.
Registers Timer
Pasangan register ( TH0, TL0) dan (TH1, TL1) adalah register pencacah 16 bit untuk Timer/ Counter 0 dan 1, masing-masing.
Registers IP, IE, TMOD, TCON, SCON, dan PCON terdiri dari bit control dan status.
Program Status Word
PSW atau Program Status Word berisi bit-bit status yang berkaitan dengan kondisi atau keadaan CPU mikrokontroler pada saat tersebut. PSW berada dalam lokasi ruang SFR ( perhatikan pada gambar 1.9, dengan lokasi alamat D0h ). Pada PSW ini kita dapat memantau beberapa status yang meliputi: carry bit, auxiliary carry ( untuk operasi BCD ), dua bit pemilih bank register, flag overflow, sebuah bit paritas dan dua flag status yang bisa didifinisikan sendiri. Bit carry dapat juga anda guakan pada keperluan operasi aritmatika, juga bisa digunakan sebagai universal akumulator untuk beberapa operasi boolean.
Table 1.1. Program Status Word
MSB LSB
CY AC F0 RS1 RS0 OV - P
BIT SYMBOL FUNCTION
PSW.7 CY Carry flag.
PSW.6 AC Auxilliary Carry flag. (For BCD operations.)
PSW.5 F0 Flag 0. (Available to the user for general purposes.)
PSW.4 RS1 Register bank select control bit 1. Set/cleared by software to determine working register bank. (See Note.)
PSW.3 RS0 Register bank select control bit 0. Set/cleared by software todetermine working register bank. (See Note.)
PSW.2 OV Overflow flag.
PSW.1 - User-definable flag.
PSW.0 P
Parity flag. Set/cleared by hardware each instruction cycle to indicate an odd/even number of “one” bits in the Accumulator, i.e., even parity.
Bit RS0 dan RS1 dapat digunakan untuk memilih satu dari empat bank register sebagaimana ditunjukkan pada tabel 19.2. Bit paritas dapat digunakan untuk mengetahuai jumlah logika '1' pada akumulator: P=1 bila pada akumulator mempunyai logika '1' yang jumlahnya ganjil, dan P=0 jika akumulator mempunyai logika '1' yang jumlahnya genap. Dua bit yang lain PSW1 dan PSW5 dapat digunakan untuk berbagai macam tujuan
Mode pengalamatan, mengacu bagaimana anda mengalamati suatu lokasi memori tertentu Mode pengalamatan pada set instruksi 8051 adalah ditunjukkan sebagai berikut
Immediate Addressing MOV A,#20h Direct Addressing MOV A,30h Indirect Addressing MOV A,@R0 External Direct MOVX A,@DPTR Code Indirect MOVC A,@A+DPTR
1.2.1 Immediate Addressing
Immediate addressing dinamakan seperti ini, karena nilai yang akan disimpan didalam memori, secara langsung berada dalam kode.
org 0h start:MOV A,#20h; put constant 20 into Acc end Org 0h Start:MOV 70h,#0h; put constant 0 into RAM 70h MOV 71h,#1h; MOV 72h,#2h; end ; Org 0h Start:MOV DPTR,#1234h;put constant 1234 into DPTR end Org 0h Start:MOV PSW,#0; Select register bank 0 MOV R0,#0; put 0 into register 0 MOV R1,#1; put 1 into register 1 MOV R2,#2; put 2 into register 2 MOV R3,#3; put 3 into register 3 MOV R4,#4; put 4 into register 4 MOV R5,#5; put 5 into register 5 MOV R6,#6; put 6 into register 6 MOV R7,#7; put 7 into register 7 end ;
org 0h Start:MOV PSW,#8; Select register bank 1 MOV R0,#0; put 0 into register 0 MOV R1,#1; put 1 into register 1 MOV R2,#2; put 2 into register 2
MOV R3,#3; put 3 into register 3 MOV R4,#4; put 4 into register 4 MOV R5,#5; put 5 into register 5 MOV R6,#6; put 6 into register 6 MOV R7,#7; put 7 into register 7 end
Immediate addressing adalah pengalamatan yang sangat cepat karena nilai yang akan diloadkan berada didalam instruksi tersebut.
1.2.2. Direct Addressing
Disebut direct addressing karena nilai yang akan disimpan didalam memori, diperoleh secara langsung dari memori yang lain.
;
org 0h Start:MOV A,30h; end ; Org 0h Start:Mov 70h,#1;put constant 1 into RAM 70h Mov A, 70h;copy RAM 70 content into Acc Mov A,#0 ;put constant 0 into Acc Mov 90h,A ;copy Acc content into RAM 90h end ; Inbyte equ 70h Port1 equ 90h Org 0h Start: Mov Inbyte,#3;put constant 3 into RAM 70h Mov A,Inbyte ;copy RAM 70h content into Acc Mov A,#0 ;Clear accumulator Mov Port1,A ;copy Acc content into RAM 90h end ; Percobaan 2.5.3: Org 0h Mov DPTR,#Character Start:Mov A, #0 Inc DPTR Movc A, @A+DPTR Mov R0,A Sjmp Start Character: DB 0,1,2,3,4,5,6,7,8,9
Indirect addressing adalah mode pengalamatan yang sangat ampuh, yang memberikan fleksibelitas dalam hal transfer data. Indirect addressing juga satu-satunya cara untuk mengakses 128 byte ekstra dari internal RAM yang ditemukan pada keluarga 8052.
MOV A,@R0
Instruksi ini menyebabkan 8051 menganalisa nilai dari register R0. 8051 kemudian akan mengambil data dari akumulator dengan nilai yang berasal dari alamat RAM internal yang ditunjukkan oleh R0. Sebagai contoh, misal R0 akan digunakan untuk menandai alamat RAM 40h yang berisi data 67h. Ketika instruksi diatas, dieksekusi maka 8051 akan melihat nilai dari R0, yang berisi 40h, dan mengirimkan isi RAM 40h (dalam hal ini mempunyai nilai 67h) ke akumulator.
MOV R0,#99h ;
MOV @R0,#01h;
Instruksi tersebut adalah tidak valid. Karena indirect addressing selalu mengacu ke RAM internal, dua instruksi ini akan menulis nilai 01 ke RAM internal alamat 99h pada 8052. Pada 8051 instruksi tersebut akan menghasilkan hasil yang tak terdifinisi, karena 8051 hanya mempunyai internal RAM 128 byte
Org 0h Start: Mov PSW, #0 ; choose register bank 0 Mov R0, #78h; put constant 78h into R0 Mov @R0, #1 ; put contanta 1 into 78h end ; Org 0h Start: Mov PSW,#0; pilih register bank 1 Mov R0,90h; copy RAM 90h content into R0 Mov @R0,#1; put constant 1 into 90h End ;
1.3. Set Instruksi
Program pengendali mikrokontroler disusun dari kumpulan instruksi, instruksi tersebut setara dengan kalimat perintah bahasa manusia yang hanya terdiri atas predikat dan objek. Dengan demikian tahap pertama pembuatan program pengendali mikrokontroler dimulai dengan pengenalan dan pemahaman predikat (kata kerja) dan objek apa saja yang dimiliki mikrokontroler. Objek dalam pemrograman mikrokontroler adalah data yang tersimpan di dalam memori, register dan input/output. Sedangkan ‘kata kerja’ yang dikenal pun secara umum dikelompokkan menjadi perintah untuk perpindahan data, arithmetik, operasi logika, pengaturan alur program dan beberapa hal khusus. Kombinasi dari ‘kata kerja’ dan objek itulah yang membentuk perintah pengatur kerja mikrokontroler.
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 dalam MCS51
Data bisa berada diberbagai tempat yang berlainan, dengan demikian dikenal beberapa cara untuk menyebut data (dalam bahasa Inggris sering disebut sebagai ‘Addressing Mode’), antara lain sebagai berikut. 1. Penyebutan data konstan (immediate addressing mode): MOV A,#$20. Data konstan
merupakan data yang berada di dalam instruksi. Contoh instruksi ini mempunyai makna data konstan $20 (sebagai data konstan ditandai dengan ‘#’) di-copy-kan ke Akumulator A. Yang perlu benar-benar diperhatikan dalam perintah ini adalah bilangan $20 merupakan bagian dari instruksi.
2. Pnyebutan 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.
3. 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. 4. 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.
5. Tanda ‘@’ dipakai untuk menandai nomor memori disimpan di dalam R0. 6. 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.
7. 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.
8. Penyebutan data dalam register (register addressing mode): MOV A,R5. Instruksi ini mempunyai makna data dalam register serba guna R5 di-copy-kan ke Akumulator A. Instruksi ini membuat register serba guna R0 sampai R7 sebagai tempat penyimpan data yang sangat praktis yang kerjanya sangat cepat.
9. Data yang dimaksud dalam bahasan di atas semuanya berada di dalam memori data (termasuk register serba guna letaknya juga di dalam memori data). Dalam penulisan program, sering-sering diperlukan tabel baku yang disimpan bersama dengan program tersebut. Tabel semacam ini sesungguhnya merupakan data yang berada di dalam memori program!
10. Untuk keperluan ini, MCS51 mempunyai cara penyebutan data dalam memori program
yang dilakukan secara indirect (code indirect addressing mode) : MOVC A,@A+DPTR. Perhatikan dalam instruksi ini MOV digantikan dengan MOVC, tambahan huruf C tersebut
dimaksud untuk membedakan bahwa instruksi ini dipakai di memori program. (MOV tanpa huruf C artinya instruksi dipakai di memori data).
Tanda ‘@’ dipakai untuk menandai A+DPTR dipakai untuk menyatakan nomor memori yang
isinya di-copy-kan ke Akumulator A, dalam hal ini nilai yang tersimpan dalam DPTR (Data Pointer Register - 2 byte) ditambah dengan nilai yang tersimpan dalam Akumulator A (1 byte) dipakai untuk menunjuk nomor memori program.
Secara keseluruhan AT8951 mempunyai sebanyak 255 macam instruksi, yang dibentuk dengan mengkombinasikan ‘kata kerja’ dan objek. “Kata kerja’ tersebut secara kelompok dibahas sebagai berikut : 1.3.1 Instruksi copy data Kode dasar untuk kelompok ini adalah MOV, singkatan dari MOVE yang artinya memindahkan, meskipun demikian lebih tepat dikatakan perintah ini mempunyai makna peng-copy-an data.
Hal ini bisa dijelaskan berikut : setelah instruksi MOV A,R7 dikerjakan, Akumulator A dan register serba guna R7 berisikan data yang sama, yang asalnya tersimpan di dalam R7.
Perintah MOV dibedakan sesuai dengan jenis memori AT89Cx051. Perintah ini pada memori data dituliskan menjadi MOV, misalkan :
MOV A,$20
MOV A,@R1
MOV A,P1
MOV P3,A
Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2 jenis instruksi yang memakai MOVC, yakni:
MOVC A,@A+DPTR ; DPTR sebagai register indirect
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
1.3.2 Instruksi Aritmatika
Perintah ADD dan ADDC Isi Akumulator A ditambah dengan bilangan 1 byte, hasil penjumlahan akan ditampung kembali dalam Akumulator. Dalam operasi ini bit Carry (C flag dalam PSW – Program Status Word) berfungsi sebagai penampung limpahan hasil penjumlahan. Jika hasil penjumlahan tersebut melimpah (nilainya lebih besar dari 255) bit Carry akan bernilai ‘1’, kalau tidak bit Carry
bernilai ‘0’. ADDC sama dengan ADD, hanya saja dalam ADDC nilai bit Carry dalam proses sebelumnya ikut dijumlahkan bersama. Bilangan 1 byte yang ditambahkan ke Akumulator, bisa berasal dari bilangan konstan, dari register serba guna, dari memori data yang nomor memorinya disebut secara langsung maupun tidak langsung, seperti terlihat dalam contoh berikut :
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.
Kelompok perintah ini dipakai untuk melakukan operasi logika mikrokontroler MCS51, operasi logika yang bisa dilakukan adalah operasi AND (kode operasi ANL), operasi OR (kode operasi ORL) dan operasi Exclusive-OR (kode operasi XRL). Data yang dipakai dalam operasi ini bisa berupa data yang berada dalam Akumulator atau data yang berada dalam memori-data, hal ini sedikit berlainan dengan operasi aritmatik yang harus melihatkan Akumulator secara aktip. Hasil operasi ditampung di sumber data yang pertama.
1. Operasi logika AND banyak dipakai untuk me-‘0’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data
konstan yang di-ANL-kan bilangan asal. Bit yang ingin di-‘0’-kan diwakili dengan ‘0’ pada data konstan, sedangkan bit lainnya diberi nilai ‘1’, misalnya. Instruksi ANL P1,#
01111110b akan mengakibatkan bit 0 dan bit 7 dari Port 1 (P1) bernilai ‘0’ sedangkan bit-bit lainnya tetap tidak berubah nilai.
2. Operasi logika OR banyak dipakai untuk me-‘1’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data
konstan yang di-ORL-kan bilangan asal. Bit yang ingin di-‘1’-kan diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya :Instruksi ORL A,#
01111110b akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator bernilai ‘1’ sedangkan bit-bit lainnya tetap tidak berubah nilai.
3. Operasi logika Exclusive-OR banyak dipakai untuk membalik nilai (complement) beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-XRL-kan bilangan asal. Bit yang ingin dibalik-nilai diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya: Instruksi XRL A,#01111110b akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator berbalik nilai, sedangkan bit-bit lainnya tetap tidak berubah nilai.
Table 1.4. Instruksi Logika
Addressing Mode Exect. Mnemonic Operation
Dir Ind Reg Imm Timer uS
Anl A,<byte> A=A and <byte> V V V V 1
Anl <byte>,A <byte>=<byte>anl A V V V V 1
Anl <byte>,#data <byte>=<byte>and #data V V V V 1
Orl A,<byte> A=A or <byte> Accumulator Only 1
Orl <byte>,A <byt>=<byt>orl A V V V 1
Orl <byte>,#data <byte>=<byte> or #data Data Pointer Only 2
Xrl A,<byte> A=A xor<byte> Accumulator Only 1
Xrl<byte>,A <byt>=<byt>xor A V V V 1
Xrl <byte>,#data <byte>=<byte>xor #data Accumulator and B Only 4
Operasi logika pada umumnya mencakup empat hal, yaitu operasi AND, operasi OR, operasi EX-OR dan operasi NOT. MCS51 hanya bisa melaksanakan tiga jenis operasi logika yang ada, yakni
intruksi ANL (AND Logical) untuk operasi AND instruksi ORL (OR Logical) untuk operasi OR, CPL (Complement bit) untuk operasi NOT. Bit Carry pada PSW diperlakukan sebagai ‘akumulator bit’, dengan demikian operasi AND dan operasi OR dilakukan antara bit yang tersimpan pada bit Carry dengan salah satu dari 256 bit data yang dibahas di atas. Contoh dari instruksi-instruksi ini adalah : ANL C,P1.1
ANL C,/P1.2
Instruksi ANL C,P1.1 meng-AND-kan nilai pada bit Carry dengan nilai Port 1 bit 1 (P1.1), dan hasil operasi tersebut ditampung pada bit Carry. Instruksi ANL C,/P1.1 persis sama dengan
instruksi sebelumnya, hanya saja sebelum di-AND-kan, nilai P1.1 dibalik (complemented) lebih dulu, jika nilai P1.1=‘0’ maka yang di-AND-kan dengan bit Carry adalah ‘1’, demikian pula
sebaliknya. Hal serupa berlaku pada instruksi ORL. Instruksi CPL dipakai untuk membalik (complement) nilai semua 256 bit data yang dibahas di atas. Misalnya :
CPL C
CPL P1.0
CPL C akan membalik nilai biner dalam bit Carry (jangan lupa bit Carry merupakan salah satu bit yang ada dalam 256 bit yang dibahas di atas, yakni bit nomor $E7 atau PSW.7).
1.3.4 Instruksi Lompatan
Pada dasarnya program dijalankan intruksi demi instruksi, artinya selesai menjalankan satu instruksi mikrokontroler langsung menjalankan instruksi berikutnya, untuk keperluan ini mikrokontroler dilengkapi dengan Program Counter yang mengatur pengambilan intruksi secara berurutan. Meskipun demikian, program yang kerjanya hanya berurutan saja tidaklah banyak artinya, untuk keperluan ini mikrokontroler dilengkapi dengan instruksi-instruksi untuk mengatur alur program. Secara umum kelompok instruksi yang dipakai untuk mengatur alur program terdiri atas
instruksi-instruksi JUMP (setara dengan statemen GOTO dalam Pascal), instruksi-instruksi untuk membuat dan memakai sub-rutin/modul (setara dengan PROCEDURE dalam Pascal), instruksi-
instruksi JUMP bersyarat (conditional Jump, setara dengan statemen IF .. THEN dalam Pascal). Di samping itu ada pula instruksi PUSH dan POP yang bisa memengaruhi alur program.
Karena Program Counter adalah satu-satunya register dalam mikrokontroler yang mengatur alur program, maka kelompok instruksi pengatur program yang dibicarakan di atas, semuanya merubah nilai Program Counter, sehingga pada saat kelompok instruksi ini dijalankan, nilai Program Counter akan tidak akan runtun dari nilai instruksi sebelumnya. Selain karena instruksi-instruksi di atas, nilai Program Counter bisa pula berubah karena pengaruh perangkat keras, yaitu saat mikrokontroler di-reset atau menerima sinyal interupsi dari perangkat input/output. Hal ini akan dibicarakan secara detail dibagian lagi. Mikrokontroler menjalankan intruksi demi instruksi, selesai menjalankan satu instruksi mikrokontroler langsung menjalankan instruksi berikutnya, hal ini dilakukan dengan cara nilai Program Counter bertambah sebanyak jumlah byte yang membentuk instruksi yang sedang dijalankan, dengan demikian pada saat instruksi bersangkutan dijalankan Program Counter selalu menyimpan nomor memori-program yang menyimpan instruksi berikutnya.
Pada saat mikrokontroler menjalankan kelompok instruksi JUMP, nilai Program Counter yang runtun sesuai dengan alur program diganti dengan nomor memori-program baru yang dikehendaki programer.
Mikrokontroler MCS51 mempunyai 3 macam intruksi JUMP, yakni instruksi LJMP (Long Jump),
instruksi AJMP (Absolute Jump) dan instruksi SJMP (Short Jump). Kerja dari ketiga instruksi ini persis sama, yakni memberi nilai baru pada Program Counter, kecepatan melaksanakan ketiga instruksi ini juga persis sama, yakni memerlukan waktu 2 periode instruksi (jika MCS51 bekerja pada frekuensi 12 MHz, maka instruksi ini dijalankan dalam waktu 2 mikro-detik),
yang berbeda dalam jumlah byte pembentuk instruksinya, instruksi LJMP dibentuk dengan 3 byte, sedangkan instuksi AJMP dan SJMP cukup 2 byte. 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
Dalam potongan program di atas, ORG adalah perintah pada assembler agar berikutnya assembler bekerja pada memori-program nomor yang disebut di belakang ORG (dalam hal ini
minta assembler berikutnya bekerja pada memori-program nomor $2000). TugasBaru disebut sebagai LABEL, yakni sarana assembler untuk menandai/ menamai nomor memori-program.
Dengan demikian, dalam potongan program di atas, memori-program nomor $2000 diberi nama TugasBaru, atau bisa juga dikatakan bahwa TugasBaru bernilai $2000. (Catatan : LABEL ditulis minimal satu huruf lebih kiri dari instruksi, artinya LABEL ditulis setelah menekan
tombol Enter, tapi instruksi ditulis setelah menekan tombol Enter, kemudian diikuti dengan 1 tombol spasi atau tombol TAB).
Dengan demikian intruksi LJMP TugasBaru di atas, sama artinya dengan LJMP $2000 yang oleh
assembler akan diterjemahkan menjadi 02 20 00 (heksadesimal).
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:
. . .
Potongan program di atas dimulai di memori-program nomor $800, dengan demikian instruksi
AJMP DaerahIni bisa dipakai, karena nomor-memori $800 (tempat instruksi AJMP DaerahIni)
dan LABEL DaerahIni yang terletak di dalam satu daerah memori-progam 2 KiloByte yang sama dengan. (Dikatakan terletak di dalam satu daerah memori-program 2 KiloByte yang sama, karena bit nomor 11 sampai dengan bit nomor 15 dari nomor memorinya sama).
Tapi AJMP DaerahLain akan di-salah-kan oleh Assembler, karena DaerahLain yang terletak di memori-program nomor $1000 terletak di daerah memori-program 2 KiloByte yang lain.
Karena instruksi AJMP hanya terdiri dari 2 byte, sedangkan instruksi LJMP 3 byte, maka memakai instruksi AJMP lebih hemat memori-program dibanding dengan LJMP. Hanya saja karena jangkauan instrusksi AJMP hanya 2 KiloByte, pemakaiannya harus hati-hati. Memori-program IC mikrokontroler AT89C1051 dan AT89C2051 masing-masing hanya 1 KiloByte dan 2 KiloByte, dengan demikian program untuk kedua mikrokontroler di atas tidak
perlu memakai instruksi LJMP, karena program yang ditulis tidak mungkin menjangkau lebih dari 2 KiloByte memori-program. 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 2’s 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:
Dalam potongan program di atas, memori-program $0F80 tidak terletak dalam daerah memori-program 2 KiloByte yang sama dengan $1000, tapi instruksi SJMP DaerahLain tetap bisa
dipakai, asalkan jarak antara instruksi itu dengan LABEL DaerahLain tidak lebih dari 127 byte.
Instruksi-instruksi untuk membuat dan memakai sub-rutin/modul program, selain melibatkan Program Counter, melibatkan pula Stack yang diatur oleh Register Stack Pointer. Sub-rutin merupakan suatu potong program yang karena berbagai pertimbangan dipisahkan dari program utama. Bagian-bagian di program utama akan ‘memanggil’ (CALL) sub-rutin, artinya mikrokontroler sementara meninggalkan alur program utama untuk mengerjakan instruksi-instruksi dalam sub-rutin, selesai mengerjakan sub-rutin mikrokontroler kembali ke alur program utama.
Satu-satunya cara membentuk sub-rutin adalah memberi instruksi RET pada akhir potongan
program sub-rutin. Program sub-rutin di-’panggil’ dengan instruksi ACALL atau LCALL. Agar nantinya mikrokontroler bisa meneruskan alur program utama, pada saat menerima
instruksi ACALL atau LCALL, sebelum mikrokontroler pergi mengerjakan sub-rutin, nilai Program Counter saat itu disimpan dulu ke dalam Stack (Stack adalah sebagian kecil dari memori-data yang dipakai untuk menyimpan nilai Program Counter secara otomatis, kerja dari Stack dikendalikan oleh Register Stack Poiner). Selanjutnya mikrokontroler mengerjakan instruksi-instruksi di dalam sub-rutin sampai
menjumpai instruksi RET yang berfungsi sebagai penutup dari sub-rutin. Saat menerima
instruksi RET, nilai asal Program Counter sebelum mengerjakan sub-rutin yang disimpan di dalam Stack, dikembalikan ke Program Counter sehingga mikrokontroler bisa meneruskan pekerjaan di alur program utama.
Instruksi ACALL dipakai untuk me-‘manggil’ program sub-rutin dalam daerah memori-program 2 KiloByte yang sama, setara dengan instruksi AJMP yang sudah dibahas di atas. Sedangkan instruksi LCALL setara dengan instruksi LCALL, yang bisa menjangkau seluruh memori-program
mikrokontroler MCS51 sebanyak 64 KiloByte. (Tapi tidak ada instrusk SCALL yang setara dengan instruksi SJMP). Program untuk AT89C1051 dan AT89C2051 tidak perlu memakai instruksi LCALL.
Instruksi RET dipakai untuk mengakhiri program sub-rutin, di samping itu masih ada pula instruksi RETI, yakni instruksi yang dipakai untuk mengakhiri Program Layanan Interupsi (Interrupt Service Routine), yaitu semacam program sub-rutin yang dijalankan mikrokontroler pada saat mikrokontroler menerima sinyal permintaan interupsi. Catatan : Saat mikrokontroler menerima sinyal permintaaan interupsi, mikrokontroler akan
melakukan satu hal yang setara dengan intruksi LCALL untuk menjalankan Program
Layanan Interupsi dari sinyal interupsi bersangkutan. Di samping itu, mikrokontroler juga me-‘mati’-kan sementara mekanisme layanan interupsi, sehingga permintaan interupsi berikutnya tidak dilayani. Saat menerima instruksi
RETI, makanisme layanan interusi kembali diaktipkan dan mikrokontroler melaksanakan hal yang setara dengan instruksi RET.
Instruksi Lompatan Bersyarat
Instruksi Jump bersyarat merupakan instruksi inti bagi mikrokontroler, tanpa kelompok instruksi ini program yang ditulis tidak banyak berarti. Instruksi-instruksi ini selain melibatkan Program Counter, melibatkan pula kondisi-kondisi tertentu yang biasanya dicatat dalam bit-bit tertentu yang dihimpun dalam Register tertentu. Khusus untuk keluarga mikrokontroler MCS51 yang mempunyai kemampuan menangani operasi dalam level bit, instruksi jump bersyarat dalam MCS51 dikaitkan pula dengan kemampuan operasi bit MCS51. Nomor memori-program baru yang harus dituju tidak dinyatakan dengan nomor memori-
program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai
Program Counter saat instruksi ini dilaksanakan. Cara ini dipakai pula untuk instruksi SJMP.
Instruksi JZ / JNZ Instruksi JZ (Jump if Zero) dan instruksi JNZ (Jump if not Zero) adalah instruksi JUMP bersyarat yang memantau nilai Akumulator A.
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).
Bit Carry merupakan bit yang banyak sekali dipakai untuk keperluan operasi bit, untuk menghemat pemakaian memori-program disediakan 2 instruksi yang khusus untuk memeriksa
keadaan bit Carry, yakni JC dan JNC. Karena bit akan diperiksa sudah pasti, yakni bit Carry, maka instruksi ini cukup dibentuk dengan 2 byte saja, dengan demikian bisa lebih menghemat memori program.
JC Periksa
JB PSW.7,Periksa
Hasil kerja kedua instruksi di atas sama, yakni MCS51 akan JUMP ke Periksa jika ternyata bit Carry bernilai ‘1’ (ingat bit Carry sama dengan PSW bit 7). Meskipun sama tapi instruksi JC Periksa lebih pendek dari instruksi JB PSW.7,Periksa, instruksi pertama dibentuk dengan 2 byte dan instruksi yang kedua 3 byte.
Instruksi JBC sama dengan instruksi JB, hanya saja jika ternyata bit yang diperiksa
memang benar bernilai ‘1’, selain MCS51 akan JUMP ke instruksi lain yang dikehendaki MCS51 akan me-nol-kan bit yang baru saja diperiksa 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. Pengujian Nilai Boolean dilakukan dengan instruksi JUMP bersyarat, ada 5 instruksi yang
dipakai untuk keperluan ini, yakni instruksi JB (JUMP if bit set), JNB (JUMP if bit Not Set), JC
(JUMP if Carry Bit set), JNC (JUMP if Carry Bit Not Set) dan JBC (JUMP if Bit Set and Clear
Bit).
Dalam instruksi JB dan JNB, salah satu dari 256 bit yang ada akan diperiksa, jika keadaannya (false atau true) memenuhi syarat, maka MCS51 akan menjalankan instruksi yang tersimpan di memori-program yang dimaksud. Alamat memori-program dinyatakan dengan bilangan relatip terhadap nilai Program Counter saat itu, dan cukup dinyatakan dengan angka 1 byte. Dengan
demikian instruksi ini terdisi dari 3 byte, byte pertama adalah kode operasinya ($29 untuk JB dan $30 untuk JNB), byte kedua untuk menyatakan nomor bit yang harus diuji, dan byte ketiga adalah bilangan relatip untuk instruksi tujuan.
Contoh pemakaian instruksi JB dan JNB sebagai berikut : JB P1.1,$
JNB P1.1,$
Instruksi-instruksi di atas memantau kedaan kaki IC MCS51 Port 1 bit 1. Instruksi pertama
memantau P1.1, jika P1.1 bernilai ‘1’ maka MCS51 akan mengulang instruksi ini, (tanda $ mempunyai arti jika syarat terpenuhi kerjakan lagi instruksi bersangkutan). Instruksi
berikutnya melakukan hal sebaliknya, yakni selama P1.1 bernilai ‘0’ maka MCS51 akan tertahan pada instruksi ini.
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 TidakSama
8051 mempunyai 5 buah sumber interupsi. Dua buah interupsi eksternal, dua buah interupsi timer dan sebuah interupsi port serial.
Meskipun memerlukan pengertian yang lebih mendalam, pengetahuan mengenai interupsi sangat membantu mengatasi masalah pemrograman mikroprosesor/mikrokontroler dalam hal menangani banyak peralatan input/output. Pengetahuan mengenai interupsi tidak cukup hanya dibahas secara teori saja, diperlukan contoh program yang konkrit untuk memahami.
Saat kaki RESET pada IC mikroprosesor/mikrokontroler menerima sinyal reset (pada MCS51 sinyal tersebut berupa sinyal ‘1’ sesaat, pada prosesor lain umumnya merupakan sinyal ‘0’ sesaat), Program Counter diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor
reset (reset vector), merupakan nomor awal memori-program yang menampung program yang harus dijalankan. Pembahasan di atas memberi gambaran bahwa proses reset merupakan peristiwa perangkat
keras (sinyal reset diumpankan ke kaki Reset) yang dipakai untuk mengatur kerja dari
perangkat lunak, yakni menentukan aliran program prosesor (mengisi Program Counter dengan vektor reset). Program yang dijalankan dengan cara reset, merupakan program utama bagi prosesor. Peristiwa perangkat keras yang dipakai untuk mengatur kerja dari perangkat lunak, tidak hanya terjadi pada proses reset, tapi terjadi pula dalam proses interupsi. Dalam proses interupsi, terjadinya sesuatu pada perangkat keras tertentu dicatat dalam flip-flop khusus, flip-flop tersebut sering disebut sebagai ‘petanda’ (flag), catatan dalam petanda tersebut diatur sedemikian rupa sehingga bisa merupakan sinyal permintaan interupsi pada prosesor. Jika permintaan interupsi ini dilayani prosesor, Program Counter akan diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor interupsi (interrupt vector), yang merupakan nomor awal memori-program yang menampung program yang dipakai untuk melayani permintaan interupsi tersebut. Program yang dijalankan dengan cara interupsi, dinamakan sebagai program layanan interupsi
(ISR - Interrupt Service Routine). Saat prosesor menjalankan ISR, pekerjaan yang sedang
dikerjakan pada program utama sementara ditinggalkan, selesai menjalankan ISR prosesor kembali menjalankan program utama, seperti yang digambarkan dalam Gambar 1.
Gambar 1.8 Bagan kerja prosesor melayani interupsi
Sebuah prosesor bisa mempunyai beberapa perangkat keras yang merupakan sumber sinyal
permintaan interupsi, masing-masing sumber interupsi dilayani dengan ISR berlainan, dengan
demikian prosesor mempunyai beberapa vektor interupsi untuk memilih ISR mana yang dipakai melayani permintaan interupsi dari berbagai sumber. Kadang kala sebuah vektor
interupsi dipakai oleh lebih dari satu sumber interupsi yang sejenis, dalam hal semacam ini ISR bersangkutan harus menentukan sendiri sumber interupsi mana yang harus dilayani saat itu. Jika pada saat yang sama terjadi lebih dari satu permintaan interupsi, prosesor akan melayani permintaan interupsi tersebut menurut perioritas yang sudah ditentukan, selesai melayani
permintaan interupsi perioritas yang lebih tinggi, prosesor melayani permintaan interupsi berikutnya, baru setelah itu kembali mengerjakan program utama.
Saat prosesor sedang mengerjakan ISR, bisa jadi terjadi permintaan interupsi lain, jika permintaan interupsi yang datang belakangan ini mempunyai perioritas lebih tinggi, ISR yang sedang dikerjakan ditinggal dulu, prosesor melayani permintaan yang perioritas lebih tinggi,
selesai melayani interupsi perioritas tinggi prosesor meneruskan ISR semula, baru setelah itu kembali mengerjakan program utama. Hal ini dikatakan sebagai interupsi bertingkat (nested
interrupt), tapi tidak semua prosesor mempunyai kemampuan melayani interupsi secara ini.
1.4.1. Sumber interupsi MCS51
Seperti terlihat dalam Gambar 2, AT89C51 mempunyai 6 sumber interupsi, yakni Interupsi
External (External Interrupt) yang berasal dari kaki INT0 dan INT1, Interupsi Timer (Timer
Interrupt) yang berasal dari Timer 0 maupun Timer 1, Interupsi Port Seri (Serial Port
Interrupt) yang berasal dari bagian penerima dan bagian pengirim Port Seri. Di samping itu AT89C52 mempunyai 2 sumber interupsi lain, yakni Interupsi Timer 2 bersumber dari Timer 2 yang memang tidak ada pada AT89C51. Bit IE0 (atau bit IE1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Eksternal. Ada 2 keadaan yang bisa meng-aktip-kan petanda ini, yang pertama karena level tegangan ‘0’ pada kaki INT0 (atau INT1), yang kedua karena terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0 (atau INT1). Pilihan bentuk sinyal ini ditentukan lewat bit IT0 (atau bit IT1) yang terdapat dalam register TCON.
1. Kalau bit IT0 (atau IT1) =’0’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat kaki INT0=’0’.
2. Kalau bit IT0 (atau IT1) =’1’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat terjadi
transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0. Menjelang prosesor menjalankan ISR dari Interupsi Eksternal, bit IE0 (atau bit IE1)
dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Eksternal sudah dilayani. Namun jika permintaan Interupsi Ekternal terjadi karena level tegangan ‘0’ pada kaki IT0 (atau IT1), dan level tegangan pada kaki tersebut saat itu masih =’0’ maka bit IE0 (atau bit IE1) akan
segera menjadi ‘1’ lagi!
Bit TF0 (atau bit TF1) dalam TCON merupakan petanda (flag) yang menandakan adanya
permintaan Interupsi Timer, bit TF0 (atau bit TF1) menjadi ‘1’ pada saat terjadi limpahan pada pencacah biner Timer 0 (atau Timer 1).
Menjelang prosesor menjalankan ISR dari Interupsi Timer, bit TF0 (atau bit TF1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Timer sudah dilayani. Interupsi port seri terjadi karena dua hal, yang pertama terjadi setelah port seri selesai
mengirim data 1 byte, permintaan interupsi semacam ini ditandai dengan petanda (flag) TI=’1’. Yang kedua terjadi saat port seri telah menerima data 1 byte secara lengkap, permintaan
interupsi semacam ini ditandai dengan petanda (flag) RI=’1’. Petanda di atas tidak dikembalikan menjadi ‘0’ menjelang prosesor menjalankan ISR dari
Interupsi port seri, karena petanda tersebut masih diperlukan ISR untuk menentukan sumber
interupsi berasal dari TI atau RI. Agar port seri bisa dipakai kembali setelah mengirim atau menerima data, petanda-petanda tadi harus di-nol-kan lewat program.
Petanda permintaan interupsi (IE0, TF0, IE1, TF1, RI dan TI) semuanya bisa di-nol-kan atau di-satu-kan lewat instruksi, pengaruhnya sama persis kalau perubahan itu dilakukan oleh perangkat keras. Artinya permintaan interupsi bisa diajukan lewat pemrograman, misalnya
permintaan interupsi eksternal IT0 bisa diajukan dengan instruksi SETB IE0.
Semua sumber permintaan interupsi yang di bahas di atas, masing-masing bisa di-aktip-kan
atau di-nonaktip-kan secara tersendiri lewat bit-bit yang ada dalam register IE (Interrupt
Enable Register).
Bit EX0 dan EX1 untuk mengatur interupsi eksternal INT0 dan INT1, bit ET0 dan ET1 untuk
mengatur interupsi timer 0 dan timer 1, bit ES untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2. Di samping itu ada pula bit EA yang bisa dipakai untuk mengatur semua sumber interupsi sekali gus.
Setelah reset, semua bit dalam register IE bernilai ‘0’, artinya sistem interupsi dalam keadaan non-aktip. Untuk mengaktipkan salah satu sistem interupsi, bit pengatur interupsi bersangkutan
diaktipkan dan juga EA yang mengatur semua sumber interupsi. Misalnya instruksi yang dipakai untuk mengaktipkan interupsi ekternal INT0 adalah SETB EX0 disusul dengan SETB
EA.
MSB LSB
EA X X ES ET1 EX1 ET0 EX0
BIT SYMBOL FUNCTION
IE.7 EA Disables semua interrupsi. Jika EA=0, tidak ada interupsi yang akan dilayani. Jika EA=1, setiap interupsi akan akan dilayani satu per satu sesuai dengan bit yang disetting.
IE.6 - -
IE.5 - -
IE.4 ES Enables or disables the Serial Port interrupt. If ES=0, the Serial Port interrupt is disabled.
IE.3 ET1 Enables or disables the Timer 1 Overflow interrupt. If ET1=0, the Timer 1 interrupt is disabled.
IE.2 EX1 Enables or disables External Interrupt 1. If EX1=0, External interrupt 1 is disabled.
IE.1 ET0 Enables or disables the Timer 0 Overflow interrupt. If ET0=0, the Timer 0 interrupt is disabled.
IE.0 EX0 Enables or disables External interrupt 0. If EX0=0, External interrupt 0 is disabled.
1.4.3 Vektor Interupsi
Saat MCS51 menanggapi permintaan interupsi, Program Counter diisi dengan sebuah nilai yang dinamakan sebagai vektor interupsi, yang merupakan nomor awal dari memori-program
yang menampung ISR untuk melayani permintaan interupsi tersebut. Vektor interupsi itu
dipakai untuk melaksanakan inststuksi LCALL yang diaktipkan secara perangkat keras. Vektor interupsi untuk interupsi eksternal INT0 adalah $0003, untuk interupsi timer 0 adalah $000B, untuk interupsi ekternal INT1 adalah $0013, untuk interupsi timer 1 adalah $001B dan untuk interupsi port seri adalah $0023. Jarak vektor interupsi satu dengan lainnya sebesar 8, atau hanya tersedia 8 byte untuk setiap ISR. Jika sebuah ISR memang hanya pendek saja, tidak lebih dari 8 byte, maka ISR tersebut
bisa langsung ditulis pada memori-program yang disediakan untuknya. ISR yang lebih panjang dari 8 byte ditulis ditempat lain, tapi pada memori-program yang ditunjuk oleh vektor interupsi
Masing-masing sumber interupsi bisa ditempatkan pada dua tingkatan perioritas yang berbeda.
Pengaturan tingkatan perioritas isi dilakukan dengan bit-bit yang ada dalam register IP (Interrupt Priority).
Bit PX0 dan PX1 untuk mengatur tingkatan perioritas interupsi eksternal INT0 dan INT1, bit PT0
dan PT1 untuk mengatur interupsi timer 0 dan timer 1, bit PS untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2.
Setelah reset, semua bit dalam register IP bernilai ‘0’, artinya semua sumber interupsi ditempatkan pada tingkatan tanpa perioritas. Masing-masing sumber interupsi bisa ditempatkan pada tingkatan perioritas utama dengan cara men-‘satu’-kan bit pengaturnya. Misalnya
interupsi timer 0 bisa ditempatkan pada tingkatan perioritas utama dengan instruksi SETB PT1. Sebuah ISR untuk interupsi tanpa perioritas bisa diinterupsi oleh sumber interupsi yang berada dalam tingkatan perioritas utama. Tapi interupsi yang berada pada tingkatan perioritas yang sama, tidak dapat saling meng-interupsi. Jika 2 permintaan interupsi terjadi pada saat yang bersamaan, sedangkan kedua interupsi tersebut terletak pada tingkatan perioritas yang berlainan, maka interupsi yang berada pada tingkatan perioritas utama akan dilayani terlebih dulu, setelah itu baru melayani interupsi pada tingkatan tanpa perioritas. Jika kedua permintaan tersebut bertempat pada tingkatan perioritas yang sama, perioritas akan
ditentukan dengan urutan sebagai berikut : interupsi eksternal INT0, interupsi timer 0, interupsi ekternal INT1, interupsi timer 1 dan terakhir adalah interupsi port seri.
Bagan Lengkap Sistem Interupsi MCS51
Meskipun sistem interupsi MCS51 termasuk sederhana dibandingkan dengan sistem interupsi MC68HC11 buatan Motorola, tapi karena menyangkut 5 sumber interupsi yang masing-masing harus diatur secara tersendiri, tidak mudah untuk mengingat semua masalah tersebut, terutama pada saat membuat program sering dirasakan sangat merepotkan membolak-balik buku untuk mengatur masing-masing sumber interupsi tersebut. Gambar 2 menggambarkan sistem interupsi MCS51 selangkapnya, berikut dengan masing-
masing bit dalam register-register SFR (Special Function Register) yang dipakai untuk mengatur masing-masing sumber interupsi. Saklar yang digambarkan dalam Gambar 2 mewakili bit dalam register yang harus diatur untuk mengendalikan sumber interupsi, kotak bergambar bendera kecil merupakan flag (petanda) dalam register yang mencatat adanya permintaan interupsi dari masing-masing sumber interupsi. Kedudukan saklar dalam gambar tersebut menggambarkan kedudukan awal setelah MCS51 di-reset. Gambar ini sangat membantu saat penulisan program menyangkut interupsi MCS51.
Pada dasarnya sarana input yang satu ini merupakan seperangkat pencacah biner (binary counter) yang terhubung langsung ke saluran-data mikrokontroler, sehingga mikrokontroler bisa membaca kedudukan pancacah, bila diperlukan mikrokontroler dapat pula merubah kedudukan pencacah tersebut. Seperti layaknya pencacah biner, bilamana sinyal denyut (clock) yang diumpankan sudah melebihi kapasitas pencacah, maka pada bagian akhir untaian pencacah akan timbul sinyal limpahan, sinyal ini merupakan suatu hal yang penting sekali dalam pemakaian pencacah. Terjadinya limpahan pencacah ini dicatat dalam sebuah flip-flop tersendiri. Di samping itu, sinyal denyut yang diumpankan ke pencacah harus pula bisa dikendalikan dengan mudah. Hal-hal yang dibicarakan di atas diringkas dalam Gambar 1.
MCS-51 mempunyai dua buah register timer/ counter 16 bit, yaitu Timer 0 dan Timer 1. Keduanya dapat dikonfigurasikan untuk beroperasi sebagai timer atau counter, seperti yang terlihat pada gambar di bawah.
Dapat
Diset
Pembacan Isi
Pencacah
Gambar 1.9. Konsep dasar Timer/Counter sebagai sarana input
Sinyal denyut yang diumpankan ke pencacah bisa dibedakan menjadi 2 macam, yang pertama yalah sinyal denyut dengan frekuensi tetap yang sudah diketahui besarnya dan yang kedua adalah sinyal denyut dengan frekuensi tidak tetap. Jika sebuah pencacah bekerja dengan frekuensi tetap yang sudah diketahui besarnya, dikatakan pencacah tersebut bekerja sebagai timer, karena kedudukan pencacah tersebut setara dengan waktu yang bisa ditentukan dengan pasti. Jika sebuah pencacah bekerja dengan frekuensi yang tidak tetap, dikatakan pencacah tersebut bekerja sebagai counter, kedudukan pencacah tersebut hanyalah menyatakan banyaknya pulsa yang sudah diterima pencacah. Untaian pencacah biner yang dipakai, bisa merupakan pencacah biner menaik (count up binary
counter) atau pencacah biner menurun (count down binary counter).
1.5.1 Fasilitas Timer/Counter
Keluarga mikrokontroler MCS51, misalnya AT89C51 dan AT89Cx051, dilengkapi dengan dua perangkat Timer/Counter, masing-masing dinamakan sebagai Timer 0 dan Timer 1. Sedangkan untuk jenis yang lebih besar, misalnya AT89C52, mempunyai tambahan satu perangkat Timer/Counter lagi yang dinamakan sebagai Timer 2.
Perangkat Timer/Counter tersebut merupakan perangkat keras yang menjadi satu dalam chip mikrokontroler MCS51, bagi pemakai mikrokontroler MCS51 perangkat tersebut dikenal
sebagai SFR (Special Function Register) yang berkedudukan sebagai memori-data internal. Pencacah biner untuk Timer 0 dibentuk dengan register TL0 (Timer 0 Low Byte, memori-data
internal nomor $6A) dan register TH0 (Timer 0 High Byte, memori-data internal nomor $6C). Pencacah biner untuk Timer 1 dibentuk dengan register TL1 (Timer 1 Low Byte, memori-data
internal nomor $6B) dan register TH1 (Timer 1 High Byte, memori-data internal nomor $6D). Pencacah biner pembentuk Timer/Counter MCS51 merupakan pencacah biner menaik (count
up binary counter) yang mencacah dari $0000 sampai $FFFF, saat kedudukan pencacah berubah dari $FFFF kembali ke $0000 akan timbul sinyal limpahan. Untuk mengatur kerja Timer/Counter dipakai 2 register tambahan yang dipakai bersama oleh
Timer 0 dan Timer 1. Register tambahan tersebut adalah register TCON (Timer Control Register, memori-data internal nomor $88, bisa dialamat secara bit) dan register TMOD (Timer Mode
Register, memori-data internal nomor $89).
Pencacah biner Timer 0 dan 1
TL0, TH0, TL1 dan TH1 merupakan SFR (Special Function Register) yang dipakai untuk membentuk pencacah biner perangkat Timer 0 dan Timer 1. Kapasitas keempat register tersebut masing-masing 8 bit, bisa disusun menjadi 4 macam Mode pencacah biner seperti terlihat dalam Gambar 2a sampai Gambar 2d. Pada Mode 0, Mode 1 dan Mode 2 Timer 0 dan Timer 1 masing-masing bekerja sendiri, artinya bisa dibuat Timer 0 bekerja pada Mode 1 dan Timer 1 bekerja pada Mode 2, atau kombinasi mode lainnya sesuai dengan keperluan.
Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai bersama-sama untuk menyusun sistem timer yang tidak bisa di-kombinasi lain.
Susunan TL0, TH0, TL1 dan TH1 pada masing-masing mode adalah sebagai berikut: Mode 0 – Pencacah Biner 13 bit
Gambar 1.10 Mode 0 - Pencacah Biner 13 Bit
Pencacah biner dibentuk dengan TLx (maksudnya bisa TL0 atau TL1) sebagai pencacah biner 5 bit (meskipun kapasitas sesungguhnya 8 bit), limpahan dari pencacah biner 5 bit ini
dihubungkan ke THx (maksudnya bisa TH0 atau TH1) membentuk sebuah untaian pencacah biner 13 bit, limpahan dari pencacah 13 bit ini ditampung di flip-flop TFx (maksudnya bisa TF0 atau TF1) yang berada di dalam register TCON. Mode ini meneruskan sarana Timer yang ada pada mikrokontroler MCS48 (mikrokontroler pendahulu MCS51), dengan maksud rancangan alat yang dibuat dengan MCS48 bisa dengan mudah diadaptasikan ke MCS51. Mode ini tidak banyak dipakai lagi. Mode 1 – Pencacah Biner 16 bit
Mode ini sama dengan Mode 0, hanya saja register TLx dipakai sepenuhnya sebagai pencacah biner 8 bit, sehingga kapasitas pencacah biner yang tersbentuk adalah 16 bit. Seiring dengan sinyal denyut, kedudukan pencacah biner 16 bit ini akan bergerak dari $0000 (biner 0000 0000 0000 0000), $0001, $0002 … sampai $FFFF (biner 1111 1111 1111 1111), kemudian melimpah kembali menjadi $0000. Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang
Gambar 1.12 Mode 2 - Pencacah Biner 8 Bit dengan Isi Ulang
TLx dipakai sebagai pencacah biner 8 bit, sedangkan THx dipakai untuk menyimpan nilai yang diisikan ulang ke TLx, setiap kali kedudukan TLx melimpah (berubah dari $FF menjadi $00). Dengan cara ini bisa didapatkan sinyal limpahan yang frekuensinya ditentukan oleh nilai yang
disimpan dalam TH0. Mode 3 – Gabungan Pencacah Biner 16 bit dan 8 Bit
Gambar 1.13 Mode 3 – Gabungan Pencacah Biner 16 Bit dan 8 Bit
Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai untuk membentuk 3 untaian pencacah, yang pertama adalah untaian pencacah biner 16 bit tanpa fasiltas pemantau sinyal limpahan yang
dibentuk dengan TL1 dan TH1. Yang kedua adalah TL0 yang dipakai sebagai pencacah biner 8 bit dengan TF0 sebagai sarana pemantau limpahan. Pencacah biner ketiga adalah TH0 yang
dipakai sebagai pencacah biner 8 bit dengan TF1 sebagai sarana pemantau limpahan.
Register Pengatur Timer
Register TMOD dan register TCON merupakan register pembantu untuk mengatur kerja Timer 0 dan Timer 1, kedua register ini dipakai bersama oleh Timer 0 dan Timer 1.
Register TMOD dibagi menjadi 2 bagian secara simitris, bit 0 sampai 3 register TMOD (TMOD bit 0 .. TMOD bit 3) dipakai untuk mengatur Timer 0, bit 4 sampai 7 register TMODE (TMOD bit 4 .. TMOD bit 7) dipakai untuk mengatur Timer 1, pemakaiannya sebagai berikut : 1. Bit M0/M1 dipakai untuk menentukan Mode Timer seperti yang terlihat dalam Tabel di
Gambar 3a. 2. Bit C/T* dipakai untuk mengatur sumber sinyal denyut yang diumpankan ke pencacah
biner. Jika C/T*=0 sinyal denyut diperoleh dari osilator kristal yang frekuensinya sudah dibagi 12, sedangkan jika C/T*=1 maka sinyal denyut diperoleh dari kaki T0 (untuk Timer
0) atau kaki T1 (untuk Timer 1).
3. Bit GATE merupakan bit pengatur saluran sinyal denyut. Bila bit GATE=0 saluran sinyal denyut hanya diatur oleh bit TRx (maksudnya adalah TR0 atau TR1 pada register TCON). Bila bit GATE=1 kaki INT0 (untuk Timer 0) atau kaki INT1 (untuk Timer 1) dipakai juga untuk mengatur saluran sinyal denyut (lihat Gambar 4).
Gambar 1.15 Denah susunan bit dalam register TCON
Register TCON dibagi menjadi 2 bagian, 4 bit pertama (bit 0 .. bit 3, bagian yang diarsir dalam
Gambar 3b) dipakai untuk keperluan mengatur kaki INT0 dan INT1, ke-empat bit ini dibahas dibagian lain.
BIT SYMBOL FUNCTION
TCON.7 TF1 Timer 1 overflow flag. Set by hardware on Timer/Counter overflow. Cleared by hardware when processor vector to interrupt routine, or clearing the bit in software.
TCON.6 TR1 Timer 1 Run control bit . Set/ cleared by software to turn Timer/ Counter on/off
TCON.5 TF0 Timer 0 overflow flag. Set by hardware on Timer/Counter overflow. Cleared by hardware when processor vector to interrupt routine, or clearing the bit in software.
TCON.4 TR0 Timer 1 Run control bit . Set/ cleared by software to turn Timer/ Counter on/off
TCON.3 IE1 Interrupt 1 Edge flag. Set by hardware when external interrupt edge detected. Cleared when interrupt processed.
TCON.2 IT1 Interrupt 1 type control bit. Set/ cleared by software to specefy falling edge/ low level trigerred external interupts
TCON.1 IE0 Interrupt 0 Edge flag. Set by hardware when external interrupt edge detected. Cleared when interrupt processed.
TCON.0 IT0 Interrupt 0 type control bit. Set/ cleared by software to specefy falling edge/ low level trigerred external interupts
Sisa 4 bit dari register TCON (bit 4..bit 7) dibagi menjadi 2 bagian secara simitris yang dipakai untuk mengatur Timer0/Timer 1, sebagai berikut:
1. Bit TFx (maksudnya adalah TF0 atau TF1) merupakan bit penampung limpahan (lihat Gambar 2), TFx akan menjadi ‘1’ setiap kali pencacah biner yang terhubung padanya
melimpah (kedudukan pencacah berubah dari $FFFF kembali menjadi $0000). Bit TFx di-nol-kan dengan istruksi CLR TF0 atau CLR TF1. Jika sarana interupsi dari Timer 0/Timer 1
dipakai, TRx di-nol-kan saat MCS51 menjalankan rutin layanan interupsi (ISR – Interupt
Service Routine).
2. Bit TRx (maksudnya adalah TR0 atau TR1) merupakan bit pengatur saluran sinyal denyut, bila bit ini =0 sinyal denyut tidak disalurkan ke pencacah biner sehingga pencacah berhenti
mencacah. Bila bit GATE pada register TMOD =1, maka saluran sinyal denyut ini diatur bersama oleh TRx dan sinyal pada kaki INT0/INT1 (lihat Gambar 4).
1.5.2 Mengatur Timer
Gambar 4 merupakan bagan susunan rangkaian yang bisa terjadi pada Timer 1 secara lengkap, digambarkan pula hubungan-hubungan semua register pembentuk dan pengatur Timer 1. Gambar ini berlaku pula untuk Timer 0. Dalam pemakaian sesungguhnya, rangkaian yang dipakai hanya sebagian dari rangkaian lengkap tersebut, sesuai dengan keperluan sistem yang dibangun. Rangkaian yang dikehendaki
dibentuk dengan mengatur register TMODE, sedangkan kerja dari Timer dikendalikan lewat
register TCON.
Gambar 1.16. Diagram blok timer/ counter
Setelah MCS51 di-reset register TMOD bernilai $00, hal ini berarti : 1. bit C/T* =’0’, menurut Gambar 4 keadaan ini membuat saklar S1 ke posisi atas, sumber
sinyal denyut berasal dari osilator kristal yang frekuensinya sudah dibagi 12, pencacah
biner yang dibentuk dengan TL1 dan TH1 berfungsi sebagai timer. Jika sistem yang
dirancang memang menghendaki Timer 1 bekerja sebagai timer maka bit C/T* tidak perlu diatur lagi. Tapi jika sistem yang dirancang menghendaki agar Timer 1 bekerja sebagai counter untuk
menghitung pulsa yang masuk lewat kakai T1 (P3.5), maka posisi saklar S1 harus dikebawahkan dengan membuat bit C/T* menjadi ‘1’.
2. bit GATE=’0’, hal ini membuat output gerbang OR selalu ‘1’ tidak dipengaruhi keadaan ‘0’ atau ‘1’ pada kaki INT1 (P3.3). Dalam keadaan semacam ini, saklar S2 hanya dikendalikan
lewat bit TR1 dalam register TCON. Jika TR1=’1’ saklar S2 tertutup sehingga sinyal denyut dari S1 disalurkan ke sistem pencacah biner, aliran sinyal denyut akan dihentikan jika
TR=’0’. Sebaliknya jika bit GATE=’1’, output gerbang OR akan mengikuti keadaan kaki INT1, saat
INT1=’0’ apa pun keadaan bit TR1 output gerbang AND selalu =’0’ dan saklar S1 selalu terbuka, agar saklar S1 bisa tertutup kaki INT1 dan bit TR1 harus =’1’ secara bersamaan.Jika sistem yang dirancang menghendaki kerja dari timer/counter dikendalikan
dari sinyal yang berasal dari luar chip, maka bit GATE harus dibuat menjadi ‘1’
3. bit M1 dan M0=’0’, berarti TL1 dan TH1 disusun menjadi pencacah biner 13 bit (Mode 0), jika dikehendaki Timer 1 bekerja pada mode 1 seperti terlihat dalam Gambar 4, maka bit M1 harus dibuat menjadi ‘0’ dan bit M0 menjadi ‘1’.
Pengetahuan di atas dipakai sebagai dasar untuk mengatur dan mengendalikan Timer seperti terlihat dalam contoh-contoh berikut :
Setelah reset TMOD bernilai $00, berarti Timer 1 bekerja sebagai pencacah biner 13 bit, sumber sinyal denyut dari osilator kristal atau Timer 1 bekerja sebagai ‘timer’, bit GATE =’0’ berarti
kaki INT1 tidak berpengaruh pada rangkaian sehingga Timer 1 hanya dikendalikan dari bit TR1. Dalam pemakaian biasanya dipakai pencacah biner 16 bit, untuk keperluan itu instruksi yang
diperlukan untuk mengatur TMOD adalah :
MOV TMOD,# 00010000b
Catatan:dalam instruksi di atas tanda ‘#’ menyatakan bagian di belakangnya adalah bilangan konstan yang akan diisikan ke TMOD, ‘b’ merupakan yang menandakan bahwa bilangan di belakangnya adalah bilangan biner. Penulisan dengan bilangan biner semacam ini, memudahkan untuk mengenali dengan cepat bit-bit apa saja yang
diisikan ke TMOD.
Bilangan biner 00010000b diisikan ke TMOD, berakibat bit 7 TMOD (bit GATE) bernilai ‘0’, bit 6 (bit C/T*) bernilai ‘0’, bit 5 dan 4 (bit M1 dan M0) bernilai ‘01’, ke-empat bit ini dipakai untuk mengatur Timer 1, sehingga Timer 1 bekerja sebagai timer dengan pencacah biner 16 bit yang
dikendalikan hanya dengan TR1. Jika dikehendaki pencacah biner dipakai sebagai counter untuk mencacah jumlah pulsa yang
masuk lewat kaki T1 (P3.5), instruksinya menjadi :
MOV TMOD,#01010000b
Perbedaannya dengan instruksi di atas adalah dalam instruksi ini bit 6 (bit C/T*) bernilai ‘1’. Selanjutnya jika diinginkan sinyal dari perangkat keras di luar chip MCS51 bisa ikut mengendalikan Timer 1, instruksi pengatur Timer 1 akan menjadi :
MOV TMOD,#11010000b
Dalam hal ini bit 7 (bit GATE) bernilai ‘1’. Setelah mengatur konfigurasi Timer 0 seperti di atas, pencacah biner belum mulai mencacah sebelum diperintah dengan instruksi :
SETB TR1
Perlu diingatkan jika bit GATE = ‘1’, selama kaki INT1 bernilai ‘0’ pencacah biner belum akan mencacah. Untuk menghentikan proses pencacahan, dipakai instruksi
CLR TR1
Di atas hanya dibahas Timer 1 saja, tata canya untuk Timer 0 persis sama. Yang perlu
diperhatikan adalah register TMOD dipakai untuk mengatur Timer 0 dan juga Timer 1, sedangkan TMOD tidak bisa dialamati secara bit (non bit addressable) sehingga jika jika kedua
Timer dipakai, pengisian bit-bit dalam register TMOD harus dipikirkan sekali gus untuk Timer 0 dan Timer 1.
Bit TR1 dan TR0 yang dipakai untuk mengendalikan proses pencacahan, terletak di dalam register TCON (memori-data internal nomor $88) yang bisa dialamati secara bit (bit
addressable). Sehingga TR0 dan TR1 bisa diatur secara terpisah (dengan perintah SETB atau
CLR), tidak seperti mengatur TMOD yang harus dilakukan secara bersamaan. Demikian pula bit penampung limpahan pencacah biner TF0 dan TF1, juga terletak dalam register TCON yang masing-masing bisa di-monitor sendiri. Sebagimana ditunjukkan pada gambar 1.11 mikrokontroller dapat beraksi sebagai timer atau counter, sesuai dengan kebutuhan. Perhatikan pada saklar sebelah kiri dan kanan pada diagram blok tersebut. Mikrokontroller akan berfungsi sebagai timer ketika saklar diposisikan ke atas dan sebaliknya akan berfungsi sebagai counter bila saklar diposisikan ke bawah, dengan mengontrol bit C/T pada register TMOD. Posisi saklar sebelah kanan, bergantung pada bit GATE (register TMOD), TR1 ( register TCON0 dan INT1.
1.6. Port Serial
Umumnya orang selalu menganggap port seri pada MCS51 adalah UART yang bekerja secara asinkron, jarang yang menyadari port seri tersebut bisa pula bekerja secara sinkron, pada hal sebagai port seri yang bekerja secara sinkron merupakan sarana yang baik sekali untuk menambah input/output bagi mikrokontroler.
Gambar 1.17. Komunikasi serial dengan komputer
Dikenal 2 macam cara transmisi data secara seri. Kedua cara tersebut dibedakan oleh sinyal denyut (clock) yang dipakai untuk men-‘dorong’ data seri, kalau clock dikirim bersama dengan data seri, cara tersebut dikatakan sebagai transmisi data seri secara sinkron. Sedangkan dalam transmisi data seri secara asinkron, clock tidak dikirim bersama data seri, rangkaian penerima data harus membangkitkan sendiri clock pendorong data seri. Port seri MCS51 bisa dipakai dalam 4 mode kerja yang berbeda. Dari 4 mode tersebut, 1 mode diantaranya bekerja secara sinkron dan 3 lainnya bekerja secara asinkron. Secara ringkas ke-empat mode kerja tersebut bisa dibedakan sebagai berikut:
Mode 0 Mode ini bekerja secara sinkron, data seri dikirim dan diterima melalui kaki P3.0 (RxD), dan kaki P3.1 (TxD) dipakai untuk menyalurkan clock pendorong data seri yang dibangkitkan MCS51.
Data dikirim/diterima 8 bit sekali gus, dimulai dari bit yang bobotnya paling kecil (bit 0) dan diakhiri dengan bit yang bobotnya paling besar (bit 7). Kecepatan pengiriman data (baud rate) adalah 1/12 frekuensi osilator kristal.
Mode 1 Mode ini dan mode-mode berikutnya bekerja secara asinkron, data dikirim melalui
kaki P3.1 (TxD) dan diterima melalui kaki P3.0 (RxD). Pada Mode 1 data dikirim/diterima 10 bit sekali gus, diawali dengan 1 bit start, disusul dengan 8 bit data yang dimulai dari bit yang bobotnya paling kecil (bit 0), diakhiri dengan 1 bit stop. Pada MCS51 yang berfungsi sebagai penerima bit stop
ditampung pada RB8 dalam register SCON. Kecepatan pengiriman data (baud rate) bisa diatur sesuai dengan keperluan. Mode inilah yang umum dikenal sebagai UART (Universal Asynchronous
Receiver/Transmitter).
Mode 2 Data dikirim/diterima 11 bit sekali gus, diawali dengan 1 bit start, disusul 8 bit data yang dimulai dari bit yang bobotnya paling kecil (bit 0), kemudian bit ke 9 yang bisa diatur lebih lanjut, diakhiri dengan 1 bit stop.
Pada MCS51 yang berfungsi sebagai pengirim, bit 9 tersebut berasal dari bit TB8 dalam register SCON. Pada MCS52 yang berfungsi sebagai penerima, bit 9 ditampung pada bit RB8 dalam register SCON, sedangkan bit stop diabaikan tidak ditampung. Kecepatan pengiriman data (baud rate) bisa dipilih antara 1/32 atau 1/64 frekuensi osilator kristal.
Mode 3 Mode ini sama dengan Mode 2, hanya saja kecepatan pengiriman data (baud rate) bisa diatur sesuai dengan keperluan, seperti halnya Mode 1.
Pada mode asinkron (Mode 1, Mode 2 dan Mode 3), port seri MCS51 bekerja secara full
duplex, artinya pada saat yang sama port seri ini bisa mengirim data sekali gus menerima data.
Register SBUF merupakan register penghubung port seri. Dalam ke-empat mode di atas, semua instruksi yang mengakibatkan perubahan isi SBUF akan mengakibatkan port seri mengirimkan data keluar dari MCS51. Agar port seri bisa menerima data, bit REN dalam register SCON harus
bernilai ‘1’. Pada mode 0, proses penerimaan data dimulai dengan instruksi CLR RI, sedangkan dalam mode lainnya proses penerimaan data diawali oleh bit start yang bernilai ‘0’. Data yang
diterima port seri dari luar MCS51, diambil dengan instruksi MOV A,SBUF. Mengambil data dari SBUF dan menyimpan data ke SBUF sesungguhnya bekerja pada dua register yang berlainan, meskipun nama registernya sama-sama SBUF.
1.6.1 Register-register Port Seri MCS51
MCS51 dilengkapi dengan 2 register dan beberapa bit tambahan untuk keperluan pemakai port seri.
Gambar 1.5.1. Register SBUF
SBUF merupakan SFR (Special Function Register) yang terletak pada memori-data internal dengan nomor $99. SBUF mempunyai kegunaan ganda, data yang disimpan pada SBUF akan dikirim keluar MCS51 lewat port seri, sedangkan data dari luar MCS51 yang diterima port seri diambil dari SBUF pula. Jadi meskipun hanya menempati satu nomor memori-data internal
(nomor $99), sesungguhnya SBUF terdiri dari 2 register yang berbeda.
Enables the multiprocessor communication feature in Modes 2 and 3. In Mode 2 or 3, if SM2 is set to 1, then Rl will not be activated if the received 9th data bit (RB8) is 0. In Mode 1, if SM2=1 then RI will not be activated if a valid stop bit was not received. In Mode 0, SM2 should be 0.
REN Enables serial reception. Set by software to enable reception. Clear by software to disable reception.
TB8 The 9th data bit that will be transmitted in Modes 2 and 3. Set or clear by software as desired.
RB8 In Modes 2 and 3, is the 9th data bit that was received. In Mode 1, it SM2=0, RB8 is the stop bit that was received. In Mode 0, RB8 is not used.
TI Transmit interrupt flag. Set by hardware at the end of the 8th bit time in Mode 0, or at the beginning of the stop bit in the other modes, in any serial transmission. Must be cleared by software.
RI Receive interrupt flag. Set by hardware at the end of the 8th bit time in Mode 0, or halfway through the stop bit time in the other modes, in any serial reception (except see SM2). Must be cleared by software.
SCON merupakan SFR (Special Function Register) yang terletak pada memori-data internal dengan nomor $98, merupakan register utama untuk mengatur kerja port seri MCS51. Setelah reset semua bit dalam SCON bernilai ‘0’.
1. Bit SM0 dan bit SM1 (bit 7 dan bit 6 pada register SMOD) dipakai untuk menentukan mode kerja port seri. Setelah reset kedua bit ini bernilai ‘0’
2. Bit REN (bit 4) dipakai untuk mengaktipkan kemampuan port seri menerima data. Pada
mode 0 kaki RxD (kaki P3.0) dipakai untuk mengirim data seri (REN=’0’) dan juga untuk menerima data seri (REN=’1’). Sifat ini terbawa pula pada saat port seri bekerja pada mode 1, 2 dan 3, meskipun pada mode-mode tersebut kaki RxD hanya dipakai untuk mengirim data, agar kaki RxD bisa dipakai untuk menerima data terlebih dulu harus dibuat REN=’1’. Setelah reset bit REN bernilai ‘0’.
3. Pada mode kerja 2 dan mode kerja 3, port seri bekerja dengan 9 bit data, SBUF yang kapasitasnya 8 bit tidak cukup untuk keperluan ini. Bit ke-sembilan yang akan dikirim
terlebih dulu diletakkan di TB8 (bit 3), sedangkan bit RB8 (bit 2) merupakan bit yang dipakai untuk menampung bit ke-sembilan yang diterima port seri.
4. Pada mode kerja 1, RB8 dipakai untuk menampung bit stop yang diterima, dengan demikian
apa bila RB8 bernilai ‘1’ maka data diterima dengan benar, sebaliknya apa bila RB8=’0’ berarti terjadi kesalahan kerangka (framing error).
Kalau bit SM2 (bit 5) bernilai ‘1’, jika terjadi kesalahan kerangka, RI tidak akan menjadi ‘1’
Bit ke 9 ini bisa dipakai sebagai bit pariti, hanya saja bit pariti yang dikirim harus
ditentukan sendiri dengan program dan diletakkan pada TB8, dan bit pariti yang diterima pada RB8 dipakai untuk menentukan integritas data secara program pula. Tidak seperti dalam UART standard, semuanya itu dikerjakan oleh perangkat keras dalam IC UART.
5. Bit TI (bit 1) merupakan petanda yang setara dengan petanda TDRE (Transmitter Data Register Empty) yang umum dijumpai pada UART standard. Setelah port seri selesai
mengirim data yang disimpan ke-dalam SBUF, bit TI akan bernilai ‘1’ dengan sendirinya, bit ini harus di-nol-kan dengan program agar bisa dipakai untuk memantau keadaan SBUF dalam pengiriman data berikutnya. Sub-rutin SerialOut berikut dipakai untuk mengirim data seri, bisa dipakai untuk semua mode port seri. Baris 02 menunggu TI menjadi ‘1’, dimaksud untuk memastikan pengiriman data sebelumnya sudah selesai. Data yang akan dikirim sebelumnya sudah
disimpan di A, pada baris 03 data tersebut dikirim melalui port seri dengan cara meletakannya di SBUF. Agar TI bisa dipakai untuk memantau keadaan SBUF pada pengiriman data berikutnya, pada baris 04 TI di-nol-kan.
SerialOut:
JNB TI,$ ; tunggu data sebelumnya selesai dikirim
MOV SBUF,A ; kirim data baru
CLR TI ; petanda ada pengiriman baru
RET
6. Bit RI (bit 0) merupakan petanda yang setara dengan petanda RDRF (Receiver Data Register Full) yang umum dijumpai pada UART standard. Setelah SBUF menerima data dari port seri, bit RI akan bernilai ‘1’ dengan sendirinya, bit ini harus di-nol-kan dengan program agar bisa dipakai untuk memantau keadaan SBUF dalam penerimaan data berikutnya.
Sub-rutin SerialIn berikut dipakai untuk menerima data seri, bisa dipakai untuk semua mode port seri. Baris 02 menunggu RI menjadi ‘1’, dimaksud untuk memastikan sudah ada
data baru yang diterima pada SBUF. Pada baris 03 data pada SBUF diambil ke A. Agar RI bisa dipakai untuk memantau keadaan SBUF pada pengiriman data berikutnya, pada baris 04 RI di-nol-kan.
SerialIn:
JNB RI,$ ; tunggu SBUF berisi data baru
MOV A,SBUF ; ambil data
CLR RI ; pentanda data sudah diambil
RET
Gambar 1.18 Bit SMOD dalam Register PCON
Mode 0 port serial
UART merupakan standard yang dipakai untuk komunikasi data seri dengan komputer, komunikasi data seri dengan modem dan lain sebagainya. Komunikasi data seri secara sinkron seperti mode 0, merupakan komunikasi data seri yang banyak dipakai untuk menghubungkan IC-IC digital dalam sebuah sistem, misalnya pada IC
Serial EEPROM, cara ini belakangan menjadi makin populer karena rangkaiannya sederhana dan tidak makan tempat.
Dalam dunia digital, dikenal 3 macam teknik transmisi data seri secara sinkron untuk keperluan di atas, yang paling terkenal adalah teknik ciptaan Philips yang dinamakan sebagai I2C (Inter IC Communication), Motorola mengenalkan teknik yang dinamakan sebagai SPI (Serial Peripheral Interface) dan National Semiconductor menciptakan MicroWire.
Transmisi data seri yang dipakai pada mode 0, tidak sepadan dengan 3 teknik yang disebut di atas, tapi dengan perancangan yang cermat mode 0 ini bisa dihubungkan ke SPI, sehingga bisa dipakai untuk menghubungkan MCS51 dengan mikrokontroler Motorola MC68HC11.
Sinyal data seri sinkron yang ada pada kaki P3.0 dan P3.1, sesungguhnya murni merupakan sinyal yang biasa dipakai untuk mengendalikan shift-register, dengan demikian dengan menghubungkan shift register ke port seri, bisa menambah port input maupun port output dengan mudah.
Baud Rate Baud rate pada mode 0 adalah tertentu: pada mode 0, Baud Rate = 1/12 x Frekuensi Osilator. Baud rate pada mode 2 bergantung pada nilai bit SMOD pada SFR PCON. Jika SMOD = 0, baud rate adalah 1/64 frekuensi osilator. Jika SMOD=1, baud rate adalah 1/32 frekuensi osilator. Penentuan baud rate mode 2 adalah sebagai berikut:
,
Sedangkan baud rate pada mode 1 dan 3 ditentukan oleh nilai laju overflow dari Timer 1.
Menggunakan Timer 1 untuk membangkitkan Baud Rate
Ketika timer 1 digunakan untuk membangkitkan clock baud rate, baud rate pada mode 1 dan 3 adalah ditentukan oleh laju overflow timer 1 dan nilai dari SMOD. Penentuan baud rate untuk mode 1 dan 3 adalah sebagai berikut:
Interupsi timer 1 harus disable pada aplikasi ini. Pada kebanyakan aplikasi, timer ini dioperasikan sebagai timer, dengan mode auto reload mode 2. Pada kasus ini baud rate diberikan dengan rumus sebagai berikut:
1.7. Bahasa Asembly
Secara fisik, kerja dari sebuah mikrokontroler dapat dijelaskan sebagai siklus pembacaan instruksi yang tersimpan di dalam memori. Mikrokontroler menentukan alamat dari memori program yang akan dibaca, dan melakukan proses baca data di memori. Data yang dibaca diinterprestasikan sebagai instruksi. Alamat instruksi disimpan oleh mikrokontroler di register, yang dikenal sebagai program counter. Instruksi ini misalnya program aritmatika yang melibatkan 2 register. Sarana yang ada dalam program assembly sangat minim, tidak seperti dalam bahasa pemrograman tingkat atas (high level language
programming) semuanya sudah siap pakai. Penulis program assembly harus menentukan segalanya, menentukan letak program yang ditulisnya dalam memori-program, membuat data konstan dan tablel konstan dalam memori-program, membuat variabel yang dipakai kerja dalam memori-data dan lain sebagainya.
1.7.1 Program sumber assembly
Program-sumber assembly (assembly source program) merupakan kumpulan dari baris-baris perintah yang ditulis dengan program penyunting-teks (text editor) sederhana, misalnya
program EDIT.COM dalam DOS, atau program NOTEPAD dalam Windows atau MIDE-51. Kumpulan baris-printah tersebut biasanya disimpan ke dalam file dengan nama ekstensi *.ASM dan lain sebagainya, tergantung pada program Assembler yang akan dipakai untuk mengolah program-sumber assembly tersebut. Setiap baris-perintah merupakan sebuah perintah yang utuh, artinya sebuah perintah tidak mungkin dipecah menjadi lebih dari satu baris. Satu baris perintah bisa terdiri atas 4 bagian, bagian pertama dikenali sebagai label atau sering juga disebut sebagai symbol, bagian kedua dikenali sebagai kode operasi, bagian ketiga adalah operand dan bagian terakhir adalah komentar. Antara bagian-bagian tersebut dipisahkan dengan sebuah spasi atau tabulator. Bagian label
Label dipakai untuk memberi nama pada sebuah baris-perintah, agar bisa mudah menyebitnya dalam penulisan program. Label bisa ditulis apa saja asalkan diawali dengan huruf, biasa panjangnya tidak lebih dari 16 huruf. Huruf-huruf berikutnya boleh merupakan angka atau tanda titik dan tanda garis bawah. Kalau sebuah baris-perintah tidak memiliki bagian label, maka bagian ini boleh tidak ditulis namun spasi atau tabulator sebagai pemisah antara label dan bagian berikutnya mutlak tetap harus ditulis.
Dalam sebuah program sumber bisa terdapat banyak sekali label, tapi tidak boleh ada label yang kembar.
Sering sebuah baris-perintah hanya terdiri dari bagian label saja, baris demikian itu memang tidak bisa dikatakan sebagai baris-perintah yang sesungguhnya, tapi hanya sekedar memberi nama pada baris bersangkutan.
Bagian label sering disebut juga sebagai bagian symbol, hal ini terjadi kalau label tersebut tidak dipakai untuk menandai bagian program, melainkan dipakai untuk menandai bagian data.
Bagian kode operasi
Kode operasi (operation code atau sering disingkat sebagai OpCode) merupakan bagian perintah yang harus dikerjakan. Dalam hal ini dikenal dua macam kode operasi, yang pertama adalah kode-operasi untuk mengatur kerja mikroprosesor / mikrokontroler. Jenis kedua dipakai untuk mengatur kerja program assembler, sering dinamakan sebagai assembler directive.
Kode-operasi ditulis dalam bentuk mnemonic, yakni bentuk singkatan-singkatan yang relatip
mudah diingat, misalnya adalah MOV, ACALL, RET dan lain sebagainya. Kode-operasi ini ditentukan oleh pabrik pembuat mikroprosesor/mikrokontroler, dengan demikian setiap prosesor mempunyai kode-operasi yang berlainan.
Kode-operasi berbentuk mnemonic tidak dikenal mikroprosesor/mikrokontroler, agar program yang ditulis dengan kode mnemonic bisa dipakai untuk mengendalikan prosesor, program semacam itu diterjemahkan menjadi program yang dibentuk dari kode-operasi kode-biner,
Tugas penerjemahan tersebut dilakukan oleh program yang dinamakan sebagai Program
Assembler.
Di luar kode-operasi yang ditentukan pabrik pembuat mikroprosesor/mikrokontroler, ada pula kode-operasi untuk mengatur kerja dari program assembler, misalnya dipakai untuk
menentukan letak program dalam memori (ORG), dipakai untuk membentuk variabel (DS), membentuk tabel dan data konstan (DB, DW) dan lain sebagainya. Bagian operand
Operand merupakan pelengkap bagian kode operasi, namun tidak semua kode operasi memerlukan operand, dengan demikian bisa terjadi sebuah baris perintah hanya terdiri dari kode operasi tanpa operand. Sebaliknya ada pula kode operasi yang perlu lebih dari satu operand, dalam hal ini antara operand satu dengan yang lain dipisahkan dengan tanda koma.
Bentuk operand sangat bervariasi, bisa berupa kode-kode yang dipakai untuk menyatakan Register dalam prosesor, bisa berupa nomor-memori (alamat memori) yang dinyatakan dengan bilangan atau pun nama label, bisa berupa data yang siap di-operasi-kan. Semuanya disesuaikan dengan keperluan dari kode-operasi.
Untuk membedakan operand yang berupa nomor-memori atau operand yang berupa data yang
siap di-operasi-kan, dipakai tanda-tanda khusus atau cara penulisan yang berlainan.
Di samping itu operand bisa berupa persamaan matematis sederhana atau persamaan Boolean, dalam hal semacam ini program Assembler akan menghitung nilai dari persamaan-persamaan dalam operand, selanjutnya merubah hasil perhitungan tersebut ke kode biner yang dimengerti oleh prosesor. Jadi perhitungan di dalam operand dilakukan oleh program assembler bukan oleh prosesor!
Bagian komentar
Bagian komentar merupakan catatan-catatan penulis program, bagian ini meskipun tidak mutlak diperlukan tapi sangat membantu masalah dokumentasi. Membaca komentar-komentar pada setiap baris-perintah, dengan mudah bisa dimengerti maksud tujuan baris bersangkutan, hal ini sangat membantu orang lain yang membaca program.
Pemisah bagian komentar dengan bagian sebelumnya adalah tanda spasi atau tabulator, meskipun demikian huruf pertama dari komentar sering-sering berupa tanda titik-koma, merupakan tanda pemisah khusus untuk komentar.
Untuk keperluan dokumentasi yang intensip, sering-sering sebuah baris yang merupakan komentar saja, dalam hal ini huruf pertama dari baris bersangkutan adalah tanda titik-koma. AT89S51 memiliki sekumpulan instruksi yang sangat lengkap. Instruksi MOV untuk byte dikelompokkan sesuai dengan mode pengalamatan (addressing modes). Mode pengalamatan menjelaskan bagaimana operand dioperasikan. Berikut penjelasan dari berbagai mode pengalamatan. Bentuk program assembly yang umum ialah sebagai berikut :
Org 0H Start: Mov A, #11111110b; Isi Akumulator Mov R0, #7 ; Isi R0 dengan 7 Kiri: Mov P0, A ; Copy A ke P0 Call Delay ; Panggil subrutine Delay RL A DEC R0 CJNE R0, #0, Kiri Sjmp Start Delay: mov R1, #255 Del1: mov R2, #255 Del2: djnz R2, del2 djnz R1, del1 ret end
Isi memori ialah bilangan heksadesimal yang dikenal oleh mikrokontroler kita, yang merupakan representasi dari bahasa assembly yang telah kita buat. Mnemonic atau opcode ialah kode yang akan melakukan aksi terhadap operand . Operand ialah data yang diproses oleh opcode. Sebuah opcode bisa membutuhkan 1 ,2 atau lebih operand, kadang juga tidak perlu operand. Sedangkan komentar dapat kita berikan dengan menggunakan tanda titik koma (;). Berikut contoh jumlah operand yang berbeda beda dalam suatu assembly.
CJNE R5,#22H, aksi ;dibutuhkan 3 buah operand MOVX @DPTR, A ;dibutuhkan 2 buah operand RL A ;1 buah operand NOP ; tidak memerlukan operand
Program yang telah selesai kita buat dapat disimpan dengan ekstension .asm. Lalu kita dapat membuat program objek dengan ekstension HEX dengan menggunakan compiler MIDE-51, yang dijelaskan sebagai berikut:
1.7.2 Assembly Listing
Program-sumber assembly di atas, setelah selesai ditulis diserahkan ke program Assembler untuk diterjemahkan. Setiap prosesor mempunyai program assembler tersendiri, bahkan satu macam prosesor bisa memiliki beberapa macam program Assembler buatan pabrik perangkat lunak yang berlainan. Hasil utama pengolahan program Assembler adalah program-obyek. Program-obyek ini bisa berupa sebuah file tersendiri, berisikan kode-kode yang siap dikirimkan ke memori-program mikroprosesor/mikrokontroler, tapi ada juga program-obyek yang disisipkan pada program-
sumber assembly seperti terlihat dalam Assembly Listing di Gambar 2. Bagian kanan Gambar 2 merupakan program-sumber Assembly karya asli penulis program, setelah diterjemahkan oleh program Assembler kode-kode yang dihasilkan berikut dengan nomor-nomor memori tempat penyimpanan kode-kode tadi, disisipkan pada bagian kiri setiap baris perintah, sehingga bentuk program ini tidak lagi dikatakan sebagai program-sumber
APLIKASI MIKROKONTROLLER 1. Penyelesaian Persamaan Beer Lamberts dengan aplikasi Look Up Table untuk
pengukuran beberapa parameter kimia dengan metode spektroskopi.
Gambar 1.1. Diagram blok akuisisi data
Transmitansi cahaya yang melewati larutan, 0
100%I
IT T=
Absorbansi cahaya oleh larutan, )(%2 TLogA −=
Pada pembuatan program ini, pemrosesan persamaan tersebut tidak dilakukan melalui proses matematika, melainkan dengan menggunakan metode look up table. Sebelum penentuan look up table maka harus dilakukan beberapa langkah sebagai berikut:
1. Ukur berapa besar tegangan yang terukur pada input ADC pada saat tanpa pemberian tabung/ gelas ukur, yang selanjutnya dianggap sebagai Io.
2. Tegangan pada saat kondisi pertama ini, selanjutnya dianggap sebagai tegangan input ADC maksimal.
3. Dengan mengetahui tegangan input ADC maksimal maka dapat ditentukan tegangan referensi ADC dan tegangan resolusi ADC.
4. Buatlah tabel dengan Microsoft Excell untuk beberapa persamaan tersebut diatas.
Asumsi yang digunakan pada pemrograman ini adalah: VI ∞ , sehingga didapatkan persamaan sebagai berikut:
Misal : Vo yang terukur adalah 2,3 volt yang dianggap sebagai Vmaks. Vo = 2,3 volt Vref = Vmaks/2 = 2,3/2 = 1,15 volt Vresolusi = 0,009019608 volt
Sehingga,
T
T VV
T 47826,433,2
100% == dan )(%2 TLogA −=
Misal Larutan X, nilai Konsentrasi standar (C standart) yang terukur adalah 2,56 mg/dl dengan nilai A standart yang terukur 0,01970, maka dapat ditentukan nilai C Sample yang terukur:
Pembuatan Look up table Absorbance: ASatuan: 2,2,1,1,1,……… APer10: 4,1,9,8,………. APer100: 0,0,2,8…….. APer1000: 7,6,9,4…….. Pembuatan Look up table Consentrate Cratusan: 3,2,2,2…… Cpuluhan: 1,7,5,3…… Csatuan: 2,3,0,4……. Cper1: 7,6,7,4…….. Sehingga pada saat ADC menerima tegangan dari sensor, sebesar 0,02706 volt ( desimal 3 )
maka: Abs = 1929 atau 1,929 (lihat look up table dan tabel konversi diatas) C = 2507 atau 250,7 (lihat look up table dan tabel konversi diatas)
VCC
D1
3V
G 74LS244
P3.2
10k
P3.3
P3.4
VCC
10
10k
VCC
VCC
150p
13
2
13
2
10k
8
R6
220
ADC0804
67
9
1112131415161718
194
5
123
+IN-IN
VREF/2
DB7DB6DB5DB4DB3DB2DB1DB0
CLKRCLKIN
INTR
CSRDWR
20P1.7..P1.0
PROG
RUN/ EN ADC
65
4
32
1
Gambar 1. Rangkaian simulasi pengukuran konsentrasi.
ret ; Write_data: setb P3.6 ; RS = P2.0 = 1, write mode data mov P0,R1 ; D7 s/d D0 = P0 = R1 setb P3.7 ; EN = 1 = P2.1 call delay ; call delay time clr p3.7 ; EN = 0 = P2.1 ret ; delay: mov R0,#0 delay1:mov R2,#0fh djnz R2,$ djnz R0,delay1 ret ; word1: DB ' Abs = ' word2: DB ' C =' ; ASatuan: db 2,2,1,1,1; tulis semua data hasil perhitungan di tabel xls (total 255 data) APer10: db 4,1,9,8; tulis semua data hasil perhitungan di tabel xls (total 255 data) APer100: db 0,0,2,8; tulis semua data hasil perhitungan di tabel xls (total 255 data) APer1000: db 7,6,9,4; tulis semua data hasil perhitungan di tabel xls (total 255 data) ; Cratusan: db 3,2,2,2; tulis semua data hasil perhitungan di tabel xls (total 255 data) Cpuluhan: db 1,7,5,3; tulis semua data hasil perhitungan di tabel xls (total 255 data) Csatuan: db 2,3,0,4; tulis semua data hasil perhitungan di tabel xls (total 255 data) Cper1: db 7,6,7,4; tulis semua data hasil perhitungan di tabel xls (total 255 data) end
2. Pengaturan Kecepatan Putaran Motor dengan PWM
Motor merupakan salah satu komponen pendukung yang sering digunakan dalam beberapa aplikasi peralatan kedokteran, sebagai contoh: Centrifuge, Rotator Shaker, Tread Mill dll. Kecepatan merupakan satu variabel yang harus dikondisikan agar dapat diperoleh kecepatan yang diinginkan.
Metode pengaturan kecepatan motor dapat dilakukan dengan berbagai macam gaya, berikut kelebihan dan kekurangan. Salah satu pengaturan kecepatan putaran motor yang paling sederhana adalah dengan metode pulse widht modulation.
Gambar 4.1. Rangkaian pengaturan putaran motor dengan PWM
;======================================================= ; FEED BACK CONTROL DENGAN PULSE WIDTH MODULATION ( PWM ) ; Oleh : Triwiyanto, S.Si.,MT ; Jurusan Teknik Elektromedik Poltekkes Surabaya ;*************BACA INTRODUCTION PWM di BAB 3.10 ***** ;======================================================= ;Aplikasi berikut digunakan untuk pengendalian kecepatan putaran ( RPM ) motor DC ;1. Setting RPM diatur melalui potensio yang selanjutnya tegangan ini disebut ; analog0 yang merupakan tegangan setting ;2. RPM motor dapat dideteksi dengan menggunakan tachometer yang selanjutnya ; disebut sebagai analog1 ;3. Agar dapat diolah oleh mikrokontroler maka diperlukan ADC dan multiplexer ;4. Dengan menggunakan instruksi JC dan JZ maka dilakukan proses perbandingan ; tegangan analog0 dan analog1 ;5. Disinilah akan diambil keputusan untuk mempercepat atau memperlambat RPM ; dengan mengatur PWM yang dikeluarkan oleh port P3.0 agar sesuai dengan setting ; dCycle equ 30h dCycleC equ 31h count equ 32h Analog0 equ 33h Analog1 equ 34h PWM bit P3.1 Channel bit P3.0 PortADC equ P1 ; DCLB equ 40d DCUB equ 255d ; KondisiMotor bit 20h ;
org 0h ljmp start org 0bh ljmp Timer_Interrupt0 start: call Init_Interupsi_Timer0 clr PWM ; mematikan motor ;============================================ ; RUTINE UTAMA ;============================================= Forever: call ADC call Update sjmp Forever ; ;================================================= ;Subrutine Timer_Interupsi0 ;================================================= ;Subrutine berikut digunakan untuk memberikan layanan interupsi timer overflow ; bila hal ini terjadi maka nilai reload TH0 akan diloadkan ke TL0 ;Pada saat awal KondisiMotor = '1' sehingga bila interupsi ini ditemui maka ; akan menuju pada label motoroff dan ditandai kondisimotor = '0' ;=================================================== Timer_Interrupt0: JB KondisiMotor,MotoroFF Setb PWM Mov TH0,dCycle Setb KondisiMotor reti Motoroff: clr PWM mov TH0,dcycleC clr KondisiMotor reti ;
;=============================================== ;Subrutine Init_interupsi_timer0 ;Inisialisasi mode timer: timer 0 difungsikan sebagai timer 8 bit mode 2 ;=============================================== Init_interupsi_Timer0: mov TH0,#dCycle Mov TMOD,#00000010b ; timer0 = sbg timer 8 bit, mode 2 setb ET0 ; Enable timer 0 interupsi Setb EA ; Master Enable All Interupsi setb TR0 ; start rock and roll timer 0 Setb KondisiMotor mov count,#50 mov dCycle,#0 mov dCycleC,#0FFh ret ;=============================================== ;Subrutine Update - Update duty cycle ;Internal register/ RAM yang diberi label count didecrement, ketika count = 0 ; maka duty cycle diupdate, shg software counter ini berfungsi agar duty cycle
; tidak berubah terlalu cepat ;================================================= Update: djnz count,upDone mov A,analog1; dari referensi mov b,analog0; dari sensor tachometer clr c subb a,b jnz update1 ret Update1: jc decrease call higherDC ret Decrease: call lowerDC UpDone:
ret ; ;============================================= ;Subrutine lowerDC - Menurunkan duty cycle ;Subrutine ini akan dikerjakan bila kecepatan motor melebihi setting ;============================================= LowerDC:mov a,dCycle cjne a,#DCLB,DecDC ret DecDC: dec dCycle inc dCycleC ret ; ;============================================= ;Subrutine HigherDC - Menaikkan duty cycle ;Subrutine ini akan dikerjakan bila kecepatan motor dibawah setting ;============================================== HigherDC: mov a,dCycle cjne a,#DCUB,IncDC ret IncDC: Inc dCycle dec dCycleC ret ; ;============================================= ;Subrutine ADC - Membaca tegangan Setting dan tegangan dari tachometer ;masing-masing disimpan ke register Internal Analog0 dan Analog1 ;untuk dibandingkan pada subrutine update ;============================================= ADC: Clr channel ; Pilih channel X0 dari multiplexer 4051 mov Analog0,PortADC Setb channel ; Pilih channel X1 dari multiplexer 4051 mov Analog1,PortADC ret
3. Pengaturan Suhu dan waktu ( Display 7 Segmen dan Setting dengan Pushbutton)
Pengaturan suhu merupakan salah satu pengaturan yang sering diterapkan pada beberapa peralatan Alat Laboratorium. Sistem pengaturan ini masih sangat sederhana sekali, karana hanya memanfaatkan sistem kontrol ON – OFF. Pada aplikasi pengaturan suhu I ini, display dapat dilihat pada 4 x 7 segmen dan setting dapat dilakukan dengan menggunakan push button.
Gambar 4.7. Rangkaian setting waktu dan dan suhu untuk simulasi kontrol ON-OFF dengan display ke Seven Segmen.
Simulasi sistem yang akan dibangun adalah suatu rangkaian yang mempunyai fasilitas setting UP dan Down untuk setting suhu dan waktu, setiap selesai melakukan setting baik suhu dan waktu maka harus diikuti dengan tombol enter. Sesuai dengan persyaratan pada sistem kontrol pada incubator maupun sterilisator maka timer akan mulai bekerja bila suhu telah tercapai sesuai dengan setting. Relay yang terpasang akan ON-OFF sesuai dengan perbandingan setting dan suhu yang terbaca.
;DRAFT LISTING PROGRAM SETTING SUHU DAN WAKTU SISTEM CONTROL SUHU ;Pada program ini suhu dan waktu pada sistem dapat disetting dg ;menggunakan tombol up/ down dan bila tombol enter ditekan maka ;data akan diterima oleh sistem uC. ;Untuk melihat hasil pembacaan suhu atau waktu dapat digunakan ;tombol up/ down.Pada program ini akan ditampilkan waktu ;detik dan menit dengan Format MM:DD Program ini bekerja dengan ;sistem interupsi yang dibangkitkan dari Timer 0 oleh TF0 ;*******************Copyright***************************** ; Forever:Mov @Labcomp,Tri_wiyanto ; sjmp Forever ;J u r u s a n T e k n i k E l e k t r o m e d i k ;P o l i t e k n i k K e s e h a t a n S u r a b a ya
; ;============================================== ;Subrutine untuk inisialisasi kerja dari timer ;dengan menggunakan mode 1 timer 0 16 bit ;dan pengaktivan interupsi TF0 ;============================================== InitTimer: clr ControlBit mov pencacah20,#20 acall UpdateDisplay mov TMOD,#00000001b mov tl0,#0b0h mov th0,#03ch setb ET0 setb EA setb TR0 ret ; ;==================================================== ;This is the most importan subrutine, to serve interuption when ;TF0 Timer 0 Call ;Instruksi berikut digunakan untuk memberikan layanan ;interupsi, dan akan terjadi setiap 0.05 detik. atau 50.000 udetik ;maka data yang harus diloadkan 65536- 50000 = 15536 d = 3CB0 h
B0h ke TL1 dan 3C ke TH1 ;Pada subrutine ini pencacah20 akan didecrement sampai ;menghasilkan nilai Pencacah20=0, yang terjadi setiap ;20 X 50000 uS = 20 X 0,05s = 1 s,apabila ini terjadi maka ;akan dipanggil subrutine jamdigital, untuk melakukan increment ;data detik, menit, atau jam ;================================================
timerinterrupt:
mov tl0,#0b0h mov th0,#03ch djnz pencacah20,Endinterupsi mov pencacah20,#20 acall jamdigital Endinterupsi: reti ; ;================================================= ;Subrutine untuk menambah jumlah cacahan dari jam digital ;Detik dan menit, bila detik sudah menunjukan 60 maka ;counter menit akan bekerja untuk menambah jumlah hitungannnya ;Subritine ini akan dipanggil setiap detik sesuai dg interupsi ;================================================== JamSetting: dec detik mov a,#0 cjne a,detik,UpdateDisplaySetting mov detik,#60 ;
satumenitSetting: dec menit mov A,#0 cjne A,menit,UpdateDisplaySetting mov menit,#60 ; setb P3.3; Mematikan beban ; ljmp endProses ; UpdateDisplaySetting: mov a,detik mov b,#10 div ab mov detik1,b mov detik10,a ; mov a,menit mov b,#10 div ab mov menit1,b mov menit10,a ret ; ;========================================================== ;Subrutine yang digunakan untuk menyesuaikan dengan waktu ;yang sedang berlaku. Yaitu dengan menekan tombol P3.6 ;dan P3.7 untuk setting waktu detik dan menit ;========================================================== ScanSettingJam: JNB P3.7,JamSetting JNB P3.6,SatuMenitSetting JNB P3.3,wait2 ret ; ;========================================================= ;Subrutine yang digunakan untuk setting suhu yang diinginkan ;dengan menggunakan tombol up/ down dengan display pada seven segmen. ;pada saat setting juga dideteksi tombol enter, untuk memulai proses ;control suhu ;========================================================= ScanSettingSuhu: mov R7,#1 Down: mov DataSetting,R7 acall DisplaySetting jnb p3.3,wait3 jb P3.7,up inc R7 acall delay sjmp down ; Up: Mov DataSetting,R7 acall DisplaySetting jnb P3.3,wait3
jb p3.6,down dec R7 acall delay sjmp down ret ; ;======================================================== ;Subrutine untuk menambah jumlah cacahan dari jam digital ;Detik dan menit, bila detik sudah menunjukan 60 maka ;counter menit akan bekerja untuk menambah jumlah hitungannnya ;Subritine ini akan dipanggil setiap detik sesuai dg interupsi ;======================================================== jamdigital: dec detik mov a,#0 cjne a,detik,UpdateDisplay ; cjne a,menit,next Setb p1.4 ljmp endProses ; next: mov detik,#59 ; satumenit: dec menit mov A,#0 cjne A,menit,UpdateDisplay mov menit,#0 ; UpdateDisplay: mov a,detik mov b,#10 div ab mov detik1,b mov detik10,a ; mov a,menit mov b,#10 div ab mov menit1,b mov menit10,a ret ; ;========================================================= ;Rutine untuk display kode dan deteksi tombol enter ;1. Display kode masing-masing kelompok dengan memunculkan inisial ; huruf nama masing-masing anggota kelompok pada 7 segmen. ; Pada contoh ini dimunculkan kode 4 3 2 1 ;2. Deteksi tombol enter dari port P3.3, apabila tidak ditekan maka ; akan memunculkan display 4 3 2 1 terus menerus, bila tombol ditekan ; maka akan melanjutkan instruksi dibawahnya.
;3. Scan Setting waktu yang diperlukan untuk pengoperasian alat dan ; setting akan disimpan bila tombol enter ditekan ;4. Scan Setting suhu yang diinginkan, dan disimpan bila tombol enter ; ditekan ;5. Label Start Operating akan mulai bekerja dengan melakukan control suhu ; sampai suhu tercapai bila suhu tercapai maka timer akan segera ; diinisialisasi dan beban mulai dihidupkan ;========================================================= Start: acall MovingDisplay jb p3.3,start ; Wait1: jnb p3.3, wait1 mov detik,#60 mov menit,#60 ; SettingWaktu: acall ScansettingJam acall DisplayWaktu sjmp SettingWaktu ; wait2: jnb p3.3, wait2 ; SettingSuhu: acall ScanSettingSuhu sjmp SettingSuhu ; wait3: jnb p3.3,wait3 ; StartOperating: acall ADC acall DisplaySuhu acall ControlSuhu jb ControlBit,StartOperating ; acall InitTimer ; Clr P1.4;Menghidupkan Beban ; ;======================================================= ;Main rutine ;1. Memanggil subrutine Control Suhu untuk tetap mempertahankan suhu ; Setting ;2. Memanggil Subrutine Display Waktu Untuk mengetahui waktu sisa ; dari waktu pengoperasian beban ;3. Scan tombol P3.3 untuk kembali ke awal, Scan tombol P3.6 untuk ; menampilkan display suhu, scan tombol P3.7 untuk menampilkan ; display Waktu ;4. Looping Forever akan terjadi untuk dua pilihan tersebut diatas
;======================================================= ForeverWaktu: Acall adc Acall displaySuhuOff Acall ControlSuhu Acall DisplayWaktu jnb P3.3,startAgain jnb P3.6,ForeverSuhu sjmp ForeverWaktu ForeverSuhu: acall adc Acall DisplaySuhu Acall ControlSuhu jnb p3.3, startAgain jnb P3.7,ForeverWaktu sjmp ForeverSuhu ; StartAgain: jnb p3.3,startAgain clr TR0 clr ET0 clr EA sjmp start ; ;======================================================= ;What do you think, I am use for? ;Pada saat label endProses dipanggil maka program akan terus menerus ;bersarang dan terkunci selamanya pada label ini ;====================================================== endProses: mov P0,#11000000b Clr P1.3 Clr P1.2 Clr P1.1 Clr P1.0 jnb p3.3,startAgain sjmp endProses ; ;======================================================== ; L O O K U P T A B L E ; Decoder to Seven Segmen -> g f e d c b a ;========================================================= Decoder7Segmen: DB 11000000b,11111001b,10100100b,10110000b,10011001b DB 10010010b,10000010b,11111000b,10000000b,10010000b ; ;======================================================= ; L O O K U P T A B L E ; Suhu = DataADC*100/255 ;====================================================== ; Pecahan:
db 0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6 db 0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2 db 6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8 db 2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4 db 8,2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6,0 ; Satuan: db 0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9 db 0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9 db 9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8 db 9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8 db 8,9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9,0 ; Puluhan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 db 3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 db 5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 db 7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0 ; Ratusan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ;
KodeKlp1: DB 10100011b,10000111b,10101011b,10001000b KodeKlp2: DB 10001000b,10100011b,10000111b,10101011b KodeKlp3: DB 10101011b,10001000b,10100011b,10000111b KodeKlp4: DB 10000111b,10101011b,10001000b,10100011b end
4. Pengaturan suhu dan waktu ( Display LCD Karakter dan Setting dengan Keypad )
Seperti halnya pada aplikasi pengaturan suhu I, pada aplikasi pengaturan suhu II, dibuat dengan tampilan yang mungkin lebih menarik. Display suhu dan waktu yang sedang berjalan dapat dilihat secara langsung pada layar LCD Character. Setting data suhu dan waktu dapat diinputkan pada Keypad 4 x 4.
Gambar 4. Rangkaian setting waktu dan dan suhu untuk simulasi kontrol ON-OFF dengan display ke LCD Character 2 x 16.
Pada gambar tersebut, mempunyai kemampuan yang sama seperti halnya yang telah kita bahas pada gambar 8.1, yaitu suatu sistem yang mensimulasikan kontrol suhu secara ON-OFF dengan setting melalui tombol-tombola KEYPAD 4 x 4, dan tampilan LCD Character 1 x 16
;=================== ======================== ;DRAFT LISTING PROGRAM SETTING SUHU DAN WAKTU SISTEM CONTROL SUHU ;Pada program ini suhu dan waktu pada sistem dapat disetting dg ;menggunakan tombol keypad dan bila tombol enter ditekan maka ;data akan diterima oleh sistem uC dan tombol Esc ditekan maka ;akan kembali ke awal dari setting. ;Untuk melihat hasil pembacaan suhu atau waktu dapat dilihat
;pada layar LCD.Pada program ini akan ditampilkan waktu ;detik dan menit dengan Format MM:DD dan display suhu dengan format ;000.0 oC Program ini bekerja dengan sistem interupsi yang ;dibangkitkan dari Timer 0 oleh TF0 ;*******************Copyright************************************** ; Forever:Mov @Labcomp,Tri_wiyanto ; sjmp Forever ;J u r u s a n T e k n i k E l e k t r o m e d i k ;P o l i t e k n i k K e s e h a t a n S u r a b a y a ;=================================================== dispclr equ 00000001b funcset equ 00111000b entrmod equ 00000110b dispon equ 00001100b cursor equ 00001110b blink equ 00001101b geserL equ 00011011b geserR equ 00011111b ; kolom1 bit p2.0 kolom2 bit p2.1 kolom3 bit p2.2 kolom4 bit p2.3 baris1 bit p2.4 baris2 bit p2.5 baris3 bit p2.6 baris4 bit p2.7 keyport equ P2 keydata equ 7bh keybounc equ 7ch ; ADC_WR bit P1.5 ADC_INT bit P1.6 ControlBit bit 20h.0 DataADC equ 60h DataSetting equ 61h SettingSatuan equ 65h SettingPuluhan equ 66h SettingRatusan equ 67h detikPuluhan equ 68h detikSatuan equ 69h MenitPuluhan equ 6ah MenitSatuan equ 6bh SuhuSatuan equ 6ch SuhuPuluhan equ 6dh SuhuRatusan equ 6eh DataSetting equ 6fh ; pencacah20 equ 70h pencacah60 equ 71h menit equ 72h jam equ 73h
;============================================== ;Subrutine untuk inisialisasi kerja dari timer ;dengan menggunakan mode 1 timer 0 16 bit ;dan pengaktivan interupsi TF0 ;============================================== InitTimer: clr ControlBit mov pencacah20,#20 mov pencacah60,#60 mov detik,#0 mov menit,#0 acall UpdateDisplay mov TMOD,#00000001b mov tl0,#0b0h mov th0,#03ch setb ET0 setb EA setb TR0 ret ; ;==================================================== ;This is the most importan subrutine, to serve interuption when ;TF0 Timer 0 Call ;Instruksi berikut digunakan untuk memberikan layanan ;interupsi, dan akan terjadi setiap 0.05 detik. atau 50.000 udetik ;maka data yang harus diloadkan 65536- 50000 = 15536 d = 3CB0 h
B0h ke TL1 dan 3C ke TH1 ;Pada subrutine ini pencacah20 akan didecrement sampai ;menghasilkan nilai Pencacah20=0, yang terjadi setiap ;20 X 50000 uS = 20 X 0,05s = 1 s,apabila ini terjadi maka ;akan dipanggil subrutine jamdigital, untuk melakukan increment ;data detik, menit, atau jam ;====================================================
timerinterrupt: mov tl0,#0b0h mov th0,#03ch djnz pencacah20,Endinterupsi mov pencacah20,#20 ; acall ScanSettingJam acall Jamdigital djnz pencacah60,Endinterupsi mov pencacah60,#60 ; acall jamdigital Endinterupsi: reti ; ;============= ====================================== ;Subrutine untuk menambah jumlah cacahan dari jam digital ;Detik dan menit, bila detik sudah menunjukan 60 maka ;counter menit akan bekerja untuk menambah jumlah hitungannnya ;Subritine ini akan dipanggil setiap detik sesuai dg interupsi ;============== ================================= jamdigital: dec detik mov a,#0 cjne a,detik,UpdateDisplay mov detik,#60 ; satumenit: dec menit mov A,#0 cjne A,menit,UpdateDisplay setb P3.3; Mematikan beban ljmp endProses ; UpdateDisplay: mov a,detik mov b,#10 div ab mov detik1,b mov detik10,a ; mov a,menit mov b,#10
div ab mov menit1,b mov menit10,a ret ; ;============ ========================================== ;Rutine untuk display kode dan deteksi tombol enter ;1. Display kode masing-masing kelompok dengan memunculkan inisial ; huruf nama masing-masing anggota kelompok pada 7 segmen. ; Pada contoh ini dimunculkan kode 4 3 2 1 ;2. Deteksi tombol enter dari port P3.3, apabila tidak ditekan maka ; akan memunculkan display 4 3 2 1 terus menerus, bila tombol ditekan ; maka akan melanjutkan instruksi dibawahnya. ;3. Scan Setting waktu yang diperlukan untuk pengoperasian alat dan ; setting akan disimpan bila tombol enter ditekan ;4. Scan Setting suhu yang diinginkan, dan disimpan bila tombol enter ; ditekan ;5. Label Start Operating akan mulai bekerja dengan melakukan control suhu ; sampai suhu tercapai bila suhu tercapai maka timer akan segera ; diinisialisasi dan beban mulai dihidupkan ;====== ================================================ Start: acall Password acall SettingWaktu acall SettingSuhu ; acall Init_LCD acall KalSuhu StartOperating: acall DisplaySuhu acall ControlSuhu jb ControlBit,StartOperating ; acall InitTimer ; Clr P1.4 ;Menghidupkan Beban ; ;======= ================================================= ;Main rutine ;1. Memanggil subrutine Control Suhu untuk tetap mempertahankan suhu ; Setting ;2. Memanggil Subrutine Display Waktu Untuk mengetahui waktu sisa ; dari waktu pengoperasian beban ;3. Scan tombol P3.3 untuk kembali ke awal, Scan tombol P3.6 untuk ; menampilkan display suhu, scan tombol P3.7 untuk menampilkan ; display Waktu ;4. Looping Forever akan terjadi untuk dua pilihan tersebut diatas ;==== ================================================== Forever: Acall DisplaySuhu Acall ControlSuhu Acall DisplayWaktu
; acall keypad4x4 mov a,keydata cjne a,#0ffh,Cancel sjmp Forever Cancel: cjne a,#0fh,Forever ljmp Start ; ;===== ================================================== ; L O O K U P T A B L E ; Suhu = DataADC*100/255 ;===== ================================================== ; Pecahan: db 0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6 db 0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2 db 6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8 db 2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4 db 8,2,6,0,4,8,2,6,0,4,7,1,5,9,3,7,1,5,9,3,7,1,5,8,2,6,0,4,8,2,6,0,4,8,2,5,9,3,7,1,5,9,3,7,1,5,9,3,6,0,4,8,2,6,0 ; Satuan: db 0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9 db 0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9 db 9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8 db 9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8 db 8,9,9,0,0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,0,0,1,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9,0 ; Puluhan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 db 3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 db 5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 db 7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0 ; Ratusan: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ;
KalPassword: db 'Password: ' KalSetTime: db 'Set.Time:00m:00d' KalSetSuhu: db 'Set.Suhu:000.0oC' KalSuhu: db 'S=000.0 oC OnOff' KalWaktu: db 'W=00:00 Esc->Out' KalOk: db 'Ent>Ok Esc>Cncel' KalOn: db 'On ' KalOff: db ' Off' endProses: end
Philips Semiconductor, 80C51 Family Programmer’s Guide and Instruction Set, 1995 ATMEL Semiconductor, 8 Bit Microcontroller with 4 K Bytes Flash, AT89S51
DAFTAR ISI Hal. Pengantar Fitur dan Pin Diskripsi Mikrokontroller 89s51 1