Pada postingan
terdahulu yang berjudul Mempelajari Data Remot Infra Merah TV, sobat
semua sudah melihat bagaimana format data dari TFT-LCD Monitor/TV Remote. Di
postingan tersebut sobat juga melihat bagaimana bentuk sinyalnya.
Nah untuk
mengetahui bagaimana isi data dari masing-masing tombol, dipostinganku kali
ini, sobat akan aku ajak melihat sebuah rangkaian sederhana untuk membaca data
remot dan kemudian sebagai tampilannya akan menggunakan aplikasi Hyper Terminal
yang ada pada PC.
Aplikasi Hyper
Terminal dapat dibuka melalui All Programs – Accessories – Communications. Pada
dibuka maka aplikasi akan menampilkan jendela Connection Description. Sobat
bisa mengisi pada kotak isian Name dengan “Remot” (sebagai contoh saja) lalu
klik OK.
Selanjutnya akan
muncul jendela Connect To. Di sini kita bisa memilih pada Connect using
kita tetapkan gerbang COM1 sesuai dengan gerbang serial RS-232 yang digunakan.
Selanjutnya akan
muncul jendela COM1 Properties. Pastikan sobat memilih Bit per second dengan
kecepatan 9600 sesuai dengan kecepatan alat yang akan digunakan nanti.
Maka sobat akan
melihat tampilan dari aplikasi Hyper Terminal seperti berikut ini:
Nah, di atas adalah
cara membuka fasilitas Hyper Terminal. Selanjutnya kita akan membahas soal
rangkaian yang akan digunakan untuk membaca remot. Aku menggunakan modul DT-51
Low Cost Nano System (LCNS) tapi untuk mempermudah sobat maka bisa kita buatkan
secara khusus rangkaian tersebut.
Untuk menjalankan
mikrokontroler AT89C2051 atau AT89S2051 maka perlu memasukkan program sebagai
berikut:
$mod51
IR_Sensor bit p3.7
RegRemote data 10h
RegStack data 20h
Pertama kita
menetapkan parameter IR_Sensor untuk masukan data sensor pada gerbang P3.7,
kemudian menentukan register tempat menyimpan data pada RegRemote pada alamat
RAM 10H. Juga menentukan RegStack pada 20H untuk penunjuk Stack Pointer.
org 0h
mov sp, RegStack-1
mov scon, #50h
mov tmod, #20h
mov tl1, #0fdh
mov th1, #0fdh
mov ie, #90h
ajmp Mulai
Pada awal program
yaitu alamat 0000H, pertama mengisi register SP dengan RegStack-1 berarti nanti
isi register SP adalah 1FH (20H-1).
Isi register SCON
(serial port control register) dengan 50H atau 01010000B. Bit-bit SCON.7 (SM0=serial
mode 0) dan SCON.6 (SM1) untuk menetapkan serial mode dengan nilai 01, di mana
kita memilih MODE 1 untuk 8 bit UART dengan baudrate diatur secara variabel.
Bit lainnya yang diset ke tinggi adalah SCON.4 (REN=receive enable) untuk
mengaktifkan kendali penerimaan melalui software.
Register berikutnya
adalah TMOD (timer/counter mode control register) dengan isi 20H atau
00100000B. Di sini kita menetapkan bit TMOD.7 ke rendah (GATE=0) untuk
mengendalikan secara software dan mengaktifkan Timer/counter 1 sebagai timer
dengan menetapkan bit TMOD.6 (C/T) ke rendah. Lalu menetapkan bit-bit TMOD.5
(M1) dan TMOD.4 (M0) pada MODE 2 yaitu 8 bit auto-load. Berkaitan dengan
penetapan register TMOD, selanjutnya kita perlu menetapkan isi
register-register TL1 (timer low 1) dan TH1 (timer high 1) dengan 0FDH. Karena
kita menggunakan frekuensi osilator 11.059.200 hertz maka diperoleh kecepatan
baudrate bersesuaian dengan 9.600 bps (bit per second).
Isi register IE
(interrupt enable register) dengan 08H atau 00001000B untuk mengeset bit IE.7
(EA=enable all) mengaktifkan semua interupsi, mengereset bit IE.4 (ES=enable
serial) menjadi rendah untuk menon-aktifkan interupsi gerbang serial dan
mengeset bit IE.3 (ET1=enable timer 1) untuk menjalankan interupsi timer 1 overflow.
Catatan: bit ES
tidak digunakan karena kita tidak memerlukan interupsi penerimaan secara
serial. Alat kita hanya berfungsi mengirim saja.
Akhirnya program
melompat ke alamat Mulai (AJMP Mulai).
Kirim: mov sbuf, a
jnb ti, $
clr
ti
ret
Baris berikutnya
adalah sub-rutin untuk pengiriman data secara serial. Baris pertama MOV SBUF, A
untuk memindahkan isi register akumulator ke register SBUF (serial buffer).
Setelah register SBUF terisi maka data tersebut secara otomatis akan terkirim
dan proses pengiriman tersebut diperiksa bendera interupsi pengiriman (transmit
interrupt flag) dengan perintah JNB TI, $ yang berada pada bit SCON.2 (TI).
Setelah pengiriman selesai maka bit TI ini akan tinggi dan program menjalankan
baris berikutnya yaitu me-reset bit TI menjadi rendah dengan perintah CLR. Sub
rutin pun selesai dan mengakhirinya dengan perintah RET.
Mulai:
mov r0, #RegRemote
jb IR_Sensor, $
acall IR_READ
jz Mulai
mov a, @r0
cjne a, #0dfh, BukanRepeater
ajmp Mulai
Pada rutin Mulai,
pertama kita isi register R0 dengan alamat buffer RegRemot. Kemudian baris
selanjutnya menunggu masukan sensor dengan perintah JB IR_Remote, $ yang akan
mengulangi perintah ini sampai mendeteksi sinyal rendah dari sensor remot infra
merah. Jika sinyal rendah IR-Sensor terdeteksi maka selanjutnya memanggil sub
rutin IR_READ.
Setelah data remote
diperoleh maka rutin memeriksa akumulator jika kosong maka ada kesalahan dan
kembali ke Mulai. Jika tidak kosong, selanjutnya program mengambil byte MSB
pertama dengan 0DFH yang merupakan data repeater. Jika bukan maka data diproses
pada rutin BukanRepeater, sebaliknya jika sama kembali ke alamat Mulai.
Catatan: perintah
CJNE untuk memeriksa data 0DFH diperlukan karena kemungkinan tombol ditekan
dalam waktu yang lama. Sementara data yang akan kita kirim hanyalah data yang
valid saja. Jadi setelah program mengirim data yang valid dan kembali membaca
sensor maka yang diterima adalah sinyal repeater yang tentu diabaikan saja.
Sinyal repeater akan terus muncul selama kita menekan tombol dan baru akan data
tombol yang valid hanya pada saat menekan tombol.
BukanRepeater:
mov r7, #7
Pada rutin BukanRepeater, kita hanya mengisi panjang data yang
akan dikirim yaitu 7 byte saja. Selanjutnya adalah mengirim data tersebut
dengan rutin Data_IR.
Data_IR:
mov a, @r0
inc r0
acall Kirim
djnz r7, Data_IR
mov a, #0dh
acall Kirim
mov a, #0ah
acall Kirim
ajmp Mulai
Rutin Data_IR,
pertama mengisi akumulator dengan buffer yang ditunjukkan oleh register R0. Kemudian
menaikkan isi register R0 untuk menunjuk alamat berikut dari buffer. Data
akumulator selanjutnya dikirim dengan sub rutin Kirim.
Setelah ketujuh
byte terkirim sesuai perintah DJNZ maka selanjutnya mengisi akumulator dengan
0DH dan mengirimnya lalu 0AH dan juga mengirimnya. Data 0DH pada daftar ASCII
adalah sama dengan ENTER dan 0AH adalah LINE FEED atau baris berikut. Setelah
selesai mengirim seluruh data maka program kembali ke awal yaitu rutin Mulai.
$include (c:\asembly\remot\irremot1.txt)
end
Program yang
ditulis di atas membutuhkan file modul yang bernama irremot1.txt untuk
menjalankan perintah pembacaan remot. Subrutin untuk membaca remot sengaja aku buat sederhana saja yang penting
berdaya guna, berhasil guna dan utamanya bisa jalan.
Subrutin berikut ini akan membaca data remot dan menyimpannya pada alamat
register yang ditunjukkan oleh Register 0 (R0). Rinciannya seperti ini:
IR_READ:
push 00h
jnb IR_Sensor, $
mov r6, #7
Seperti sobat ketahui pada postingan aku
sebelumnya bahwa remot akan mengirim logika rendah selama kurang lebih 8 ms dan
memulai bit data logika tinggi setelahnya. Tapi karena pastinya setelah 8 ms
adalah logika tinggi maka tanpa menggunakan fasilitas interupsi akhirnya
menggunakan perintah JNB setelah sebelumnya menyimpan isi register R0. Kemudian
menyiapkan register R6 untuk banyaknya byte data yaitu 7 byte.
Berikutnya kita persiapkan jumlah bit
dalam satu byte dengan menetapkannya pada register R5.
BacaByte_IR:
mov r5, #8
Sekarang akan kita looping 8 bit data
dari remot dengan memeriksa logika pada gerbang masukan yang diberi nama IR_Sensor
dengan perintah JB. Jika masukan IR_Sensor rendah maka rutin akan membuat bit
Carry menjadi rendah dengan perintah CLR C baru melanjutkan melompat ke rutin
untuk merotasi data. Sebaliknya jika ternyata masukan IR_Sensor tinggi maka
kita perlu membuat bit Carry juga tinggi dengan perintah SETB C.
BacaSerial_IR:
jb IR_Sensor, BacaTinggi_IR
clr c
ajmp RotasiData_IR
BacaTinggi_IR:
setb c
Setelah kita mengidentifikasi logika
masukan dan direpresentasikan melalui bit Carry maka selanjutnya adalah
memasukkan status bit tersebut ke akumulator dengan merotasi ke kiri sehingga
bir Carry ini akan berpindah ke akumulator pada ACC.0.
Nah, proses mengambil 1 bit data dari
remot sudah selesai. Kita akan mengambil
bit-bit berikutnya namun sebelum itu perlu menunggu selama 1 ms untuk munculnya
bit yang sah berikutnya. Untuk itu kita menggunakan pemanggilan subrutin
bernama Pulsa. Perintah ACALL PULSA ini kita panggil selama 2 kali. Setelah
tundaan cukup, berikutnya kita memeriksa isi register R5 dengan perintah DJNZ.
RotasiData_IR:
rlc a
acall Pulsa
acall Pulsa
djnz r5, BacaSerial_IR
mov @r0, a
inc r0
djnz r6, BacaByte_IR
ret
Ke-8 bit data sudah masuk ke akumulator.
Kita hanya perlu menyimpannya ke alamat register yang ditunjukkan oleh register
R0. Pada program awal alamat awal register tempat menyimpan data adalah
REGREMOT. Setelah itu kita siapkan alamat register berikutnya dengan menaikkan
isi register R0 dengan INC dan memeriksa register R6 untuk menyelesaikan 6 byte
data sisanya dengan mengulangi rutin BacaByte_IR.
Subrutin yang diperlukan untuk member tundaan
sesuai perioda pulsa remot adalah sebagai berikut:
Pulsa:
mov r7, #255
djnz r7, $
ret
Kita mengisi register R7 dengan nilai 255 atau setara dengan heksa FF
dengan kata lain ini adalah nilai tertinggi yang bisa ditampung. Kemudian me-loop
register R7 ke alamatnya sendiri.
Lamanya pulsa dapat dihitung sesuai siklus setiap perintah. Jika
perintah ACALL dimasukkan dengan jumlah siklus 2, kemudian MOV dengan 1 siklus
dan RET 2 siklus maka jika ditambah dengan DJNZ yang 2 siklus dikalikan 255
maka hasilnya mikrokontroler akan membutuhkan 260 siklus untuk menyelesaikan
perintah di atas. Karena kita menggunakan Kristal dengan frekuensi 11.059.200
Hz dan setiap siklus adalah 1/12 dari frekuensi yaitu sekitar 1,085 ms maka
hasilnya adalah 282 ms.
Udah ya, makasih
udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan
oleh sobat semua.
Salam....
bisa kursus mikrokontroler g bos?
BalasHapustolong hbngi 081903095187
Pengen belajar, tapi mulai dari mana dl ya? :/
BalasHapusIde menarik tuh. Nanti kalau senggang saya buat rangkuman deh soal teknik digital dan mikrokontroler. Sebenarnya sih ada bukunya atau cari di internet juga ada. Apa perlu kita bikin institusi nih he...he
BalasHapusSoal mulai dari mana mungkin dari dasar kali ya. Dasar-dasar elektronika dilanjutkan ke teknik digital terus baru masuk ke mikrokontroler ditambah dengan pengenalan bahasa pemrograman asembli, C atau basic.