Pemrograman Interupsi

BAB 11

Sasaran

 

Setelah anda menamatkan bab ini , diharapkan anda dapat :

ð          Membedakan dan membandingkan Interupsi dengan polling

ð          Menjelaskan kegunaan ISR (Interupt service routine)

ð          Menjelaskan 6 interupsi pada 8051

ð          Menghidupkan dan mematikan interupsi

ð          Meprogram Timer pada 8051 dengan menggunakan interupsi

ð          Menjelaskan dua interupsi hardware external pada 8051

ð          Membedakan edge-triggering dan level-triggering

ð          Memprogram 8051 untuk komunikasi serial berbasis interupsi

ð          Menjelaskan prioritas interupsi pada 8051

 

Interupsi adalah kejadian (event) eksternal atau internal yang bisa menginterupsi CPU dan memberitahukan bahwa sebuah peralatan membutuhkan layanan. Pada BAB ini kita akan membahas lebih jauh tentang interupsi dan pemrograman interupsi. Pad SubBAB 11-2 kita akan mendiskusikan interupsi milik Timer-0 dan Timer-1. Interupsi hardware ekternal akan didiskusikan pada SubBAB 11-3. Adapun interupsi yang berhubungan dengan komunikasi serial dibahas pada SubBAB 11-4. Dan akhirnya pada SubBAB 11-5 kita akan membahas prioritas interupsi pada 8051.

 



 

SubBAB 11-1: Interupsi pada 8051

 

Pada SubBAB ini kita akan mendiskusikan perbedaan polling dan interupt dan membahas pula berbagai interupsi pada 8051.

 

Interupsi dan Polling

 

Sebuah MikroKontroller dapat melayani beberapa peralatan (selanjutnya kita sebut dengan device). Ada dua cara untuk memberikan layanan, yaitu dengan Interupsi dan polling. Pada Metode Interupt, kapan saja device butuh layanan, maka CPU akan sedapat mungkin untuk segera melayani, device akan memberitahukan pada CPU dengan mengirim sinyal interupsi. Setelah sinyal interupsi ini diterima, CPU akan berhenti mengerjakan tugasnya dan segera melayani device tadi. Program (instruksi-instruksi) dimana yang berisi layanan interupsi, disebut dengan Interupt Service Routine ( ISR )atau juga Interupt Handler. Sedang pada polling, CPU secara terus menerus akan memonitor status yang diberikan oleh device-device, saat kondisi tertentu di mana nampak device membutuhkan layanan, maka CPU akan mulai mengerjakan layanannya. Setelah CPU selasai dengan layanan, maka CPU akan kembali mengerjakan pekerjaan semula yaitu memmonitor device selanjutnya sampai ketemu device yang meminta layanan. Walaupun polling dapat memonitor status beberapa device dan melayani setiap kondisi tertentu, ini tidak efisien karena CPU hanya atau lebih banyak bertugas untuk memeriksa status dari device. Salah satu device yang meminta layanan bahkan harus menunggu lama karena CPU sedang sibuk melayani device lain. Nah peralatan interupsi inilah jawabannya. Dengan Interupsi, CPU dapat melakukan tugas lebih banyak (tentu saja tidak sekaligus karena 8051 hanya satu core CPU) dan dapat melayani segera device yang membutuhkan layanan segera. Harap dimengerti interupsi berbeda dengan multitasking. Interupsi adalah peralatan yang dapat menginterupsi tugas CPU, dan untuk sementara diminta melaksanakan tugas yang baru, namun untuk multitasking yaitu bahwa ada benar-benar 2 atau lebih, proses yang berjalan bersama-sama. Kembali ke masalah interupsi. CPU bahkan bisa lebih mengutamakan layanan untuk Device yang derajat prioritasnya lebih tinggi. Sebaliknya apakah dengan menggunakan metode polling bisa dilakukan prioritas. Ya tentu saja asal kita bisa membuat program yang memonitor lebih sering untuk device yang memiliki prioritas lebih tinggi (disebut metode round-robin fashion). Lebih penting lagi, metode interupsi pada CPU dapat mengabaikan (mask / ignore) device tertentu yang meminta layanan. Akhirnya dengan demikian tidak diperlukan lagi metode polling. Alasan paling penting dari penggunaan metode interupsi ini adalah metode ini jauh lebih efisien dibanding metode polling yang selalu membutuhkan waktu lebih banyak bagi CPU untuk melakukan polling itu sendiri bagi semua device, tidak perduli device tersebut minta dilayani atau tidak. Untuk mencegah membebani CPU terlalu banyak seperti itu, cara yang paling tepat adalah dengan interupsi. Seperti contoh, memeriksa timer (diulas pada BAB 9) dengan menggunakan perintah “JNB TFx,lokasi“, dan menunggu sampai TF = 1 alias Timer Rollover. Saat menunggu tersebut, prosesor tidak bisa melakukan tugas yang lain. Hal ini tentu saja akan membuang waktu dari prosesor. Akhirnya kita menggunakan interupsi untuk Timer. Pertama CPU melakukkan set-up untuk Timer dan kemudian mengerjakan tugas yang lain. Saat terjadi rollover, bendera interupsi diaktifkan (hal ini dapat diartikan sinyal untuk memberitahukan CPU akan terjadi sebuah kondisi dalam hal ini adalah rollover dari Timer) dan selanjutnya meminta CPU menghentikan tugasnya dan mulai mengerjakan leyanan interupsi Timer. Setelah selesai memberikan layanan, CPU akan kembali mengerjakan tugasnya yang terbengkalai tadi.

 

Interupt Service Routine

 

Setiap interupsi, selalu memiliki Interupt Service Routine (ISR), atau disebut juga Interupt Handler. Yaitu rutin-rutin yang khusus dijalankan sebagai layanan dari sebuah interupsi. Saat interupsi terjadi, CPU akan mulai menjalankan rutin ISR ini. Setiap Interupsi selalu memiliki lokasi tetap dalam memory program yang disebut Interupt Vector Table, seperti ditampilkan pada gambar 11-1.

 

Langkah-langkah Mengeksekusi Interupsi

 

Setelah adanya aktifasi interupsi, 8051 akan mengerjakan tugas seperti langkah-langkah di bawah ini.

1.    Begitu adanya sinyal interupsi, CPU mulai merespon. Namun jika saat itu CPU sedang dalam proses menjalankan instruksi, tentu CPU harus menyelesaikan instruksi tersebut, sehingga tidak ada instruksi apapun yang terhenti di tengah-tengah. Baru kemudian CPU memulai proses menanggapi interupsi dengan menyimpan PC pada stack, agar nantinya proses benar-benar kembali ke alamat ini. Prosesnya serupa dengan CALL.

2.    CPU juga menyimpan secara internal akan status dari semua interupsi.

3.    Kemudian program Counter akan melompat pada alamat yang sudah ditetapkan, yang disebut Interupt Vector Table, di mana ISR berada.

4.    Setelah mendapatkan alamat tersebut, CPU mulai mengeksekusi alamat yang sudah ditetapkan tersebut. Yang berarti ISR dimulai dari alamat ini. Setiap kode-kode-nya dieksekusi sampai ditemukannya perintah “RETI“, yang berarti akhir dari layanan interupsi.

5.    Setelah mengeksekusi perintah “RETI”, mikrokontrolller kembali ke alamat yang ditinggalkan tadi sesaat sebelum interupsi. Yaitu dengan cara mengambil kembali simpanan alamat yang tadi diletakkan di STACK, dengan mem-POP dua kali dan dimasukkan ke PC. Sekarang PC sudah berisi alamat yang tadi ditinggalkan. Prosesnya mirip dengan RET.

 

Harap dicatat, isi dari STACK adalah sangat penting bagi hal ke 5. Sehingga kita harus hati-hati untuk memodifikasi STACK. Yaitu hati-hati dalam penggunaan CALL serta jumlah POP dan PUSH yang harus sama dalam sebuah ISR.

 

Enam Interupsi dalam 8051

 

Sebenarnya ada 5 interupsi yang bisa kita gunakan pada 8051. Namun beberapa datasheet menyebutkan dengan 6 interupsi. Itu karena datasheet memasukkan reset sebagai interupsi. Adapun ke-enam interupsi ini dialokasikan sebagai berikut.

