avatar_ete

PIC Basic Ders-06 (Kesme (INTERRUPT) Kullanımı)

Başlatan ete, 28 Ağustos 2011, 16:13:09

ete

Tüm bilgisayarlar ve mikroişlemci sistemlerinde kullanılan bir özelliktir. Basitçe açıklamak gerekirse, bir mikroişlemciye kesme anında neler yapması gerektiği bir program bölümü şeklinde verilir. Açıkçası mikro işlemci kesme oluştuğu anda yaptığı işi tamamen bırakarak kesme bölümüne gider ve orada gösterilen işleri yapar. Kesme bölümünün sonunda tekrar geriye dön komutunu alır ve önceden yaptığı işe kaldığı yerden devam etmek üzere döner.


Bu olayı günlük hayatımızda yaşadığımız bir örnekle açıklayalım isterseniz. Diyelim ki bir evde yaşıyorsunuz ve bir gün tüm aileyi topladınız. Amacınız aileye bir yangın olması durumunda ne yapılması gerektiğini öğreteceksiniz. Burada yangının meydana gelmesi bir kesme olayı olacaktır. Normal yaşama düzeninde hiç yangın olmaz ise kesme oluşmayacak demektir. Ama oluşma ihtimali her zaman olacaktır.


Şimdi bir akşam yemeği esnasında yangın çıktığını varsayalım. Kesme oluşacak ve herkes önceden öğretildiği gibi görevinin başına koşacak. Yangın söndürülecek ve her kes yemeğe geri dönecektir. İşte tipik bir kesme olayına örnek.

Evren Kılıç

peki bir işlemciye aynı anda 2 iş yaptırmak için nasıl bir yol izlenmeli yemek konusundan örnek verelim yemek yerken evin diğer odasında yangın çıktı orada da bir vana var ve o vana açılır ise  30 saniye içinde yangını söndürülecek ama orada 30 saniye vakit kaybetmek değilde şu yapılması isteniyor
1-yemek yeniyor
2-yangın çıktı
3-gidip vanayı açtık geldik
4-yemek yemeye devam ediliyor
5-bu arada 30 saniye doldu
6-gidip vanayı kapattık
7-yemek yemeye devam ettik ,bu şekilde çalışma yapılabilirmi

Mucit23

#2
Kesmenin çalışma mantığı bu şekildedir zaten.
İşlemci Bir işle meşguldur O anda kesme geldi diyelim. İstisnai durumlar dışında o anda işlemci işi gücü yarıda bırakıp gidip kesmedeki işleri halledip geri gelir sonra kaldığı yerden devam eder.
İstisnai durumlar dedim çünkü bazı komutlar kesme oluşmasını engelleyebilir. Mesela pause komutu ile beklenirken kesme gelirse program kesmeye gidemez. Veya pulsin gibi komutlar işlenirken kesme gelirse kesme oluşmaz. Bu yüzden bu tip komutların kullanımına dikkat edilmelidir.

Pic ile aynı anda paralel işlem yapılamaz ama kesme gibi donanımlar sayesinde bu işlemler çok hızlı bir şekilde sırayla yapılır. İnsan hızdan dolayı işlemlerin aynı anda yapılıyormuş gibi hisseder ve görür. (Bknz; Tek çekirdek bilgisayar işlemcileri,,,,)

Senin deiğinde şöyle yapılabilir.
Timer kesmesi ile arka planda bir saat oluşturulur aynı zamanda yangın varmı yokmu kontrol edilir. Ana programdada diğer işlemler halledilir.  Eğer yangın olursa sayac başlatılır ve vanalar açılır. Sonra geçen süre 30 sn oldumu vana kapatılır. Normal işlemlere devam edilir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

est32

#3
işlemci çift çekirdek değilse asla aynı anda iki iş birden yapılamaz.
Tek çekirdek işlemciye sahip bir bilgisayarda hem müzik dinliyorum hem internete giriyorum hem de başka işler yapıyorum ama bunların tümü aynı anda olmuyor.Arka planda işler sırası ile yapılıyor,o kadar hızlı yapılıyor ki biz sanki aynı anda yapılıyormuş zannediyoruz.
Bir pic örneği vereyim;
pic ile 5 saniyelik bir melodi çalacağız ve ekrana da bu melodi süresince merhaba yazacağız. pic bu melodiyi çalarken başka hiç bir işlem yapamaz.Yani 5 saniye boyunca melodi bitene kadar melodiyi çalar.Şimdi hem ekrana yazı yazalım hem de melodi çalalım.Önce şöyle yapalım,önce melodi çalsın hemen ardından merhaba yazısını ekrana gönderelim.Bu durumda yazı ekrana 5 saniye sonra gelecektir ve isteğimiz olmayacak.
lcd ekrana bir yazıyı göndermek bir kaç mili saniye, öyle ise önce ekrana yazıyı göndeririz ve hemen ardından da melodiyi çalarız. Bu durumda merhaba yazısı ekranda 5 saniye boyunca melodi ile birlikte görünecekitr, işlemciye sanki aynı anda iki iş yaptırıyormuşuz gibi olacaktır.Bir nevi yazılımı da daha hızlı işletmiş gibi olduk.
Bana göre yazılımın kalitesini belirleyen etkenlerden biri de budur.
Ayrıca bahsettiğin yöntem en doğru yöntem.İster yangın sönene kadar orada kalınır,istenirse yangın söndükten sonra gelinip vana kapatılır.Daha doğrusu o an hangisinin yapılması daha doğru ise o yapılır, yani programı yazan kişinin yapmak istediği şey hangisine daha uygun ise o yapılmalıdır.

