Pengertian Set Instruksi Mikrokontroler

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.


Mengenal Set Instruksi 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.

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

2. 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
MOVC A,@A+PC ;PC 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
| Mnemonic          | Operation                        | Addressing Mode   |     |     |     | Exect.   |
|-------------------|----------------------------------|-------------------|-----|-----|-----|----------|
|                   |                                  | Dir               | Ind | Reg | Imm | Timer uS |
| Mov A,<src>       | A=<src>                          | V                 | V   | V   | V   | 1        |
| Mov <dest>,A      | <dest>=A                         | V                 | V   | V   | V   | 1        |
| Mov <dest>, <src> | <dest>=<src>                     | V                 | V   | V   | V   | 1        |
| Mov DPTR,#data16  | DPTR=16 bit immediate const      | Accumulator Only  |     |     |     | 1        |
| Push <src>        | Inc SP                           | V                 | V   | V   |     | 1        |
| Pop <src>         | Dec SP                           | Data Pointer Only |     |     |     | 2        |
| Xch A,<byte>      | Acc and <byte> exchange data     | Accumulator Only  |     |     |     | 1        |
| Xchd A,@Ri        | Acc and @Ri exchange low nibbles | V                 | V   | V   |     | 1        |

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

ADD A,R0 ; register serba guna
ADD A,#$23 ; bilangan konstan
ADD A,@R0 ; no memori tak langsung
ADD A,P1 ; no memori langsung (port 1)

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.

Table 1.3. Instruksi Aritmatika

| Mnemonic      | Operation             | Addressing Mode        |     |     |     | Exect.   |
|---------------|-----------------------|------------------------|-----|-----|-----|----------|
|               |                       | Dir                    | Ind | Reg | Imm | Timer uS |
| Add A,<byte>  | A=A+<byte>            | V                      | V   | V   | V   | 1        |
| Addc A,<byte> | A=A+<byte>+C          | V                      | V   | V   | V   | 1        |
| Subb A,<byte> | A=A-<byte>-C          | V                      | V   | V   | V   | 1        |
| Inc A         | A=A+1                 | Accumulator Only       |     |     |     | 1        |
| Inc <byte>    | <byt>=<byt>+1         | V                      | V   | V   |     | 1        |
| Inc DPTR      | DPTR=DPTR+1           | Data Pointer Only      |     |     |     | 2        |
| Dec A         | A=A-1                 | Accumulator Only       |     |     |     | 1        |
| Dec <byte>    | <byt>=<byt>-1         | V                      | V   | V   |     | 1        |
| Mul AB        | B:A=BxA               | Accumulator and B Only |     |     |     | 4        |
| Div AB        | A=Int[A/B] B=Mod[A/B] | Accumulator and B only |     |     |     | 4        |
| DA A          | Dec Adjust            | Accumulator Only       |     |     |     | 1        |

4. Instruksi Logika

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.

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,#%01111110 akan mengakibatkan bit 0 dan bit 7 dari Port 1 (P1) bernilai '0' sedangkan bit-bit lainnya tetap tidak berubah nilai.

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,#%01111110 akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator bernilai '1' sedangkan bit-bit lainnya tetap tidak berubah nilai.

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,#%01111110 akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator berbalik nilai, sedangkan bit-bit lainnya tetap tidak berubah nilai.

| Mnemonic         | Operation                   | Addressing Mode        |     |     |     | Exect.   |
|------------------|-----------------------------|------------------------|-----|-----|-----|----------|
|                  |                             | 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        |
| CLR A            | A=00h                       | Accumulator only       |     |     |     | 1        |
| CPL A            | A= not A                    | Accumulator only       |     |     |     | 1        |
| RL A             | Rotate A left 1 bit         | Accumulator only       |     |     |     | 1        |
| RLC A            | Rotate A left trough Carry  | Accumulator only       |     |     |     | 1        |
| RR A             | Rotate A right 1 bit        | Accumulator only       |     |     |     | 1        |
| RRC              | Rotate A right trough carry | Accumulator only       |     |     |     | 1        |
| SWAP A           | Swap nibbles in A           | Accumulator only       |     |     |     | 1        |

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

5. 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 sub-rutin

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

Pokok Bahasan

  1. Karakteristik Instruksi Mesin
  2. Tipe tipe Operand
  3. Tipe tipe Operasi
  4. Proses Pengalamatan
  5. Format Instruksi.

1. Karakteristik Instruksi Mesin

Adalah ciri-ciri khusus atau sifat khas yang dimiliki oleh instruksi-instruksi atau kode operasi dalam pemrograman komputer.

Set fungsi dari instruksi-instruksi yang berbeda yang dapat di eksekusi oleh CPU dikenal sebagai set instruksi CPU.

Elemen-elemen Instruksi Mesin:

  • Operation Code (OP Code)
, menspesifikasi operasi yang akan dilakukan Kode Operasi berbentuk Kode Biner.
  • Source Operand Reference
, operasi dapat berasal dari satu sumber. Operand adalah input operasi.
  • Result Operand Reference
, hasil operasi/keluaran operasi.
  • Next Instruction Reference
, menginformasikan CPU ke instruksi berikutnya yang harus diambil dan dieksekusi.

Operand dan Hasil disimpan pada:

  • Memori Utama atau Memori Virtual
  • Register CPU
  • Perangkat I/O

2. Tipe tipe Operand

Addresses (akan dibahas pada addressing modes).

Numbers:

Integer or fixed point,Floating point,Decimal (BCD)
Characters :
ASCII, EBCDIC

Logical Data

Bila data berbentuk binary: 0 dan 1

Jenis operasi computer

  • Transfer data – konversi
  • Aritmatika – input/output
  • Logika – kontrol sistem dan transfer kontrol

Operasi set instruksi untuk transfer data

  • MOVE : memindahkan word atau blok dari sumber ke tujuan
  • STORE : memindahkan word dari prosesor ke memori.
  • LOAD : memindahkan word dari memori ke prosesor.
  • EXCHANGE : menukar isi sumber ke tujuan.
  • CLEAR / RESET : memindahkan word 0 ke tujuan.
  • SET : memindahkan word 1 ke tujuan.
  • PUSH : memindahkan word dari sumber ke bagian paling atas stack.
  • POP : memindahkan word dari bagian paling atas sumber