1.    RESET. Saat pin reset diaktifkan, PC menjadi 0000h (Awal program). Semua isi register dihapus menjadi 00h. Semua port menjadi FFh. Sehingga dengan reset ini, CPU benar-benar memulai dari awal. (sebagaimana yang dibahas pada BAB 4)

2.    Dua interupt lainnya adalah Timer. Salah satunya adalah Timer-0 dan satunya lagi adalah Timer-1. Lokasi memory pada Interupt Vector Table dari Timer ini masing-masing adalah  000Bh dan 001Bh.

3.    Dua Interupt lainnya lagi adalah eksternal hardware interupt. Pin 12 (P3.2) dan pin 13 (P3.3) pada port 3 digunakan sebagai Interupsi Hardware Ekternal masing-masing INT0 dan INT1. Lokasi memory untuk kedua interupsi ini adalah 0003h dan 0013h.

4.    Komunikasi serial juga memiliki satu Interupsi yang digunakan oleh kedua mode transfer data, baik itu pengiriman (melibatkan TI) dan penerimaan (melibatkan RI). Lokasi dari ISR interupsi ini adalah 0023h.

 

Harap dilihat pada tabel 11.1 bahwa ada batasan jumlah byte diantara tiap-tiap interupt vektor Table. Misalnya untuk INT-0, interupt hardware eksternal 0, total hanya memiliki 8-byte mulai dari 0003h – 000Ah. Hal yang sama juga ada pada alamat-alamat yang lain. Bagaimana kalau ternyata besar ISR lebih dari 8-byte. Oleh karena itu buatlah ISR ditempat lain yang aman. Dan berikanlah instruksi “Ajmp” atau LJmp” pada Interupt Vektr Table tersebut, sehingga CPU dapat menunjuk pada ISR yang lokasinya lebih jauh dan aman.

 

Dari tabel 11-1, pada kenyataannya hanya ada 3 byte yang disediakan untuk RESET. Yaitu alamat 0000, 0001 dan 0002. Sedang 0003 sudah menjadi milik INT0. Dengan alasan ini pembuat program selalu menggunakan alamat tersebut untuk diisi instruksi LJMP atau AJMP sebagai instruksi pertama. Sehingga progam dapat melompati Interupt Vector Table. Tapi jika kita memang tidak menggunakan interupsi apapun, tentu saja alamat pada Interupt Vector Table dapat digunakan secara bebas.

 

Tabel 11.1: Insterupt Vector Table pada 8051

Interupsi                      Lokasi ROM                Pin

Reset                          0000h                     9

External Hardware 0 (INT0)     0003h                     12 (P3.2)

Timer 0 (TF0)                  000Bh

External Hardware 1 (INT1)     0013h                     13 (P3.3)

Timer 1 (TF1)                  001Bh

Serial COM (RI dan TI)         0023h

 

 

 

               ORG  0          ;alamat pertama setelah reset

               LJMP MULAI      ;Lompati Interupt Vector Table

 

;——— Program Utama mulai dari sini

               ORG  30h

MULAI:

               …

               END

 

Gambar 11-1 : Cara melompati Interupt Vektor Table setelah 8051 dihidupkan

 

 

Menghidupkan dan mematikan interupt

 

Setelah reset, semua interupsi dalam keadaan mati (disabled / masked), yang berarti CPU tidak akan merespon interupsi apapun. Interupsi harus dihidupkan melalui software agar mikrokontroller bisa meresponnya. Ada sebuah register yang dinamakan IE (Interupt Enable) yang bertugas untuk menghidupkan dan mematikan masing-masing interupsi. Gambar 11-2 menunjukkan register IE ini. Ingat IE adalah register yang juga bisa dialamati Bit.

Dari gambar 11-2  kita dapat melihat D7 dari register tersebut adalah EA (Enable All). Kita harus men-set bit ini menjadi 1s agar bit-bit yang lain dalam register ini berpengaruh. D6 tidak digunakan, sedang D5 hanya digunakan pada 8052. D4 adalah milik interupt serial, dan demikian seterusnya. Misalnya jika kita hendak mengaktifkan interupsi Timer-0, maka kita harus men-set D1. Interupsi masih belum bisa dikatakan aktif, sebelum kita juga men-set D7. Sebaliknya jika D7 clear atau rendah. Maka semua bit interupsi yang lain dianggap tidak aktif. Lho jadi apa kegunaan Bit EA ini? Ada kalanya kita menginginkan sebuah rutin, dimana rutin tersebut tidak boleh diganggu oleh interupsi apapun, cukup hanya dengan satu instruksi “CLR IE.7” atau “CLR EA“. Setelah rutin selesai kita bisa mengembalikan pada keadaan semua, juga hanya dengan satu instruksi “SETB IE.7” atau “SETB EA“. Cara tersebut jauh lebih efisien dari pada kita harus memeriksa semua bit interupsi yang aktif.

 

Langkah-langkah menghidupkan Interupsi

 

Untuk menghidupkan interupsi kita harus ikuti langkah-langkah ini.

1.    Bit D7 dari register IE, yaitu EA harus di-set menjadi 1s. Agar bit-bit yang lain bekerja.

2.    Setelah EA = 1, maka setiap bit pada IE yang bersangkutan akan membuat interupsi bekerja. Namun jika EA = 0, tidak akan ada interupsi walaupun bit-bit interupsi yang lain dalam keadaaan tinggi (1s).

Untuk mengerti hal ini sebaiknya ada lihat Contoh 11-1

 

 

 

EA    IE.7    Untuk menghidupan peralatan Interupsi. Jika EA = 0, tidak ada interupsi yang akan dilayani. Jika EA =1, maka interupsi akan dilayani selama bit interusi yang bersesuian (IE.4 – IE.0) juga dalam keadaan tinggi.

–    IE.6    Tidak digunakan.

–    IE.5    digunakan khusus 8052.

ES    IE.4    Hidup mati Interupsi Serial Port.

ET1   IE.3    Hidup mati Interupsi OverFlow Timer-1.

EX1   IE.2    Hidup mati Interupsi External 1.

ET0   IE.1    Hidup mati Interupsi OverFlow Timer-1.

EX0   IE.0    Hidup mati Interupsi External 0.

 

Gambar 11-2 Register IE (Interupst Enable)

 

 

Contoh 11-1

 

Tunjukkan instruksi untuk (a) menghidupkan interupsi serial, interupsi Timer-0 dan interupsi External harware 1 (EX1), dan (b) matikan (mask) Interupsi Timer-0, lalu (c) tunjukkan bagaimana mematikan mematikan semua interupsi dengan hanya satu instruksi.

 

Jawaban:

 

(a)   MOV IE,#10010110b  ;hidupkan  Serial, Timer-0, EX1.

Mengingat IE adalah register yang bisa dialamati bit, maka kita dapat menggunakan intruksiseperti di bawah iniuntuk mengakses setiap bit dari register tersebut.

(b)   CLR  IE.1          ;matikan Timer-0 (bisa juga dengan “Clr ET0″)

(c)   CLR  IE.7          ;Matikan peralatan interupsi

 

cara lainnya untuk menulis “MOV IE,#10010110b” adalah bisa dengan menggunakan intstruksi bit seperti..

    SetB IE.7          ;Hidupkan peralatan Interupsi

    SetB IE.4          ;Hidupkan interupsi Serial

    SetB IE.1          ;Hidupkan interupsi Timer-0

    SetB IE.2          ;Hidupkan interupsi EX1

 

 

 



 

SubBAB 11.2: PEMROGRAMAN INTERUPSI TIMER

 

Pada BAB 9 kita mendiskusikan bagaimana menggunakan Timer-0 dan Timer-1 dengan metode biasa (polling). Dalam sub bab ini kita akan menggunakan interupsi untuk memprogram Timer pada 8051. Silahkan kembali membaca bab 9 sebelum anda melanjutkan bab ini.

 

Gambar 11.3:  Interupsi TF0 dan TF1

 

 

Bendera RollOver Timer dan Interupsi

 

