Download

1/12/2011

Pemrograman Bit-Tunggal dan Instruksi-instruksinya

Sasaran

Setelah anda menamatkan bab ini , diharapkan anda dapat :
ð          Memaparkan Instruksi dalam bahasa Assembler 8051 untuk manipulasi bit.
ð          Membuat code instruksi 8051 untuk manipulasi bit pada port.
ð          Menjelaskan bagian mana dalam 8051 yang bisa dialamati bit.

ð          Menjelaskan manipulasi bit atas bendera carry.
ð          Memaparkan intruksi yang bit-relation pada bendera carry pada 8051.


Salah satu andalan yang unik dan hebat nan digjaya dari 8051 adalah operasi bit-tunggal. Instruksi bit-tunggal ini memungkinkan kepada kita untuk men-set, clear, move, dan complemet bit secara mandiri baik itu untuk port, memory, atau register. Pada bab ini ini kita akan menggali instruksi-instruksi ini dalam konteks dari beberapa contoh dan aplikasinya. Pada SubBab 8.1 kita belajar instruksi bit-tunggal yang umum. Dana pada SubBab 8.2 kita menggali instruksi bit-tunggal yang "bit-related" dengan carry.




SubBAB 8.1 Pemrograman Instruksi Bit tunggal

Pada kebanyakan mikroporsesor, data diakses dalam bentuk ukuran byte. Dalam hal pengalamatan byte pada Mikroprosesor, isi register, RAM, atau port, semuanya harus diakses sebagai byte. Dengan kata lain, minimum penanganan terhadap data di dalam mikroprosesor harus dilakukan dalam ukuran byte. Hal yang sama, dilakukan oleh Mikrprosesor seperti Pentium, jika kita ingin mengubah sebuah bit, kita terpaksa harus melibat semua bit-bit dalam satu byte yang bersangkutan. Namun adakalanya kita hanya ingin mengakses satu bit saja , misalnya saat kita ingin menghidupkan atau mematikan sebuah lampu. 8051 sanggup melakukannya operasi bit-tunggal itu. Kemampuan pengalamatan bit ini membuat 8051 menjadi mikroprosesor yang sangat pas untuk keperluan tersebut. Kemampuan dalam menanganan bit-tunggal dari 8051 ini, dan menjadikannya sebagai mikrokontroller 8-bit terbaik yang ada di pasaran. Bagian yang mana dari RAM, register, ROM, dll yang bisa dialamat secara bit ini ? Kita tahu bahwa ROM digunakan untuk menyimpan kode operasi yang berformat byte. Setiap opcode diwakili oleh satu byte, dan beberapa diantaranya ditambah dengan beberapa operand dan alamat relatif yang kesemuaya juga dalam bentuk byte. Dengan alasan ini, kemampuan pengalamat bit dalam ROM menjadi tidak berguna, oleh karena itu dalam 8051, ROM tidak dimasukkan di dalamnya, yaitu sebagai bagian yang bisa dialamati bit. Selebihnya beberapa lokasi RAM, beberapa register, dan port I/O dibuat untuk bisa dialamati secara bit. Kesemuanya akan dibahas satu per satu.

Instruksi Bit-Tunggal

Instruksi-instruksi untuk operasi bit-tunggal dapat kita lihat  dalam Table 8.1. Dalam SubBab ini kita akan menbahas instruksi tersebut dan memberikan contoh penggunaannya. Intruksi bit-tunggal yang hanya berpengaruh untuk CY akan dibahas di bagian lain.

Tabel 8.1 Instruksi-instruksi Bit Tunggal
Instruksi          keterangan
SETB bit           Men-set bit (bit=1)
CLR  bit           men-clear bit (bit=0)
CPL  bit           complement bit ( bit = NOT bit)
JB   bit,target    Lompat ke target jika bit = 1 (jumop if bit)
JNB  bit,target    Lompat ke target jika bit = 1 (jumop if bit)
JNC  bit,target    Lompat ke target dan clear bit,jika bit = 1 (jumop if bit)


Port I/O dan Kemampuan Pengalamatan-Bit