3. Tipe tipe Operasi

  • Operator Aritmetika, +(penjumlahan), – (mengurangkan), * (mengalikan), / (membagi).
  • Operator relational, menyatakan relasi atau perbandingan antara dua operand, seperti > (lebih besar), =(lebih besar atau sama), <= (lebih kecil atau sama), == (sama), != (tidak sama).
  • Operator Logik, merelasikan operand secara logis seperti && (and), || (or), !(not).

Operasi set instruksi untuk operasi logical

  • AND, OR, NOT, EXOR
  • COMPARE : melakukan perbandingan logika.
  • TEST : menguji kondisi tertentu.
  • SHIFT : operand menggeser ke kiri atau kanan menyebabkan konstanta pada ujung bit.
  • ROTATE : operand menggeser ke kiri atau ke kanan dengan ujung yang terjalin.

4. Proses Pengalamatan

Direct Addresing

  • Direct Addresing, harga yang akan dipakai diambil langsung dalam alamat memori lain.
  • Kelebihan dari Direct Addresing. Field alamat berisi efektif address sebuah operand
  • Kelemahan dari Direct Addresing. Keterbatasan field alamat karena panjang field alamat biasanya lebih kecil dibandingkan panjang word

Indirect Addresing

  • Indirect Addressing dapat memberikan fleksibilitas tinggi dalam mengalamati suatu harga.
  • Kelebihan dari Indirect Addresing. Ruang bagi alamat menjadi besar sehingga semakin banyak alamat yang dapat referensi.
  • Kekurangan dari Indirect Addresing. Diperlukan referensi memori ganda dalam satu fetch sehingga memperlambat proses operasi

Immediate Addresing

  • Immediate Addresing, sangat umum dipakai karena harga yang akan disimpan dalam memori langsung mengikuti kode operasi dalam memori.
  • Kelebihan dari Immedieate Addresing. Tidak adanya referensi memori selain dari instruksi yang diperlukan untuk memperoleh operand, Menghemat siklus instruksi sehingga proses keseluruhan akan cepat
  • Kekurangan dari Immedieate Addresing. Ukuran bilangan dibatasi oleh ukuran field alamat

Pengenalan pada Register Addressing

  • Metode pengalamatan register ini  mirip dengan mode pengalamatan langsung
  • Kelebihan Register Addressing. Diperlukan field alamat berukuran kecil dalam instruksi dan tidak diperlukan referensi memori, Akses ke regster lebih cepat daripada akses ke memori, sehingga proses eksekusi akan lebih cepat
  • Kerugian Register Addressing. Ruang alamat menjadi terbatas

Register Indirect Addressing

Metode pengalamatan register tidak langsung mirip dengan mode pengalamatan tidak langsung  Perbedaannya adalah field alamat mengacu pada alamat register. Letak operand berada pada memori yang dituju oleh isi register.

Displacement Addressing dan Stack Addresing

  • Displacement Addressing, menggabungkan kemampuan pengalamatan langsung dan pengalamatan register tidak langsung. Tiga model displacement. Relative addressing, Base register addressing, Indexing ,Relative addressing
  • Stack Addresing. Stack adalah array lokasi yang linier = pushdown list = last-in-first-out. Stack merupakan blok lokasi yang terbalik

5. Format Instruksi.

Suatu instruksi terdiri dari beberapa field yang sesuai dengan elemen dalam instruksi tersebut. Layout dari suatu instruksi sering disebut sebagai Format Instruksi (Instruction Format).

Jenis-jenis instruksi

  • Data processing: Arithmetic dan  Logic Instructions
  • Data storage: Memory instructions
  • Data Movement: I/O instructions
  • Control: Test and branch instructions

Transfer data

  • Menetapkan lokasi operand sumber dan operand tujuan.
  • Lokasi-lokasi tersebut dapat berupa memori, register atau bagian paling atas daripada stack.
  • Menetapkan panjang data yang dipindahkan.
  • Menetapkan mode pengalamatan.

Tindakan CPU untuk melakukan transfer data
Memindahkan data dari satu lokasi ke lokasi lain.

Apabila memori dilibatkan:

  • Menetapkan alamat memori.
  • Menjalankan transformasi alamat memori virtual ke alamat memori actual.
  • Mengawali pembacaan / penulisan memori.

Himpunan instruksi (Instruction Set), instruksi-instruksi tersebut diumpankan ke mikroprosesor chip dalam bentuk bilangan biner 8 bit disebut Operational Code (Op-Code) berikut datanya yang disebut operand. Menulis program dengan sandi mesin merupakan pekerjaan panjang & menjemukan biasanya program ditulis dengan menggunakan alphabet, lalu diterjemahkan ke serangkaian Op-Code & operand. Bentuk paling sederhana dari terjemahannya adalah assembler, yang memanfaatkan bahasa pemrograman rakitan (Assembly Programing Language).

Dalam bahasa assembler, tiap Op-Code memiliki sandi mnemonic, seperti:

  1. LDA untuk load accumulator
  2. ADC untuk Add With Carry
  3. JMP untuk Jump, dan seterusnya.

Instruction set dapat dikelompokkan menjadi tiga kelompok (sub himpunan).

Pengiriman data yang memuat pergerakan data antara CPU dan lokasi memori, contoh;

  • Memuat accumulator dengan isi memory (LDA).
  • Menyimpan isi accumulator ke dalam memory (STA).
  • Memuat register X dengan isi memori (LDX).

Aritmatika & logika berisi instruksi-instruksi untuk melakukan operasi aritmatika & logika, Contoh:

  • Menjumlahkan dua bilangan dengan carry (ADC).
  • Mengurangi dua bilangan dengan carry (SBC).
  • Mengoprasikan AND pada dua bilangan (AND).
  • Mengoprasikan EXOR pada dua bilangan (XOR).
  • Menggeser kanan secara logika (LSR).
  • Menggeser kiri secara aritmatika (ASL).

Tes & cabang menyediakan fasilitas bagi mikroprosesor untuk melakukan serangkaian operasi dengan cara melompat atau mencabang ke bagian lain dari program, contoh

  • Melompat ke subrutin (JSR).
  • Mencabang jika hasilnya negatif (BMI).
  • Mencabang jika sama (BEQ).

Alamat Tidak Langsung dan Indeks

