📈
Ween's Lab
UdemyYouTubeTikTok
  • Welcome
  • 📻FPGA Tutorials
    • FPGA Boards: Getting Started
      • Getting Started with PYNQ on Kria KV260 Vision AI Starter Kit
      • Getting Started with PYNQ on Red Pitaya STEMlab 125-14
      • Getting Started with PYNQ on ZYBO
    • FPGA Ethernet Tutorial
      • FPGA Tutorial Ethernet 1: Simple TCP Server
    • PYNQ FPGA Tutorial 101
      • Part 0: Introduction
      • Part 1: GPIO
      • Part 2: Custom IP
      • Part 3: Memory
      • Part 4: ANN Processor
    • PYNQ FPGA Tutorial 102
      • Part 0: Introduction
      • Part 1: Memory Mapped
      • Part 2: Direct Memory Access
      • Part 3: AXI-Lite Multiplier
      • Part 4: AXI-Stream Multiplier with DMA
      • Part 5: AXI-Lite GCD
      • Part 6: AXI-Stream GCD with DMA
      • Part 7: Access to DDR from PL
    • ZYNQ FPGA Tutorial
      • Part 1: Gate-Level Combinational Circuit
      • Part 2: RT-Level Combinational Circuit
      • Part 3: Regular Sequential Circuit
      • Part 4: FSM Sequential Circuit
      • Part 5: ZYNQ Architecture
      • Part 6: ARM CPU and FPGA Module
      • Part 7: FPGA Memory
      • Part 8: Hardware Accelerator for Neural Networks
    • ZYNQ FPGA Linux Kernel Module
      • Cross Compiling Kernel, Kernel Module, and User Program for PYNQ
      • Configure PL to PS Interrupt in Kernel Module
      • Configure AXI DMA in Kernel Module
  • 📟Proyek Arduino
    • Kumpulan Proyek
      • Rangkaian LED
      • LED Berkedip Nyala Api
      • LED Chaser
      • LED Binary Counter
      • OLED 128x4 Bitcoin Ticker
      • Rangkaian Button
      • Button Multifungsi
      • Button Interrupt
      • Button Debouncing
    • Pelatihan Mikrokontroler Arduino ESP32
      • Bab 1 Pengenalan Mikrokontroler
      • Bab 2 Pengenalan Arduino
      • Bab 3 Pengenalan Bahasa C
      • Bab 4 Digital Output
      • Bab 5 Digital Input
      • Bab 6 Serial Communication
      • Bab 7 Analog-to-Digital Conversion
      • Bab 8 Interrupt
      • Bab 9 Timer
      • Bab 10 Pulse-Width Modulation
      • Bab 11 SPI Communication
      • Bab 12 I2C Communication
  • 💰Finance
    • Coding for Finance
      • Build a Bitcoin Price Alert with Google Cloud and Telegram
      • Build a Bitcoin Ticker with ESP32 and Arduino
      • Stock Price Forecasting with LSTM
    • Trading dan Investasi
      • Istilah Ekonomi, Keuangan, Bisnis, Trading, dan Investasi
      • Jalan Menuju Financial Abundance
      • Memahami Korelasi Emas, Oil, Dollar, BTC, Bonds, dan Saham
      • Mindset Trading dan Investasi
      • Rangkuman Buku: Rahasia Analisis Fundamental Saham
      • Rangkuman Buku: The Psychology of Money
      • Rangkuman Kuliah: Introduction to Adaptive Markets
      • Rumus Menjadi Orang Kaya
  • 📝Life
    • Life Quotes
Powered by GitBook
On this page
  • 1. Interrupt
  • 2. Perbedaan Polling dan Interrupt
  • 3. Library Interrupt
  • 4. Contoh Program
  • 5. Repository Kode Program
  1. Proyek Arduino
  2. Pelatihan Mikrokontroler Arduino ESP32

Bab 8 Interrupt

PreviousBab 7 Analog-to-Digital ConversionNextBab 9 Timer

Last updated 1 year ago

1. Interrupt

Interrupt merupakan sinyal yang akan melakukan interupsi terhadap CPU yang sedang mengeksekusi kode. Sinyal tersebut bisa berasal dari peripheral internal atau eksternal. Ketika interrupt terjadi, maka CPU akan mengeksekusi kode khusus untuk interrupt tersebut. Setelah selesai, maka CPU akan kembali melanjutkan eksekusi kode yang tertunda tersebut. Proses interrupt digambarkan pada Gambar 1.

Kode yang dijalankan pada interrupt biasanya merupakan kode yang bersifat critical dan harus direspon secepat mungkin.

2. Perbedaan Polling dan Interrupt