8051 memiliki 4 port, masing-masing port disebut sebagai P0, P1, P2, dan P3. Kita dapat mengakses port-port ini sebagai 8-bit, maupun sebagai bit tunggal tanpa mempengauhi bit-bit yang lain. Saat kita hendak mengakses satu bit dalam port tersebut kita dalam menggunakan perintah seperti "SETB X.Y", dimana X dapat berupa P0, P1, P2, atau P3. Sedang Y adalah nomor bit yang dibutuhkan yaitu diantara 0 s/d 7 untuk data bit D0 s/d D7. Contohnya, " SETB P1.5", yaitu men-Set bit ke-5 dari Port P1. Ingat D0 adalah LSB dan D7 adalah MSB. Liihat contoh 8-1.


Contoh 8-1

Tulis program berikut.
(a)    Buat gelombang kotak dengan siklus kerja 50% pada bit-0 dari P1.
(b)    Buat gelombang kotak dengan siklus kerja 66% pada bit-3 dari P1.

Jawaban:

(a) siklus kerja 50% berarti lama status "on" dan "off" (atau high atau low) memiliki panjang yang sama.Selanjutnya kita akan men-toggle P1.0 yang ditambahkan Tundaan untuk setiap state-nya.

ULANG:      SETB  P1.0       ;Set tinggi untuk bit 0 dari port 1
            LCALL DELAY      ;Panggil Tundaan
            CLR   P1.0       ;Reset menjadi rendah
            LCALL DELAY      ;Panggil Tundaan
            SJMP ULANG       ;Terus kerjakan

Cara lain dalam penulisan program adalah sebagai berikut.

ULANG:      CPL   P1.0       ;buat Complement dari P1.0
            LCALL DELAY      ;Panggil Tundaan
            SJMP ULANG       ;Terus kerjakan


(b) Sedang siklus kerja 66%, berarti status "on" memiliki lama sebanyak 2 kali dari status "off".

ULANG:      SETB  P1.3       ;Set tinggi untuk bit 3 dari port 1
            LCALL DELAY      ;Panggil Tundaan
            LCALL DELAY      ;Panggil Tundaan 2 kali
            CLR   P1.3       ;Reset menjadi rendah
            LCALL DELAY      ;Panggil Tundaan
            SJMP ULANG       ;Terus kerjakan




Harap dicatat saat ada instruksi seperti "SETB P1.0" di kompilasi, instruksi tersebut akan otomatis diubah menjadi "SETB 90h" karena P1.0 memiliki alamat bit 90h. Dari gambar 8.1 kita melihat bahwa alamat bit dari P1 adalan 90h s/d 97h, dan seterusnya. Gambar 8.1 juga menunjukkan semua register yang bisa dialamati bit.

Tabel 8-2 Port-port yang bisa dialamati-bit
P0          P1          P2          P3          Bit Port
P0.0        P1.0        P2.0        P3.0        D0
P0.1        P1.1        P2.1        P3.1        D1
P0.2        P1.2        P2.2        P3.2        D2
P0.3        P1.3        P2.3        P3.3        D3
P0.4        P1.4        P2.4        P3.4        D4
P0.5        P1.5        P2.5        P3.5        D5
P0.6        P1.6        P2.6        P3.6        D6
P0.7        P1.7        P2.7        P3.7        D7



Contoh 8-2

Untuk setiap instruksi berikut ini,
Gunakan gambar 8-1.
(a) SETB  86h      (b) CLR 87h       (c) SETB 92h
(d) SETB  0A7h     (e) CLR 0F2h      (f) SETB 0E7h

Jawaban:

(a) SETB 86h  sama dengan SETB P0.6
(b) CLR  87h  sama dengan CLR  P0.7
(c) SETB 92h  sama dengan SETB P1.2
(d) SETB 0A7h sama dengan SETB P2.7
(e) CLR  0F2h sama dengan CLR  B.2    yaitu bit-2 dari register B
(f) SETB 0E7h sama dengan SETB ACC.7  yaitu bit-7 dari register ACC



Memeriksa Bit Input

Instruksi JNB (jump if bit not set) dan JB (Jump if bit set) digunakan untuk operasi bit-tunggal. Dengan instruksi tersebut kita dapat memonitor bit dan membuat keputusan berdasarkan kemungkinan 0s atau 1s. Lihat Contoh 8-3.