Moda Alamat adalah pemilihan data oleh PLC yang akan digunakan dalam sebuah instruksi. Moda alamat dibuat dengan menentukan instruksi dari operand. Jadi pada topik ini akan ada istilah: data, operand dan moda instruksi, yang didefinisikan sbb.

  • DATA: nilai numerik yang digunakan untuk komputasi. Misalnya jika PLC mempunyai nilai 4 dalam sebuah alamat memori dan nilai 2 di alamat memori lainnya, serta ada instruksi ADD untuk kedua alamat tsb, maka setelah instruksi tsb dieksekusi akan ada nilai 4 dan 2.
  • OPERAND: simbol-simbol dalam sebuah instruksi. Jika terdapat instruksi ADD, maka data yang ada pada alamat memori adalah sama, tetapi lokasi akan ditulis dengan simbol-simbol.
  • MODA ALAMAT (addressing mode) : menggambarkan relasi (hubungan) antara operand dan data, yaitu bagaimana menggunakan operand untuk mengambil data yang tepat.

1. Alamat Langsung (Direct Addressing)

Pada moda alamat langsung, alamat memori dari data ditentukan dengan instruksi. Contoh pada Gambar 11.64, alamat (2112) dalam instruksi secara langsung menuju alamat yang berisi data (85).

Gambar 11.67: Moda Alamat Langsung
Gambar 11.67: Moda Alamat Langsung

2. Alamat Tidak Langsung (Indirect Addressing)

Pada moda alamat tidak langsung, alamat dalam instruksi berfungsi sebagai titik referensi dan bukan merupakan lokasi yang berisi data yang akan dituju atau diambil. Dengan kata lain, alamat memori dari instruksi berisi alamat dari lokasi dimana data tersimpan, seperti ditunjukkan pada Gambar 11.65.

Gambar 11.68: Moda Alamat Tidak Langsung
Gambar 11.68: Moda Alamat Tidak Langsung

3. Alamat Indeks (Indexed Addressing)

Alamat indeks ialah suatu moda alamat untuk patokan lokasi memori yang berisi "nilai" alamat memori + nilai data yang tersimpan di dalam indeks register. Alamat indeks sangat berguna untuk mengakses elemen-elemen dalam suatu rumpun (array) data. Alamat dalam instruksi tidak berubah, tetapi nilai indeks register akan berubah (naik), sehingga secara berurutan akan dapat mengakses lokasi rumpun data satu per satu. Bayangkan seperti seorang tukang pos yang akan menyampaikan surat untuk seorang penghuni suatu asrama. Alamat asrama adalah tetap satu (alamat instruksi), tetapi alamat kamar masing-masing penghuni asrama berbeda (indeks register). Tukang pos harus menyusur & melihat setiap nomor kamar secara berurutan, mulai dari nomor yang kecil ke nomor yang besar (kenaikan nilai indeks register) untuk menemukan kamar yang tepat. Penghuni kamar adalah data yang akan diakses.

Gambar 11.69: Moda Alamat Indeks
Gambar 11.69: Moda Alamat Indeks

4. Pelacakan Alamat Tidak Langsung & Indeks (Indexed Addressing) dalam Diagram

Mode alamat bukanlah instruksi, tetapi dapat digunakan bersama instruksi PLC. Masalah yang sering terjadi ialah pemilihan offset atau nilai pointer yang berada diluar "wilayah" tempat penyimanan data, sehingga menyebabkan kesalahan. Beberapa vendor menyediakan kebebasan kepada pemakai untuk menentukan sendiri batas wilayah tempat penyimpanan data.

Program PLC dapat dikembangkan untuk menyelesaikan masalah yang lebih kompleks proses penyelesaiannya. Hal ini dapat menimbulkan masalah, ketika program menggunakan alamat tidak langsung dan alamat indeks pada rang ladder, dimana rang ladder tsb tidak dapat berfungsi dengan baik.

Pelacakan program PLC yang mengandung alamat tidak langsung lebih sulit daripada yang mengandung alamat indeks. Gunakan petunjuk berikut ini jika program tidak bekerja dengan baik.

  • Pastikan bahwa pointer berada didalam wailayah memori data
  • Instruksi TND dapat digunakan untuk menghentikan pemindaian di suatu titik dalam diagram ladder yang mengandung alamat indeks yang akan diperiksa.
  • Gunakan pilihan single-step untuk memindai satu rang pada satu waktu. Periksa dan lakukan analisis bagaimana pointer mengubah aliran alamat.
  • Jika elemen data yang harus disimpan sangat banyak, dan memori penyimpan menggunakan struktur data base, mulailah melacak gangguan dari satu set data yang kecil.

Rangkuman

Beberapa definisi PLC yang digunakan untuk menjelaskan pengertian PLC:

  • PLC merupakan sistem mikrokomputer yang dapat digunakan orang untuk proses-proses kontrol di industri
  • PLC merupakan komputer industrial yang khusus dirancang untuk kontrol mesin-mesin manufaktur dan sistem diberbagai bidang yang sangat luas.
  • PLC merupakan komponen elektronika khusus berbasis satu atau lebih mikroprosesor yang digunakan untuk mengontrol mesin-mesin industri.

Kesamaan PLC dan PC:

  • mempunyai motherboard,
  • prosesor,
  • memori dan slot-slot untuk ekspansi

Arsitektur PLC: Pada dasarnya PLC terdiridari bagian input, bagian pemroses, bagian memori, jalur-jalur untuk data (bus data) dan alamat (bus alamat), serta bagian output.

Prinsip kerja: Kerja PLC dimulaii dari menginisiasi program-program internal PLC, misalnya timer, notasi-notasi, dan sebagainya. Lalu akan mengambil data-data input yang didapat melalui antarmuka input. Data-data tersebut kemudian diproses sesuai dengan instruksi-instruksi yang tertulis dalam program. Hasil pemrosesan akan disalurkan ke outputmelalui antarmuka output, dan atauke bagian lain sesuai dengan instruksi.

Berdasarkan cara operasinya, PLC dibedakan menjadi 3:

  1. Rack atau Sistem berbasis Alamat
  2. Sistem Berbasis Tag
  3. Soft PLC atau Kontrol berbasis PC.

Standar bahasa pemrograman PLC yang disepakati yaitu:

  • Ladder Diagram (LD)
  • Function Block Diagram (FBD)
  • Structure Text (ST)
  • Instruction List (IL)
  • Sequential Function Charts (SFC)

Semua program PLC dibuat berdasarkan urutan logika.si dasar Instruksi diekspresikan melalui operasi-operasi logika. Operasioperasi dasar logika tersebut ialah: AND (menggambarkan rangkaian seri), OR (menggambarkan rangkaian paralel) dan NOT (menggambarkan rangkaian inverter). Dari ketiga dasar ini dapat dikembangkan rangkaian-rangkaian lainnya yang merupakan kombinasi dari ketiganya.

