PDA

Orijinalini görmek için tıklayınız : 46. Arduino Interrupt (Kesinti) İşlemleri



bolubeyi
18.Eylül.2015, 17:57
Bugünkü dersimizde arduino bir programı yürütürken yürümekte olan programı duraklatıp araya başka bir program sıkıştırmasını öğreneceğiz. Araya sıkıştırdığımız program komutları yerine getirildiğinde ana program kaldığı yerden devam edecektir.

ANA PROGRAM AKIŞ DİYAGRAMI
https://temrinlerim.org/images/kesme/1.png

https://temrinlerim.org/images/kesme/2.png

https://temrinlerim.org/images/kesme/3.png

https://temrinlerim.org/images/kesme/4.png

https://temrinlerim.org/images/kesme/5.png

https://temrinlerim.org/images/kesme/3.png

https://temrinlerim.org/images/kesme/9.png

https://temrinlerim.org/images/kesme/6.png

https://temrinlerim.org/images/kesme/3.png

https://temrinlerim.org/images/kesme/7.png

https://temrinlerim.org/images/kesme/8.png

Bir arduino programı pic ve plc programları gibi alt alta yazılan komutlardan oluşur. Arduino çalışmaya başladığında ilk komuttan itibaren tüm komutlar yukarıdan aşağıya doğru sırayla çalıştırılır. Arduinoya bağlı sensör, buton, röle kontakları gibi çevresel birimlerden gelen verilersürekli kontrol edildiğinden program son komuta geldiğinde tekrar başa döner ve bir döngü halinde sürekli çalışır.

Örneğin bir yürüyen ışık için yandaki gibi bir akış diyagramı söz konusudur. Yandaki akış diyagramında görüldüğü gibi program tüm komutları yukarıdan aşağıya sırayla çalıştırmak ve en alttaki komutu uyguladıktan sonra tekrar başa dönüp bu işlemi sonsuz bir döngü haline getirmekten ibarettir.

Akış diyagramına ait arduino kodlarımız:

// DIJITAL CIKIS PIN TANIMLAMALARI BASLADI
int birinci_led = 1;
int ikinci_led = 2;
int ucuncu_led = 3;
// DIJITAL CIKIS PIN TANIMLAMALARI BITTI

// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BAŞLADI
void setup()
{
pinMode(birinci_led, OUTPUT); // DİJİTAL 1 PİNİNE 1. LED BAĞLANACAK
pinMode(ikinci_led, OUTPUT); // DİJİTAL 2 PİNİNE 2. LED BAĞLANACAK
pinMode(ucuncu_led, OUTPUT); // DİJİTAL 3 PİNİNE 3. LED BAĞLANACAK
}
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BITTI

