Interupsi adalah fitur yang kuat dari mikrokontroler yang memungkinkan Anda menangani acara secara tidak sinkron. Tidak seperti pemungutan suara, yang terus -menerus memeriksa acara, interupsi segera merespons ketika peristiwa tertentu terjadi, seperti tekan tombol atau luapan timer. Tutorial ini akan memandu Anda melalui pemahaman dan menggunakan interupsi dengan Arduino.
Apa yang Anda Butuhkan
- Arduino uno (atau papan yang kompatibel)
- Tombol tekan
- Resistor 10k-ohm (untuk konfigurasi pull-down)
- LED dan resistor 220-OHM (opsional)
- Papan tempat memotong papan dan kabel jumper
- IDE Arduino diinstal di komputer Anda
Langkah 1: Apa itu interupsi?
Interupsi sementara menghentikan eksekusi program utama untuk menangani acara tertentu. Setelah acara diproses, program dilanjutkan di mana ia tinggalkan. Interupsi dikelola menggunakan fungsi khusus yang disebut Rutinitas Layanan Interupsi (ISRS).
Jenis interupsi di Arduino
- Interupsi Eksternal: Dipicu oleh peristiwa pada pin tertentu (mis., Pin 2 atau 3 di Arduino UNO).
- Pin mengubah interupsi: Dipicu oleh perubahan pada pin digital apa pun.
- Timer mengganggu: Dipicu oleh timer meluap atau membandingkan kecocokan.
Langkah 2: Menggunakan interupsi eksternal
Arduino UNO mendukung interupsi eksternal pada pin 2 dan 3. Anda dapat mengonfigurasi interupsi ini untuk memicu:
- KENAIKAN: Sinyal berubah dari rendah ke tinggi.
- Jatuh: Sinyal berubah dari tinggi ke rendah.
- MENGUBAH: Status Perubahan Sinyal (rendah ke tinggi atau tinggi ke rendah).
- RENDAH: Sinyal tetap rendah.
Contoh Kode: Mendeteksi tombol Tekan
Contoh ini mengubah LED ketika tombol yang terhubung ke pin 2 ditekan.
#define buttonPin 2 // Interrupt pin
#define ledPin 13 // Built-in LED
volatile bool ledState = false; // Shared variable between ISR and main code
void handleInterrupt() {
ledState = !ledState; // Toggle LED state
digitalWrite(ledPin, ledState);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}
void loop() {
// Main loop does nothing; interrupt handles the LED
}
Penjelasan
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: Mengkonfigurasi interupsi.-
pin
: Pin interupsi (mis., Pin 2 atau 3 di Arduino Uno). -
ISR
: Rutinitas layanan interupsi untuk dieksekusi. -
mode
: Kondisi pemicu (RISING
,FALLING
,CHANGE
, atauLOW
).
-
-
digitalPinToInterrupt(pin)
: Mengubah nomor pin ke nomor interupsi.
Langkah 3: Menggunakan Pin Change Interrupts
PIN Change Interrupts memungkinkan Anda untuk mendeteksi perubahan pada pin digital apa pun. Ini membutuhkan perpustakaan tambahan, seperti Memungkinkan interuprup.
Contoh Kode: Pin Change Interrupt
#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor
void handlePinChange() {
Serial.println("Pin state changed!");
}
void setup() {
Serial.begin(9600);
enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}
void loop() {
// Main loop does nothing; interrupt handles the event
}
Instalasi Perpustakaan
Untuk menggunakan interupsi ganti pin, instal Memungkinkan interuprup Perpustakaan melalui Manajer Perpustakaan Arduino.
Langkah 4: Timer mengganggu
Garis waktu interupsi berguna untuk tugas penjadwalan pada interval yang tepat. Mengacu kepada Tutorial Arduino Timer Untuk detail tentang mengonfigurasi interupsi timer.
Contoh: Mengedipkan LED dengan Timer1 Interrupt
#define ledPin 13
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
Langkah 5: Praktik terbaik untuk menggunakan interupsi
- Segar ISRS: Hindari penundaan atau perhitungan kompleks di ISR untuk memastikan respons cepat.
- Hindari komunikasi serial di ISRS: Fungsi serial mungkin tidak bekerja dengan andal di dalam ISR.
-
Menggunakan
volatile
untuk variabel bersama: Variabel tanda yang dibagikan antara ISRS dan program utama sebagaivolatile
untuk mencegah masalah optimasi kompiler. - Input Debounce: Tangani logika debounce dalam perangkat lunak atau perangkat keras untuk sinyal bising seperti penekan tombol.
-
Nonaktifkan interupsi selama bagian kritis: Menggunakan
noInterrupts()
Daninterrupts()
untuk melindungi bagian kode kritis.
Aplikasi interupsi
- Tombol penanganan penekan tanpa pemungutan suara
- Membaca Rotary Encoders
- Pengaturan waktu kejadian kritis (mis., Kontrol motor yang tepat)
- Penjadwalan tugas berkala
- Bereaksi terhadap sinyal eksternal (mis., Sensor, peristiwa komunikasi)
Pemecahan masalah
- Interupsi tidak memicu: Pastikan pin dan mode yang benar dikonfigurasi.
- Perilaku tidak stabil: Debounce sinyal berisik dan hindari ISR yang panjang.
- Konflik dengan perpustakaan: Beberapa perpustakaan menggunakan interupsi secara internal (mis., Servo, PWM). Pastikan tidak ada konflik dengan kode Anda.
Kesimpulan
Interupsi memungkinkan penanganan peristiwa yang responsif dan efisien dalam proyek -proyek Arduino. Dengan belajar menggunakan interupsi eksternal, perubahan pin, dan timer, Anda dapat membuat aplikasi yang kuat dan tepat. Eksperimen dengan berbagai jenis interupsi untuk meningkatkan proyek Anda dan mengoptimalkan kinerja!