Karena biasanya PLC digunakan pada tegangan listrik AC, maka kita harus berhati-hati agar jangan sampai tersengat listrik. Oleh karena itu, prosedur keamanan kerja harus dipatuhi.

Pemeliharaan PLC meliputi pemeliharaan perangkat keras dan perangkat lunak. Dari banyak kasus, kerusakan terbanyak adalah pada saklar-saklar input. Kerusakan bisa disebabkan oleh usia komponen, korosi, atau patah lidah saklarnya.

Untuk mencari kerusakan pada sistem berbantuan PLC, biasanya diperlukan metode pelacakan. Dalam hal ini bisa berupa diagram blok, pengelompokan atau analisis aliran sinyal. Pemeliharaan perangkat lunak biasanya merupakan pemeliharaan program kontrol. Pelacakan dapat dilakukan melalui instruksi-instruksi kontrol, sub-routin, atau alamat langsung maupun tidak langsung dan indeks.

Latihan Soal

  1. Apakah PLC itu? Apa kesamaan PLC dan komputer pribadi (PC)?
  2. Apa keunggulan PLC dibandingkan dengan komputer?
  3. Bagaimana PLC bekerja, jelaskan dengan singkat dengan menggunakan bahasamu sendiri.
  4. Sebutkan bahasa pemrograman PLC yang disepakati IEC?
  5. PLC bekerja berdasarkan instruksi-instruksi logika. Sebuah PLC mendapat 2 buah input A dan B, serta output X. Ketika kedua input berlogik 1, output akan berlogik 1. Jika salah satu input berlogik 0, output akan berlogik 0. Operasi logika apakah ini?

Tugas Kelompok

Buatlah sebuah program sederhana PLC untuk mengendalikan lampu dan AC di ruang belajar kalian. Lampu akan menyala saat cahaya matahari mulai redup. Set tingkat keredupan yang kalian inginkan. Sebaliknya, lampu akan padam sendiri jika kelas cukup terang. Set pula tingkat kecerahan cahaya yang kalian inginkan. AC akan aktif jika ruang kelas kalian panas dan akan mati saat suhu ruangan dingin. (Set suhu ruangan yang kalian inginkan, misalnya antara 23-30 derajat C). Buat pula program tersebut agar lampu dan AC keduanya mati beberapa saat setelah ruangan tersebut kosong dan dikunci!

Mengenal Instruksi Subroutine

Subroutine adalah suatu grup instruksi dalam diagram ladder yang berada diluar program ladder utama, yang dapat dieksekusi dengan instruksi sub-routine. Jadi dengan menggunakan sebuah instruksi subroutine, program rutin yang berulang dapat dieksekusi secara berulang tanpa harus menulis ulang prgram rutin tersebut pada diagram ladder utama. Misalnya sebuah mesin otomatis, mempunyai urutan program rang yang harus diulang beberapa kali dalam sebuah siklus mesin. Urutan tersebut dapat diprogram satu kali saja dalam subroutine, yang dapat dipanggil jika diperlukan.

Gambar 11.66: Instruksi Jump to Subroutine
Gambar 11.66: Instruksi Jump to Subroutine

1. Pelacakan Kerusakan Instruksi Subroutine

Jika bagian dari program ladder tidak bekerja dengan baik, lakukan langkah-langkah seperti dianjurkan berikut ini:

  • Gunakan instruksi always false (AFI) pada input rang yang mengandung instruksi MCR dan JMP, untuk mempersempit daerah MCR dan JMP sampai ditemukan operasi yang benar dari program routine utama. AFI akan mn-set kondisi rang agar menjadi baik kembali. Jadi AFI akan menundukkan (disable) semua instruksi pada rang.
  • Instruksi TND atau SUS dapat digunakan untuk menghentikan instruksi MCR, JMP atau JSR setelah percabangan rang, agar kondisi logik input dapat dievaluasi. Ini sangat bermanfaat jika terdapat kesalahan pada cabang rang.
  • Lakukan pelacakan kerusakan pada sebuah rang dengan menggunakan moda single-step.
  • Gunakan breakpoint dalam moda single-step untuk mengeksekusi ladder kebawah, dimana telah disisipkan breakpoint dalam diagram ladder.

Untuk mempermudah pelacakan, pastikan bahwa:

  • Daerah MCR dan atau JMP tidak saling tindih (overlap)
  • Tidak terjadi loncatan balik (Backward jumpa) yang akan menyebabkan waktu pindai bertambah, ketika dilakukan pemindaian ulang program. Jika waktu pindai lebih dari 2.5 detik, maka prosesor akan rusak.
  • Instruksi JSR dan SBR mempunyai nomor parameter input yang sama.
  • Instruksi JSR dan RET mempunyai nomor parameter-balik yang sama.
  • Instruksi LBL dan SBR merupakan instruksi input pertama pada rang.
  • Tipe Data yang digunakan pada memori sama/konsisten dengan data yang digunakan saat ini.

Interrupt Pemrograman Assembly

Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler berhenti sejenak untuk melayani interrupt tersebut. Program yang dijalankan pada saat melayani interrupt disebut Interrupt Service Routine. Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan pekerjaan mengetik dan mengangkat telephone. Setelah pembicaraan telephone yang dalam hal ini adalah merupakan analogi dari Interrupt Service Routine selesai maka orang tersebut kembali meneruskan pekerjaanya mengetik.

Demikian pula pada sistem mikrokontroler yang sedang menjalankan programnya, saat terjadi interrupt, program akan berhenti sesaat, melayani interrupt tersebut dengan menjalankan program yang berada pada alamat yang ditunjuk oleh vektor dari interrupt yang terjadi hingga selesai dan kembali meneruskan program yang terhenti oleh interrupt tadi. Seperti yang terlihat Gambar 4.1, sebuah program yang seharusnya berjalan terus lurus, tiba-tiba terjadi interrupt dan harus melayani interrupt tersebut terlebih dahulu hingga selesai sebelum ia kembali meneruskan pekerjaannya.

Gambar 4.1 Interrupt
Gambar 4.1 Interrupt