Dalam pemrograman mikrokontroler, ada dua flow eksekusi program yang biasa digunakan untuk menunggu suatu event yaitu polling dan interrupt. Salah satu contoh event yang biasa diperlukan yaitu misalnya membaca penekanan push button.

Pada metode polling, CPU akan terus menerus melakukan pembacaan GPIO yang terhubung ke push button tersebut, walaupun push button sedang tidak ditekan. Hal ini dilakukan karena CPU tidak tahu kapan push button akan ditekan.

Pada metode interrupt, CPU tidak perlu terus menerus melakukan pembacaan GPIO. GPIO tersebut akan dihubungkan dengan blok interrupt, kemudian jika terjadi penekanan push button, CPU akan diberi tahu dengan interupsi. Perbedaan polling dan interrupt digambarkan pada Gambar 2.

Analogi yang berguna untuk menjelaskan interrupt yaitu bel rumah. Daripada kita menunggu orang dengan cara mengecek pintu rumah setiap 10 menit sekali, lebih baik kita memasang bel di pintu rumah agar ketika orang datang, kita dapat diberi tahu. Dengan adanya bel rumah kita tidak perlu sibuk mengecek pintu rumah, tetapi kita bisa melakukan pekerjaan lain, misalnya memasak.

Sama seperti analogi tersebut, jika kita menggunakan interrupt untuk membaca penekanan push button, maka CPU dapat digunakan untuk melakukan eksekusi tugas lain. Tabel berikut ini merangkum perbandingan polling dan interrupt.

Polling
Interrupt

CPU melakukan sampling terhadap status peripheral.

Sebuah sinyal yang dikirim peripheral untuk menginterupsi CPU.

Eksekusi program dilakukan di fungsi utama/loop().

Eksekusi program dilakukan di fungsi interrupt service routine (ISR).

Terjadi secara periodik.

Bisa terjadi kapan saja.

Memboroskan CPU cycles.

Tidak memboroskan CPU cycles.

Tidak efisien jika event-nya jarang terjadi.

Tidak efisien jika event-nya sangat sering terjadi.

3. Library Interrupt

Pada bagian ini, kita akan belajar mengenai fungsi pada library Arduino yang diperlukan untuk menggunakan interrupt.

void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode);

Fungsi attachInterrupt berfungsi untuk menghubungkan pin GPIO input dengan interrupt. Fungsi ini memiliki tiga argumen input yaitu pin GPIO, nama fungsi ISR, dan mode interrupt:

  • pin merupakan nomor pin GPIO yang akan dihubungkan dengan interrupt. Disarankan menggunakan fungsi digitalPinToInterrupt untuk memasukkan argumen ini.

  • intRoutine merupakan nama fungsi ISR yang kita definisikan.

  • mode merupakan mode trigger interrupt yang akan digunakan. Terdapat lima mode trigger interrupt pada ESP32:

    • LOW: trigger interrupt ketika pin bernilai LOW

    • HIGH: trigger interrupt ketika pin bernilai HIGH

    • CHANGE: trigger interrupt ketika pin berubah nilai dari HIGH menjadi LOW atau LOW menjadi HIGH.

    • FALLING: trigger interrupt ketika pin berubah nilai dari HIGH menjadi LOW.

    • RISING: trigger interrupt ketika pin berubah dari LOW menjadi HIGH.

4. Contoh Program

Pada contoh program ini, kita akan mempelajari perbedaan polling dan interrupt dengan aplikasi sederhana yaitu membaca penekanan push button.

Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:

  • Development board ESP32

  • Push button

  • 2 buah LED

  • 2 buah resistor 100Ω

  • Breadboard

  • Kabel jumper

Di sini kita akan menggunakan dua buah LED (merah dan hijau). LED merah akan berkedip setiap 2 detik, dan LED hijau akan menyala jika push button ditekan.

Ilustrasi koneksi dari komponen-komponen ke ESP32 ditampilkan pada Gambar 3. Pin yang digunakan untuk menghubungkan komponen-komponen ke ESP32 ditampilkan pada tabel di bawah ini. LED dan push button tersebut menggunakan rangkaian active-low.

Sensor/Aktuator Pin
ESP32 Pin

Push button

D12

LED merah

D25

LED hijau

D26

Kode berikut ini menampilkan contoh program pembacaan push button dengan metode polling. Berikut ini penjelasan cara kerja program tersebut:

  • Pada line 2-5, kita mendefinisikan pin untuk LED dan push button.

  • Pada line 10-18, kita mengkonfigurasi pin untuk LED dan push button.

  • Pada line 24-27 berisi kode program untuk LED merah yang berkedip setiap 2 detik.

  • Pada line 29-38 berisi kode program untuk pembacaan push button dan LED hijau.

