|
|
Interrupt Handling in AT89C51
Prosedur interupsi pada mikrokontroler merupakan
program yang akan dijalankan terlebih dahulu meskipun mikrokontroler sedang
menjalankan program utama (dengan kata lain prosedur interupsi merupakan
prosedur sela). Ketika interupsi terjadi, maka program utama dihentikan,
kemudian mikrokontroler menjalankan prosedur interupsi hingga selesai, setelah
prosedur interupsi selesai dieksekusi maka mikrokontroler akan kembali
menjalankan program utama.
Terdapat lima jenis sumber interupsi dalam
mikrokontroler AT89C51, yaitu dua buah interupsi ekternal (INT0 dan INT1), dua
buah interupsi counter/timer (T0 dan T1) serta interupsi komunikasi serial.
Interupsi
Eksternal
Interupsi ini diaktifkan secara level atau transisi
rendah, tergantung pada kondisi bit IT0 dan IT1 pada register TCON. Sedangkan
secara umum, interupsi eksternal dikendalikan melalui IE0 dan IE1 pada register
TCON. Supaya interupsi ini dikenali, maka vektor alamat interupsi harus
dideklarasikan pada awal program. Berikut ini adalah contoh program untuk
menangani interupsi eksternal 0 (alamat vektor 03h) untuk menghitung maju dan
mundur (tergantung level tegangan pada P0.0). Hasil cacahan dikeluarkan leat P1
dan P2. Interupsi terjadi ketika terjadi perubahan level dari tinggi ke rendah
(TCON.0 di set). Inisialisasi register dilakukan setelah label mulai, sedangkan
program utama (mengeluarkan data cacahan ke P1 (byte rendah) dan P2 (byte tinggi))
disajikan di bawah label ulang
$mod51
;TCON.0 set/clear adlh falling/low level
;IE.7 set/clear adlh enable/disable semua interrupt
;IE.0 =INT0 set/clear adlh enable/disable eksternal
0 interrupt
org 00h
jmp mulai
org 03h
jmp hitung
mulai: setb TCON.0
setb IE.0
setb IE.7
mov a, #00h
mov r0, #0f8h
ulang: mov p1, a
mov p2, r0
jmp ulang
hitung: jb P0.0, maju
subb a, #01h
jc kurang1
jmp keluar
maju: add a, #01h
jc nambah1
jmp keluar
kurang1:cjne r0, #0f0h, kurang
jmp reset
kurang: dec r0
jmp keluar
nambah1: cjne r0, #0ffh, nambah
jmp reset
nambah: inc r0
jmp keluar
reset: mov a, #00h
mov r0, #0f8h
keluar: reti
end
Interupsi
Counter/Timer
Yang dibahas di halaman ini adalah interupsi timer 0
(alamat vektor adalah 0bh) untuk menghitung naik isi register R6 dan ditampilkan
melalui P1.Timer yang diaktifkan memiliki kapasitas 16bit (mode 1), dengan
kristal 11,0592 MHz, maka diperoleh penambahan isi register R6 setiap 1 detik.
Inisialisasi register (TMOD, TCON dan IE) dilakukan setelah label mulai,
sedangkan program utama dieksekusi setelah label ulang
$mod51
org 00h
jmp mulai
org 0bh
ajmp hitung
mulai:
mov p1, #00h
mov a, #00h
mov r6, #00h
mov tmod, #81h
mov tcon, #00h
mov ie, #00h
setb ie.7
setb ie.1
setb tr0
ulang: mov a, r6
mov p1, a
lcall tunda
jmp ulang
;prosedur interupsi
hitung:cjne r5, #00h , maju
mov r5, #14
maju: dec r5
cjne r5, #00, exit
cjne r6, #100, maju2
mov r6, #00
maju2: inc r6
exit: reti
;prosedur tunda
tunda:
mov r1, #255
kurang:
dec r1
cjne r1, #00h, kurang
ret
end
Interupsi
Komunikasi Serial
-
Pengiriman Data (transmit)
Ketika kita akan mengirimkan
data secara serial menggunakan AT89c51, maka beberapa hal yang harus
dipersiapkan adalah:
1. Menentukan mode
komunikasi serialnya.
2. Menentukan kecepatan
pengiriman data (baud rate)
Mode
komunikasi ditentukan dengan mengisi register SCON sesuai dengan tabel pada data
sheet-nya. Pada contoh berikut, mode komunikasinya adalah mode 1 (pengiriman
data 8 bit dengan satu bit start dan satu bit stop), sehingga SCON dimuati data
40h, untuk menentukan baud rate, kita dapat mengaturnya menggunakan timer 1
dengan mode timer yang dapat direload (mode 2), sehingga kita isi dengan 20h.
Serta mengisi register TH1 dengan nilai sebesar 0cch untuk menghasilkan baud
rate sebesar 600,9 (kristal yang digunakan adalah 12 MHz). Jangan lupa
untuk menset bit ES, pada register IE serta (untuk mengaktifkan timer) bit TR1
dari register TCON juga harus diset.Contoh program sederhana untuk pengiriman
data dapat dilihat di bawah ini:
;program
untuk mengirim isi data pada r7
$mod51
org 00h
jmp setting
setting:
mov p0, #00
mov p1, #00
mov r7, #00
mov tmod,
#20h
mov scon,
#40h
mov th1,
#0cch
setb tr1
setb es
mulai:
call delay
cjne r7,
#100, nambah
mov r7, #00
jmp terus
nambah:
inc r7
terus:
mov a, r7
mov sbuf, a
jnb ti, $
clr ti
sjmp mulai
delay: ;mode pengurangan 5x255
mov r0, #250
loop1:
mov r1, #255
loop:
dec r1
cjne r1,#00,
loop
dec r0
cjne r0, #00,
loop1
ret
end
-
Penerimaan Data (receive)
Untuk menerima data dari
rangkaian yang memiliki program seperti di atas, maka beberapa hal yang harus
diperhatikan adalah:
1. Mode komunikasi serialnya
harus sama.
2. Kecepatan penerimaan data
(baud rate)-nya juga harus sama.
Sehingga untuk membuat
programnya, maka register-register yang berperan harus diisi dengan bilangan
yang sama, kecuali SCON, maka bir REN harus diset, sehingga SCON diisi dengan
50h. Untuk mendeteksi adanya kiriman data melalui interupsi, maka vektor
interupsi komunikasi serial harus dideklarasikan yaitu org 23h, serta bit ES,
dan EA pada register IE harus diset. Untuk mengaktifkan timer maka bit TR1 dari
register TCON juga harus diset. Program sederhana untuk menerima kiriman data
dari program di atas adalah seperti di bawah ini. (data yang diterima akan
ditampilkan pada P1)
$mod51
org 00h
jmp setting
org 23h
jmp terima
setting:
mov tmod, #20h
mov scon, #50h
mov th1, #0cch
setb EA
setb ES
setb tr1
ulang:
mov p1, a
jmp ulang
terima: mov a, sbuf
clr ri
reti
end
|