Proses yang dilakukan oleh mikrokontroler saat melayani interrupt adalah sebagai berikut:

  1. Instruksi terakhir yang sedang dijalankan diselesaikan terlebih dahulu
  2. Program Counter (alamat dari instruksi yang sedang berjalan) disimpan ke stack 
  3. Interrupt Status disimpan secara internal 
  4. Interrupt dilayani sesuai peringkat dari interrupt (lihat Interrupt Priority) 
  5. Program Counter terisi dengan alamat dari vector interrupt (lihat Interrupt Vector) sehingga mikrokontroler langsung menjalankan program yang terletak pada vector interrupt.

Program pada vector interrupt biasanya diakhiri dengan instruksi RETI di mana pada saat ini proses yang terjadi pada mikrokontroler adalah sebagai berikut:

  1. Program Counter diisi dengan alamat yang tersimpan dalam stack pada saat interrupt terjadi sehingga mikrokontroler kembali meneruskan program di lokasi saat interrupt terjadi
  2. Interrupt Status dikembalikan ke kondisi terakhir sebelum terjadi interrupt.

1. Enable Interrupt 

Dalam suatu kondisi dapat juga dibutuhkan suatu program yang sedang berjalan tidak boleh diinterrupt, untuk itu 89C51 mempunyai lima buah interrupt yang masing-masing dapat dienable ataupun disable satu per satu. Pengaturan enable dan disable interrupt dilakukan pada Register Interrupt Enable yang terletak pada alamat A8H.

Enable Interrupt

EA

Disable semua interrupt apabila bit ini clear. Bila bit ini clear, maka apapun kondisi bit lain dalam register ini, semua interrupt tidak akan dilayani, oleh karena itu untuk mengaktifkan salah satu interrupt, bit ini harus set.

ES

Enable/disable Serial Port Interrupt, set = enable, clear = disable. Apabila Serial Port Interrupt aktif maka interrupt akan terjadi setiap ada data yang masuk ataupun keluar melalui serial port yang membuat Flag RI (Receive Interrupt Flag) ataupun TI (Transmit Interrupt Flag).

ET1

Enable/disable Timer 1 Interrupt, set = enable, clear = disable. Apabila interrupt ini enable maka interrupt akan terjadi pada saat Timer 1 overflow.

EX1

Enable/disable External  Interrupt 1, set = enable, clear = disable. Apabila interrupt ini enable maka interrupt akan terjadi pada saat terjadi pulsa low pada INT1.

ET0

Enable/disable Timer 0 Interrupt, set = enable, clear = disable. Apabila interrupt ini enable maka interrupt akan terjadi pada saat Timer 0 overflow.

EX0

Enable/disable External Interrupt 0, set = enable, clear = disable. Apabila interrupt ini enable maka interrupt akan terjadi pada saat terjadi pulsa low pada INT0.

2. Status Interrupt 

Status-status interrupt dari 89C51 terletak pada Register TCON yaitu;

  • INT0: Bit IE0, clear oleh hardware saat interrupt terjadi pada mode aktif level
  • INT1: Bit IE1, clear oleh hardware saat interrupt terjadi pada mode aktif level 
  • Timer 0: Bit TF0, clear oleh hardware saat interrupt terjadi 
  • Timer 1 : Bit TF1, clear oleh hardware saat interrupt terjadi 
  • Serial Port (TXD) : Bit TI, clear oleh software 
  • Serial Port (RXD) : Bit RI, clear oleh software.

External Interrupt 0 maupun External Interrupt 1 dapat diatur menjadi aktif level maupun aktif transisi dengan mengubah bit IT0 atau IT1 pada Register TCON External Interrupt akan bekerja secara aktif level bila bit ITx (x = 0 untuk INT0 dan x =1 untuk INT1) berkondisi low dan bekerja secara aktif transisi bila bit ITx berkondisi high.

3. Interrupt Priority 

Dalam melayani interrupt, mikrokontroler bekerja berdasarkan prioritas yang dapat diatur pada Register Interrupt Priority.

  • IP0 atau PX0 untuk External Interrupt 0
  • IP1 atau PT0 untuk Timer 0 Interrupt IP2 atau PX1 untuk External Interrupt 1 IP3 atau PT1 untuk Timer 1 Interrupt IP4 atau PS untuk Serial Interrupt

Bit-bit ini akan berkondisi set apabila interrupt yang diaturnya ditempatkan pada prioritas yang tinggi. Interrupt dengan prioritas yang tinggi dapat meng-interrupt interrupt lain yang mempunyai prioritas lebih rendah, sedangkan interrupt dengan prioritas tinggi itu sendiri tidak dapat di interrupt oleh interrupt lain.

Apabila terjadi lebih dari satu interrupt yang mempunyai prioritas yang sama secara bersamaan, maka prioritas akan diatur secara polling mulai dari:

  • External Interrupt 0
  • Timer 0 Interrupt
  • External Interrupt 1
  • Timer 1 Interrupt
  • Serial Interrupt

4. Interrupt Vector  

Interrupt Vector adalah harga yang disimpan ke Program Counter pada saat terjadi interrupt sehingga program akan menuju ke alamat yang ditunjukkan oleh Program Counter. Pada saat program menuju ke alamat yang ditunjuk oleh Interrupt Vector maka flag-flag yang set karena terjadinya interrupt akan di-clear kecuali RI dan TI.

Kelima interrupt dan system reset dari 89C51 mempunyai Vector masingmasing yang dapat dilihat pada Tabel 4.1

Table 4.1 Interrupt Vector

| INTERRUPT            | FLAG       | ALAMAT VEKTOR |
|----------------------|------------|---------------|
| System Reset         | RST        | 0000H         |
| External Interrupt 0 | I E0       | 0003H         |
| Timer 0              | TF0        | 000BH         |
| External Interrupt 1 | I E1       | 0013H         |
| Timer 1              | TF1        | 001BH         |
| Serial Port          | RI atau TI | 0023H         |

Masing-masing alamat vektor mempunyai jarak yang berdekatan sehingga akan timbul masalah bila diperlukan sebuah Interrupt Service Routine yang cukup panjang, misalnya hendak digunakan External Interrupt 0 dan Timer 0 dalam satu sistem, maka bila Interrupt Service Routine untuk External Interrupt 0 diletakkan pada alamat 0003H dan Interrupt Service Routine untuk Timer 0 diletakkan pada alamat 000BH akan terjadi bentrok alamat antara kedua Interrupt Service Routine ini apabila tidak dilakukan suatu trik berikut yang terlihat pada listing berikut;

Listing 4.1
  ORG 0000H
  LJMP Start
  ORG 0003H
  LJMP Int0
 ORG 000BH  LJMP Timer0  ......
  ......
  ......