button-polling.ino
// LED pin
#define RED_LED_PIN     25
#define GREEN_LED_PIN   26
// Button pin
#define BTNPIN          12

void setup()
{
  // Konfigurasi GPIO pin sebagai output untuk LED
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  
  // Set nilai LED ke kondisi off
  digitalWrite(RED_LED_PIN, HIGH);
  digitalWrite(GREEN_LED_PIN, HIGH);
  
  // Konfigurasi GPIO pin sebagai input pull-up untuk button
  pinMode(BTNPIN, INPUT_PULLUP);
}

void loop()
{
  // Red LED berkedip setiap 2 detik
  digitalWrite(RED_LED_PIN, LOW);
  delay(2000);
  digitalWrite(RED_LED_PIN, HIGH);
  delay(2000);

  if (digitalRead(BTNPIN) == LOW) // Jika button ditekan
  {
    // Nyalakan LED
    digitalWrite(GREEN_LED_PIN, LOW);
  }
  else
  {
    // Matikan LED
    digitalWrite(GREEN_LED_PIN, HIGH);
  }
}

Gambar 4 menampilkan hasil pembacaan push button dengan metode polling. Dapat kita lihat bahwa LED merah berkedip setiap 2 detik. Ketika push button ditekan, LED hijau tidak selalu menyala atau kurang responsif. Hal ini terjadi karena pembacaan GPIO dilakukan pada fungsi loop yang juga berisi kode untuk LED merah berkedip. Pada kasus terburuk, agar penekanan push button terbaca, maka penekanan harus dilakukan selama 4 detik. Delay 4 detik ini berasal dari kode LED merah.

Kode berikut ini menampilkan contoh program pembacaan push button dengan metode interrupt. Berikut ini penjelasan cara kerja program tersebut:

  • Pada line 2-5, kita mendefinisikan pin untuk LED dan push button.

  • Pada line 7-19, kita mendefinisikan fungsi ISR untuk push button dan LED hijau. Fungsi ini yang akan di-input-kan pada fungsi attachInterrupt.

  • Pada line 24-32, kita mengkonfigurasi pin untuk LED dan push button.

  • Pada line 35, kita memanggil fungsi attachInterrupt untuk menghubungkan pin GPIO dengan interrupt. Mode yang kita gunakan yaitu mode CHANGE.

  • Pada line 40-44 berisi kode program untuk LED merah yang berkedip setiap 2 detik.

button-interrupt.ino
// LED pin
#define RED_LED_PIN     25
#define GREEN_LED_PIN   26
// Button pin
#define BTNPIN          12

void IRAM_ATTR button_isr()
{ 
  if (digitalRead(BTNPIN) == LOW) // Jika button ditekan
  {
    // Nyalakan LED
    digitalWrite(GREEN_LED_PIN, LOW);
  }
  else
  {
    // Matikan LED
    digitalWrite(GREEN_LED_PIN, HIGH);
  }
}

void setup()
{
  // Konfigurasi GPIO pin sebagai output untuk LED
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  
  // Set nilai LED ke kondisi off
  digitalWrite(RED_LED_PIN, HIGH);
  digitalWrite(GREEN_LED_PIN, HIGH);
  
  // Konfigurasi GPIO pin sebagai input pull-up untuk button
  pinMode(BTNPIN, INPUT_PULLUP);

  // Hubungkan interrupt handler (ISR) dengan button
  attachInterrupt(digitalPinToInterrupt(BTNPIN), button_isr, CHANGE);
}

void loop()
{
  // Red LED berkedip setiap 2 detik
  digitalWrite(RED_LED_PIN, LOW);
  delay(2000);
  digitalWrite(RED_LED_PIN, HIGH);
  delay(2000);
}

Gambar 5 menampilkan hasil pembacaan push button dengan metode interrupt. Pada metode interrupt, dapat kita lihat bahwa setiap penekanan push button, LED hijau selalu menyala atau lebih responsif. Hal ini terjadi karena pembacaan GPIO dilakukan pada fungsi ISR, sehingga tidak terganggu oleh kode LED merah berkedip. Ketika push button ditekan, maka CPU akan menghentikan sementara eksekusi kode LED merah, dan melakukan pembacaan push button.

5. Repository Kode Program

Kode program untuk polling dan interrupt dapat didapatkan di repository ini: dan .

📟
button-polling
button-interrupt
Gambar 1. Proses interrupt
Gambar 2. Perbedaan polling dan interrupt
Gaambar 3. Rangkaian breadboard untuk program polling dan interrupt
Gambar 4. Hasil pembacaan push button dengan metode polling
Gambar 5. Hasil pembacaan push button dengan metode interrupt