Interrupt'lar kelime olarak '' kesme '' anlamına gelir. Arduino gibi tek işlemcili mikrodenetleyicilerde kodlar yukarından aşağıya doğru okunur ve işlemler bu şekilde gerçekleştirilir. Normal şartlar altında bu sıra asla değiştirilmez. Ancak uzun yazılım içeren ve yüksek bekleme süresine sahip bazı durumlarda hızlı tepki süresi istediğimiz bir kod için interrupt'lar devreye girer. Interrupt'lar tetiklendiğinde ana döngünün akışı kesilir ve kesme anında istenilen işlemler devreye sokulur.
Bu konuyu bir örnekle açıklamak gerekirse ders anında hocanın dersi anlatması normal gidişattır. Yalnız bölüm başkanı kapıyı çalıp bir duyuru yapmak isterse hoca ders anlatmayı bir süreliğine bırakmak zorundadır. Bölüm başkanı duyurusunu yaptıktan sonra hoca derse kaldığı yerden devam eder. İşte bu günlük hayattan bir interrupt örneğidir. :)
Arduino'da iki çeşit interrupt vardır. Bunlardan birincisi dış kesmeler ( external interrupt ) diğeri ise zaman kesmesi'dir ( timer interrupt ). Biz ilk olarak dış kesmelere ( external interrupt ) değineceğiz. Dış kesmeler özellikle buton kullanılan programlarda oldukça işe yarar. Mesela bir butona basıldığında arduino'nun normal akışından çıkıp farklı bir veri göndermesini istiyorsunuz. Arduino'yu interrupt kullanmadan programladığınız zaman sürekli butona basılıp basılmadığı kontrol edilmelidir. External interrupt kullanıldığında ise butona basıldığı anda buton bilgisi Arduino'ya gider ve istenilen işlemler devreye sokulur. Peki external interrupt kullanılır ? Gelin şimdi ona bakalım.
Dış kesmeler Arduino'nun özel pinlerindeki voltaj değişimlerine göre devreye girerler. Bu özel pinler farklı devre kartları için şunlardır ;
Yukarıda görüldüğü gib Arduino Uno gibi atmega - 328 işlemcisi içeren Arduino'ların 2 ve 3 numaralı pinleri interrupt pinleridir.
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
attach interruptlarını devreye sokmak yukarıdaki komut kullanılır. Bu komutta digitalPinToInterrupt ile hangi interrupt pininin kullanıldığı yazılır. 2 numaralı pinse 0, 3 numaralı pin ise (pin) yerine 1 yazılır. ISR ise interrupt anında gidilecek fonksiyonu gösterir. Mode kısmında ise hangi durumda interruptın devreye gireceğiz yazılır. Daha önce dış kesmeler voltaj değişimlerinde devreye girdiğini söylemiştik. Yani 2 veya 3. pinlerin girişinde bir değişim olması gerekiyor. Bu değişimler şunlardır ;
- LOW – Dijital pindeki gerilim 0 olduğunda kesmeye girer
- CHANGE – Belirli dijital pinde oluşacak her gerilim değişiminde kesmeye girer. Yani pindeki gerilim 0’dan 5’e yükseldiğinde veya 5’ten 0’a düştüğünde kesmeye girer.
- RISING – Yükselen kenar olduğunda kesmeye girer. Yani dijital pindeki gerilim 0’dan 5 Volta çıktığında kesmeye girer.
- FALLING – Düşen kenar olduğunda kesmeye girer. Yani dijital pindeki gereilim 5’dan 0 Volta çıktığında kesmeye girer.
Not 1 : Interrupt içerisinde delay() ve millis() komutları döndürülümez.
Not 2 : Yükselen kenar Arduino Uno gibi 5V ile çalışan kartlar için 2.5 V ve üzeridir. Due gibi 3.3 V ile çalışan kartlarda ise 1.65 V ve üzeridir.
Gömülü sistem programlamayı öğrenmenin en iyi yolu kart üzerinde denemek olduğu için örnek bir uygulama gerçekleştirmeye çalışalım. Bu uygulamızda sarı led 1 sn aralıklara yanıp sönsün kırmızı led ise butona basıldığı sürece yansın aksi taktirde yanmasın.
Kodlar ;
Bu programda butonu 2. pine bağladık. Bu şekilde interrupt pinini kullanmış olduk ve yükselen kenarda kırmızı ledin yanmasını sağladık. Kırmızı led yandıktan sonra sürekli yanmaması için ise ikinci bir interrruptı devreye soktuk bu da düşen kenarda ( FALLING ) ledi_sondur fonksiyonuna giderek led'e verilen enerjiyi kesti.
Yorumlar
Yorum Gönder