Contoh 8-3

Anggaplah bahwa bit P2.3 adalah input dan merupakan representasi kondisi dari oven pemanas. Jika bit tersebut menjadi tinggi, dapat berarti oven dalam keadaan panas. Periksa bit terus menerus. Begitu dia tinggi, kirim pulsa tinggi ke rendah pada port P1.5 untuk menyalakan buzzer.

Jawaban:

ULANG:     JNB  P2.3,ULANG     ;Terus monitor Port
           SETB P1.5           ;Set bit P1.5
           CLR  P1.5           ;Clear P1.5 untuk membuat pulsa H-L



Register dan kemampuan Pengalamatan-Bit.

Jika semua port I/O dapat dialamati-bit, ternyata tidak semua register juga bisa dialamati-bit. Seperti yang kita lihat pada gambar 8-1. Kita hanya akan mendapatkan register B, PSW, IP, IE, ACC, SCON, dan TCON yang termasuk memiliki kemampuan bisa dialamati-bit. Dari beberapa register yang bisa dialamati-bit tersebut, kita akan berkonsentrasi pada ACC, B dan PSW. Sedang register yang lain akan kita bahas pada bab yang lain. Dari gambar 8-1 dapat kita lihat bahwa bit-bit port-0 memiliki alamat 80h s/d 87h. Dan alamat 88h s/d 8Fh adalah alamat yang digunakan untuk register TCON. Dan terakhir F0h dan F7h ditempatkan pada register B. Lihat contoh 8-4 dan ontoh 8-5 yang memperlihatkan penggunaan register ini dalam hal pengalamatan secara bit.


Gambar 8-1. Alamat-alamat SFR (byte dan Bit)


Contoh 8-4

Tulis program untuk melihat apakah isi akumulator memiliki nilai genap. Jika ya, bagilah dengan 2. Jika tidak, maka buatlah menjadi genap, baru bagi menjadi 2.

Jawaban:

            MOV B,#2           ;B=2
            JNB ACC.0,YES      ;Jika D0 (dari A) = 0 ? Jk ya lompat
            INC A              ;Ganjil, buatlah menjadi genap
YES:        DIV AB             ;A/B



Contoh 8-5

Tulis program untuk melihat apakah bit 0 dan 5 dari register B adalah tinggi (1′s). Jika tidak, buatlah menjadi tinggi dan simpan pada R0.

Jawaban:

            JB   0F0h,LANJUT_1   ;lompat jika B.0 = tinggi
            SETB 0F0h            ;jadikan tinggi
LANJUT_1:   JB   0F5h,LANJUT_2   ;lompat jika B.5 = tinggi
            SETB 0F5h            ;jadikan tinggi
LANJUT_2:   MOV  R0,B            ;Simpan pada R0




 

RS1       RS0        Register Bank          Alamat
0         0             0                 00h s/d 07h
0         1             1                 08h s/d 0Fh
1         0             2                 10h s/d 17h
1         1             3                 18h s/d 1Fh

Gambar 8-2. Bit-bit pada register PSW


Seperti yang kita diskusikan pada Bab 2 bahwa register PSW memiliki dua bit yang digunakan untuk memilih bank bagi register kerja R0 s/d R7. Kita dapat memilih bank dari register kerja tersebut melalui kemampuan PSW untuk dialamati secara bit. Hal tersebut cukup dengan mengakses bit 3 dan 4 dari register PSW atau juga yang disebut RS0 dan RS1.


Contoh 8-6

Tulis program untuk menyimpan akumulator ke dalam R7 di bank 2.

Jawaban:

        CLR  PSW.3
        SETB PSW.4
        MOV  R7,A

Contoh 8-7

Jika ada instruksi seperti JNC dan JC untuk memeriksa kondisi bit bendera Carry, namun tidak ada perintah seperti itu untuk memeriksa bit bendera Overflow (OV). Bagaimana kita menulis program untuk memeriksa OV ?

Jawaban:

Bendera OV juga disebut PSW.2, yakni nama bit anggota register PSW. PSW adalah register yang bisa dialamati-bit, sehingga kita dapat menggunakan perintah berikut untuk memeriksa OV.

        JB  PSW.2,target      ;lompat jika OV = 1

 RAM yang bisa Dialamati bit

Dari 128 byte RAM internal dalam 8051 hanya 16-byte yang bisa dialamati secara bit (selain juga secara byte), yakni RAM dengan lokasi 20h s/d 2Fh. Sedang lokasi RAM yang lain, harus diakses secara byte. Ke 16-byte yang bisa dialamati-bit ini dapat menyediakan maksimum 128 bit yang doalokasikan dengan alamat mulai dari 0 s/d 7Fh. Lokasi bit tersebut berurutan mulai dari bit terkecil mulai RAM-byte lokasi 20h. Bit ke 8 s/d 15 di RAM-byte lokasi 21h. Dan seterusnya sampai bit terakhir, yakni bit 128 (7Fh) pada RAM-byte lokasi 2Fh. Perhatikan gambar 8-3 dan 8-1 untuk memperjeas kedudukan bit di dalam RAM-byte.
Gambat 8-3 RAM Internal 128 byte
Contoh 8-8

Carilah byte yang mana yang ditempati oleh masing-masing bit berikut ini. Berikan alamat dari RAM dalam bilangan hex.
(a) SETB 42h                  (d) SETB 28h
(b) CLR  67h                  (e) CLR  12
(c) CLR  0Fh                  (f) SETB 05

Jawaban:

(a) lokasi bit RAM 42h adalah di D2 dari RAM lokasi 28h
(b) lokasi bit RAM 67h adalah di D7 dari RAM lokasi 2Ch
(c) lokasi bit RAM 0Fh adalah di D7 dari RAM lokasi 21h
(d) lokasi bit RAM 28h adalah di D0 dari RAM lokasi 25h
(e) lokasi bit RAM 12  adalah di D4 dari RAM lokasi 21h
(f) lokasi bit RAM 05  adalah di D5 dari RAM lokasi 20h



Salah satu kegunaan RAM yang bisa dialamati bit adalah untuk menyimpan status sebuah bit. Misalnya digunakan sebagai menunjuk status sebuah lampu yang cukup diwakili dengan hanya satu bit. Lihat contoh 8-9.


Contoh 8-9

Status dari bit P1.2 dan P1.3 dari I/O port P1 harus disimpan sebelum mereka berubah. Tulis program untuk menyimpan status dari port-port tersebut pada bit lokasi 06 untuk P1.2 dan bit lokasi 07 untuk P1.3.

Jawaban:

          CLR  06            ;Clear bit lokasi 06
          CLR  07            ;Clear bit lokasi 07
          JNB  P1.2,LANJUT   ;periksa bit P1.2, lompat jika 0
          SETB 06            ;Set bit lokasi 06
LANJUT:   JNB  P1.3,SELESAI  ;periksa bit P1.3, lompat jika 0
          SETB 07            ;Set bit lokasi 07
SELESAI:  …
SubBAB 8-2: Operasi bit dengan CY

Di samping yang kita tahu bahwa CY (Carry Flag) adalah bit yang paling berpengaruh pada operasi aritmatika dan logika, 8051 memiliki beberapa instruksi yang dimana CY dapat dimanipulasi secara langsung. Instruksi ini ditampilkan pada Tabel 8-3.
Dari instruksi-instruksi pada tabel 8-3, kita ditunjukkan penggunaan JNC , JC, CLR dan SETB di dalam beberapa contoh pada beberapa bab sebelumnya. Selebihnya dari SubBAB ini adalah menunjukkan bagaimana menggunakan beberapa instruksi lainnya seperti dalam table 8-3.
Beberapa instruksi dari Tabel 8-3 terkait dengan operasi logika AND dan OR, contoh penerapannya dapat anda lihat pada contoh berikutnya ini.
Pada BAB yang mendatang kita dapat melihat menggunaan instruksi-instruksi seperti pada table 8-3 lebih instensif di dalam program aplikasi sebenarnya (real-word application).