Pada BAB 9 kita telah mengetahui bahwa bendera Timer (TF) menjadi aktif saat Timer Rollover. Pada bab yang telah lalu, kita akan ditunjukkan bagaimana memonitor TF dengan instruksi “JNB TFx,lokasi“. Pada polling TF, kita harus menunggu sampai TF menjadi 1s. Masalah dengan metode ini, bahwa CPU akan tertahan/terpaku saat menunggu naiknya TF, dan tidak bisa melakukan hal selain menunggu. Menggunakan interupsi akan menyelesaikan masalah tersebut untuk mencegah CPU terpaku. Saat TF naik, CPU di-interupsi dari apa yang dikerjakan saat itu, lalu melompat ke vektor table untuk melayani ISR. Dengan demikian, CPU masih dapat melakukkan hal lain, sampai diinterupsi/diberitahu bahwa telah terjadi rollover Timer dan kemudian melakukan tugas yang berkaitan dengan Timer tersebut. Lihat Gambar 11-3 dan Contoh 11-2.

 

Perhatikan hal-hal tentang program dalam contoh 11-2 ini.

1.    Kita harus menghindari penggunaan memory program di alamat yang digunakan dalam vektor table interupsi. Kita dapat menempatkan instruksi LJMP pada alamat 0000, yang menunjuk pada Program Utama kita yang berada ditempat yang lain. Kita dapat menempatkan program utama, yaitu program yang paling pertama dijalankan, mulai dari alamat 0030h. Sehingga CPU dapat melompati alamat-alamat yang digunakan vector table interupsi.

2.    ISR untuk Timer-0 menempati alamat 000Bh. Karena kode yang kita gunakan lebih kecil dari 8-byte dan tidak sampai mengganggu alamat 0013h milik EX1, maka kita bisa menuliskan kode ISR mulai alamat 000Bh.

3.    Tidak lupa kita menghidupkan interupsi Timer-0 dengan perintah “MOV IE,#10000010b” pada label MAIN.

4.    Setelah itu data P0 diambil dan diletakkan pada P1 secara terus menerus, ketika Timer-0 rollover, TF menjadi tinggi, CPU keluar dari loop BACK, dan melompat ke 000Bh dan mulai mengeksekusi ISR yang dimulai dari alamat tersebut.

5.    Dalam ISR Timer-0, perhatikan bahwa tidak dibutuhkkan instruksi “CLR TF0“, seperti yang harus dilakukan pada mode polling. Sebab karena kita menggunakan Interupsi, TF akan otomatis di-reset menjadi 0s begitu CPU mulai mengesekusi ISR.

 

Contoh 11-2

 

Tulislah progam untuk secara terus menerus membaca data 8-bit dari P0 dan mengirimkannya ke P1, sambil secara terus-menerus pula membuat gelombang kotak dengan perioda 200uS pada P2.1. Gunakan Timer-0 untuk membuat gelombang kotak. Dan menggunakan XTAL = 11.0592 MHz.

 

Jawaban:

 

Kita menggunakan Timer-0 pada Mode-2 (auto reload). TH0 = 100/1.085uS = 92.

 

;———————————————————–

             ORG  0000h       ;alamat pertama setelah reset

             LJMP MULAI       ;Lompati Interupt Vector Table

 

;

;—– ISR untuk Timer 0 utk menghasilkan gelombang kotak.

             ORG  000Bh      ;Interupt Vector Table untuk Timer-0

             CPL  P2.1       ;Toggle pin P2.1

             RETI            ;Akhir dari ISR

;

;—– Program Utama mulai dari sini

             ORG  0030h      ;Alamat bebas dari vektor table

MULAI:       MOV  TMOD,#02h  ;Timer-0, Mode-2 (autoreload)

             MOV  P0,#0FFh   ;Buat P0 untuk menjadi port input

             MOV  TH0,#-92   ;TH0 = A4h = -92

             MOV  IE,#82h    ;IE=10000010b utk interupsi Timer

             SETB TR0        :Jalankan Timer

ULANG:       MOV  A,P0       ;Ambil data dari Port 0

             MOV  P1,A       ;Kirim data ke Port 1

             SJMP ULANG      ;Lompat ke ULANG, untuk terus mengulang

 

             END

 

 

 

Contoh 11-3

 

Tulis ulang Contoh 11-2 untuk membuat gelomang kotak yang memiliki bagian tinggi 1085 uS dan bagian rendah 10 uS. Dengan menggunakan XTAL = 11.0592 MHz. Gunakan Timer-1.

 

Jawaban:

 

1085 uS bisa didapat dari 1000 x 1.085 uS, kita harus menggunakan Mode-1 pada Timer-1.

 

;———————————————————–

             ORG  0000h       ;alamat pertama setelah reset

             LJMP MULAI       ;Lompati Interupt Vector Table

 

;

;—– ISR untuk Timer 1 utk menghasilkan gelombang kotak.

             ORG  001Bh      ;Interupt Vector Table untuk Timer-1

             LJMP ISR_T1     ;Lompat ke ISR

;

;—– Program Utama mulai dari sini

             ORG  0030h      ;Alamat bebas dari vektor table

MULAI:       MOV  TMOD,#10h  ;Timer-1, Mode-1

             MOV  P0,#0FFh   ;Buat P0 untuk menjadi port input

             MOV  TL1,#018h  ;TL1 = 18h (low byte dari -1000)

             MOV  TH1,#0FCh  ;TH1 = 18h (high byte dari -1000)

             MOV  IE,#88h    ;IE=10001000b utk interupsi Timer-1

             SETB TR1        :Jalankan Timer

ULANG:       MOV  A,P0       ;Ambil data dari Port 0

             MOV  P1,A       ;Kirim data ke Port 1

             SJMP ULANG      ;Lompat ke ULANG, untuk terus mengulang

 

;

;—– IST Timer-1. Harus di-reload karena Timer pakai Mode-1

ISR_T1:      CLR TR1         ;Matikan Timer

             CLR P2.1        ;P2.1=0, mulai bagian rendah

             MOV R2,#4       ;                           2MC

TUNGGU:      DJNZ R2,TUNGGU  ;  4 x 2 siklus Mesin (MC)  8MC

             MOV TL1,#018h   ;Re-load  nilai Low-Byte    2MC

             MOV TH1,#0FCh   ;Re-load  nilai High-Byte   2MC

             SetB TR1        ;Jalankan lagi Timer-1      1MC

             SetB P2.1       ;P2.1=1, kembali (1s)       1MC

             RETI            ;Akhir dari ISR

 

             END

 

 

Ingat bahwa bagian rendah dari sinyal adalah sepanjang 14 siklus mesin, dimana setiap siklus mesin = 1.085 uS. Sehingga hasilnya adalah 14 x 1.085 uS = 15.19 uS.

 

 

Contoh 11-4

 

Tulis program untuk menghaslkan gelombang kotak dengan frekuensi 50 Hz pada pin P1.2. Ini sangat mirip dengan Contoh 9-12 kecuali menggunakan Interupsi untuk Timer-0. Anggaplah kita menggunakan XTAL = 11.0592 MHz.

 

Jawaban:

 

 ;———————————————————–

             ORG  0000h       ;alamat pertama setelah reset

             LJMP MULAI       ;Lompati Interupt Vector Table

 

             ORG  000Bh      ;Interupt Vector Table untuk Timer-1

             CPL  P1.2

             MOV  TL0,#00h   ;Re-load  nilai Low-Byte

             MOV  TH0,#0DCh  ;Re-load  nilai High-Byte

             RETI            ;Akhir dari ISR

 

;———————————————————–

;—– Program Utama mulai dari sini

             ORG  0030h      ;Alamat bebas dari vektor table

MULAI:       MOV  TMOD,#01h  ;Timer-0, Mode-1

             MOV  TL0,#00h

             MOV  TH0,#0DCh

             MOV  IE,#82h    ;IE=10000010b utk interupsi Timer-0

             SETB TR0        :Jalankan Timer

ULANG:       SJMP ULANG      ;Lompat ke ULANG, untuk terus mengulang

 

             END

 

 

 

 

 



 

SubBAB 11.3: PEMROGRAMAN INTERUPSI HARDWARE EXTERNAL

 

