Elektrik elektronik temrinleri

Ders Notları => Arduino Öğreniyorum => Arduino Genel => Konuyu başlatan: Hasan ERTÜRK - 18 Eylül 2015, 12:54:26

Başlık: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: Hasan ERTÜRK - 18 Eylül 2015, 12:54:26
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
(http://temrinlerim.org/images/kesme/1.png)

(http://temrinlerim.org/images/kesme/2.png)

(http://temrinlerim.org/images/kesme/3.png)

(http://temrinlerim.org/images/kesme/4.png)

(http://temrinlerim.org/images/kesme/5.png)

(http://temrinlerim.org/images/kesme/3.png)

(http://temrinlerim.org/images/kesme/9.png)

(http://temrinlerim.org/images/kesme/6.png)

(http://temrinlerim.org/images/kesme/3.png)

(http://temrinlerim.org/images/kesme/7.png)

(http://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
(http://temrinlerim.org/images/kesme/10.png)

Ana programa ait fritzing çizimi
(http://temrinlerim.org/images/kesme/11.png)

Ana programa ait isis çizimi
(http://temrinlerim.org/images/kesme/12.PNG)

Ana programa ait çalışma videosu:
http://www.youtube.com/watch?v=db_FnKTNviU

Ana programa ait isis simülasyonu videosu:
http://www.youtube.com/watch?v=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.

KART INTO INT1 INT2 INT3 INT4 INT5
Uno, Nano, Mini PIN2 PIN3        
Mega, Mega2560, MegaADK PIN2 PIN3 PIN18 PIN19 PIN20 PIN21
Micro, Leonardo PIN0 PIN1 PIN2 PIN3 PIN7  
Zero DİJİTAL 4 PİNİ HARİÇ TÜM DİJİTAL PİNLER
Due TÜM DİJİTAL PİNLER

Ş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
(http://temrinlerim.org/images/kesme/13.PNG)

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

Bitmiş devreye ait video:
http://www.youtube.com/watch?v=8RwwHQB9OE8

Bitmiş devreye ait isis simülasyonu:
http://www.youtube.com/watch?v=coKMnGWMlIw

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.
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: kurusaray - 13 Kasım 2016, 00:59:38
Selamlar. Ardunio Mega'da 150ms lik bir zaman interuptu kurmak istiyorum. Nasıl yapmalıyım.

Bu örnek kod 1sn'lik.

 cli();

  // Timer1 kesmesi ayarlanıyor
  TCNT1  = 0;
  TCCR1A = 0;
  TCCR1B = 0;
  OCR1A = 15624;  // 1 saniye çalışması için gerekli zaman kesmesi frekansı
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: Hasan ERTÜRK - 13 Kasım 2016, 01:03:01
Yukarıdaki örnek açıklayıcı değil mi?
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: kurusaray - 13 Kasım 2016, 01:14:27
Yukarıdaki örnekte harici kesme kullanılmış. Ben ise zamanlama kesmesi kullanamak istiyorum.
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: Hasan ERTÜRK - 13 Kasım 2016, 11:25:51
Başka bilmiyorum arkadas.
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: tolgaonder - 18 Şubat 2017, 14:27:38
merhaba,

kesme gerçekleştiğinde çalışacak olan fonksiyonda for gibi kontrol yapılarını kullanamıyorum. Acaba delay() fonksiyonunu kullanamadığımız gibi bu yapılarıda mı kullanamıyoruz ?
Başlık: Ynt: 10. Arduino Interrupt (Kesinti) İşlemleri
Gönderen: ekmert - 19 Aralık 2022, 13:43:36
Sayın hocam tekrar tekrar denedim arzu ettiğim kadar öğrenemedim. Bu komutu kullanarak yıldız üçgen yol verme nasıl yaparız.