Tabel 8-3 Instruksi yang Bit-Related dengan Carry
Instruksi         Gunanya
SETB C            membuat CY = 1
CLR  C            membuat CY = 0
CPL  C            Complemnet CY  <== not CY
MOV  bit,C        salin CY ke dalam bit
MOC  C,bit        salin bit ke dalam CY
JNC  target       lompat jika CY = 0
JC   target       lompat jika CY = 1
ANL  C,bit        CY –AND- bit , dan simpan hasil pada CY
ANL  C,/bit       CY –AND- (kebalikan bit) , dan simpan hasil pada CY
ORL  C,bit        CY –OR- bit , dan simpan hasil pada CY
ORL  C,/bit       CY –OR- (kebalikan bit) , dan simpan hasil pada CY
Contoh 8-10

Tulis progam untuk menyimpan status dari bit P1.2 dan P1.3 ke dalam RAM, masing-masing dengan lokasi bit 6 dan 7.

Jawaban:

          MOV  C,P1.2     ;simpan status dari P1.2 pada CY
          MOV  06,C       ;simpan ke dalam memory ( bit 06 = 20h.6)
          MOV  C,P1.3     ;simpan status dari P1.3 pada CY
          MOV  07,C       ;simpan ke dalam memory ( bit 07 = 20h.7)

Contoh 8-11

Anggaplah RAM bit dengan lokasi 12h menyimpan status keadaan adanya panggilan telepon atau tidak. Jika tinggi, berarti ada panggilan baru. Tulis prtogram untuk menulis LCD "New Messages" jika RAM bit 12h tersebut tinggi. Namun jika rendah maka LCD tetap bertuliskan "No New Messages".

Jawaban:

          MOV   C,12h       ;salin bit 12h pada C
          JNC   NO          ;periksa CY, apakah tinggi
          MOV   DPTR,#400h  ;Jika ya, isikan dengan alamat tulisan
          LCALL DISPLAY     ;Tulis pada LCD
          SJMP  KELUAR      ;program selesai
NO:       MOV   DPTR,#420h  ;Jika ya, isikan dengan alamat tulisan
          LCALL DISPLAY     ;Tulis pada LCD
KELUAR:   …

;—————-data yang dikirim pd LCD
          ORG 400h
TES_MG:   DB "New Messages"
          ORG 420h
NO_MG:    DB "No New Messages"



Contoh 8-12

Anggaplah bahwa bit P2.2 digunakan untuk mengkontrol lampu halaman dan bit P2.5 untuk mengontrol lampu dalam ruangan. Tunjukkan bagaimana untuk menyalakan lampu halaman dan mematikan lampu ruangan.

Jawaban:

          SETB C          ;CY=1
          ORL  C,P2.2     ;CY <==  P2.2 di-OR dengan CY
          MOV  P2.2,C     ;nyalakan "on" jika belum "on"
          CLR  C          ;CY=0
          ANL  C,P2.5     ;CY <==  P2.5 di-AND dengan CY
          MOV  P2.5,C     ;matikan "off" jika belum "off"





SubBAB 8.3: Membaca Pin Input atau Port Latch.

Saat membaca port, beberapa instruksi adalah membaca status dari pin milik port. Instruksi yang lain adalah membaca status dari gerendel(latch) milik port. Sehingga kita mendapatkan dua kemungkinan untuk membaca sebuah port:
1.    Membaca status dari pin
2.    Mambaca status dari Latch
Tentu saja kita tidak boleh dibingungkan dengan dua kategori tersebut. Namun kesalahan dalam menetukkan instruksi yang tepat akan membuat program tidak seperti yang kita harapkan. Lalu mana yang hendak kita gunakan?. Kita menggunakan instruksi membaca pin milik port misalnya dengan instruksi "MOV A,P1", "JNB P1.2,label", atau "MOV C,P3.0", adalah saat kita membaca status dari peralatan lain misalnya saklar, comparator dll yang terhubung pada port tersebut. Pada saat membaca pin tersebut latch port harus dibuat tinggi, agar port bertindak sebagai port input, yakni cukup dengan "MOV P1,#0FFh" atau "SetB P1.1". Dengan demikian status yang diberikan terhadap port dapat langsung dibaca. Namun saat kita handak memaca status latch dari port tersebut tanpa meperdulikan status dari pin yang terhubung dengan peralatan lain, kita dapat menggunakan perintah seperti "XRL P1,#0Fh", "INC P2", "DJNZ P3,Label". Nilai port bukan seperti status yang diberikan terhadap pin milik port tersebut, melainkan status latch internal. Adapun fungsi darilatch ini adalah untuk keperluan port dalam tugasnya sebagai port output.