8051 memiliki dua buah interupsi hardware eksternal. Pin 12 (P3.2) dan pin 13 (P3.3) masing-masing juga dinamakan dengan pin INT0 dan INT1. Digunakan untuk menghasilkan interupsi hardware eksternal. Jika pin-pin ini dipaksa menjadi rendah, CPU 8051 akan meloncat dari tugas normalnya, dan segera mengerjakan layanan ISR untuk interupsi yang aktif tersebut.

 

Gambar 11-4 Cara pengaktifan INT0 dan INT1

 

Interupsi Eksternal INT0 dan INT1

 

Kedua pin ini digunakan untuk membangkitkan interupsi secara eksternal. Kedua interupsi ini memmiliki alamat vektor, masing-masing untuk INT0 dan INT1 adalah 0003h dan 0013h. Seperti yang sudah kita bahas pada SubBAB 6-1 aktivasi pin-pin interupsi hardware tersebut dapat menghasilkan interupsi hanya saat bit-bit IE yang bersangkutan juga diaktifkan. Jika bit-bit tersebut 0s (rendah) maka aktifasi pin interupsi tidak akan menghasilkan apa-apa.

 

Bagaimana pin ini bisa diaktifkan. CPU 8051 mengenal 2 jenis aktifasi pin interupsi. Yaitu (a) Tersulut Level atau level triggered, dan (b) Tersulut Pinggir atau edge triggered.

 

Interupsi Tersulut Level

 

Saat RESET, sebagaimana port-port yang lain, masing-masing port INT0 dan INT1 berlaku sebagai port I/O biasa, yang berstatus 1s (tinggi). Demikian pula saat port tersebut digunakan sebagai interupsi, port tersebut masih dalam keadaan tinggi. Namun jika port ini dipakasa dibuat rendah sehingga berstatus 0s (low), maka interupsi menjadi aktif. Dan CPU 8051 akan segera menjalankan ISR yang berkaitan dengan interupsi ini. Port tersebut harus segera dikembalikan kembali ke keadaan semula (tinggi) sebelum CPU mengeksekusi perintah terakhir dari ISR, yaitu  RETI. Jika pin tersebut tidak segera dikembalikan ke keadaan semula, maka saat CPU selesai menjalankan ISR, pin yang masih rendah tersebut dianggap sebagai interupsi baru, dan CPU menjalankan kembali ISR yang sama. Lihat Contoh 11-5.

 

Contoh 11-5

 

Anggaplah bahwa INT1 terhubung dengan saklar yang saat normal adalah high (tinggi). Begitu dibuat rendah, maka akan menyalakan LED. LED terhubung dengan P1.3 dan normalnya tinggi adalah Off. Saat dia dihidupkan dia akan hidup untuk beberapa saat. Dan selama saklar rendah , maka LED akan terus hidup.

 

Jawaban:

 

             ORG  0

             LJMP MULAI       ;Lompati Interupt Vector Table

 

;—– ISR untuk INT1 (untu menyalakan LED)

             ORG  13h

             CLR  P1.3        ;nyalakan LED

             MOV  R3,#255

TUNGGU:     DJNZ R3,TUNGGU   ;tetap hidupkan LED beberapa saat

             SETB P1.3        ;matikan LED

             RETI             ;Akhir dari ISR

 

;—– Program Utama mulai dari sini

             ORG  30h

MULAI:       MOV  IE,#10000100b  ;Hidupkan Interupsi INT1

ULANG:       SJMP ULANG      ;Tunggu di sini sampai ada interupsi

 

             END

 

 

 

 

 

Dalam program ini, CPU 8051 melakukan loop terus-menerus pada pada loop ULANG. Seketika switch pada INT1 (pin P3.3) diaktifkan, CPU akan keluar dari loop dan lompat ke vektor lokasi 13h. Dan ISR untuk INT1 akan menyalankan LED, dan terus menyalakannya sementara waktu, dan selanjutnya memadamkannya setelah selesai menjalankan ISR. Dan jika saat CPU telah selesai menjalankan instruksi RETI, sedang pin INT1 masih dalan keadaan rendah, CPU mengang itu sebuah interupsi baru dan akan menjalankan ISR kembali. Untuk mengatasi masalah tersebut pin INT1 harus sedapat mungkin dikembalikan tinggi sesaat sebelum instruksi RETI dijalankan.

 

Sampling The Low level Triggered interupst

 

Pin P3.2 dan P3.3 dalam keadaan normalnya digunakan sebagai port I/O biasa, kecuali jika bit INT0 dan INT1 pada register IE kita aktifkan (dibuat tinggi). CPU selalu mencuplik (Sampled) status tinggi dari pin ini setiap siklus mesin. Sehingga setiap perubahan status pada pin ini, CPU dapat membaca dengan cepat signal status rendah pada pin ini. Jika bit interupsi diaktifkan, CPU akan menganggap rendahnya status dari pin ini sebagai awal dari permintaan interupsi. Namun bagaimanapun juga CPU meminta agar panjang durasi tinggi dan rendah harus memenuhi syarat untuk bisa dianggap sebuah interupsi.

Beberapa datasaheet pabrik pembuat chip menerangkan, agar pint INT0 dan/atau INT1 harus tetap rendah, sampai interupsi diterima dan CPU 8051 mulai menjalankan layanan Interupsi (ISR). Dan jika pin tersebut dibuat tinggi kembali sebelum mulai dijalankannya layanan interupsi (ISR) yang bersangkutan, maka akan dianggap itu bukan interupsi. Dalam mode Interupsi Tersulut Level seperti ini, untuk menjamin sebuah pengaktifan interupsi dapat dibaca dengan benar oleh CPU, pin INT0 dan/atau INT1 harus dalam keadaan tinggi setidaknya 1 MC , dan kemudian harus dibuat rendah setidaknya 4 siklus mesin, atau sampai layanan Interupsi ISR mulai dijalankan. Setelah itu pin tersebut bisa dibuat tinggi kembali.

Menurut datasheet pula, bahwa jika pin INT0 dan/atau INT1 dibiarkan rendah walaupun layanan interupsi telah selesai dijalankan, maka CPU akan menganggap itu adalah interupsi kedua. Dan CPU kembali menjalankan ISR yang sama.

Gambar 11-5 Durasi minimum dari Interupsi Tersulut Level (XTAL=11.0592MHz)

 

 

Interupsi tersulut pinggir

 

Setelah kita belajar bagaimana interupsi dibangkitkan dari interupsi tersulut level rendah di atas, maka sekarang kita akan membahas interupsi tersulut pinggir. Perbedaan yang paling mencolok dari kedua jenis mode sulut (Trigggering mode) adalah… Jika tersulut level, adalah level rendah setidaknya 4 MC maka akan dianggap aktifasi interupsi. Selama pin tersebut rendah maka dianggap interusi. Namun pada interupsi tersulut pinggir, adalah  setiap adanya transisi port dari tinggi ke rendah, akan dianggap suatu interupsi, tidak masalah seberapa panjang baik status tinggi maupun status rendahnya.

Untuk dapat memperoleh fitur yang menarik ini, kita harus kembali menyimak register TCON. Bit TCON.0 (IT0) dan TCON.2(IT1) masing-masing digunakan untuk menjadikan pin-pin tersebut bereaksi pada saat transisi tinggi ke rendah yang dikenakan pada mereka (yaitu masuk dalam mode edge triggered). Jika TCON.0 = 0 maka pin INT0 akan bekerja sebagai level triggered, namun saat TCON.0 = 1, maka INT0 akan bekerja sebagai edge triggered. Demikian pula TCON.2 untuk pin INT1.

Lihat bit-bit lain dari register TCON ini. Bit TCON.1 (IE0) dan TCON.3(IE1) masing-masing digunakan untuk mengunci status dari INT0 dan INT1 saat adanya transisi tinggi ke rendah. Bit-bit ini sebenarnya bertindak sebagai bendera yang menyatakan “sebuah interupsi sedang dalam pelayanan” dan akan mengabaikan setiap transisi tinggi ke rendah lainnya selama CPU masing menjalankan ISR dari interupsi yang sama. Dan begitu CPU selesai melayani ISR dari interupsi sebelumnya, maka transisi tinggi ke rendah pada pin-pin tersebut akan segera ditanggapi sebagai interupsi baru.

 

 

 