Start:
  ......
  ...... ;Main Program
  ......

Int0:
  ......
  ...... ;Int0 ISR   ......
  RETI

Timer0:
  ......
  ...... ;Timer 0 ISR   ......   RETI

Jadi pada listing ini, saat terjadi interrupt Program Counter memang tetap berisi nilai dari Interrupt Vector sehingga program juga meloncat ke alamat tersebut, namun karena di alamat tersebut sudah diletakkan instruksi untuk meloncat ke label yang lain seperti Int0 untuk External Interrupt 0 Service Routine maka tidak akan terjadi bentrok alamat antara kedua Interrupt Service Routine ini.

Interupsi adalah suatu permintaan khusus kepada mikroposesor untuk melakukan sesuatu. Bila terjadi interupsi, maka komputer akan menghentikan dahulu apa yang sedang dikerjakannya dan melakukan apa yang diminta oleh yang menginterupsi.


Mengenal Interrupt Pada Pemrograman Assembly

Pada IBM PC dan kompatibelnya disediakan 256 buah interupsi yang diberi nomor 0 sampai 255. Nomor interupsi 0 sampai 1Fh disediakan oleh ROM BIOS, yaitu suatu IC didalam komputer yang mengatur operasi dasar komputer. Jadi bila terjadi interupsi dengan nomor 0-1Fh, maka secara default komputer akan beralih menuju ROM BIOS dan melaksanakan program yang terdapat disana. Program yang melayani suatu interupsi dinamakan Interrupt Handler.

1. Vektor Interupsi

Setiap interrupt akan mengeksekusi interrupt handlernya masing-masing berdasarkan nomornya. Sedangkan alamat dari masing- masing interupt handler tercatat di memori dalam bentuk array yang besar elemennya masing-masing 4 byte. Keempat byte ini dibagi lagi yaitu 2 byte pertama berisi kode offset sedangkan 2 byte berikutnya berisi kode segmen dari alamat interupt handler yang bersangkutan. Jadi besarnya array itu adalah 256 elemen dengan ukuran elemen masing-masing 4 byte. Total keseluruhan memori yang dipakai adalah sebesar 1024 byte (256 x 4 = 1024) atau 1 KB dan disimpan dalam lokasi memori absolut 0000h sampai 3FFh. Array sebesar 1 KB ini disebut Interupt Vector Table (Table Vektor Interupsi). Nilai-nilai yang terkandung pada Interupt Vector Table ini tidak akan sama di satu komputer dengan yang lainnya.

Interupt yang berjumlah 256 buah ini dibagi lagi ke dalam 2 macam yaitu:

  • Interupt 00h - 1Fh (0 - 31) adalah interrupt BIOS dan standar di semua komputer baik yang menggunakan sistem operasi DOS atau bukan. Lokasi Interupt Vector Table-nya ada di alamat absolut 0000h-007Fh.
  • Interupt 20h - FFh (32 - 255) adalah interrupt DOS. Interrupt ini hanya ada pada komputer yang menggunakan sistem operasi DOS dan Interupt Handler-nya di-load ke memori oleh DOS pada saat DOS digunakan. Lokasi Interupt Vector Table-nya ada di alamat absolut 07Fh-3FFh.

2. Tabel BIOS Interrupt

| No. Interrupt | Nama Interrupt         |
|---------------|------------------------|
| *00h          | Divide By Zero         |
| *01h          | Single Step            |
| *02h          | Non MaskableInt(NMI)   |
| *03h          | Break point            |
| 04h           | Arithmatic Overflow    |
| 05h           | Print Screen           |
| 06h           | Reserved               |
| 07h           | Reserved               |
| 08h           | Clock Tick(Timer)      |
| 09h           | Keyboard               |
| 0Ah           | I/O Channel Action     |
| 0Bh           | COM 1 (serial 1)       |
| 0Ch           | COM 2 (serial 2)       |
| 0Dh           | Fixed Disk             |
| 0Eh           | Diskette               |
| 0Fh           | LPT 1 (Parallel 1)     |
| 10h           | Video Service          |
| 11h           | Equipment Check        |
| 12h           | Memory Size            |
| 13h           | Disk Service           |
| 14h           | Communication (RS-232) |
| 15h           | Cassette Service       |
| 16h           | Keyboard Service       |
| 17h           | Printer Service        |
| 18h           | ROM Basic              |
| 19h           | Bootstrap Loader       |
| 1Ah           | BIOS time & date       |
| 1Bh           | Control Break          |
| 1Ch           | Timer Tick             |
| 1Dh           | Video Initialization   |
| 1Eh           | Disk Parameters        |
| 1Fh           | Graphics Char          |

** Tanda Interrupt ini telah dipastikan kegunaannya oleh sistem untuk keperluan yang khusus, tidak boleh dirubah oleh pemrogram seperti yang lainnya.*

  • DEVIDE BY ZERO: Jika terjadi pembagian dengan nol maka proses akan segera dihentikan.
  • SINGLE STEP: Untuk melaksanakan / mengeksekusi intruksi satu persatu.
  • NMI: Pelayanan terhadap NMI (Non Maskable Interrupt) yaitu interupsi yang tak dapat dicegah.
  • BREAK POINT: Jika suatu program menyebabkan overflow flag menjadi 1 maka interrupt ini akan melayani pencegahannya dan memberi tanda error.

3. Tabel DOS Interrupt

| No. Interrupt | Nama Interrupt              |
|---------------|-----------------------------|
| 20h           | Terminate Program           |
| 21h           | DOS Function Services       |
| 22h           | Terminate Code              |
| 23h           | Ctrl-Break Code             |
| 24h           | Critical Error Handler      |
| 25h           | Absolute Disk Read          |
| 26h           | Absolute Disk Write         |
| 27h           | Terminate But Stay Resident |

Didalam pemrograman dengan bahasa assembler kita akan banyak sekali menggunakan interupsi untuk menyelesaikan suatu tugas.

Pengertian Register

Dalam pemrograman dengan bahasa Assembly, mau tidak mau anda harus berhubungan dengan apa yang dinamakan sebagai Register. Lalu apakah yang dimaksudkan dengan register itu sebenarnya?


Mengenal Register Pemrograman Assembly

Register merupakan sebagian memori dari mikroprosesor yang dapat diakses dengan kecepatan yang sangat tinggi. Dalam melakukan pekerjaannya mikroprosesor selalu menggunakan register-register sebagai perantaranya, jadi register dapat diibaratkan sebagai kaki dan tangannya mikroprosesor.

