Elektrik Elektronik Teknolojisi Alanı Temrinleri

 
Hoşgeldiniz Ziyaretçi. Lütfen giriş yapın veya kayıt olun.

Kullanıcı adınızı, şifrenizi ve aktif kalma süresini giriniz

Gönderen Konu: 10. Arduino Interrupt (Kesinti) İşlemleri  (Okunma sayısı 2961 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

18 Eylül 2015, 11:24:26
Çevrimdışı Hasan ERTÜRK
*
İleti: 472
Karma 3
Profili Görüntüle Spina Bifida 
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





















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


Ana programa ait fritzing çizimi


Ana programa ait isis çizimi


Ana programa ait çalışma videosu:
<iframe width="640" height="385" src="//www.youtube.com/embed/db_FnKTNviU?fs=1&start=" frameborder="0" allowfullscreen></iframe>

Ana programa ait isis simülasyonu videosu:
<iframe width="640" height="385" src="//www.youtube.com/embed/IlemIp1TzP8?fs=1&start=" frameborder="0" allowfullscreen></iframe>

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


Ana programa ek program eklenmiş devreye ait fritzing çizimi


Bitmiş devreye ait video:
<iframe width="640" height="385" src="//www.youtube.com/embed/8RwwHQB9OE8?fs=1&start=" frameborder="0" allowfullscreen></iframe>

Bitmiş devreye ait isis simülasyonu:
<iframe width="640" height="385" src="//www.youtube.com/embed/coKMnGWMlIw?fs=1&start=" frameborder="0" allowfullscreen></iframe>

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.
« Son Düzenleme: 30 Eylül 2016, 21:17:07 Gönderen: fatek »

12 Kasım 2016, 22:29:38
Yanıtla #1
Çevrimdışı kurusaray
*
İleti: 8
Karma 0
Profili Görüntüle 
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();
« Son Düzenleme: 12 Kasım 2016, 22:31:59 Gönderen: kurusaray »

12 Kasım 2016, 22:33:01
Yanıtla #2
Çevrimdışı Hasan ERTÜRK
*
İleti: 472
Karma 3
Profili Görüntüle Spina Bifida 
Yukarıdaki örnek açıklayıcı değil mi?

12 Kasım 2016, 22:44:27
Yanıtla #3
Çevrimdışı kurusaray
*
İleti: 8
Karma 0
Profili Görüntüle 
Yukarıdaki örnekte harici kesme kullanılmış. Ben ise zamanlama kesmesi kullanamak istiyorum.

13 Kasım 2016, 08:55:51
Yanıtla #4
Çevrimdışı Hasan ERTÜRK
*
İleti: 472
Karma 3
Profili Görüntüle Spina Bifida 

18 Şubat 2017, 11:57:38
Yanıtla #5
Çevrimdışı tolgaonder
*
İleti: 1
Karma 0
Profili Görüntüle 
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 ?