// ANA PROGRAM BURADA BASLADI
void loop() {
digitalWrite(birinci_led, HIGH); // DİJİTAL 1 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(birinci_led, LOW); // DİJİTAL 1 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ikinci_led, HIGH); // DİJİTAL 2 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(ikinci_led, LOW); // DİJİTAL 2 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ucuncu_led, HIGH); // DİJİTAL 3 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(ucuncu_led, LOW); // DİJİTAL 3 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}
// ANA PROGRAM BURADA BITTI

Ana programa ait montajı yapılmış devre
https://temrinlerim.org/images/kesme/10.png

Ana programa ait fritzing çizimi
https://temrinlerim.org/images/kesme/11.png

Ana programa ait isis çizimi
https://temrinlerim.org/images/kesme/12.PNG

Ana programa ait çalışma videosu:
db_FnKTNviU


Ana programa ait isis simülasyonu videosu:
IlemIp1TzP8

Arduinonun belli bir pinine gelen sinyalle belli bir fonksiyonun ya da önceden belirlenmiş bir alt programın çalıştırılmasını sağlamak için attachInterrupt komutu kullanılır.

Kullandığımız arduinonun sürümüne göre dijital pinlerden bazıları attachInterrupt pini olarak da işlev görür. Aşağıdaki tabloda farklı arduino modellerine göre kullanılabilir attachInterrupt pinleri listelenmiştir.

https://temrinlerim.org/images/kesme/15.png

Şimdi program çalışırken programın her hangi bir aşamasında dijital 2. pine bağlı olan butona basıldığında 4., 5. ve 6. ledlerin yanmasını, dijital 3. pine bağlı olan butona basıldığında 4., 5. ve 6. ledlerin sönmesini isteyelim. Burada yapacağımız işleme interrupt (kesinti) denir.

Arduino unonun dijital2 ve dijital3 pinleri (INT0 ve INT1) kesme komutu pinleridir. Yukarıdaki programda bu pinlere led bağlamıştık. Bu pinleri kullanabilmemiz için aşağıdaki şemada görüldüğü gibi 1., 2., ve 3. pinlerdeki ledleri 4., 5. ve 6. pinlere taşıyoruz. 7., 8. ve 9. pinlere de sırasıyla 4., 5. ve 6. ledleri bağlayacağız. INT0 ve INT1 girişlerine de birer adet buton bağlayıp programımızı hazırladığımız devre şemasına uygun olarak düzenleyeceğiz.

Ana programa ek program eklenmiş devreye ait isis çizimi
https://temrinlerim.org/images/kesme/13.png

Ana programa ek program eklenmiş devreye ait fritzing çizimi
https://temrinlerim.org/images/kesme/14.png

Bitmiş devreye ait video:
8RwwHQB9OE8

Bitmiş devreye ait program:

// DIJITAL CIKIS PIN TANIMLAMALARI BASLADI
int birinci_led = 4;
int ikinci_led = 5;
int ucuncu_led = 6;
int dorduncu_led = 7;
int besinci_led = 8;
int altinci_led = 9;

// DIJITAL CIKIS PIN TANIMLAMALARI BITTI

// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BAŞLADI
void setup()
{
pinMode(birinci_led, OUTPUT); // DİJİTAL 4 PİNİNE 1. LED BAĞLANACAK
pinMode(ikinci_led, OUTPUT); // DİJİTAL 5 PİNİNE 2. LED BAĞLANACAK
pinMode(ucuncu_led, OUTPUT); // DİJİTAL 6 PİNİNE 3. LED BAĞLANACAK
pinMode(dorduncu_led, OUTPUT); // DİJİTAL 7 PİNİNE 4. LED BAĞLANACAK
pinMode(besinci_led, OUTPUT); // DİJİTAL 8 PİNİNE 5. LED BAĞLANACAK
pinMode(altinci_led, OUTPUT); // DİJİTAL 9 PİNİNE 6. LED BAĞLANACAK
pinMode(2, INPUT); // DİJİTAL 4 PİNİNE 1. LED BAĞLANACAK
pinMode(3, INPUT); // DİJİTAL 5 PİNİNE 2. LED BAĞLANACAK
attachInterrupt(0, kesme, RISING); // INT0 pini (dijital2 pini) 1 yapılırsa program kesme isimli fonksiyonu yürütür.
attachInterrupt(1, kesme2, RISING); // INT1 pini (dijital3 pini) 1 yapılırsa program kesme2 isimli fonksiyonu yürütür.
}
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BITTI

// ANA PROGRAM BURADA BASLADI
void loop() {
digitalWrite(birinci_led, HIGH); // DİJİTAL 4 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(birinci_led, LOW); // DİJİTAL 4 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ikinci_led, HIGH); // DİJİTAL 5 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(ikinci_led, LOW); // DİJİTAL 5 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ucuncu_led, HIGH); // DİJİTAL 6 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(ucuncu_led, LOW); // DİJİTAL 6 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}
// ANA PROGRAM BURADA BITTI

void kesme()
{
digitalWrite(dorduncu_led, HIGH); // DİJİTAL 4 PİNİNDEKİ LED YAKILDI
digitalWrite(besinci_led, HIGH); // DİJİTAL 5 PİNİNDEKİ LED YAKILDI
digitalWrite(altinci_led, HIGH); // DİJİTAL 6 PİNİNDEKİ LED YAKILDI
}
void kesme2()
{
digitalWrite(dorduncu_led, LOW); // DİJİTAL 4 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(besinci_led, LOW); // DİJİTAL 5 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(altinci_led, LOW); // DİJİTAL 6 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}

Böylece bir program yürütülürken araya başka bir programı sıkıştırıp her iki programı da yürütmüş olduk.

Gerekmesi durumunda konuya ait program dosyalarını orjinal konu (https://temrinlerim.org/index.php?topic=231.0) ekinden (üyelik gerektirir) indirebilirsiniz.