Arduino Keser Eğitim

Arduino Interrupts Tutorial

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

  1. Arduino Uno (veya uyumlu bir tahta)
  2. Push Düğmesi
  3. 10k-OHM direnç (aşağı çekme yapılandırması için)
  4. LED ve 220-ohm direnç (isteğe bağlı)
  5. Breadboard ve jumper telleri
  6. 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

  1. Harici kesintiler: Belirli pimlerdeki olaylar tarafından tetiklenir (örn., Arduino uno'da pim 2 veya 3).
  2. PIN Değişikliği keserleri: Herhangi bir dijital pim üzerindeki bir değişiklik ile tetiklenir.
  3. 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, veya LOW).
  • 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

  1. ISRS'yi kısa tut: Hızlı yanıt sağlamak için ISR'lerde gecikmelerden veya karmaşık hesaplamalardan kaçının.
  2. ISRS'de seri iletişimden kaçının: Seri işlevleri bir ISR içinde güvenilir bir şekilde çalışmayabilir.
  3. Kullanmak volatile Paylaşılan değişkenler için: ISRS ve ana program arasında paylaşılan Mark değişkenleri volatile derleyici optimizasyon sorunlarını önlemek için.
  4. 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.
  5. Kritik bölümler sırasında kesintileri devre dışı bırakın: Kullanmak noInterrupts() Ve interrupts() Kritik kod bölümlerini korumak için.

Kesintilerin uygulamaları

  1. Yoklama olmadan işleme düğmeleri
  2. Rotary kodlayıcıları okumak
  3. Kritik olayların zamanlaması (örneğin, hassas motor kontrolü)
  4. Periyodik görevleri planlamak
  5. 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!

Yorum bırak

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.