ete

İşlemciye birden farklı şekillerde kesme verebilirsiniz. Tek çekirdekli bu işlemcilerde bir iş sırası olur. Birden fazla ama tek kesme gelmiş ise kesme bayraklarından hangisi set edilmiş ise ona bakılır ve o işle ilgili program kısmına geçilir. Aynı anda her iki kesme bayrağıda set edilmiş ise birinden birisi mutlka öncelik almalıdır. Zaten yazdığınız program sırası önceliği belirler.
Dolayısıyla hem birinci kesme işlerini yapar sonra ikinci kesme işlerini yapar ve kesmeden çıkarsınız.
Bir örnekle açıklayalım. Bir programda Hem TMR0 kesmesi hemde PORTB0 kesmesini aktif ettiniz diyelim.
Tmr0 kesmesi oluştuğu zaman ona ait kesme bayrağı INTCON.2 biti 1 olacaktır. Programın başında diyelimki önce PORTB0 kesmesine bakıyoruz bu durumda;
IF INTCON.2=1 THEN DIGERINE_ATLA
Buradan itibarende portB.0 kesmesi işlemlerini yazar ve sonda da kesme bayrağını sıfırlarız.
DIGERINE_ATLA:
Burada da TMR0 işlemlerini yapar ve kesme bayrağını sıfırlarız.
Her ikisi sonunda diğer kesme bayrağının aktif olup olmadığını kontrol ederek ona ait işlemleride yaptırabilirsiniz.

Tabiiki kesme kaynağı yalnızca 1-2 olamaz. Gerekirse 3-4 farklı kesmeyi tek bir kesme etiketi altında değerlendirebilirsiniz. Elinizdeki ip ucu kesme bayrakları olacaktır. Hangi kesme bayrağı set edilmiş ise ona ait işlem yerine getirilerek iş sürdürülmelidir.

Ete

Evren Kılıç


Hattuşa

s.a.
ete hocam bu kesmeyi geciktirenler arasında LCD ye print süreside etkiliyor ve dikkatimi çeken konu print dediğimizde yazılan değer byte , word, float cinsine göre süre uzuyor, yani bir float değerini atıyorum 3mS de print ediyorsak word değeri 1mS den aşağı düşüyor. ve bu süre içerisinde kesme gelirse işte o zaman sıkıntılar başlıyor ve bunu aşmanın yolu varmıdır? bilmiyorum

ete

LCD nin kendi kontrolcüsü olduğu için yazma sizin işlemci oraya bir şey yazmak için bekleme yapmaz. Emri verir ve oradan ayrılır. Bu nedenle LCD ye yazma işinin gecikme yarattığını sanmıyorum. Ben rastlamadım. Gecikmeyi yaratanlar genelde komutların kendi gecikmeleri , özellikle gecikme komutları dır.
Komut gecikmeleri kaçınılmazdır. Zira her bir komutun işlenme süresi vardır. Bir basic komutu birden fazla ASM komutu gerektirir. Kesme işinde ASM her zaman üstün özelliklere sahiptir. ASM de ker bir ASM komut aralığında progream kesmeye gidebilir. Ama basicde komutun işlenme süresi bitmeden kesmeye gidemez program. Bu ise birden fazla ASM satırının işlenip bitirilmesi anlamına geliyor. Çok çok hassas kesme programları gerekiyorsa tek çözüm ASM de yazmaktır. Başka çaresi yok maalesef.

Ete

Reytabu

Hocam

Kesme ollayının mantığını anlamaya çalışıyorum. Kafama yakılan konular var.
örnek olarak R0 kesme örneği, ledi yakıp söndürmek için butonun 1-0 durumu ile yakıp  söndürülmüyor da kesme ile bu iş yapılıyor. Ben kesme durumunu bir nevi sorun olduğunda program bloke
olmayıp çalışmaya devam etmesini sağlamak için kesmenin kullanılacağını düşünmüştüm.
Birde saat örneği var. Herhalde kesmenin özelliğinden yararlanılarak saat yapılabiliyor.
kesme olayını biraz daha açabilirmiyiz.