Instruksi-instruksi untuk membaca Input Port

Dalam BAB 4, untuk dapat membuat port dalam 8051 dapat bekerja sebagai port input, kita harus menulis port tersebut sebagai 1′s (high). Sebenarnya yang kita tulis terhadap port tersebut adalah menulis latch. Setelah membuat latch tersebut menjadi tinggi, data diluar CPU yang dihubungkan pada pin kemudian dapat dibaca. Berikut ini adalah tabel untuk instruksi-instruksi pembacaan status pin.

Tabel 8-4 Instruksi-instruksi untuk membaca Input Port
Mnumonic          Contoh            Keterangan
MOV A,Px          MOV A,P2          Mengambil data dan disimpan pada A
JNB Px.y,Label    JNB P2.1,Target   Lompat jika pin P2.1 = rendah
JB  Px.y,Label    JB  P2.1,Target   Lompat jika pin P2.1 = tinggi
MOV C,Px.y        MOV C,P3.0        Ambil data bit dan simpan pd C


Membaca Latch untuk Port Output

Beberapa instruksi dapat digunakan untuk membaca isi dari latch internal milik port disamping instruksi untuk membaca status dari pin eksternal. Tabel 8-5 memberikan daftar dari instruksi tersebut. Misalnya contoh, lihat pada instruksi "ANL P1,A". Urutan kejadian dari instruksi tersebut saat dieksekusi adalah sebagai berikut.
1.    Membaca latch internal dari port dan mambawa data nya pada CPU.
2.    Data tersebut di-AND dengan isi register A.
3.    Hasil dari AND tersebut kemudian dikembalikan pada latch.
4.    Pin dari port kemudian mungkin berubah menurut perubahan status dari latch port yang bersangkutan.

Dari pemaparan di atas kesimpulannya adalah instruksi untuk membaca lacth, adalah kira-kira sebagai berikut, yaitu adalah membaca status latchnya, melakukan operasi tertentu, dan kemudian menuliskan hasil operasi, kembali pada latch port. Hal ini kemudian disebut sebagai "Read-Modify-Write". Tabel 8-5 menunjukkan kepada kita daftar instruksi read-modify-write yang menggunakan port sebagai tujuan destination.
5.    semua instruksi read-modify-write tersebut harus menggunakan port sebagai operand. Dengan kata lain instruksi tersebut hanya bekerja  untuk port, dan digunakan sebagai port output.

Tabel 8-5 Instruksi-instruksi untuk membaca Latch
Mnumonic                Contoh
ANL  Px                 ANL  P0
ORL  Px                 ORL  P3                
XRL  Px                 XRL  P1                
JBC  Px.y,target        JBC  P1.1,target       
CPL  Px.y               CPL  P3.1
INC  Px                 INC  P2
DEC  Px                 DEC  P1
DJNZ Px,target          DJNZ P3,target
MOV  Px.y,C             MOV  P1.0,C
CLR  Px.y               CLR  P1.2
SETB Px.y               SETB P2.1

RINGKASAN
Bab ini menjelaskan operasi bit-tunggal pada 8051, yang merupakan salah satu andalan paling hebat dari 8051. Instruksi bit-tunggal memberikan programer kemudahan untuk men-set, clear, move, dan complement bit secara individual terhadap bit-bit port, memory, dan register.

Selebihnya, ada beberapa instruksi dimana bendera Carry dapat dimanipulasi secara langsung. Kita juga mendiskusikan instruksi untuk membaca status pin pada port, dan juga membaca status latch pada port.

0 komentar:

Post a Comment

Newer Post Older Post Home
Aulia DirUt. Powered by Blogger.
 

Followers

 

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger