onmousedown="return false" oncontextmenu="return false" onselectstart="return false"

Monday, November 9, 2009

Interupsi pada MCS-51

Sumber interupsi MCS51
Seperti terlihat dalam Gambar 2, AT89C51 mempunyai 6 sumber interupsi, yakni Interupsi External (External Interrupt) yang berasal dari kaki INT0 dan INT1, Interupsi Timer (Timer Interrupt) yang berasal dari Timer 0 maupun Timer 1, Interupsi Port Seri (Serial Port Interrupt) yang berasal dari bagian penerima dan bagian pengirim Port Seri.
Di samping itu AT89C52 mempunyai 2 sumber interupsi lain, yakni Interupsi Timer 2 bersumber dari Timer 2 yang memang tidak ada pada AT89C51. 
Bit IE0 (atau bit IE1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Eksternal. Ada 2 keadaan yang bisa meng-aktip-kan petanda ini, yang pertama karena level tegangan ‘0’ pada kaki INT0 (atau INT1), yang kedua karena terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0 (atau INT1). Pilihan bentuk sinyal ini ditentukan lewat bit IT0 (atau bit IT1) yang terdapat dalam register TCON.
·        Kalau bit IT0 (atau IT1) =’0’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat kaki INT0=’0’.
·        Kalau bit IT0 (atau IT1) =’1’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0.
Menjelang prosesor menjalankan ISR dari Interupsi Eksternal, bit IE0 (atau bit IE1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Eksternal sudah dilayani. Namun jika permintaan Interupsi Ekternal terjadi karena level tegangan ‘0’ pada kaki IT0 (atau IT1),  dan level tegangan pada kaki tersebut saat itu masih =’0’ maka bit IE0 (atau bit IE1) akan segera menjadi ‘1’ lagi!  
Bit TF0 (atau bit TF1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Timer, bit TF0 (atau bit TF1) menjadi ‘1’ pada saat terjadi limpahan pada pencacah biner Timer 0 (atau Timer 1).
Menjelang prosesor menjalankan ISR dari Interupsi Timer, bit TF0 (atau bit TF1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Timer sudah dilayani. 
Interupsi port seri terjadi karena dua hal, yang pertama terjadi setelah port seri selesai mengirim data 1 byte, permintaan interupsi semacam ini ditandai dengan petanda (flag) TI=’1’. Yang kedua terjadi saat port seri telah menerima data 1 byte secara lengkap, permintaan interupsi semacam ini ditandai dengan petanda (flag) RI=’1’.
Petanda di atas tidak dikembalikan menjadi ‘0’ menjelang prosesor menjalankan ISR dari Interupsi port seri, karena petanda tersebut masih diperlukan ISR untuk menentukan sumber interupsi berasal dari TI atau RI. Agar port seri bisa dipakai kembali setelah mengirim atau menerima data, petanda-petanda tadi harus di-nol-kan lewat program. 
Petanda permintaan interupsi (IE0, TF0, IE1, TF1, RI dan TI) semuanya bisa di-nol-kan atau di-satu-kan lewat instruksi, pengaruhnya sama persis kalau perubahan itu dilakukan oleh perangkat keras. Artinya permintaan interupsi bisa diajukan lewat pemrograman, misalnya permintaan interupsi eksternal IT0 bisa diajukan dengan instruksi SETB IE0.

Mengaktipkan Interupsi
Semua sumber permintaan interupsi yang di bahas di atas, masing-masing bisa di-aktip-kan atau di-nonaktip-kan secara tersendiri lewat bit-bit yang ada dalam register IE (Interrupt Enable Register).
Bit EX0 dan EX1 untuk mengatur interupsi eksternal INT0 dan INT1, bit ET0 dan ET1 untuk mengatur interupsi timer 0 dan timer 1, bit ES untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2. Di samping itu ada pula bit EA yang bisa dipakai untuk mengatur semua sumber interupsi sekali gus.
Setelah reset, semua bit dalam  register IE bernilai ‘0’, artinya sistem interupsi dalam keadaan non-aktip. Untuk mengaktipkan salah satu sistem interupsi, bit pengatur interupsi bersangkutan diaktipkan dan juga EA yang mengatur semua sumber interupsi. Misalnya instruksi yang dipakai untuk mengaktipkan interupsi ekternal INT0 adalah SETB EX0  disusul dengan SETB EA.
Vektor Interupsi
Saat MCS51 menanggapi permintaan interupsi, Program Counter diisi dengan sebuah nilai yang dinamakan sebagai vektor interupsi, yang merupakan nomor awal dari memori-program yang menampung ISR untuk melayani permintaan interupsi tersebut. Vektor interupsi itu dipakai untuk melaksanakan inststuksi LCALL yang diaktipkan secara perangkat keras.
Vektor interupsi untuk interupsi eksternal INT0 adalah $0003, untuk interupsi timer 0 adalah $000B, untuk interupsi ekternal INT1 adalah $0013, untuk interupsi timer 1 adalah $001B dan untuk interupsi port seri adalah $0023.
Jarak vektor interupsi satu dengan lainnya sebesar 8, atau hanya tersedia 8 byte untuk setiap ISR. Jika sebuah ISR memang hanya pendek saja, tidak lebih dari 8 byte, maka ISR tersebut bisa langsung ditulis pada memori-program yang disediakan untuknya. ISR yang lebih panjang dari 8 byte ditulis ditempat lain, tapi pada memori-program yang ditunjuk oleh vektor interupsi diisikan instruksi JUMP ke arah ISR bersangkutan.

Tingkatan Perioritas
Masing-masing sumber interupsi bisa ditempatkan pada dua tingkatan perioritas yang berbeda. Pengaturan tingkatan perioritas isi dilakukan dengan bit-bit yang ada dalam register IP (Interrupt Priority).
Bit PX0 dan PX1 untuk mengatur tingkatan perioritas interupsi eksternal INT0 dan INT1, bit PT0 dan PT1 untuk mengatur interupsi timer 0 dan timer 1, bit PS untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2.
Setelah reset, semua bit dalam register IP bernilai ‘0’, artinya semua sumber interupsi ditempatkan pada tingkatan tanpa perioritas. Masing-masing sumber interupsi bisa ditempatkan pada tingkatan perioritas utama dengan cara men-‘satu’-kan bit pengaturnya. Misalnya interupsi timer 0 bisa ditempatkan pada tingkatan perioritas utama dengan instruksi SETB PT1.
Sebuah ISR untuk interupsi tanpa perioritas bisa diinterupsi oleh sumber interupsi yang berada dalam tingkatan perioritas utama. Tapi interupsi yang berada pada tingkatan perioritas yang sama, tidak dapat saling meng-interupsi.
Jika 2 permintaan interupsi terjadi pada saat yang bersamaan, sedangkan kedua interupsi tersebut terletak pada tingkatan perioritas yang berlainan, maka interupsi yang berada pada tingkatan perioritas utama akan dilayani terlebih dulu, setelah itu baru melayani interupsi pada tingkatan tanpa perioritas.
Jika kedua permintaan tersebut bertempat pada tingkatan perioritas yang sama, perioritas akan ditentukan dengan urutan sebagai berikut : interupsi eksternal INT0, interupsi timer 0, interupsi ekternal INT1, interupsi timer 1 dan terakhir adalah interupsi port seri.

Bagan Lengkap Sistem Interupsi MCS51
Meskipun sistem interupsi MCS51 termasuk sederhana dibandingkan dengan sistem interupsi MC68HC11 buatan Motorola, tapi karena menyangkut 5 sumber interupsi yang masing-masing harus diatur secara tersendiri, tidak mudah untuk mengingat semua masalah tersebut, terutama pada saat membuat program sering dirasakan sangat merepotkan membolak-balik buku untuk mengatur masing-masing sumber interupsi tersebut.
Gambar 2 menggambarkan sistem interupsi MCS51 selangkapnya, berikut dengan masing-masing bit dalam register-register SFR (Special Function Register) yang dipakai untuk mengatur masing-masing sumber interupsi.
Saklar yang digambarkan dalam Gambar 2 mewakili bit dalam register yang harus diatur untuk mengendalikan sumber interupsi, kotak bergambar bendera kecil merupakan flag (petanda) dalam register yang mencatat adanya permintaan interupsi dari masing-masing sumber interupsi. Kedudukan saklar dalam gambar tersebut menggambarkan kedudukan awal setelah MCS51 di-reset.
Gambar ini sangat membantu saat penulisan program menyangkut interupsi MCS51.



Gambar 2 Bagan Lengkap Sistem Interupsi MCS51


Pedoman pembuatan ISR
Layanan interupsi oleh MCS51 dilakukan dengan menjalankan program setara dengan LCALL mulai dari memori-program yang ditunjuk oleh vektor interupsi, sampai MCS51 menjumpai instruksi RETI (Return from Interrupt). Intstruksi RETI memberitahu MCS51 bahwa ISR sudah selesai dikerjakan, kemudian mengambil kembali isi Program Counter yang sebelumnya disimpan ke dalam Stack. Dengan demikian MCS51 akan melanjutkan kembali pekerjaan di program utama yang ditinggal untuk melayani interupsi.
Instruksi RET memang bisa dipakai untuk meninggalkan ISR dan melanjutkan kerja program utama. Tapi RET tidak bisa menghentikan proses interupsi, akibatnya sebelum menjumpai instruksi RETI, MCS51 tidak akan melayani permintaan interupsi yang lain.
Untuk menjelaskan pembuatan program interupsi, diperlukan program lengkap yang bisa berfungsi penuh, tapi ukuran program tersebut harus kecil sehingga bisa memberi gambaran jelas tentang interupsi. Untuk keperluan penjelasan ini, dipakai rangkaian AT89C2051 pada Gambar 3. Dengan program yang akan dibahas rangkaian ini bisa membangkitkan gelombang kotak pada kaki P1.7 (kaki nomor 19), dalam contoh kedua frekuensi gelombang kotak yang dibangkitkan bisa ditentukan dengan mengatur lebar pulsa.

Pembangkit gelombang kotak 2000 Hz
Pembangkit gelombang kotak 2000 Hz ini merupakan contoh pembuatan sistem interupsi yang sangat sederhana, hanya menggunakan rangkaian baku AT89C2051 seperti terlihat dalam Gambar 3. Yakni hanya memakai U1 AT89C2051 berikut dengan rangkaian osilator kristal yang dibentuk dengan C1, C2 dan Y1 (kristal 12 MHz), serta rangkaian reset yang terdiri dari C3 dan R3. Sinyal gelombang kotak dibangkitkan pada kaki P1.7 (kaki nomor 19).



Gambar 3 Pembentuk Gelombang Kotak 2KHz

Program 1 yang hanya 18 baris merupakan program lengkap pembangkit gelombang kotak 2000 Hz ini. Setelah program di-assembly, program-objek hasil kerja assembler diisikan ke Flash PEROM AT89C2051 dengan menggunakan AT89C2051 Flash PEROM Programmer (http://alds.stts.edu//DIGITAL/Prog2051.htm). 
Program ini memakai interupsi timer 0 yang diatur sedemikian rupa, sehingga timer 0 menginterupsi AT89C2051 setiap 250 mikro-detik. Saat terjadi interupsi, nilai pada P1.7 dibalik, jika P1.7 bernilai ‘0’ akan dibalik menjadi ‘1’ dan sebaliknya jika bernilai ‘1’ dibalik menjadi ‘0’. Dengan demikian pada kaki P1.7 akan timbul gelombang kotak yang periodenya 2x250 = 500 mikro-detik (atau frekuensinya sama dengan 1/500 mikro-detik = 2000 Hz).


Program 1 : Pembangkit gelombang kotak 2000 Hz

01: Clock bit P1.7        ; Clock dihasilkan pada P1.7
02: ;
03:       ORG $0000       ; Vektor Reset
04:       LJMP Start
05: ;
06:       ORG  $000B      ; Vektor interupsi Timer 0
07:       CPL  Clock      ; membalik nilai P1.7
08:       RETI
09: ;
10: Start:         
11:       MOV  TMODE,#$02 ; Timer 0 bekerja pada mode 2
12:       MOV  TH0,#-250  ; setiap 250 mikro-detik interupsi sekali
13:       SETB ET0        ; Aktipkan sistem interupsi Timer 0
14:       SETB EA         ; Aktipkan sistem interupsi MCS51
15:       SETB TR0        ; aktipkan Timer 0
16: TanpaHenti:
17:       SJMP TanpaHenti ; berputar tanpa henti di sini
18:       END

Baris 01 pada program menentukan yang dinamakan sebagai Clock (yakni tempat gelombang kotak dibangkitkan) diletakkan pada P1.7, cara semacam ini merupakan cara umum dan praktis dipakai untuk memberi nama lain pada kaki-kaki port parallel MCS51, agar program yang ditulis lebih enak dibaca, seperti terlihat pada baris 07.
Baris 03 menentukan agar program yang dibangkitkan assembler diletakkan pada memori-program nomor $0000, yakni lokasi pada memori-program yang ditunjuk oleh vektor reset.
Instruksi pada memori-program nomor $0000 adalah LJMP Start (baris 04), yakni mengalihkan program yang harus dikerjakan pada saat reset ke memori-program yang ditandai dengan label Start (baris 10).
Baris 06 menentukan memori-program berikutnya yang dipakai adalah nomor $000B, yakni lokasi pada memori-program yang ditunjuk oleh vektor interupsi Timer 0.
Program Layanan Interupsi (ISR – Interrupt Service Routine) untuk interupsi Timer 0 ini sangat sederhana, hanya sekedar membalik nilai Clock (P1.7) pada baris 07 dan kemudian mengakhiri ISR dengan istruksi RETI pada baris 08.
Baris 10 dan berikutnya merupakan program utama. Baris 11 sampai 15 mempersiapkan kerja dari AT89C2051, setelah itu AT89C2051 hanya berputar-putar terus pada baris 16 dan 17, tanpa mengerjakan hal yang lain.
Selama AT89C2051 berputar-putar pada baris 16 dan 17, setiap 250 mikro-detik sekali Timer 0 menginterupsi AT89C2051, sehingga AT89C2051 menjalankan ISR pada baris 07 dan 08 untuk membangkitkan gelombang kotak, dan kembali berputar lagi pada baris 16 dan 17.
Baris 16 dan 17 yang berputar tanpa maksud tersebut, memang dibuat agar contoh program ini sederhana, untuk mempertegas pembicaraan tentang mekanisme interupsi. Dalam sistem yang sesungguhnya, baris 16 dan 17 bisa diganti dengan program apa saja yang berdaya-guna.
Baris 11 mengatur kerja dari Timer 0, instruksi MOV TMODE,#$02 mengatur Timer 0 bekerja dalam Mode 2, yakni Pencacah Biner 8 bit dengan isi ulang. Dalam hal ini Timer 0 hanya dibentuk dengan pencacah TL0 yang 8 bit, setiap kali pencacah tersebut melimpah maka TL0 akan diisi ulang dengan nilai yang disimpan dalam TH0.
Baris 12 mengisi TH0 dengan nilai –250, nilai ini diisikan ke TL0 setiap kali pencacah TL0 melimpah. Pencacah TL0 merupakan pancacah naik (count up counter), karena nilai awal dari TL0 adalah –250 maka setelah menerima 250 pulsa sinyal denyut (clock) pencacah TL0 akan melimpah. Dengan kristal 12 MHz, pencacah TL0 mencacah sekali setiap 1 mikro-detik, dengan demikian Timer 0 akan menginterupsi AT89C2051 sekali setiap 250 mikro-detik.
Sesuai dengan Gambar 2, baris 13 (SETB ET0) mengaktipkan permintaan interupsi timer 0 dan baris 14 (SETB EA) mengaktipkan sistem interupsi AT89C2051 secara keseluruhan. Setelah kedua instruksi ini, Timer 0 akan meng-interupsi AT89C2051 setiap kali flag (petanda) TF0 menjadi ‘1’ karena pencacah TL0 melimpah.
Baris 15 (SETB TR0) mengaktipkan Timer 0, yakni menghubungkan sumber sinyal denyut (clock) ke Timer 0, setelah instruksi ini Timer 0 akan mulai bekerja dan 250 mikro-detik kemudian meng-interupsi AT89C2051.

No comments:

Post a Comment

Blog ini masih butuh saran dan kritik.
Oleh karena itu dimohonkan kepada siapa saja yang bersedia untuk memberikan komentar, baik berupa saran maupun kritik yang membangun untuk blog ini.
Terimakasih.