Orange pi İnterrupt(Kesme) ve Trafik Işığı Uygulaması
Daha önceki yazılarımızda C ile blink uygulaması ve buton ile led kontrolü üzerine bir uygulama yaptık. Blink uygulaması ile basit bir şekilde kod yapısına baktık ve bir gpio portuna dijital olarak bir değer verdik. Buton ile kontrol ederken ise bir gpio portundan dijital bir değer okuduk ve bu değeri koşullandırarak başka bir gpio portuna lojik bir değer atadık.Bu yazımızda C programlamada interrupt(kesme) kavramını işleyeceğiz ve şuana kadar öğrendiklerimizin yanında interrupt işlemi kullanarak trafik ışığı uygulaması yapacağız. Bu uygulamada kesmeyi, yayaların bastığı buton ile trafik ışığının araçlar için kırmızı olması için kullanacağız. Ayrıca kod yapısında da bir değişikliğe gidip main fonksiyonu dışında fonksiyonlar oluşturacağız. Bu da kodun daha kolay anlaşılmasını sağlayacak.
İnterrupt nasıl uygulanır?
wiringPiISR(pin , edge type , void(*function(void))
Bu ifade main bloğunda wiringPiSetup() satırından hemen sonra tanımlanır.Bu ifade de "pin" bizim kesmeyi takip edeceğimizi pin no ' yu gösterir, "edge type"ise INT_EDGE_FALLING , INT_EDGE_RISING , INT_EDGE_BOTH olabilir ve bu ifadeler sırasıyla kenar düşümünde, kenar yükselirken, her iki kenar değişiminde kesme oluşturması anlamına gelir. Bu kesmeler oluştuğunda programın bir şeyler yürütmesi için yapılacakların olduğu bir kesme fonksiyonuna ihtiyaç vardır. "Void" kısmına kesme fonksiyonunu yazarız.
wiringPiISR(1, INT_EDGE_RISING ,&kesme ); gibi bir kesme tanımlanırsa
void kesme(){
printf("Kesme gerçekleşti");
}
gibi bir fonksiyon tanımı olabilir.
Kesmeler ile ilgili daha detaylı bilgi için http://wiringpi.com/reference/priority-interrupts-and-threads/ sitesini ziyaret edebilir veya wiringOP kütüphanesini kurduğumuzda oluşan wiringOP/examples dizine girip oradaki isr.c örnek programını inceleyebilirsiniz.
Şimdi kodumuza bakalım. Burada programı çalıştırdığımızda kod main bloğundan işlenmeye başlar. Burada gpio 7. pinden alınan değer her yükselen kenar olduğunda , yani butona her bastığımızda bir kesme oluşturması için wiringPiISR(7, INT_EDGE_RISING ,&myInterrupt0) kodunu yazdık. Daha sonra KIRMIZI , YESIL ve SARI ismini verdiğimiz pinleri çıkış olarak ayarladık. Sonrasında ise sonsuz bir for döngüsünde yesil() ve kırmızı() adlı fonksiyonlarını çağırdık.
yesil() fonksiyonunda yeşil led yanıyor ve bu işlemden sonra 5 sn bekleme oluyor. Yani 5 saniyeliğine herhangi bir işlem yapılmıyor ve yeşil led yanık kalıyor. Daha sonra burada if ile bir şart döngüsü var. Bu eğer kesme gelmiş ve kesme fonksiyonuna gidilmiş, yeşil led sönüp kırmızı led yanmış ise kesmeden geldikten sonra tekrar sarı yanmasına gerek kalmaması için yapılmış bir şart döngüsüdür. Eğer kesme gelmemişse 1 sn sarı yanıp daha sonra yeşil ve sarı sönecek ve daha sonra bu fonksiyondan çıkacaktır.
kırmızı() fonksiyonunda ise kırmızı led 5 sn boyunca yanar. Daha sonra 1 sn kırmızı led ve sarı led yanar. Sonrasında kırmızı ve sarı led söner ve fonksiyondan çıkılır.
Böylece 5 sn yeşil led ve bu sürenin bitiminde 1 saniye yeşil ve sarı led birlikte yanar. Sonrasında 5 sn kırmızı led ve bu sürenin bitiminde 1 saniye kırmızı ve sarı led birlikte yanar. Böyle bir döngüde trafik ışığı işlevi görür. Eğer bir yaya butona basarsa kesme gelir ve trafik ışığı araçlar için yeşilden kırmızıya döner.
Sorun: Burada çözemediğim bir sorun var. Bu konuda geri dönüşünüze bekliyorum. Kesme işlemi olduğunda programın ana akışı duruyor ve kesme fonksiyonundaki işlemler yapılıyor. Kesme işlemindeki işlemler yapıldıktan sonra kesme fonksiyonundan çıkılıyor ve nerede kalındıysa oradan devam ediyor.
Burada sıkıntı şu. Diyelim ki yeşil led yandı ve 2 saniye sonra biz butona bastık. Burada kesme fonksiyonundaki işlemler olan yeşil ledin sönmesi ve kırmızı ledin yanması oldu. Bu işlemler olduktan sonra kod kaldığı yerden devam eder. Yani 5 saniyelik gecikmenin 2 saniyesi geçtiğinde sen kesmeye girdiğine göre kesme fonksiyonunda çıktığında geri kalan 3 saniye bekleme devam edecek. Bu yüzden kesme fonksiyonunda yanan kırmızı led 3 saniye boyunca yanık kalacak. Daha sonra yesil() fonksiyonundan çıkılacak. Kırmızı() fonksiyonuna geçilecek ve burada kırmızı led 5 sn boyunca açık kalacak. Kırmızı led toplamda 8 sn açık kalacak. Yani kesme geldiğinden kırmızı led gerekenden fazla süre açık kalacak. Bu konu hakkındaki düşüncelerinizi orangepisersa@gmail.com' a atabilir veya yorumlara yazabilirsiniz.
Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.
Hiç yorum yok:
Yorum Gönder