Mucit23

Ben anlatayım.

Kesme bildiğiniz üzere donanımsal bir olaydır ve ana programda herhangi bir iş ile uğraşıyorken Kesme alt programındada başka işler yapılabilir. Ana program işlenirken kesmenin ne zaman geleceği bilinemez. Eğer kesme gelirsede İşlemci o an hangi komutu işliyorsa o komutu işleyip hemen altındaki satırdan kesme alt programına gidip oradaki işler yapar.

RB0 kesmesini düşünün. Bir butonumuz var. bu butonun herzaman okunmasını istiyoruz. Şimdi kesme kullanmadanda ana programda butonu okuyabilirdik. Herhangi bir satıra ıf'li bi sorgulamayla okurduk. Ama Programın işleyişi gereği Buton okuma komutu işlendikten sonra kod işleme sırası tekrar butona gelinceye kadar bir vakit geçer. Heleki anaprogram içerisinde birçok iş veya uzun süreli birçok iş yapılması gerekiyorsa butonları okumak çok problem olabilir. .

İşte bu durumlarda kesme çok faydalı olur.
RB0 kesmesi için düşünelim yine

Butonu RB0 bağlayalım ve RB0 kesmesini açalım. Farzedelim Butona her bastığımızda düşen kenarda kesme oluşsun.
Şimdi böyle olunca ana programda program hangi kodu işliyorsa işlesin eğerkesme oluşursa program o anki işini gücünü bırakıp kesme alt programına gidip butona basıldığı zamanki işleri yapabilir. Kesmenin faydalarından biri budur

Diğer yandan Saat projelerinde clock frekansını elde etmek için kullanılabilir.
Timer kesmesi ile Sabit bir frekansda sürekli kesme oluşturulur.  Bu kesme frekansıyla clock frekansı elde edilir. saniye dakika saat gün gün ay yıl terimler yönetilir.

Mesela donanımsal kesmeler vardır. Usart kesmesi I2C kesmesi, USB kesmesi, ADC kesmesi, MSSP kesmesi vs vs
Bu donanımsal kesmelerinde artısı çok fazladır. Mesela usart kesmesini ele alalım

Usarttan veri okuyabilmek için işlemci  sürekli olarak veri geldimi gelmedimi kontrol etmesi gerekir. Bu kimi zaman zahmetli bir iş haline dönebilir. Çünkü sürekli usartın kapısından bir bekçi gibi gelen giden varmı ona bakıyorsun. Yani kimi zaman insanın elini kolunu bağlayıp diğer işlerinden mahrum eder.
Ama işte USART kesmesi bunun gibi işlerde bizim imdadımıza yetişiyor. Usart kesmesini aktif ettiğimizde sürekli olarak gelen verinin olup olmadığını kontrol ediyor. Gelen veri varsa kesme oluşuyor. Sende gidip kesme alt programında gelen verileri alıyorsun.
I2C, USB, MSSP de genel olarak aynı işi yapıyor bildiğim kadarıyla. ADC kesmesi ise ADC dönüşümü başlatıldıktan sonra dönüşüm tamalandığında kesme oluşturuyor ve sende gidip kesme alt programında ADC değerini okuyabiliyorsun.

Kesmenin genel olarak kullanımı işlevleri böyle
Kolay gelsin.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Kesme denilen şey programda bazı yapılacak işlerin bekçisidir.
Bi rbuton kontrolünü kesme fonksiyonuna bağlamış isem, ana program içinde butona basılmışmı basılmamışmı hiç kontrol etmem. O işi kesmeye bırakırım. Nedenmi çünki butona basıldımı program çalışmasını yarıda keserek doğruca kesme etiketine gider. Ama giderken nereden ayrıldığını adres olarak bir yere not alır. Kesme içinde senin emrettiğin şeyleri yapar ve kesmeden çıkınca o not aldığı adresi kendine hdef olarak verip doğruca o adrese gider ve kaldığı yerden ana program çalışmasına devam eder. Bak adı üzerinde "kesme" neden kesme çünki yaptığı işi kesti ve gitti kesmeyi oluşturan sebeb dayalı işleri yaptı (buton basılmış ise şunu yap vs gibi.) ve geri döndü.
Buton kontrolü kesmeye bağlanır ise kesme oluştuğunda butona kesin olarak basılmış demektir. Bunednele birde gidip kesme etiketi altında artık IF BUTON=0 Then gibi bir komut yazmanın anlamı yok elbette. Orada butona basıldığı kesinde ondan sonra ne yapacaksan onu yapman gerekir.
Kesme içinde fazla zaman kaybetmemek gerekir. Mümkün olduğunca bir bit değişkenini set edip oradan çıkmak en doğrusudur. Mesela Butona basılmış ise kesme oluşur ve ben orada KESTIR=1 deyip kesmeden çıkarsam ve ana program içinde ise
IF KESTIR=1 then
   KESTIR=0
   SAYI=SAYI+1
