INTERUPSI
3.1 Tujuan
Praktikum ini mempelajari teknik interupsi pada mikroprosesor. Kompetensi khusus yang
akan dikuasai adalah:
Percobaan
No Kompetensi
1 2 3
1 Rangkaian sensor opto-coupler X X X
2 Algoritma mengukur frekuensi X
3 Algoritma mengukur frekuensi dengan interupsi X
4 Algoritma mengukur periode dengan interupsi X
3.3 Teori
Dalam praktikum sebelumnya, kita telah bisa mengatur kecepatan motor dengan PWM,
serta mengukur dayanya melalui resistor sense. Meski demikian, laju putaran motor yang
sebenarnya masih blm diketahuia. Pada praktikum ini kita akan memakai kit motor DC
yang sama, dimana diagram blok-nya nampak pada Gambar 3.1. Bagian baru yang akan
dipelajari adalah rotary encoder, untuk mengukur kecapatan motor DC melalui digital
input (DI) / interrupt.
Ada dua versi kit yang akan dipakai, yaitu versi 2013 dan versi 2015. Blok-blok keduanya
sama, namun ada perbedaan besar dalam koneksi pin arduinonya seperti diberikan pada
Tabel 3.1. Pada kit 2013, sinyal dari rotary encoder masuk ke pin D3. Sementara itu pada
kit 2015, ada sebuah jumper pemilih, agar sinyal masuk ke pin D2 atau A5.
Laboratorium TF II III-1
Gambar 3.1. Blok diagram kit Motor DC
Pin Arduino
Blok I/O Jenis Kit 2013 Kit 2016
Pembagi Tegangan tegangan AI A5 A0
Motor Driver enable PWM D6 -
Input 1 DO/PWM D5 D3
Input 2 DO D4 A1
Pengukur Arus tegangan AI A4 A3
Tacho Meter tegangan AI A2 A5
Rotary Sensor pulsa DI / interrupt D3 D2
Switch tegangan DI D2 A2
Laboratorium TF II III-2
Opto-coupler harus dipasang pada suatu rangkaian pull-up seperti pada Gambar 3.3.
Nampak bahwa LED TX dari optocoupler akan memancarkan cahaya ke photo-transistror
RX. Ketika menerima cahaya, maka photo-transistor akan tersambung dan sebaliknya akan
putus jika tak menerima cahaya. Transistor ini kemudian diberi trimpot sebagai resistor
pull-up, dimana harga trimpot sebaiknya diatur agar sama dengan tahanan dalam transistor
dalam keadaan terputus.
Sebagai ilustrasi, sinyal yang akan dibangkitkan opto-coupler akan nampak seperti pada
Gambar 3.3. Waktu antar pulsa (T1 ... Tn) adalah periode putaran baling-baling. Semakin
cepat baling-baling berputar, periode ini makin pendek, sehingga dalam satu selang waktu
tertentu (Tw), jumlah pulsa akan makin banyak.
Sinyal ini kemudian diumpankan ke digital input (DI) arduino, sehingga dapat diuji dengan
program sederhana berikut :
// Kode 3.1 : Membaca Masukan Opto-coupler
#define PIN_OPTO 3
void setup() {
Serial.begin(115200);
pinMode(PIN_OPTO, INPUT);
}
void loop() {
byte data=digitalRead(PIN_OPTO);
Serial.print(data);
delay(500);
}
Laboratorium TF II III-3
3.3.2 Interupsi
Interupsi adalah fitur yang memungkinkan mikroprosesor untuk :
• Jika picuan muncul, seketika itu juga aliran program normal akan dihentikan.
Menerima sinyal dari opto-coupler dengan interupsi akan jauh lebih andal dibandingkan
membacanya memakai digitalRead biasa. Contoh kode sumbernya akan diberikan dibawah
ini. Sebelum mempelajarinya, perhatikan beberapa hal berikut:
• Ada tiga jenis picuan yakni RISING (berubah dari LOW ke HIGH), FALLING
(berubah dari HIGH ke LOW), dan CHANGE (gabungan raising dan falling).
• Rutin interupsi harus dibuat sebagai suatu fungsi void tersendiri. Dalam hal ini
diberi nama taskOpto.
• Jika rutin interupsi perlu mengakses variabel global (dalam hal ini count), maka
variabel tersebut harus dideklarasikan sebagai volatile.
• Agar rutin interupsi siap beraksi, maka setup() harus memasangnya dulu dengan
fungsi attachInterrupt.
• Jika di bagian rutin normal (loop dan semua fungsi yang terpanggil oleh loop) akan
mengakses variabel global, maka harus dipastikan bahwa saat itu interupsi tidak
boleh terjadi. Untuk itu gunakan fungsi noInterrupts() dan interrupts().
Silahkan baca referensi Arduino untuk memahami volatile, attachInterrupt, noInterrups dan
interrupts.
• Rutin normal arduino (setup dan loop) berjalan sebagai background, yaitu proses
prioritas rendah yang bisa di-interupsi kapan saja. Seperti biasa, rutin ini disarankan
memakai algoritma event-driven (jalankan aksi bisa ada event).
Laboratorium TF II III-4
• Rutin interupsi (dalam hal ini INT Opto) berjalan sebagai foreground, yaitu proses
prioritas tinggi yang akan dijalankan kapan saja jika ada picuan interupsi.
• Antara foreground dan background, ada suatu buffer untuk saling bertukar data.
3.4 Latihan
Untuk latihan interupsi, buatlah rangkaian Gambar 3.6 pada protoboard. Rangkaian ini
terdiri atas:
• Rangkaian tombol (S1) yang diberi resistor pull-down (R2). Rangkaian ini diberi
tambahan sebuah kapasitor (C1) sebagai debouncer. Luaran rangkaian
dikoneksikan ke pin D2 Arduino.
• Rangkaian LED dengan resistor R1, dikoneksikan ke pin D3.
Laboratorium TF II III-5
Gambar 3.6. Rangkaian Latihan Interupsi
/* DEKLARASI *************/
#define PIN_INT 2
#define PIN_LED 3
#define INT_CHANNEL 0
#define INT_MODE RISING
/* IMPLEMENTASI *********/
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_INT, INPUT);
Laboratorium TF II III-6
void loop() {
word cacah_baru;
// membaca interupsi dengan aman
nointerrupt(); // cegah interupsi terjadi
cacah_baru = cacah; // baca dari variabel global
interrupt(); // bolehkan interupsi lagi
3.5 Aplikasi
Pada rotary encoder, ada dua kemungkinan mode pengukuran yakni :
• Mengukur banyaknya pulsa dalam satu selang waktu tertentu (pulsa / WAKTU).
Lama waktu ini sering disebut Time Gate. Jika ingin mengukur RPS (revolution per
second), maka sebaiknya Tgate diatur 1000 mili detik.
Mode mengukur banyak pulsa/waktu lebih bagus dipakai untuk putaran cepat, sementara
metode kedua untuk putaran lambat. Berikut ini dua mode pengukuran yang akan
dilakukan pada praktikum kali ini.
pU
F= (3.1)
T gate
dimana :
Laboratorium TF II III-7
F = frekuensi putaran dalam RPM / RPS
p = cacahan pulsa
Program untuk mengukur periode tersebut pada dasarnya menggunakan algoritma event-
driven. Agar lebih jelas, kali ini dijelaskan dengan diagram alir seperti Gambar 3.4.
Nampak di sini bahwa sistem ada sebuah variabel pulse yang akan mencatat banyaknya
pulsa yang telah terbaca dari opto-coupler. Pada loop utama, setiap terjadi pulsa maka
intOpto akan menaikkan cacahan pulse.
Sementara itu akan ada taskFrequency berjalan secara periodik sesuai PERIODE_GATE
(sebagai Tgate), untuk menghitung RPS sesuai rumus 3.1 dan kemudian me-reset cacahan
pulse menjadi nol lagi. Beginilah programnya:
// Kode 3.3 : Pengukuran Frekuensi Teknik Pooling
#define PERIODE_DISPLAY 5
#define PERIODE_GATE 1000
Laboratorium TF II III-8
// Pemetaan Port untuk memutar motor seperti praktikum sebelumnya
// BCD, T1, T2, MOTOR_INPUT1, MOTOR_INPUT2,
// MOTOR_ENABLE untuk kit 2013
// fungsi-fungsi standard
boolean s1IsPressed() { ... }
void writeDigit(int bcd){ ... }
void writeDigit3(int data) { ... }
void shiftDigit() {...}
//variabel global
long tdisplay, tgate;
long pulse;
int pwm;
void setup() {
Serial.begin(115200);
Serial.println("Pengukuran Frekuensi teknik pooling");
// inisialisasi mode pin
// ............
Laboratorium TF II III-9
// Task dipanggil setiap Tgate
// untuk menghitung frekuensi
void taskFrequency(long ms) {
// hitung selang waktu tw
// harusnya selalu ms selalu sama dengan tgate
// tapi bisa saja terlambat, sehingga perlu dihitung lagi
long tw = PERIODE_GATE + (ms - tgate);
// hitung frekuensi
int freq = ...................... ; // lihat persamaan (3.1)
// tampilkan ke 7 segment
writeDigit3(freq);
// reset cacahan
pulse = 0;
}
// loop utama
void loop() {
long ms = millis();
if (.............) {
taskOpto();
}
else if (.. .. .....) {
taskFrequency(ms);
tgate = tgate + PERIODE_GATE;
}
else if (.............) {
taskButton();
}
else if (.. .. ........) {
taskDisplay();
tdisplay = tdisplay + PERIODE_DISPLAY;
}
}
Kode 3.3. Pengukuran Frekuensi Teknik Pooling
Pada kode 3.4, adanya pulsa dari opto coupler diperiksa dengan cara membaca masukan
(digital input) secara terus menerus (dalam subrutin loop). Teknik ini disebut pooling.
Laboratorium TF II III-10
Kelemahan teknik ini adalah, ada kemungkinan pulsa tidak sempat terbaca karena program
sedang sibuk mengerjakan berbagai task.
Dengan interupsi, skema program untuk menghitung frekuensi menjadi seperti Gambar
3.5. TaskOpto kini tidak lagi dijalankan oleh loop secara event-driven, namun akan
berjalan begitu terjadi interupsi, akibat adanya pulsa dari opto-coupler di pin D3.
Perhatikan beberapa hal berikut:
• Rutin interupsi harus dibuat sebagai suatu fungsi void tersendiri. Dalam hal ini
diberi nama taskOpto.
• Jika rutin interupsi perlu mengakses variabel global (dalam hal ini count), maka
variabel tersebut harus dideklarasikan sebagai volatile.
Laboratorium TF II III-11
• Agar rutin interupsi siap beraksi, maka setup() harus memasangnya dulu dengan
fungsi attachInterrupt.
• Jika di bagian rutin normal (loop dan semua fungsi yang terpanggil oleh loop) akan
mengakses variabel global, maka harus dipastikan bahwa saat itu interupsi tidak
boleh terjadi. Untuk itu gunakan fungsi nointerrupt() dan interrupt().
Silahkan baca referensi Arduino untuk memahami volatile, attachInterrupt, noInterrups dan
interrupts. Berikut adalah tabel kebutuhan :
Untuk kebutuhan tersebut, rancangan tabel transisi keadaan adalah sebagai berikut :
Laboratorium TF II III-12
S1 ditekan Turunkan nilai pwm = pwm – (256/16), lalu RUN
kirimkan nilai PWM ke MOTOR DC
tdisplay > 5 ms Multiplexing 7 segment RUN
#define PERIODE_DISPLAY 5
#define PERIODE_GATE 1000
// fungsi-fungsi standard
boolean s1IsPressed() { ... }
void writeDigit(int bcd){ ... }
void writeDigit3(int data) { ... }
void shiftDigit() {...}
//variabel global
long tdisplay, tgate;
long pulse;
int pwm;
void setup() {
Serial.begin(115200);
Serial.println("Pengukuran Frekuensi teknik pooling");
// inisialisasi mode pin
// ............
Laboratorium TF II III-13
tgate = tdisplay = millis();
pulse = 0;
pwm = 255;
}
// hitung frekuensi
int freq = ...................... ;
// tampilkan ke 7 segment
writeDigit3(freq);
// reset cacahan
pulse = 0;
}
// loop utama
void loop() {
long ms = millis();
if (.............) {
taskOpto();
}
else if (.. .. .....) {
taskFrequency(ms);
tgate = tgate + PERIODE_GATE;
Laboratorium TF II III-14
}
else if (.............) {
taskButton();
}
else if (.. .. ........) {
taskDisplay();
tdisplay = tdisplay + PERIODE_DISPLAY;
}
}
Kode 3.4. Pengukuran Frekuensi dengan Interupsi
T =t i 1−t i (3.2)
Namun jika motor berputar kencang, maka periode ini akan singkat sekali dan sulit diukur.
Karena itu pengukuran periode ini dilakukan untuk sejumlah pulsa (N), lalu lama total
dibagi dengan jumlah pulsa tersebut.
t i N −t i
T = (3.3)
N
Dengan demikian, mula-mula program harus memasang task interupsi (taskOpto) yang
selalu siap mencacah variabel pulse jika ada interupsi dari opto-coupler. Kemudian ada
taskPeriode yang memeriksa cacahan tersebut, dan bila sudah mencapai harga N, maka
akan menghitung periode pulsa rata-rata sesuai rumus 3.3. Untuk menghitung selang
waktu, maka taskPeriode ini juga harus menangani variabel global tstart. Berikut adalah
tabel kebutuhannya :
Laboratorium TF II III-15
Untuk kebutuhan tersebut, rancangan tabel transisi keadaan adalah sebagai berikut :
1. Buatlah rangkaian Gambar 3.6 pada protoboard. Potret dan laporkan pada jurnal
tugas awal.
2. Cobalah melakukan latihan mode interupsi seperti yang dijelaskan pada sub bab
latihan. Paparkan hasil percobaan dan simpulkan apa beda ketiga mode tersebut.
3. Jelaskan mengapa rangkaian tombol pada latihan perlu diberi kondensator (C1)
sebagai debouncer.
5. Jelaskan dengan singkat mengapa data buffer yang diakses oleh rutin foreground
(interupsi) dan background (normal) harus diberi keyword volatile.
6. Jelaskan dengan singkat mengapa saat membaca data buffer di rutin background
(normal) harus dikawal dengan fungsi noInterrupts() dan interrupts() ?
Laboratorium TF II III-16
3.7 Praktikum
Untuk praktikum ini, koneksikan kit-kit praktikum seperti gambar berikut:
Secara keseluruhan, pada percobaan-percobaan berikut kita akan mengukur frekuensi atau
periode putaran motor pada kecepatan putar yang berubah dari paling kencang hingga
berhenti, sesuai dengan PWM yang diatur oleh penekanan tombol S1.
Laboratorium TF II III-17
• Putar baling-baling agar menghalangi opto-coupler. Seharusnya luaran digital di
monitor menjadi 1.
Jika hal itu tidak tercapai, maka anda harus melakukan trouble-shooting.
• Ambil vol meter, ukur tegangan di masukan Arduino (pin D2 atau D3). Saat baling-
baling menghalangi, tegangan seharusnya lebih dari 2 Volt. Sebaliknya saat tidak
terhalangi tegangan lebih kecil dari 1 Volt.
7. Tekan tombol reset (di kit induk) agar motor benar-benar berhenti.
Pertama, gunakan kode 3.4. Pengukuran Frekuensi dengan Interupsi, lakukan langkah-
langkah yang sama dengan percobaan sebelumnya, dan isikan hasilnya ke jurnal 3.2 kolom
TGATE=1000.
Laboratorium TF II III-18
Setelah itu lakukan percobaan ini dua kali lagi, dengan mengubah harga PERIODE_GATE
(TGATE) menjadi 500 dan lalu 100. Isikan semuanya ke jurnal 3.2 pada kolom yang
sesuai.
1. Ketikkan kode sumber periode1 pada Arduino IDE, pastikan bahwa NDATA adalah
100, lalu unggah
7. Tekan tombol reset (di kit induk) agar motor benar-benar berhenti.
Setelah itu lakukan percobaan ini dua kali lagi, dengan mengubah harga NDATA menjadi
50 dan lalu 10. Isikan semuanya ke jurnal 3.3.
3.8 Laporan
Seperti biasa, buat salinan jurnal dan kode sumber yang telah diperbaiki untuk masing-
masing anggota. Buatlah laporan dengan mengolah data hasil percobaan dan menjawab
beberapa pertanyaan berikut.
Laboratorium TF II III-19
2. Menurut anda, apakah akan lebih baik seandainya opto-coupler dipasang dalam
konfigurasi pull-down seperti berikut ? Berikan alasannya.
4. Jelas bahwa hasil pengukuran frekuensi seharusnya turun bila harga PWM
mengecil. Coba amati hasil pengukuran anda, apakah memang demikian ? Jika
tidak beri alasannya, dimana kesalahan bisa terjadi ?
4. Amati data ketiga series. Mestinya untuk PWM yang sama, berapapun harga
TGATE, maka hasil pengukuran frekwnsi akan sama. Apakah data anda memang
demikian ? Jelaskan bila memang ada perbedaan.
5. Bandingkan program Kode 3.3 dan Kode 3.4. Mengapa program Kode 3.4
berhasil mencacah pulsa lebih teliti ?
Laboratorium TF II III-20
3.8.3 Pengukuran Periode
1. Masukkan data-data dari jurnal 3.3 (pengukuran periode) ke spread-sheet. Buatlah
grafik periode terhadap pwm untuk setiap NDATA (menjadi grafik garis 3 series).
2. Seharusnya, berapapun harga NDATA, maka periode akan sama untuk harga PWM
tertentu. Apakah grafik anda menunjukkan hal itu ? Jika tidak, coba cari alasannya
kenapa kesalahan itu bisa terjadi.
4. Coba olah data lebih lanjut, buatlah 3 kolom baru yang menghitung frekwensi dari
periode untuk ketiga harga TGATE (kita sebut frekwensi_p), kemudian buatlah
grafiknya terhadap PWM (menjadi 3 series).
Laboratorium TF II III-21
JURNAL PRAKTIKUM TF2207
Modul 3 - Interupsi
Tanggal / Sesi Nomor Kit
Nama Peserta
NIM Peserta
TGATE=1000
No PWM Tw P F
1 255
2 239
3
4
5
6
7
8
9
10
Catatan:
Laboratorium TF II III-22
Jurnal 3.2 Pengukuran Frekuensi Dengan Interupsi
PWM : pwm ke motor
Tw : selang waktu pencacahan
P : Banyaknya cacahan
Fi : hasil perhitungan frekuensi (di 7 segment)
Laboratorium TF II III-23
Jurnal 3.3 Pengukuran Periode
PWM : pwm ke motor
Tw : selang waktu pencacahan
P : Banyaknya cacahan
Tp : hasil perhitungan periode (di 7 segment)
Laboratorium TF II III-24