Soru & Cevap

PAYLAŞIM - ARDUINO KESME (INTERRUPT) Uygulama Tekniği

24.07.2018 - 03:10

ÖRNEK KESME PROGRAMI LİNKİ:

https://drive.google.com/open?id=13JQrjacp2bJGCdS-fAEfLQIi8Gn71384

ARDUINO genelde teker işlem yaparak çalışır. Fakat içerdiği iki KESME pinlerini kullanarak veTIMER yardımı ile ona iki işi aşağı yukarı gerçek zamanda yaptırmak mümkündür.

Ekteki örnek program bu tekniği uygulayarak D2 ve D3 pinlerini KESME olarak tanımlıyor. 

Bağlantılar:

D2 ------------- GND
D3 ------------- GND

D2 KESME bu pinin HIGH olduğu zaman ateşlemesine ve intRtn_H() işlemini yapmasına ayarlı.

D3 KESME bu pinin CHANGE olduğu zaman ateşlemesine ve intRtn_C() işlemini yapmasına ayarlı.

Bunlara göre test için:

D2 kablosunu GND den ayırdığınız zaman pin HIGH olup intRtn_H() rutinini çalıştıracaktır.
Seri Monitör de buna uyan mesajları yazacaktır.

D3 kablosunu GND den ayırdığınız zaman pin CHANGE olup intRtn_C() rutinini çalıştıracaktır.
SERI Monitör de buna uyan mesajları yazacaktır.

Kabloları geri taktığınızda da standard SERI mesajları her iki portun durumunu yazacaktır.

KESME kullanırken dikkat edilecek noktalar:

DELAY() kullanılmaz
MILLIS() artmaz
SERIAL veri okuma düzenli olmayabilir
KESME uuygulanabilecek PIN ler ARDUINO modellerine göre değişir. Her zaman referans sayfasını kontrol edin:
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Bu örnek programda göreceğiniz bir başka teknik de DELAY() yerine kullanılabilecek intDELAY() fonksiyonudur.

Bu fonksiyon MICROS() komutu kullanarak yukarıdaki problemi elimine ediyor.

Gördüğünüz gibi her iki ISR rutini de bu intDelay() kullanarak istenen yavaşlatmayı uyguluyor.

KESME olaylarını halleden rutinlerin çok çabuk çalışması ve fazla lüzümsuz işleri yapmaması gerektiğinden, her iki ISR rutinde de birer FLAG (bayrak) kullanılmıştır.

Bu teknik,  KESME olayını tanımlayıp bu veriyi ana LOOP() kısmına iletmekte kullanılır. Böylece KESME ye ait mesajlar vs KESME ISR rutini dışında halledilir.

Umarım bu örnek program KESME ile çalışmaya başlayan arkadaşlara yardımcı olur.

İyi çalışmalar.

672 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-87289-1569234090.png
yakupgovler
28.09.2019 - 12:45

@mesut, fiziksel buton kullanmadığınız için kesme kullanamazsınız. Probleminizin kaynağı kodunuzda kullandığınız delay komutları. Bu komutlar nedeniyle bekleme yaptığınız süre boyunca butonları algılatamazsınız. Yapmanız gereken delay ifadelerine millis fonksiyonu ile yeniden düzenlemek.

https://gelecegiyazanlar.turkcell.com.tr/soru/paylasim-millis-kullanarak-coklu-gorev-multitasking

adresindeki paylaşımda yer alan kodları kendi algoritmanıza uyarlayıp, kullanacaksınız. Yani hem motorun çalışmasını hem de kumandadan gelen kodu sürekli olarak okuyacak hale getirmelisiniz.

picture-158072-1530701953.jpg
TGUNEYSU
27.07.2018 - 08:06
https://create.arduino.cc/projecthub/gomecin/blinds-or-any-ac-power-motor-control-27f633?utm_campaign=new_projects&utm_content=0&utm_medium=email&utm_source=hackster&utm_term=project_name
Profile picture for user m_mesut_44
m_mesut_44
26.07.2018 - 09:05

benim yapmak istediğim motorlu perde projesi için yazmış olduğum koda 2 ayrı buton koyup perde tam açıldığında veya tam kapandığında motorların durması yazmış olduğum kod aşağıya ekledim inceleyip nasıl yapacağımı söyleyebilirseniz sevinirim    int motor_sag=13; int motor_sol=12; int butonsag=8; int butonsol=7; int butondurumsag; int butondurumsol; #include <IRremote.h> IRrecv irrecv(2); decode_results results; #define BUTON0 0x20DF08F7 #define YUKARI 0xE0E048B7 #define ASAGI 0xE0E008F7 void setup() { pinMode(motor_sag,OUTPUT); pinMode(motor_sol,OUTPUT); pinMode(butonsag,INPUT); pinMode(butonsol,INPUT); Serial.begin(9600); irrecv.enableIRIn(); pinMode(4, OUTPUT); digitalWrite(3, LOW); } void loop() { butondurumsag=digitalRead(butonsag); butondurumsol=digitalRead(butonsol); while (butondurumsag==1 && butondurumsol==0){ digitalWrite(motor_sag,HIGH); digitalWrite(motor_sol,LOW); } else if(butondurumsag==0 && butondurumsol==1){ digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,HIGH); delay(2000); digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,LOW); } else if(butondurumsag==1 && butondurumsol==1){ digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,LOW); } else if(butondurumsag==0 && butondurumsol==0){ digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,LOW); if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == YUKARI) digitalWrite(motor_sag,HIGH); digitalWrite(motor_sol,LOW); delay(1500); digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,LOW); irrecv.resume(); } if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == ASAGI) digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,HIGH); delay(2000); digitalWrite(motor_sag,LOW); digitalWrite(motor_sol,LOW); irrecv.resume(); } } }