Elektrik Elektronik Teknolojisi Alan Temrinleri

 
Hogeldiniz Ziyareti. Ltfen giri yapn veya kayt olun.

Kullanc adnz, ifrenizi ve aktif kalma sresini giriniz

Gnderen Konu: 10. Arduino Interrupt (Kesinti) Ýþlemleri  (Okunma says 83147 defa)

0 ye ve 1 Ziyareti konuyu incelemekte.

18 Eyll 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





















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 Dzenleme: 30 Eyll 2016, 22:47:07 Gnderen: fatek »


ileti?im: 0542 343 09 15
 

13 Kasm 2016, 00:59:38
Yantla #1
kurusaray

leti:

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 Dzenleme: 13 Kasm 2016, 01:01:59 Gnderen: kurusaray »
 

13 Kasm 2016, 01:03:01
Yantla #2
Yukarýdaki örnek açýklayýcý deðil mi?
ileti?im: 0542 343 09 15
 

13 Kasm 2016, 01:14:27
Yantla #3
kurusaray

leti:

Yukarýdaki örnekte harici kesme kullanýlmýþ. Ben ise zamanlama kesmesi kullanamak istiyorum.
 

13 Kasm 2016, 11:25:51
Yantla #4
ileti?im: 0542 343 09 15
 

18 ubat 2017, 14:27:38
Yantla #5
tolgaonder

leti:

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 ?
 

19 Aralk 2022, 13:43:36
Yantla #6
evrimd ekmert
*
leti: 5
Profili Grntle 
Sayýn hocam tekrar tekrar denedim arzu ettiðim kadar öðrenemedim. Bu komutu kullanarak yýldýz üçgen yol verme nasýl yaparýz.