TF1 TCON.7  Bender Overflow Timer-1. Bendera ini di-set oleh hardware saat Tmer/Counter overflow. Bisa di-Clear secara hardware oleh peralatan Interupsi, saat mCPU menjalankan ISR.

TR1 TCON.6  Bit Control Run Timer-1. Di-Set dan di-Clear oleh software untuk menghidupkan dan mematikan Timer-1.

TF0 TCON.5  Bender Overflow Timer-0. Bendera ini di-set oleh hardware saat Tmer/Counter overflow. Bisa di-Clear secara hardware oleh peralatan Interupsi, saat mCPU menjalankan ISR.

TR0 TCON.4  Bit Control Run Timer-0. Di-Set dan di-Clear oleh software untuk menghidupkan dan mematikan Timer-0.

IE1 TCON.3  Bendera Sulut Pinggir(Edge Flag) Interupsi Eksternal-1. Di-Set oleh CPU saat adanya Interupsi Eksternal Sult Pinggir (transisi H ke L). Do-Slear oleh CPU setelah interupsi diproses. Bit ini tidak bekerja pada Interupsi Sulut Level.

IT1 TCON.2  Bit Control Type Interupsi 1. Di-Set/Clear oleh software untuk menjadikan Insterupsi eksternal Sulut Pinggir / Sulut Level.

IE0 TCON.1  Bendera Sulut Pinggir(Edge Flag) Interupsi Eksternal-0. Di-Set oleh CPU saat adanya Interupsi Eksternal Sult Pinggir (transisi H ke L). Do-Slear oleh CPU setelah interupsi diproses. Bit ini tidak bekerja pada Interupsi Sulut Level.

IT0 TCON.0  Bit Control Type Interupsi 0. Di-Set/Clear oleh software untuk menjadikan Insterupsi eksternal Sulut Pinggir / Sulut Level.

 

Gambar 11-: Register TCON (Timer/Counter Control) (Bisa Dialamati Bit)

 

Lihat pada Contoh 11-6, Perhatikan bahwa satu-satunya perbedaan program ini dengan program pada Contoh 11-5 adalah pada baris pertama pada MAIN, di mana Instruksi “SETB TCON.2″ membuat INT1 menjadi Interupsi Tersulut Pinggir. Saat adanya falling edge (pinggir menurun / H ke L) dari sinyal pada pin INT1, LED akan menyala beberapa waktu. Durasi nyala LED tergantung pada tundaan waktu dalam ISR untuk INT1. Untuk kembali menyalakan LED, transisi Tinggi ke Rendah (H ke L) berikutnya harus diberikan pada pin P3.3 (INT1). Hal ini berbeda dengan Contoh  11-5, dimana interupsi terjadi (tersulut) oleh level rendah yang ada pada pin P3.3 (INT1). Selama pin tersebut rendah, maka selama itu pula LED akan menyala. Sekali lagi seperti pada Contoh 11-6, untuk menyalakan LED kembali, pin P3.3 tersebut harus dibuat tinggi kembali agar kemudian dapat dibuat transisi tinggi ke rendah untuk mengaktifkan interupsi.

 

Contoh 11-6

 

Anggaplah pin P3.3 (INT1) terhubung dengan Generator Pulsa, tulislah program di mana saat terjadinya transisi tinggi ke rendah pada pin ini, CPU menyalakan LED atau Buzzer dengan membuat pin P1.3 rendah. Dengan kata lain adalah Lampu akan menyala saat terjadinya transisi tinggi ke rendah pada pin P3.3 (INT1). Ini adalah program dengan versi yang lain dari program pada Contoh 11-5.

 

Jawaban:

 

             ORG  0

             LJMP MULAI       ;Lompati Interupt Vector Table

 

;—– ISR untuk INT1 (untuk menyalakan LED)

             ORG  13h

             CLR  P1.3        ;nyalakan LED

             MOV  R3,#255

TUNGGU:     DJNZ R3,TUNGGU   ;tetap hidupkan LED beberapa saat

             SETB P1.3        ;matikan LED

             RETI             ;Akhir dari ISR

 

;—– Program Utama mulai dari sini

             ORG  30h

MULAI:       SETB TCON.2      ;Buat INT1 sbg Interupsi Sulut Pinggir

             MOV  IE,#10000100b  ;Hidupkan Interupsi INT1

ULANG:       SJMP ULANG       ;Tunggu di sini sampai ada interupsi

 

             END

 

 

 

 

Sampling The Egde Triggered interupst

 

Sebelum mengakhiri SubBAB ini, kita harus dapat menjawab pertanyaan bagaimana caranya Interupsi Tersulut Pinggir di-sampled (Ind = Cuplik). Interupsi Tersulut Pinggir, sumber eksternal harus dalam keadaan tinggi setidaknya 1 siklus mesin sebelum memulai transisi ke status rendah. Dan status rendah tersebut juga setidaknya 1 siklus mesin. Hal itu diperlukan untuk menjamin CPU dapat membaca transisi tersebut sebagai Interupsi Eksternal Tersulut Pinggir.

 

 

Transisi tersebut dikunci (latched) oleh 8051 dan menyimpan status adanya transisi tersebut pada register TCON. Bit TCON.1 dan TCON.2 yang menyimpan status transisi pinggir masing-masing untuk INT0 dan INT1. TCON.1 dan TCON.3 ini juga masing-masing disebut sebagai IE0 dan IE1, seperti yang ditunjukkan pada gambar 11-6. Dengan fungsi sebagai bendera bahwa interupsi masih dalam layanan (interupt-in-service flag). Demikian dapat pula berarti, bahwa bendera ini menjadi sebagai tanda pada dunia luar bahwa interupsi masih dalam layanan, dan setiap ada transisi tinggi ke rendah yang diberikan pada pin yang bersangkutan untuk sementara tidak akan direspon. Dan begitu layanan tersebut selesai dijalankan, CPU bisa merespon interupsi berikutnya. Hal ini mirip nada sibuk (Busy Signal), saat anda mencoba menghubungi nomor telpon yang sedang digunakan. Berikutnya untuk bit TCON lainnya yaitu IT0 dan IT1, kita harus memeperhatikan dua hal berikut ini.

1.    Hal pertama adalah saat CPU telah selesai menjalankan ISR (dengan dieksekusinya instruksi RETI), bit ini (TCON.1 dan/atau TCON.3)akan di-Clear, yang menandakan bahwa seluruh proses dari interupsi telah selesai dilaksanakan, dan selanjutnya CPU 8051 siap untuk menerima intrupsi berikutnya pada pin yang bersangkutan. Agar interupsi berikutnya dapat dimengerti oleh CPU, pin tersebut harus dikembalikan sesaat ke keadaan tinggi untuk kemudian memulai transisi tinggi ke rendah. Itu yang harus diperhatikan dalam Interupsi Tersulut Pinggir.