ENDIF gibi  bir komut dizisi kullansam kesme içinde yapmam gereken sayı artırma işini orada değilde ana program içinde yapmış olurum. Bu size bir şey kaybettirmez. Tabiiki ANa program satırları çok uzun ise birden fazla yere
IF KESTIR=1 THEN kontrolü koymak yada onu bir GOSUB ile gidilen alt programa yerleştirmek akıllıca olur.

Sonuç olarak toparlarsak,
Kesme,  bizim sürekli bakmak zorunda olduğumuz bazı hareketleri ana programımızı meşgul etmesin diye bir başka kontrole bırakma işidir. Çünki Pic lerin içinde birde geri planda çalışan işlemcinin kendi programları vardır. Bu şekilde siz bakma işini geri programlara bırakmış olursunuz ve böylece sizin yerinize bir başkasını görevlendirmiş olursunuz. Ger plan programı tuşa basılıp basılmadığını kontrol eder ve besıldığı anda seni kesme etiketine yönlendirerek tuşa basıldığını haber verir. Sen de gerekeni yaparsın.
Hepsi bu kadar.
Ete

Reytabu

Teşekkürler Sn Mucit23 ve Sn ETE
Çok iyi izah edip örneklemişsiniz.
kafamdaki soru işaretleri kalktı bu konuda da.


dogus

#12
hocam timer0 ile ilgili verdiğiniz örnekte 1:64 prescaler seçildi yani 1 kesme oluşması için 64 darbe gelmesi gerekti ve dahili osilatör kullanıldı, dahili osilatörün frekansı nedir, bu osilatör mcu'nun içindemidir yoksa dışta duran kristalmidir, eğer kristal değilse kristali nasıl osilatör olarak kullanabiliriz? saat örneğinden sonra bu konuda kafam biraz karıştı, sorum 16f877a için

ete

Tmr0 kesmesi surekli sayma halinde olan tmr0 sayacinin 255 degerine ulasmasindan sonra olusur.
Tmr0 sayaci islemci yi calistiran hangi osc ise ondan puls alir. Bolme orani (option registerindedir) 1/1 alinirsa her clk plsinde bir sayar. Bolme orani 1/64 alinmis ise islemci osc sinin her 64 pulsinde bir sayar. Bu sekilde kısa surede kesme (1/1 bolme ile) ve daha uzun surede (1/256 bolme ile) kesme sureleri ayarlanabilir  Hatta tmr0 sayacina bir on yukleme degeri verilerek istenilen surede kesme yaratilebilir. Aksine bir komut vermez iseniz tmr0 normalde sifirdan saymaya baslar ve 256 ci saymada kesme olusur. Ama tmr0=200 derseniz sayma 200 den baslar ve 50 saymadan sonra kesme olusur. Sure hesabida soyle yapilir. Diyelimki islemci 4 mhz de calisiyor. Bu durumda bir komut cevrimi (yada tmr0 icin 1clk Palsi suresi 4mhz/4=1mhz ve peryot ise 1000000/1000000=1 us dir. Bu durumda 1/1 bolme oranina gore tmr0 255 sayarsa 256 us sonra kesme olusacak demektir.
1/2 bolme oranina gore 256 x 2= 512 us de kesme olusacak demektir. 1/64 bolme oranina gore ise , 256x64=16384 us de bir kesme olusacak demektir.
Herhalde artik tmr0 kesmesinin calisma mantigi anlasilmistir.
Ete

dogus

#14
Alıntı yapılan: ete - 03 Temmuz 2012, 17:06:59
Diyelimki islemci 4 mhz de calisiyor. Bu durumda bir komut cevrimi (yada tmr0 icin 1clk Palsi suresi 4mhz/4=1mhz ve peryot ise 1000000/1000000=1 us dir.

hepsini anladım da hocam neden 4 mhz,i 4'e böldünüz? 4 mhz 4.000.000 hertz, yani saniyede 4 milyon kere darbe oluşacağını belirtir, 1 saniyede 4 milyon ise 1 us 4 eder, yani bu durumda periyotumuz 1/4 us olmaz mı? nerede hata yaptığımı çözemiyorum kafam allak bullak

Powered by EzPortal