Kesmeler, olayları eşzamansız olarak işlemenizi sağlayan mikrodenetleyicilerin güçlü bir özelliğidir. Etkinlikleri sürekli kontrol eden yoklamanın aksine, kesintiler, bir düğme baskısı veya zamanlayıcı taşması gibi belirli bir olay meydana geldiğinde hemen yanıt verir. Bu öğretici, Arduino ile kesintileri anlama ve kullanma konusunda size rehberlik edecektir.
Ne İhtiyacınız Olacak
- Arduino Uno (veya uyumlu bir tahta)
- Push Düğmesi
- 10k-OHM direnç (aşağı çekme yapılandırması için)
- LED ve 220-ohm direnç (isteğe bağlı)
- Breadboard ve jumper telleri
- Bilgisayarınızda yüklü Arduino IDE
Adım 1: Kesmeler nelerdir?
Bir kesinti, belirli bir olayı ele almak için ana programın yürütülmesini geçici olarak durdurur. Etkinlik işlendikten sonra, program kaldığı yere devam eder. Kesmeler, adlandırılan özel işlevler kullanılarak yönetilir Kesme Hizmet Rutinleri (ISRS).
Arduino'da kesme türleri
- Harici kesintiler: Belirli pimlerdeki olaylar tarafından tetiklenir (örn., Arduino uno'da pim 2 veya 3).
- PIN Değişikliği keserleri: Herhangi bir dijital pim üzerindeki bir değişiklik ile tetiklenir.
- Zamanlayıcı keser: Zamanlayıcı taşar veya eşleşmeleri karşılaştırır.
2. Adım: Harici kesintileri kullanmak
Arduino UNO, PIN 2 ve 3'teki harici kesintileri destekler. Bu kesintileri şunları tetikleyecek şekilde yapılandırabilirsiniz:
- Yükselen: Sinyal alçaktan yükselir.
- Düşme: Sinyal yüksekten alçaktan gider.
- DEĞİŞTİRMEK: Sinyal durumu değiştirir (düşük ila yüksek veya yüksek ila düşük).
- DÜŞÜK: Sinyal düşük kalır.
Örnek Kodu: Bir Düğmeye Basın Algılama
Bu örnek, pim 2'ye bağlı bir düğme basıldığında bir LED'yi değiştirir.
#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
}
Açıklama
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: Kesinti yapılandırır.-
pin
: Kesme pimi (örn., Arduino Uno'da pim 2 veya 3). -
ISR
: Yürütülmesi için Kesme Hizmet Rutini. -
mode
: Tetikleme koşulu (RISING
,FALLING
,CHANGE
, veyaLOW
).
-
-
digitalPinToInterrupt(pin)
: PIN numarasını kesinti numarasına dönüştürür.
Adım 3: PIN değiştirme kesintilerini kullanmak
Pim değiştirme kesintileri, herhangi bir dijital pimdeki değişiklikleri tespit etmenizi sağlar. Bu, ek kütüphaneler gerektirir, örneğin Etkinleştirme.
Örnek Kodu: Pin Değişikliği Kesme
#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
}
Kütüphane Kurulumu
PIN değiştirme kesintilerini kullanmak için Etkinleştirme Kütüphane Arduino Kütüphane Yöneticisi aracılığıyla.
4. Adım: Zamanlayıcı keser
Zamanlayıcı kesintileri, görevleri hassas aralıklarla planlamak için kullanışlıdır. Şuraya bakın Arduino zamanlayıcı öğreticisi Zamanlayıcı kesintilerini yapılandırma ile ilgili ayrıntılar için.
Örnek: Timer1 kesinti ile bir LED'i yanıp sönmek
#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
}
Adım 5: Kesme kullanmak için en iyi uygulamalar
- ISRS'yi kısa tut: Hızlı yanıt sağlamak için ISR'lerde gecikmelerden veya karmaşık hesaplamalardan kaçının.
- ISRS'de seri iletişimden kaçının: Seri işlevleri bir ISR içinde güvenilir bir şekilde çalışmayabilir.
-
Kullanmak
volatile
Paylaşılan değişkenler için: ISRS ve ana program arasında paylaşılan Mark değişkenlerivolatile
derleyici optimizasyon sorunlarını önlemek için. - Debounce Girişleri: Düğme presleri gibi gürültülü sinyaller için yazılım veya donanımdaki debounce mantığını kullanın.
-
Kritik bölümler sırasında kesintileri devre dışı bırakın: Kullanmak
noInterrupts()
Veinterrupts()
Kritik kod bölümlerini korumak için.
Kesintilerin uygulamaları
- Yoklama olmadan işleme düğmeleri
- Rotary kodlayıcıları okumak
- Kritik olayların zamanlaması (örneğin, hassas motor kontrolü)
- Periyodik görevleri planlamak
- Harici sinyallere tepki vermek (örn. Sensörler, iletişim olayları)
Sorun giderme
- Kesme Tetiklenmiyor: Doğru pim ve modun yapılandırıldığından emin olun.
- Kararsız davranış: Gürültülü sinyaller ve uzun ISR'lerden kaçınır.
- Kütüphanelerle Çatışmalar: Bazı kütüphaneler dahili olarak kesintiler kullanır (örn. Servo, PWM). Kodunuzla çatışmadan emin olun.
Çözüm
Arduino projelerindeki olayların duyarlı ve verimli bir şekilde ele alınmasını sağlayan kesintiler. Harici, pim değişikliği ve zamanlayıcı kesintilerini kullanmayı öğrenerek sağlam ve kesin uygulamalar oluşturabilirsiniz. Projelerinizi geliştirmek ve performansı optimize etmek için farklı kesintilerle deneyin!