2.    hal ke dua adalah saat Insterupt Service Routine (ISR sedang dijalankan, pin INTn akan diabaikan, tidak masalah berapa kali transisi tinggi ke rendah terhadap pin ini. Dan kita harus tahu fungsi dari intruksi RETI juga untuk men-Clear-kan bit yang bersangkutan pada register TCON (TCON1 atau TCON.0). Ini untuk memberitahukan bahwa layanan interupsi tidak ada lagi atau telah selesai. Itu sebabnya TCON1 dan TCON.0 pada register TCON tersebut disebut dengan bendera Interupt-In-Service. Bendera ini menjadi tinggi saat transisi tinggi ke rendah terbaca pada pin INTn, dan akan tetap tinggi selama CPU menjalankan ISR. Dan akhirnya bit ini hanya di-clear secara otomatis oleh instruksi RETI yang harus diletakkan sebagai akhir dari ISR. Oleh karena itu tidak dibutuhkan perintah untuk men-clear-kan bit tersebut, seperti dengan “CLR TCON.1″ atau “CLR TCON.3″ sebelum instruksi “RETI” pada akhir ISR yang bersangkutan. Hal yang berbeda dimiliki interupsi komunikasi serial, dimana akan kita bahas pada SubBAB berikutnya.

 

Contoh 11-7

 

Apa perbedaan antara instruksi RET dengan RETI? Jelaskan kenapa kita tidak bisa menggunakan RET untuk menggantikan RETI di akhir sebuah ISR.

 

Jawaban:

 

Keduanya melakukan hal yang sama, yaitu me-POP keluar dua byte dari stack dan meletakkannya pada Program Counter, dan membuat 8051 melompat kembali ke alamat PC yang baru. Namun untuk RETI, dia memiliki tugas tambahan, yaitu men-Clear-kan bendera Interupt-In-Service, yang menandakan layanan interupsi telah selesai, untuk kemudian 8051 siap untuk menerima interupsi berikutnya. Jika kita menggunakan RET unteuk menggantikan RETI sebagai akhir dari ISR, maka bendera Interupt-In-Service tetap tinggi, sehingga tidak akan ada lagi interupsi yang ditanggapi. Seolah-olah CPU terus-menerus melayani interupsi. Bit-bit yang termasuk sebagai Interupt-In-Service, yang di-clear oleh instruksi RETI, adalah TF1, TF0, TCON.1, dan TCON3.

 

 

Lebih jauh tentang register TCON

 

Selajutnya kita akan membahas register TCON lebih jauh untuk lebih mengerti aturan dalam penanganan interupsi. Gambar 11-6 menunjukkan bit-bit pada register TCON.

 

IT0 dan IT1

 

TCON.0 dan TCON.2 juga masing-masing disebut dengan IT0 dan IT1. kedua bit ini mengatur mode untuk insterupsi eksternal hardware pada pin INT0 dan INT1 sebagai Tersulut Level Rendah ataukah Tersulut Pinggir. Ke dua bit ini berstatus rendah saat reset, dan membuat berada dalam mode Tersulut Level Rendah. Kita dapat memperogram bit ini untuk membuat interupsi ini menjadi Tersulut Pinggir.

 

IE0 dan IE1

 

TCON.1 dan TCON.3 masing-masing juga disebut sebagai IE0 dan IE1. Bit-bit ini digunakan oleh 8051 hanya untuk melacak adanya Interupsi Tersulut Pinggir. Dengan kata lain jika IT0 dan IT1 dalam keadaan 0, yang artinya interupsi hardware dalam mode Tersulut Level, IE0 dan IE1 tidak berguna. IE0 dan IE1 hanya digunakan 8051 untuk mengunci transisi Tinggi ke rendah pada pin INT0 dan INT1. Adanya perubahan transisi tinggi ke rendah pada pin ini akan ditandai oleh CPU 8051, dan tanda tersebut adalah dengan men-set bit IE0 dan/atau bit IE1 milik register TCON ini. Dan selanjutnya program akan melompat ke vektor tabel untuk mulai menjalankan ISR.

Begitu ISR dijalankan tidak ada lagi transisi Tinggi ke rendah (H ke L) yang ditanggapi. Hanya instruksi RETI pada akhir ISR yang bisa membuat CPU men-Clearkan bit-bit ini. Sehingga transisi H ke L yang baru, kemudian dapat kembali dianggap sebagai permintaan interupsi. Dari diskusi ini kita dapat memahami bahwa IE0 dan IE1 digunakan secara internal oleh 8051 untuk sebagai tanda bahwa sebuah interupsi telah digunakan dan dalam proses layanan. Dengan kata lain kita tidak perlu terlalu memperhatikan bit-bit ini, karena bit hanya digunakan secara internal oleh 8051, dan bukan dirancang untuk keperluan kita.

 

TR0 dan TR1

 

Ini adalah Bit D4 (TCON.4) dan D6 (TCON.6) dari register TCON. Kita telah diperkenalkan akan bit-bit ini pada BAB 9. Mereka digunakan untuk menjalankan dan mneghentikan Timer/Counter. Bit ini adalah bit-adrresable.

 

TF0 dan TF1

 

Ini adalah Bit D5 (TCON.5) dan D7 (TCON.7) dari register TCON. Kita telah diperkenalkna akan bit-bit ini pada BAB 9. Mereka digunakan masing-masing oleh Timer-0 dan Timer-1, untuk menandai bahwa Timer/Counter telah terjadi Rollover. Bit ini adalah bit-adrresable.

 



 

SubBAB 11.4: PEMROGRAMAM INTERUPSI KOMUNIKASI SERIAL

 

Pada Bab 10 kita mempelajari komunikasi serial pada 8051. Semua contoh pada bab tersebut menggunkan metoda polling. Pada SubBAB ini kita akan mengulas komunikasi serial yang berbasis interupsi, di mana akan membuat CPU 8051 masih bisa mengerjakan pekerjaan lainya, sambil mengirim dan menerima data dari port komunikasi serial

 

Bendera RI dan TI serta Interupsi

 

Seperti yang kita ketahui pada BAB 10, TI (Transfer Interupt) akan tinggi setelah bit terakhir dari bingkai data, yaitu bit stop , telah terkirim, yang menandakan register SBUF telah siap untuk menerima data yang baru. Dan sebaliknya RI (Receive Interupt), akan menjadi tinggi saat setelah semua bingkai data, termasuk bit stop telah diterima. Dengan kata lain, saat register SBUF telah mendapatkan data lengkap dari COM, RI akan tinggi yang menandakan bawah byte yang telah diterima harus segera diambil sebelum data tersebut hilang, tertimpa data yang datang kemudian. Selama kita menitik-beratkan pada komunikasi serial, konsep diatas sama dalam penerapannya baik menggunakan metode polling maupun dengan menggunakan metode Interupt. Satu-satunya peredaaan dari kedua metode tersebut, adalah bentuk layanannya. Dalam metode polling, kita harus menunggu tingginya bendera TI atau bendera RI. Sementara itu dilakukan, CPU tidak dapat melakukan hal yang lain. Sedang pada metode Interupt, kita akan diberitahu jika 8051 telah menerima data byte, atau 8051 telah siap untuk mengirimkan data selanjutnya, Kita dapat melalukan hal-hal penting lainnya, sambil tetap melayani komunikasi serial.

 

8051 hanya menyediakan satu buah vektor interupsi untuk komunikasi serial. Vektor ini digunakan bersama oleh RI (penerimaan) dan TI (pengiriman). Jika bit IE.4, yaitu bit untuk interupsi serial diaktifkan dengan dibuat tinggi, maka berubahnya status TI atau RI menjadi tinggi akan membangkitkan interupsi serial, dan program akan melompat ke alamat yang sama, yakni 0023h untuk kemudian menjalankan ISR dari alamat tersebut. ISR harus diisi kode yang bisa membedakan bahwa interupsi disebabkan oleh TI ataukah oleh RI.

 

Gambar 11-7:  Satu Vektor Interupsi untuk dua bendera TI dan RI

 

Menggunakan Serial COM pada 8051

 

Penggunaan interupsi pada 8051 dalam banyak aplikasi hanya digunakan untuk menerima data. Dan sangat jarang digunakan untuk mengirim data. Hal ini mirip sebuah telpon di rumah kita. Saat telepon berdering, sesegera mungkin kita untuk menjawab telepon tersebut sebelum telepon diputus. Kita harus meninggalkan pekerjaan kita untuk sementara, demi menjawab telepon tersebut. Namun saat kita hendak menelpon keluar, kita dapat melakukannya kapan kita mau. Demikian pula yang biasa digunakan oleh beberapa aplikasi pada 8051. Interupsi Serial digunakan untuk penerimaan data, mengingat sesegera mungkin data yang telah diterima diletakkan pada tempat yang aman sebelum data tersebut hilang karena tertimpa data yang baru. Lihat contoh 11-9.

 

 

Contoh 11-8

 

Tulis program agar 8051 dapat membaca data dari port P1 dan menuliskannya pada Port P2 terus menerus, sambil memberikan salinan data tersebut pada port COM serial untuk dikirimkan dengan cara serial. Anggaplah menggunakan XTAL = 11.0592 MHz. Atur baud rate pada 9600.

 

Jawaban:

 

        ORG   0

        LJMP  PROGRAM_UTAMA

       

        ORG   23h

        LJMP  SERIAL

       

        ORG   30h

PROGRAM_UTAMA:

        MOV   P1,#0FFh        ;Buat P1 sebagai Port Input

        MOV   TMOD,#20h       ;Timer-1, Mode-2 (autireload)

        MOV   TH1,#0FDh       ;baud rate 9600

        MOV   SCON,#50h       ;8-bit, 1-stop, ren = 1

        SETB  TR1             ;jalankan Timer-1

ULANG:  MOV   A,P1            ;Baca data pada P1

        MOV   SBUF,A          ;Kirim data ke COM seroal

        MOV   P2,A            ;Tulis ke Port 2

        SJMP  ULANG

 

;———————–ISR untuk Serial Port

SERIAL: JB   TI, TRANS        ;lompat jika TI =1

        MOV  A,SBUF           ;menyimpan data dari COM serial

        CLR  RI               ;reset RI

        RETI                  ;kembali dari ISR

TRANS:  CLR  TI               ;reset TI

        RETI                  ;kembali dari ISR

 

        END

 

Masalah yang utama seperti pada program di atas adalah aturan untuk TI dan RI. Saat byte sedang dituliskan pada SBUF, maka data akan dibingkai dan dikirim secara serial. Hasilnya, saat bit terakhir (bit stop) dikirimkan, maka TI menjadi tinggi. Ini kemudian akan membangkitan interupsi (tentu jika bit-bit yang berkenaan pada IE diaktifkan). Namun dalam program ISR, kita harus memeriksa kedua TI dan RI karena dua bit ini mengaktifkan interupsi yang sama. Dengan kata lain kedua sumber interupsi itu menggunakan satu interupsi baik itu saat pengiriman data maupun saat menerima data.

 

 

 

 

Contoh 11-9

 

Tulis program agar 8051 dapat membaca data P1 dan mengirimkannya pada P2 secara terus menerus, sambil menuliskan data yang diterima dari port serial, Anggaplah menggunakan XTAL 11.0592 MHz.

 

Jawaban:

 

        ORG   0000

        LJMP  PROGRAM_UTAMA

       

        ORG   0023h

        LJMP  SERIAL

       

        ORG   0030h

PROGRAM_UTAMA:

        MOV   P1,#0FFh        ;Buat P1 sebagai Port Input

        MOV   TMOD,#20h       ;Timer-1, Mode-2 (autireload)

        MOV   TH1,#0FDh       ;baud rate 9600

        MOV   SCON,#50h       ;8-bit, 1-stop, ren = 1

        MOV   IE,#10010000b   ;aktifkan Interupsi Serial

        SETB  TR1             ;jalankan Timer-1

ULANG:  MOV   A,P1            ;Baca data pada P1

        MOV   P2,A            ;Tulis ke Port 2

        SJMP  ULANG

 

;———————–ISR untuk Serial Port

SERIAL: JB    TI,TRANS        ;lompat jika TI =1

        MOV   A,SBUF          ;menyimpan data dari COM serial

        MOV   P0,A

        CLR   RI              ;reset RI

        RETI                  ;kembali dari ISR

TRANS:  CLR   TI              ;reset TI

        RETI                  ;kembali dari ISR

 

        END

 

 

 

Mereset RI atau TI sebelum Instruksi RETI

 

Saat kita menggunakan interupsi pada Timer atau hardware external, bendera interupsi akan di-reset (dibuat rendah) oleh CPU begitu menjalankan ISR dari interupsi yang bersangkutan. Hal yang berbeda pada Interupsi Serial, CPU tidak me-reset RI atau TI saat ISR serial dijalankan. Padahal RI dan TI harus dibuat rendah setelah menjalankan ISR. Sehingga  RI dan TI tersebut harus dibuat rendah oleh programmer (kita) secara software, dengan memberikan perintah “CLR TI” atau “CLR RI“. Lihat Contoh 11-10, dua perintah terakhir dari ISR Serial adalah me-reset TI dan RI, diikuti perintah “RETI“.

 

Contoh 11-10

 

Tulislah progam dengan menggunakan interupsi untuk dibawah ini.

(a)  Terima data serial dan kirimkan pada P0.

(a)         Setelah port P1 dibaca, dan kirimkan data secara serial dan berikan salinannya untuk P2

(b)Buat Timer-0 untuk menghasilkan gelombang kotak pada frekuensi 5 kHz pada Pin P0.1.

 

Jawaban:

 

        ORG   0

        LJMP  PROGRAM_UTAMA

       

        ORG   0Bh

        CPL   P0.1            ;togle P0.3

        RETI

       

        ORG   23h

        LJMP  SERIAL

       

        ORG   30h

PROGRAM_UTAMA:

        MOV   P1,#0FFh        ;Buat P1 sebagai Port Input

        MOV   TMOD,#22h       ;Timer-1, Mode-2  dan

                              ;Timer0, juga pada Mode-2

        MOV   TH1,#0F6h       ;baud rate 4800 bps

        MOV   SCON,#50h       ;8-bit, 1-stop, ren = 1

        MOV   TH0,#-92        ;untuk gelombang 5 kHz

        MOV   IE,#10010010b   ;aktifkan Interupsi Serial n Timer-0

        SETB  TR0             ;jalankan Timer-0

        SETB  TR1             ;jalankan Timer-1

ULANG:  MOV   A,P1            ;Baca data pada P1

        MOV   SBUF,A          ;mengirim data pada COM serial

        MOV   P2,A            ;Tulis ke Port 2

        SJMP  ULANG

 

;———————–ISR untuk Serial Port

SERIAL: JB    TI, TRANS       ;lompat jika TI =1

        MOV   A,SBUF          ;menyimpan data dari COM serial

        MOV   P0,A

        CLR   RI              ;reset RI

        RETI                  ;kembali dari ISR

TRANS:  CLR   TI              ;reset TI

        RETI                  ;kembali dari ISR

 

        END

 

 

 

 

Sebelum menyelesaikan subBAB ini, harap perhatikan semua bendera interupsi yang ditunjukkan pada Tabel 11-2. Register TCON berisi 4 bendera interupsi, sedang bendera RI dan TI ditempatkan pada register SCON.

 

Tabel 11-2: Bit-bit bendera Interupsi pada 8051

Inteurpt                                                 Bendera                                        Bit register SFR

Eksternal 1            INT1                 TCON.1

Timer 1                TF1                  TCON.3

Eksternal 0            INT0                 TCON.5

Timer 0                TF0                  TCON.7

Komunikasi Serial      RI+TI                SCON.1

 



 

SubBAB 11.5: PRIORITAS INTERUPSI PADA 8051

 

Pada SubBAB ini kita akan membahas tentang masalah jika ada dua interupsi yang aktif dalam waktu yang bersamaan. Yang mana yang akan ditanggapi terlebih dahulu oleh 8051? Nah Prioritas Interupsi inilah yang akan kita bahas lebih mendetil.

 

Prioritas Interupsi setelah RESET

 

Saat 8051 baru dihidupkan, prioritas interupsi menjadi seperti yang ditunjukkan pada Tabel 11-3. Seperti pada Tabel tersebut, jika interupsi ekternal 0 dan interupsi ekternal 1 sama-sama aktif, maka yang pertama ditanggapi adalah interupsi eksternal 0. Dan interupsi eksternal 1 akan ditanggapi dan dilayani, hanya setelah CPU telah selesai menjalankan ISR interupsi eksternal 0. Hal ini karena interupsi eksternal 1 memiliki prioritas yang lebih rendah.

 

Tabel 11-3: Prioritas Interupsi pada 8051 setelah Reset

Prioritas Tertinggi sampai terendah

Interupsi Eksternal 1              INT1     

Interupsi Timer 1                  TF1      

Interupsi Eksternal 0              INT0     

Interupsi Timer 0                  TF0      

Interupsi Komunikasi Serial        RI+TI    

 

 

Contoh 11-11

 

Bagaimana apabila interupsi semacam INT0, TF0, dan INT1, ternyata aktif dalam waktu yang bersamaan. Dengan menganggap level prioritas diatur seperti keadaan setelah reset, dan interupsi hardware eksternal pada mode Tersulut Level.

 

Jawaban:

 

Jika dari ketiga interupsi ini aktif dalam waktu yang bersamaan, mereka akan dikunci dan disimpan statusnya secara internal. Kemudian 8051 memeriksa kelima sumber interupsi menurut urutannya seperti yang ditampilkan pada Tabel 11-3. Jika ada yang aktif, maka kesemuanya dilayanai menurut urutannya. Sehingga jawaban dari pertanyaan di atas adalah urutan dari instrupsi yang aktif tersebut adalah, IE0 (eksternal interupt 0) dilayani pertama kali, lalu Timer-0 (TF0), dan akhirnya IE1 (eksternal interupt 1).

 

 

 

 

 

 

–    IP.7    Tidak digunakan.

–    IP.6    Tidak digunakan.

–    IP.5    Digunakan khusus 8052 untuk Timer-2.

PS    IP.4    Bit Prioritas Interupsi Serial Port.

PT1   IP.3    Bit Prioritas Interupsi Timer-1.

PX1   IP.2    Bit Prioritas Interupsi External 1.

PT0   IP.1    Bit Prioritas Interupsi Timer-0.

PX0   IP.0    Bit Prioritas Interupsi External 0.

 

Kita diharapkan untuk tidak menulis bit-bit yang tidak digunakan, karena bit tersebut mungkin digunakan oleh produk sejenis lainnya.

 

Gambar 11-8: Register Prioritas Interupsi (Bisa dialamati Bit)

 

Mengatur Prioritas Interupsi dengan register IP

 

Kita dapat mengubah urutan prioritas interupsi tersebut, misalnya dengan menjadikan salah satu interupsi lebih tinggi dari semua interupsi yang lainnya. Hal ini bisa kita lakukan dengan memrogram bit yang bersangkutan pada sebuah register yang kita namakan register IP (Interupt Priority), menjadi tinggi. Lihat Contoh 11-12

Hal lain yang harus diperjelas adalah di saat dua atau lebih dari interuupsi ternyata sama memiliki bit yang tinggi pada register IP, maka urutan dari interupsi-interupsi ini kembali seperti pada Tabel 11-3. Lihat contoh 11-13.

 

Catatan dari penterjemah. Pada pinsipnya proses bagi 8051 untuk menemukan insterupsi tetap menggunakan metode polling. Lho koq bisa, kan kita menggunakan interupsi? Yah itulah yang sebenarnya dilakukan mesin 8051 secara internal. 8051 akan selalu melakukan polling mulai dari INT0 dan seterusnya… seperti urutan pada tabel 11-3 namun bagi yang memiliki bit 1 pada register IP. Dan sekali lagi seperti urutan tabel 11-3 dengan bit 0 pada regsiter IP. Jadi seolah olah kita memiliki dua urutan, urutan pertama (yang memiliki hirarki/derajat lebih tinggi) dengan bit 1 pada IP dan urutan yang sama dengan bit 0 pada IP.

 

 

Contoh 11-12

 

(a) Program-lah register IP untuk mengatur prioritas tertinggi bagi INT1 (eksternal Interupt 1), dan (b) jelaskan apa yang terjadi jika (INT0, INT1, dan TF0 ternyata aktif bersamaan. Anggaplah kedua interupsi eksternal dalam Mode Tersulut Pinggir.

 

Jawaban:

 

(a)    MOV IP,#00000100b ;IP.2=1  utk INT1 setingkat lebih tinggi.

Dapat pula mengunakan intruksi “SETB IP.2“. Mengingat register IP adalah bisa dialamati Bit.

(b)    Karena dari langkah (a) intruksinya adalah mengatur INT1 menjadi memiliki prioritas lebih tinggi, dan merupakan satu-satunya yang memilik bit 1 pada register IP, maka INT1-lah yang akan dilayani pertama kali, baru kemudian INT0 dan selanjutnya TF0. Demikian seperti tabel 11-3.

 

 

 

Contoh 11-13

 

Anggaplah setelah reset, prioritas interupsi telah diatur dengan instruksi “MOV IP,#00001100b“. Jelaskan urutan dari tingkat masing-masing interupsi yang dilayani oleh 8051.,

 

Jawaban:

 

Instruksi “MOV IP,#00001100b” (b maksudnya binary) mengatur interupsi eksternal 1 (INT1) dan Timer-1(TF1) menjadi memiliki prioritas lebih tinggi satu tingkat. Selanjutnya 8051 akan melakukan polling mulai dari bagian prioritas tinggi dan bagian prioritas biasa, semuanya seperti menuruttabel 11-3. Hasil urutannya adalah demikian.

 

Prioritas Tinggi      INT1      Interupsi Eksternal 1

Prioritas Tinggi      TF1       Interupsi Timer 1

Prioritas Biasa       INT0      Interupsi Eksternal 0

Prioritas Biasa       TF0       Interupsi Timer 0

Prioritas Biasa       RI+TI     Interupsi Komunikasi Serial

 

 

 

Interupsi di dalam Interupsi

 

Apa yang terjadi saat CPU sedang menjalankan ISR dari sebuah interupsi, lalu kemudian ada interupsi lain yang tiba-tiba aktif? Pada kasus yang demikian Interupsi yang memiliki prioritas lebih tinggilah yang dapat menginterupsi sebuah interupsi yang memiliki prioritas lebih rendah. Sebaliknya sebuah interupsi tidak bisa diinterupsi oleh interupsi yang memiliki prioritas yang lebih rendah. Semua permintaan interupsi yang memiliki prioritas lebih rendah akan diterima dan disimpan oleh CPU, dan CPU belum akan menjalankan ISR dari interupsi tersebut sampai semua layanan ISR interupsi yang lebih tinggi selesai dijalankan.

 

Membangkitkan Interupsi dengan Software

 

Ada cara yang cukup baik untuk menguji sebuah ISR yang telah kita buat, seperti yang sering dilakukan pada simulasi. Yaitu dengan menggunakan perintah yang sangat sederhana yaitu dengan men-set bit interupsi menjadi tinggi, yang kemudian CPU akan melompat pada alamat vektor tabel yang bersangkuitan. Misalnya, kita men-set bit-bit Timer pada register IE. Selanjutnya dengan menggunakan perintah “SETB TF1“, akan langsung membangkitkan interupsi, dan CPU akan melompat ke interupt vector table. Sehingga kita tidak perlu menunggu Timer menjadi rollover. Singkat kata kita dapat memaksa untuk membangkitan interupsi dengan membuat tinggi bendera interupsi yang diinginkan.

 

 



 

RINGKASAN

 

Interupsi adalah sebuah keadaan atau kejadian (event) pada internal maupun eksternal 8051 yang bisa menginterupsi CPU, dan memberitahukan CPU bahwa sebuah alat meminta layanan segera. Setiap interupsi memiliki program layanan tersendiri yang disebut ISR, Interupt Service Routine. 8051 memiliki 6 interupsi, 5 diantaranya yang bisa diakses oleh user. Yaitu interupsi untuk RESET, dua untuk Timer, dua lagi untuk Hardware Eksternal, dan satu interupsi komunikasi serial.

8051 dapat diprogram untuk menghidupkan dan mematikan interupsi, termasuk untuk mengubah prioritas dari masing-masing interupsi. Bab ini menjelaskan bagaimana untuk memrogram interupsi pada 8051.

 

 


—————————————-

|o-o| Diterjemahkan oleh Dhanny Dhuzell

—————————————-

You can leave a response, or trackback from your own site.

3 Responses to “Pemrograman Interupsi”

  1. Ketu AAreka Parea mengatakan:

    maaf numpang tanya nih, aku mncoba untuk membuat program interupsi tetapi kenapa ya kok program nya d eksekusi dua kali tiap terjadi interap pada kejadian tersebut. mohon pencerahannya apakah ada yang salah waktu saya mensetting mikro atmega 16

  2. paijo mengatakan:

    maju terus pak Mus……..!!!!!

Leave a Reply

You must be logged in to post a comment.

Anda mungkin juga sukaclose