Register yang digunakan oleh mikroprosesor dibagi menjadi 5 bagian dengan tugasnya yang berbeda-beda pula, yaitu:

1. Segmen Register

Register yang termasuk dalam kelompok ini terdiri atas register CS,DS,ES dan SS yang masing-masingnya merupakan register 16 bit. Register-register dalam kelompok ini secara umum digunakan untuk menunjukkan alamat dari suatu segmen.

Register CS(Code Segment) digunakan untuk menunjukkan tempat dari segmen yang sedang aktif, sedangkan register SS(Stack Segment) menunjukkan letak dari segmen yang digunakan oleh stack. Kedua register ini sebaiknya tidak sembarang diubah karena akan menyebabkan kekacauan pada program anda nantinya.

Register DS(Data Segment) biasanya digunakan untuk menunjukkan tempat segmen dimana data-data pada program disimpan. Umumnya isi dari register ini tidak perlu diubah kecuali pada program residen. Register ES(Extra Segment), sesuai dengan namanya adalah suatu register bonus yang tidak mempunyai suatu tugas khusus. Register ES ini biasanya digunakan untuk menunjukkan suatu alamat di memory, misalkan alamat memory video.

Pada prosesor 80386 terdapat tambahan register segment 16 bit, yaitu FS < Extra Segment > dan GS < Extra Segment >.

2. Pointer dan Index Register

Register yang termasuk dalam kelompok ini adalah register SP,BP,SI dan DI yang masing-masing terdiri atas 16 bit. Register- register dalam kelompok ini secara umum digunakan sebagai penunjuk atau pointer terhadap suatu lokasi di memory.

Register SP(Stack Pointer) yang berpasangan dengan register segment SS(SS:SP) digunakan untuk mununjukkan alamat dari stack, sedangkan register BP(Base Pointer)yang berpasangan dengan register SS(SS:BP) mencatat suatu alamat di memory tempat data.

Register SI(Source Index) dan register DI(Destination Index) biasanya digunakan pada operasi string dengan mengakses secara langsung pada alamat di memory yang ditunjukkan oleh kedua register ini.

Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu ESP, EBP, ESI dan EDI.

3. General Purpose Register

Register yang termasuk dalam kelompok ini adalah register AX,BX,CX dan DX yang masing-masing terdiri atas 16 bit. Register- register 16 bit dari kelompok ini mempunyai suatu ciri khas, yaitu dapat dipisah menjadi 2 bagian dimana masing-masing bagian terdiri atas 8 bit, seperti pada gambar 4.1. Akhiran H menunjukkan High sedangkan akhiran L menunjukkan Low.


Gambar 4.1. General purpose Register

Secara umum register-register dalam kelompok ini dapat digunakan untuk berbagai keperluan, walaupun demikian ada pula penggunaan khusus dari masing-masing register ini yaitu :

Register AX, secara khusus digunakan pada operasi aritmatika terutama dalam operasi pembagian dan pengurangan.

Register BX, biasanya digunakan untuk menunjukkan suatu alamat offset dari suatu segmen.

Register CX, digunakan secara khusus pada operasi looping dimana register ini menentukan berapa banyaknya looping yang akan terjadi.

Register DX, digunakan untuk menampung sisa hasil pembagian 16 bit. Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu EAX, EBX, ECX dan EDX.

4. Index Pointer Register

Register IP berpasangan dengan CS(CS:IP) menunjukkan alamat dimemory tempat dari intruksi(perintah) selanjutnya yang akan dieksekusi. Register IP juga merupakan register 16 bit. Pada prosesor 80386 digunakan register EIP yang merupakan register 32 bit.

5. Flags Register

Sesuai dengan namanya Flags(Bendera) register ini menunjukkan kondisi dari suatu keadaan< ya atau tidak >. Karena setiap keadaan dapat digunakan 1 bit saja, maka sesuai dengan jumlah bitnya, Flags register ini mampu memcatat sampai 16 keadaan. Adapun flag yang terdapat pada mikroprosesor 8088 keatas adalah:

OF < OverFlow Flag >

Jika terjadi OverFlow pada operasi aritmatika, bit ini akan bernilai 1.

SF < Sign Flag >

Jika digunakan bilangan bertanda bit ini akan bernilai 1.

ZF < Zero Flag >

Jika hasil operasi menghasilkan nol, bit ini akan bernilai 1.

CF < Carry Flag >

Jika terjadi borrow pada operasi pengurangan atau carry pada penjumlahan, bit ini akan bernilai 1.


Gambar 4.2. Susunan Flags Register 8088

PF < Parity Flag >

Digunakan untuk menunjukkan paritas bilangan. Bit ini akan bernilai 1 bila bilangan yang dihasilkan merupakan bilangan genap.

DF < Direction Flag >

Digunakan pada operasi string untuk menunjukkan arah proses.

IF < Interrupt Enable Flag >

CPU akan mengabaikan interupsi yang terjadi jika bit ini 0.

TF < Trap Flag >

Digunakan terutama untuk Debugging, dengan operasi step by step.

AF < Auxiliary Flag >

Digunakan oleh operasi BCD, seperti pada perintah AAA.

NT < Nested Task >

Digunakan pada prosesor 80286 dan 80386 untuk menjaga jalannya interupsi yang terjadi secara beruntun.

IOPL < I/O Protection level >

Flag ini terdiri atas 2 bit dan digunakan pada prosesor 80286 dan 80386 untuk mode proteksi.

Adapun susunan dari masing-masing flag didalam flags register dapat anda lihat pada gambar 4.2. Pada prosesor 80286 dan 80386 keatas terdapat beberapa tambahan pada flags register, yaitu:

PE < Protection Enable >

Digunakan untuk mengaktifkan mode proteksi. flag ini akan bernilai 1 pada mode proteksi dan 0 pada mode real.

MP < Monitor Coprosesor >

Digunakan bersama flag TS untuk menangani terjadinya intruksi WAIT.

EM < Emulate Coprosesor >

Flag ini digunakan untuk mensimulasikan coprosesor 80287 atau 80387.

TS < Task Switched >

Flag ini tersedia pada 80286 keatas.

ET < Extension Type >

Flag ini digunakan untuk menentukan jenis coprosesor 80287 atau 80387.

RF < Resume Flag >

Register ini hanya terdapat pada prosesor 80386 keatas.

VF < Virtual 8086 Mode >

