Jika ditinjau dari program, interupt adalah melaksanakan subrutin, seperti pada
perintah ACALL, LCALL; hanya saja yang menginstruksikan untuk menjalankan
subrutin adalah sinyal interupsi. Sinyal interupsi ditimbulkan dari luar yaitu suatu
perangkat I/O yang memerlukan perhatian atau ingin diservis, atau dari suatu
perangkat yang termasuk didalam MCU katagori I/O. Contoh kasus adalah MCU
sebagai pengendali putaran motor, tiba-tiba motor overload, beban terlalu besar atau
ada kerusakan lain, MCU diinterupsi oleh perangkat sensor dan akan mematikan
sistem dan memberi informasi adanya overload.
Polling adalah suatu proses yang juga dapat digunakan untuk melakukan servis
rutin yang dikehendaki oleh perangkat I/O atau diluar sistem MPU, tetapi dalam hal
ini MCU melakukan polling kepada perangkat tersebut apakah perlu melakukan
servis rutin atau tidak, semacam ditanya satu persatu, apakah ada sesuatu yang diluar
keadaan normal atau perlu servis atau tidak, jika tidak, prosesor akan belanjut
memeriksa perangkat lain dan seterusnya.
Terlihat jelas perbedaan antara interupt dan polling, bahwa interupt yang aktif
adalah perangkat yang ingin diservis, sedangkan polling yang aktif ada pada prosesor.
Interupt memungkinkan MCU melaksanakan program lain, sedangkan polling MCU
harus senantiasa mencek pada waktu-waktu tertentu. Untuk pembuatan program,
sistem polling lebih sederhana dan mudah dimengerti dibandingkan dengan sistem
interupt, tetapi kesemuanya tergantung kebutuhan, kerumitan proses dan kepandaian
pemrogram. Dalam kasus tertentu keduanya dapat digunakan.
101
Gb. 8. 1 Struktur interupt pada AT89C
102
Tabel 8. 1 Interupt Enabled Control Register
IEC Interupt Ena- AF - - AC AB AA A9 A8 A8H
ble Control EA ES ET1 EX1 ET0 EX0
103
alamat lain, tetapi perlu diperhatikan bahwa adanya interupt, otomatis
stack berubah.
Proses interupsi tidak menyimpan secara otomatis, register A atau PSW, untuk
keperluan penyelamatan data, harus dilakukan perintah tersendiri. Proses multiple
interupt sesuai dengan aturan prioritas dimungkinkan, tetapi perlu memperhatikan
lokasi stack, jangan sampai terlalu dalam, sehingga memory stack tumpang tindih
dengan data user atau sudah melampaui kapasitas internal RAM nya.
Interupt flag ada pada TCON Register (Tabel 8. 3), masing-masing; IE0 untuk
external 0, IE1 untuk external 1, TF0 untuk Timer 0, TF1 untuk Timer 1. Untuk Serial
ada pada SCON Register (Tabel 8. 4), masing-masing T1 untuk Serial kirim, R1
untuk serial terima.
Tabel 8. 3 Timer Control Register
TCON Timer 8F 8E 8D 8C 8B 8A 89 88 88H
Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Interupt flag dapat dikendalikan oleh software, oleh sinyal penyebab interupt
atau proses otomatis saat MCU melaksanakan ISR. Bit kendali IT0 dan IT1 pada
TCON dapat digunakan untuk memilih tipe sinyal eksternal yang menyebabkan
interupt, jika status bit tersebut bernilai '1' , maka dipilih tipe negative-edge activated
interupt, artinya sinyal eksternal dari hi ke lo yang menyebabkan interupt flag '1',
selanjutnya MCU akan meng clearkan saat akan melaksanakan ISR. Untuk status bit
'0' , dinamakan low-level activated interupt, selama sinyal eksternal bernilai '0',
dianggap masih ada interupt, artinya interupt flag hanya dapat diclear kan oleh sinyal
itu sendiri pada saat sinyal kembali ke logika '1'. Ini berarti; bila MCU telah selesai
melaksanakan ISR, tetapi sinyal interupt masih '1', MCU akan kembali melaksanakan
ISR lagi, begitu seterusnya.
Perhatikan bahwa ruang memori antara 0000h dengan 0003h hanya 3 memori,
ruang antara 0003h dengan 00Bh hanya 8 memori, artinya bahwa lokasi memori
antara interupt vector satu dengan yang lain tidak cukup tempat bagi program-
104
program yang panjang, sehingga program ISR harus ditempatkan di lokasi lain, dan di
interupt vector diberikan perintah lompat (LJMP atau AJMP) ke alamat ISR yang
baru.
VCC
U29
VCC 2 12
3 P3.0/RXD P1.0/AIN0 13
6 P3.1/TXD P1.1/AIN1 14
7 P3.2/INTO P1.2 15
8 P3.3/INT1 P1.3 16
RESET 9 P3.4/T0 P1.4 17
11 P3.5/T1 P1.5 18
P3.7 P1.6 19
5 P1.7
4 XTAL1
XTAL2
12 MHZ 1
RST/VPP
20
VCC
VCC
AT89C2051
105
1 ;program 8.1, Pencacah pulsa masuk via INT0
2 ;****************************************
3
4 $MOD51
5
0000 6 Pstart equ 0000h ;start program
002F 7 stack equ 02fh ;di internal RAM
8
9 ;================== tabel interupt vectors
0000 10 org Pstart ; power up and reset vector
0000 802E 11 sjmp init
0003 12 org Pstart+03h ; interrupt 0 vector
0003 0590 13 inc P1
0005 32 14 reti
000B 15 org Pstart+0bh ; timer 0 interrupt vector
000B 020030 16 ljmp init
0013 17 org Pstart+13h ; interrupt 1 vector
0013 020030 18 ljmp init
001B 19 org Pstart+1bh ; timer 0 interrupt 1 vector
001B 020030 20 ljmp init
0023 21 org Pstart+23h ; serial port int. vector
0023 020030 22 ljmp init
002B 23 org Pstart+2bh ; 8052 extra interrupt vector
002B 020030 24 ljmp init
25
26 ;=================== main program
0030 27 org Pstart+30h
0030 28 init:
0030 759000 29 mov P1,#0 ;nolkan P1
0033 75812F 30 mov SP,#stack ;inisialisasi stack pointer
0036 D288 31 SETB IT0 ;negative-edge activated int.
0038 D2AF 32 SETB EA ;aktifkan global interupt
33
003A 34 start:
003A 901234 35 MOV DPTR,#1234h ;contoh program utama
003D E0 36 MOVX A,@DPTR
003E F5F0 37 MOV B,a
0040 A3 38 INC DPTR
0041 E0 39 MOVX A,@DPTR
0042 25F0 40 ADD a,b
0044 80F4 41 SJMP start ;looping
42 end
43
1. Pada saat reset atau pertama MCU diberi catu, lokasi 0000h yang akan dituju
oleh MCU atau PC (Program Counter) dimuati 0000h, di lokasi tersebut terdapat
perintah lompat ke lokasi 0030h.
2. Dilokasi 0030h perintah dilaksanakan diantaranya adalah inisialisasi stack yang
menunjuk alamat 3Fh dan menghidupkan interupt.
106
3. Selanjutnya menuju alamat 003Ahh 0000 80 1
sebagai program utama (dalam hal ini 0001 2E
contoh saja), selama menjalankan
0002
program ini misalnya terjadi interupt
INT0 pada saat sedang mengeksekusi 0003 05
MOVX DPTR,#1234h, maka MCU 0004 90 2
akan menyelesaikan perintah itu lebih 0005 32
dahulu, kemudian melakukan proses
sebagai berikut; 0030 75
Penunjuk stack dinaikkan 1, menjadi
0031 90
40h 4
PC low di push ke stack dalam hal 0032 00
ini data 3Dh disimpan di lokasi 40h 5
3
Penunjuk stack dinaikkan 1, menjadi
41h 003A 90
PC hi di push ke stack dalam hal ini 003B 12 int
data 00 disimpan ke lokasi 41h,
003C 34
perhatikan bahwa 003D adalah
lokasi kembalinya setelah selesai 003D E0
melaksanakan servis interupt nanti. 003E F5
003F F0
4. PC dimuati 0003h atau program menuju 7
0040 A3
0003h, disini melaksanakan ISR.
0041 E0
5. Perintah RETI adalah mengembalikan ke
0042 25 6
lokasi semula sebelum terjadi interupt
dengan cara; 0043 F0
POPing isi stack ke PC hi. 0044 80
Penunjuk stack diturunkan 1, 0045 F4
menjadi 40h
POPing isi stack ke PC lo,
selengkapnya PC akan dimuati Gb. 8. 3 Sekuen program pencacah
003Dh, dan program kembali pulsa
melanjutkan program utama
Penunjuk stack diturunkan 1, menjadi 3Fh.
6. Program dilanjutkan hingga lokasi 0045h dan looping kembali kealamat 003Ah
secara terus-menerus, jika ada interupt, prosesnya akan sama seperti yang telah
diuraikan, Jika selama menjalankan interupt di interupt lagi oleh sumber yang
memiliki prioritas lebih tinggi, maka proses multiple interupt ini prosesnya
identik dengan yang telah dijelaskan, hanya memerlukan memory stack yang
lebih banyak.
Program P8.2 adalah pencacah pulsa dengan cara polling, yaitu mendeteksi
adanya perubahan level tegangan pada P3.5, setiap ada tegangan dari tinggi ke rendah
akan mengakibatkan port P1 bertambah satu.
107
;program 8.2, Pencacah pulsa masuk via Polling P3.5
;***************************************************
$MOD51
start:
JNB IN_PULSA,$ ;menunggu level pulsa hi
JB IN_PULSA,$ ;menunggu level pulsa kembali lo
inc P1 ;naikkan nilai P1
sjmp start
end
Program P8.3 adalah penambahan fasilitas deteksi beban lebih pada kontrol
tandon air. Dua sensor yang memberikan logika ‘0’ bila pompa-pompa mengalami
gangguan dikoneksikan ke port INT0 dan INT1, selanjutnya port P1.5 dikoneksikan
ke ALARM, yang bila berlogika ‘1’ akan berbunyi. Program menggunakan interupt
dan vector interupt INT1 dan INT0 diarahkan ke alamat lain yang berlabel
Pompa_trouble. Pada kasus ini bila terjadi interupt, program akan seakan berhenti
dan menunggu reset untuk mengulang program dari awal.
$MOD51
108
;================== interupt vectors
org Pstart ; power up and reset vector
ljmp init
org Pstart+03h ; interrupt 0 vector
ljmp pompa_trouble
org Pstart+0bh ; timer 0 interrupt vector
ljmp init ; int yg tidak digunakan arahkan ke label
; init
org Pstart+13h ; interrupt 1 vector
ljmp pompa_trouble
org Pstart+1bh ; timer 0 interrupt 1 vector
ljmp init
org Pstart+23h ; serial port interrupt vector
ljmp init
org Pstart+2bh ; 8052 extra interrupt vector
ljmp init
start:
JB TANDON,MATIKANPOMPA ;jika Tandon isi matikan kedua pompa
JB BAKPAM,POMPAPAM_ON ;jika tandon kosong dan bak pam isi
;hidupkan pompa bak PAM
JB SUMUR,POMPASUMUR_ON ;jika tandon kosong, bak pam kosong
;dan sumur isi, hidupkan pompa sumur
AJMP MATIKANPOMPA ;jika tandon kosong, bak PAM kosong
;dan sumur kosong, matikan kedua
;pompa
POMPASUMUR_ON:
SETB POMPA_SUMUR
AJMP Start
POMPAPAM_ON:
SETB POMPA_PAM
AJMP Start
MATIKANPOMPA:
;matikan semua pompa
CLR POMPA_SUMUR
CLR POMPA_PAM
AJMP Start
109
;interupt service routine (ISR)
org 0200h
Pompa_trouble: ;matikan semua pompa & program seakan berhenti
clr Pompa_sumur
clr Pompa_pam
setb alarm ;hidupkan alarm
sjmp $ ;looping disini
end
110