Translate

Membaca Data Remot Dengan Aplikasi Hyper Terminal Menggunakan AT89C2051



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....

3 komentar:

  1. bisa kursus mikrokontroler g bos?

    tolong hbngi 081903095187

    BalasHapus
  2. Pengen belajar, tapi mulai dari mana dl ya? :/

    BalasHapus
  3. Ide 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

    Soal 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.

    BalasHapus