Bila flag ini bernilai 1 pada saat mode proteksi, mikroprosesor akan memungkinkan dijalankannya aplikasi mode real pada mode proteksi. Register ini hanya terdapat pada 80386 keatas.

6. Pengertian Register dalam Sistem Digital

Informasi yang terdiri atas bit tunggal tersimpan dalam flip-flop D. Sejumlah N bit informasi membentuk satu word dengan panjang N-bit dapat disimpan dalam N flip-flop D. Contoh word dengan panjang 4-bit dapat dilihat pada Gambar 4.27. Susunan flip-flop yang digunakan untuk menyimpan data disebut register. Dalam konfigurasi pada gambar tersebut data masukan Di dimasukkan ke register saat jalur Write dan Enable tinggi, sinkron dengan detak.

Isi register dapat dibaca pada keluaran Qi hanya saat jalur Enable tinggi, karena buffer tiga keadaan terputus secara elektronis saat Enable rendah. Kita sederhanakan penggambaran register menjadi seperti Gambar 4.28.


Gambar 4.28 Register 4-bit disederhanakan

Register geser akan menggeser isi pada setiap flip-flop ke flip-flop sesudahnya, dan menerima masukan pada ujung masukan serta memuntahkan isinya pada ujung keluaran, sehingga memungkinkan untuk disusun secara bersambungan. Perhatikan register geser pada Gambar 4.29. Register dapat digeser ke kiri, digeser ke kanan, menerima masukan secara paralel, atau dibiarkan isinya tetap, semunya sinkron dengan detak. Fasilitas pemasukan paralel dan pembacaan paralel memungkinkan register geser berfungsi sebagai pengubah serial ke paralel atau pengubah paralel ke serial.


Gambar 4.29 Register geser

Instruksi Percabangan Mikrokontroler

ACALL addr11

| Siklus | Jumlah Byte | Instruksi    |    |    |     |     |    |   |   |
|--------|-------------|--------------|----|----|-----|-----|----|---|---|
| 2      | 2           | ACALL Addr11 |    |    |     |     |    |   |   |
| Flag   |             | C            | AC | F0 | RS1 | RS0 | OV |   | P |
|        |             |              |    |    |     |     |    |   |   |

Melakukan lompatan ke suatu subroutine yang ditunjuk oleh alamat pada addr11. Lompatan yang dapat dilakukan berada di area sebesar 2K byte.

Proses yang terjadi pada saat instruksi ini dikerjakan adalah sebagai berikut:

  1. Data pada Program Counter + 2 yang merupakan alamat program saat kembali dari subroutine disimpan ke dalam stack
  2. Stack pointer bertambah 2 kali 
  3. Melakukan lompatan ke alamat yang ditunjuk oleh addr11 dengan mengisi Program Counter dengan alamat tersebut. Alamat yang diisikan ke Program Counter hanya 11 bit sehingga lompatan maksimum hanya sebesar 2K byte.

Contoh:

2000  Acall Lompatan1
 …………
 …………

Lompatan1 
2100  Mov  A,#00H 

Data pada Program Counter + 2 yaitu 2002H disimpan pada stack di mana byte tinggi disimpan di alamat yang ditunjuk oleh SP+1 dan byte rendah disimpan di alamat yang ditunjuk oleh SP+2. Apabila sebelumnya posisi SP berada di alamat 10H maka byte tinggi, 20H akan disimpan di alamat 11H dan byte rendah, 02H disimpan di 12H. Kemudian data 11 bit pada alamat lompatan 1 dipindah ke Program Counter.

LCALL addr16

| Siklus | Jumlah Byte | Instruksi    |    |    |     |     |    |   |   |
|--------|-------------|--------------|----|----|-----|-----|----|---|---|
| 2      | 3           | LCALL Addr16 |    |    |     |     |    |   |   |
| Flag   |             | C            | AC | F0 | RS1 | RS0 | OV |   | P |
|        |             |              |    |    |     |     |    |   |   |

Melakukan lompatan ke suatu subroutine yang ditunjuk oleh alamat pada addr16. Lompatan yang dapat dilakukan berada di area sebesar 64K byte.

Proses yang terjadi pada saat instruksi ini dikerjakan adalah sebagai berikut:

  1. Data pada Program Counter + 2 yang merupakan alamat program saat kembali dari subroutine disimpan ke dalam stack
  2. Stack pointer bertambah 2 kali 
  3. Melakukan lompatan ke alamat yang ditunjuk oleh addr16 dengan mengisi Program Counter dengan alamat tersebut. Alamat yang diisikan ke Program Counter adalah 16 bit sehingga lompatan maksimum dapat mencapai 64K byte.

Contoh:

2000  Lcall Lompatan1
 …………
 …………

Lompatan1
3000  Mov  A,#00H 

Data pada Program Counter + 2 yaitu 2002H disimpan pada stack di mana byte tinggi disimpan di alamat yang ditunjuk oleh SP+1 dan byte rendah disimpan di alamat yang ditunjuk oleh SP+2. Apabila sebelumnya posisi SP berada di alamat 10H maka byte tinggi, 20H akan disimpan di alamat 11H dan byte rendah, 02H disimpan di 12H. Kemudian data 16 bit pada alamat lompatan 1 dipindah ke Program Counter yaitu 3000H.

RET

| Siklus | Jumlah Byte | Instruksi |    |    |     |     |    |   |   |
|--------|-------------|-----------|----|----|-----|-----|----|---|---|
| 2      | 1           | RET       |    |    |     |     |    |   |   |
| Flag   |             | C         | AC | F0 | RS1 | RS0 | OV |   | P |
|        |             |           |    |    |     |     |    |   |   |

Melakukan lompatan ke alamat yang disimpan dalam SP dan SP-1. Instruksi ini biasa digunakan pada saat kembali dari subroutine yang dipanggil dengan instruksi ACALL atau LCALL.

Proses yang terjadi adalah sebagai berikut:

  1. Isi dari alamat yang ditunjuk oleh stack pointer dipindah ke Program Counter nibble tinggi
  2. Stack pointer berkurang 1 
  3. Isi dari alamat yang ditunjuk oleh stack pointer dipindah ke Program Counter nibble rendah 
  4. Stack pointer berkurang 1.

Contoh:

2000  Lcall Lompatan1 
2002   ……….… 
………… 
………… 

Lompatan1
3000  Mov  A,#00H 
3002  Ret 

Post a Comment

Previous Next

نموذج الاتصال