Merhaba elektronik Severler.. Bir önceki dersimizde programcılık deneyimlerimiz arasına SPİ (Seri İLETİŞİM) temellerine değindik seri haberleşme sonucu bilgiyi paralel olarak yazabileceğimiz en yaygın kullanılan 74HC595 entegresini inceledik ve PIC ile kontrolünü yapabileceğimiz yazılımını vermeden PIC programcısı için olmazsa olmaz konulardan Birisini öğrenilmesini uygun görüyorum.
Peki nedir bu olmazsa olmaz konu ?
Tabiki “KESME” yani interruptlar.
Sanıyorum kesmeleri öğrenen bir programcı PIC programcılığı yolunda epey bir yol kat etmiş olacaktır.Kesme konusundan sonra SPİ kontrol yazılımına değineceğim ve kayan yazılar ve grafik ekranlarla ilgili temel bilgiler öğrenmiş olacaksınız. Tabiki geliştirmek size kalmış bir şey.
Dersimize başlamadan önce işimize yarayabilecek kısa ip uçları vermek alışkanlık oldu.
- PIC içerisine yüklenmiş olan yazılımı çalıştırır ve çevresel aygıtları kontrol eder. Ve yazılım çalıştırılması programcının istediği doğrultuda gerçekleştirilir. Yani programcı döngüler kontrol şartları veya zamanlama kullanmışsa pic bunların hepsini yerine getirir.
- Pic aynı anda sadece ve sadece bir komut çalıştırabilir ve Program eğer bir döngüde yada zamanlama beklemesinde ise pic diğer komutu gerçekleştirmek için döngünün bitmesini yada zamanlamanın bitmesini bekler.
- Düşününki pic sonsuz döngüde ve sizde o ara butonla bir işlem yapacaksınız eğer ki programda buton sorgulamanız sonsuz döngü içinde değilse pic ile o kontrolü yapamazsınız.
- Tamda bu sırada imdada ne yetişiyor!!!Tabikide İNTERRUPT (KESME) yetişiyor.
KESME (İNTERRUT Programlanması)
Kesme Gerçek zamanlı denetleyici ve işlemcilerde büyük önem ve kolaylık taşımaktadır. Esasen kesme programlamak assembly dilinde deveye hendek atlatmaktan zor bir iştir.(tabiki bu derslerden önce :D),Fakat MikroC derleyicisinin özel bir fonksiyonu bulunur ve kesme anında program bu fonksiyona yönlendirilir. Bu yüzden oldukça kolay kullanımı vardır. Kes e fonksiyonu voidinterrupt() şeklinde başlar ve programda fonksiyon olarak çağırılamaz.Pic kesme gerçekleştiği anda fonksiyona kendiliğinden gider.
Peki genel hatlarıyla kesmeyi izah etmek gerekirse?
Kesme olgusunu günlük bir olayla bağlayıp anlatırsak evde dev akranda sinema film izliyorsunuz ve bir yandan mısır patlağı yiyorsunuz.
Ve her hangi bir andakapı zili çalıyor siz elinizdeki son mısırı yiyip filmi dondurup kapıya gidersiniz kapıda gelen kişiyi karşılarsınız konuşursunuz vs tekrar tv karşısında eski yerinizi alırsınız filmi kaldığı yerden başlatıp mısır yemeye devam edersiniz. Ve bütün bunlar bir anda gerçekleşir.
Burada gerçekleşen olayı kesme ile bağdaştıracak olursak sizin ilk başta film izleyip mısır yiyor olmanız işleyen pic programı kapının çalması KESME anı kapıya gidip orada birtakım işlemler yapmanız Kesme programı kapıdan dönüp geri geldiğinizde kalığınız yerden devam etmeniz kesme sonlanması.
Yani kesme gerçekleştiği anda PIC işlemekte olduğu Son komut satırını işler son komutun bulunduğu adres bilgisini stackregister (kaydedici) Kaydeder kesme gerçekleştri anlamına gelen kesme bağrağını kendiliğinden 1 yapar ve kesme programına gider kesme programı içerisinde olan komutları işler (burada işlemler çok uzun olmamalı ve mümkünse Delay (zamanlama) kullanılmamalıdır.
Aksi taktirde pic normal programa geç döner) Sonrasında pıcstackregister e gider ve kesmeden önce yürütülen son program komutunun adresini alır ve o komut satırının bir sonrasına giderek programı kaldığı yerden devam ettirir. Biz kesme programının sonunda kendiliğinden 1 olan kesme bayrağını 0 yapmalıyız aksi taktirde bir daha kesme programına gidilmez.
Uygulamalarımızda sıklıkla kullandığımız PIC16f628A PIC de Dış kesme Kaynakları (RBİNT0 kesmesi RB4-7 Değişiklik Kesmesi) bulunmaktadır ve iç kesme kaynakları Zaman kesmeleridir ve bunlarda TMR0 TMR1 ve TMR’ ve EEproma yazma tamamlandı kesmeleridir.ve TMR2 haricindeki kesmelerini biz direk olarak kullanmaktayız.TMR2 kesmesi ise donanımsal PWM modülünde kullanılmaktadır.
Umarım tanımlamaları iyi anlamışsınızdır.Kesme konusu benide öğrenirken epey zorlamıştı. 🙂
GelelimRB İnt0kesmesine bu kesme pıc yazılımına kullanıcının doğrudan müdehale etmesine olanak tanır Bir buton kontrolü aracılığı ile işleyen programda değişkenler veriler yada işlemler kontrol edilebilir. Bu kesmeyi kullanmak için B portunun 0.biti kesinlikler giriş olarak tanımlanmalıdır ve pic donanımı arasında yer alan İNTCON register(İNTerruptCostimizasyON) kesme ayarları kaydedicisi ve OPTION_REG (şeçenekler kaydedicisi) iyi öğrenilmelidir.
Bu kaydediciler aracılığı ile programda kesmeler aktif pasif edilir ve kesmenin gerçekleşme şartları ayarlanır.
Örneğin pıc portlarının giriş çıkış olarak ayarlanması TRİS registerleri ile yapılıyor.
Bu kaydedicilerden İNTCONregisteri inceleyelim (Bu ayar kaydedicisi TMR1 ve TMR2 kesmeleri için kullanılamaz)
Bit 7: Bu bitin anlamı Global İnterruptEnablekelimeleridir.Yani Evrensel Kesme aktif bitidir.
1 ise Kesmelere izin verilimiştirBütüm kesmelerde 1 yapılır
0 ise kesme programı kullanılmayacaktır.
Bit 6: PeripheralInterruptEnable bitEEproma veri yazılması ile ilgili MikroC’deEEproma yazma fonksiyonu olduğundan bunu kullanmıyoruz.
Bit5: TMR0 OverflowInterruptEnablebit . TMR0 sayacının başlangıca dönmesi sonucu kesme oluşturur.
1 ise TMR0 kesmesi aktif yapılır
0 olduğunda TMR0 zaman kesmesi kullanılmayacaktır
Bit4: İNTE RB0 Dış kaynak kesmesi
1 RB0 Aktif
RB0 Pasif
Bit3: RBIE RB 4 7 Değişiklik kesmesi( b Portunun 4 ve 7 portları (4 5 6 7 ) Giriş yapılmak zorundadır)
1 aktif 0 pasif
Son 3 bit ise ilgili kesmelerin bayraklarıdır her hangibir bayrak 1 iken diğer kesmeler aktif bile olsa kesmeler çalışmaz o yüzden bayraklar kesme programı sonunda 0 yapılmalıdır.
Evvet bunlarda de dediğinizi hissediyor gibiyim ama rahat olun programlarda kullanınca çok daha rahat anlayacaksınız.
Şimdi birazda Option registeregöz atalım.. (seçenekler kaydedicisi) bu register ile kesmelerin çeşitli yapılandırmasını yapıyoruz.bu sebeple optionregister bizim için önemli .
Bu registeride bitler halinde tanımlayacak olursak
Bit 7: RBPUPortB İçten Yukarı çeken (PULL UP) dirençlerini aktif yapma biti
1 pasif
0 aktif yapar.(bu dirençler Buton kontrolünde +5v a bağladığımız 10K lık direnlerin görevini görür)
Bit 6: INTEDG RB0İnt Kesmesini kenar seçme biti
1 iken kesme RB0 bağlı sinyalin Yükselen kenarında (yani Buton bağlı ise butona basılınca)gerçekleşir
0 iken kesme RB0 bağlı sinyalin düşen kenarında(yani Bağlı olan butona baılıp elimiz çekilince)gerçekleşir
Bit5: T0CS TMR0 sayacının saat kaynağının seçim biti
1 ise RA4/T0CKI bacağının her sinyalinde TMR0 sayacı bir artar.
0 ise Saat kaynağı komut çevrim sinyali olun (yani PİC firakansının ¼ ü frekansta bir artar)(bu arada TMR0 PIC ierisinde sürekli olarak 0dan 255e kadar sayan bir sayaçtır ve 255den 0a dönerken keme kurulmuş ise kesme oluşturur)
Bit4: T0SE Eğer TMR0 saat kaynağı dış sayaç seçilmişse bu bit dış sinyalin kenarını seçer.
1 ise TMR0 sinyalin düşen kenarında artar
0 ise TMR0 sinyalin yükselen kenarında artar
Bit3:sayaç ön bölücü seçim biti.
1 Önbölücü WDT(bekçi Köpeği) ayarlandı
0 önbölücü TMR0 A ayarlandı.
Bit 2-0Önbölücü oran seçme bitleri
Bit değerleri TMR0 kesme oluşturma oranı
000 ½ (TMR0 sayacının her iki defa 255 saymasından sonra Kesme Oluşturur)
001 ¼
010 1/8
011 1/16
100 1/32
101 1/64
110 1/128
111 1/256
Not: Programımızda öncelikle kesme oluşacağı şartlar belirlenmeli ve bu registerler ona göre ayarlanmalıdır.
Değerli elektronik severler Bu dersimizde RB0-İNT kesmesini örnekleyip dersimizi sonlandıracağım.
RB0-İNT KESMESİ
BR0 kesmesi Pic programına kullanıcının müdehale etmesine veya PİC dışında gerçek dünyadaki bazı olguların müdehale etmesine olanak tanır. Bu Durum bir makinenin ACİL STOP butonu olabilir veya fiziki bir değişiklik sinyali ile olabilir yada bir çevresel aygıtın bilgi veren sinyali olabilir. Bunun gibi durumlarda PICe çeşitli işlemler yaptırmak için kullanıma müsaittir.
Şimdi bu dediklerimizi açıklamalı örnek programla açıklayayım
INT0 kesmesi kurulmuş olan 16f628A ile yürüyen ışık programı yazalım ve bu yürüme fonksiyonunu Bir kesmede PORTB de bir kesmede PORTA da gösterelim ve bunu yaparken de birkaç değişik yönteme de el atmış olalım.
/***********************YAZAR AYTAÇ DÜRGEN******************************/ unsignedint i =1,port=1,dongu=0; /****************BU PROGRAM BUTONA BASILDIĞINDA YURUYEN IŞIK PORT DEĞİŞTİRİR********************/ /**********************AYARLAR ADINDA FONKSİYON TANIMLANDI ve ANA PROGRAMDAN ÇAĞIRILDI BÖYLECE PROGRAMIMIZ ÇOK KARIŞMADAN DEVAM ETTİ****************************************************************/ void ayarlar(){ CMCON=0x07; /*Karşılaştırıcımodül kapatıldı Portlar dijitale ayarlandı*/ OPTION_REG=0x00; /*OP_REG 0x00 yapıldı yani 6.bit sıfır olduğu için RBINT0 kesmesi butondan elimizi çekerken gerçekleşecek*/ INTCON.GIE = 1; /*Tüm kesmelere izin verildi*/ INTCON.INTE = 1; /*INT0 Kesmesi Aktiflendi*/ PORTB=0; TRISB=0x01; /*PORTB.B0 KESMEYE Ayarlandığı için RB0 Giriş*/ PORTA=0; TRISA=0; } /**************KESME ALT PROGRAMI**********BURAYA KESME GERÇEKLEŞTİKTEN SONRA GERÇEKLEŞECEK İŞLEMLER YAZILACAKTIR Fonksiyon İsmi İNTERRUPT dan farklı olamaz******************/ voidinterrupt(){ port++; /*****************KEsme ile PORT değişkeni artırılıyor.*************/ i=1; PORTA=0; PORTB=0; if(port==2)port=0; /***PORT değişkeni 2 ile sınırlandırılıyor böylece butona bir basmada port 0 oluyor bir basmada 1 oluyor**/ INTCON.INTF=0; /**Kesme çıkışında aktiflenen kesme bayrağı siliniyor böylece gelen diğrer kesmelerin önü açılıyor**/ } void main() { ayarlar(); for(;;) { while(port==0){ PORTB = i<<1 ; i=i*2; if(i==128)i=1; /*************Buradaki döngü sayısı Ms olarak bekleme yaptırır********************/ for(dongu=0;dongu<1600;dongu++){ delay_ms(1); if(port==1)break; } /*Bu gecikme blogunun sebebi kesme ile yer değiştiren portA ve PortB de yer değiştirmeninn hemen gözlenmesi amaçlandı */ /*Aksi taktirde DELAY_MS kullandığımda Kesme gerçekleştiği anda portlar değişecek fakat yer değiştirme ancak o an beklenmektei değişkeninin Gösterilme süresi dolduktan sonra gözlemleyecektik. dileyen arkadaşlar üstteki bloku DELEY_MS(1600) vs yapıp denesinler ne demek istediğimi daha iyi anlayacaksınız*/ } while(port==1){ PORTA = i ; i=i*2; if(i==256)i=1; for(dongu=0;dongu<1600;dongu++){ delay_ms(1); if(port==0)break; } } } } /********************Program BURAYA KADAR*********************/
Bu dersimizi burada sonlandırıyorum.Bir sonraki dersimizde RB4-7 kesmesine değineceğim ve geçen dersimizde yer verdiğimiz 74hc595 entegresinin programsal olarak sürülmesini işleyeceğim. Bu derste kesme programına dahil etmeyi düşündüm fakat konu oldukça zor anlaşılıyor o sebeple ilk kesme konusunun işlendiği bu derste sizlere yüklenmek istemedim.
Yaz tailinde olduğum için yazılarımın arasını çok uzatmamaya gayret göstereceğim.
Yazılarımı takip edenlerden ricam programlar üzerine sizde fikirler üretip uygulama yapın.Fikirlerini sunmak isteyen arkadaşlar yaptığı program dosyalarını bana yollarsa sitede yayınlama fırsatımız olur böylece ÖĞRENEN MERKEZLİ BİR EĞİTİMİ BENİMSEMİŞ OLURUZ 🙂
Programın çalışma dosyaları ve isis şeması ektedir.Ama tavsiyem hazırdan ziyade yeniden sizin yeniden dosyaları oluşturmanızdır.
Uğraşanlara kolay gelsin İyi çalışmalar.
http://www.facebook.com/#!/tarsus.led
[email protected]
Aytaç Dürgen
MikroC Dersleri 8 proteus isis simülasyon ve mikroc kod dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2011/07/30 Etiketler: kılavuz ders, mikroc dersleri, mikroc interrut, mikroc kesme
Created the greatest arctleis, you have.
@Destry. thank
emeğiniz için teşekkürler Aytaç hocam büyük bir çalışma elinize sağlık
@basic: Teşekkür ederim. Yazılarımı Takip edenler yazı aralarını uzun buluyor olabilirler ancak fırsat buldukça yazıyorum . İdare edin hocanızı
aytaç hocam çok sağolun gerçekten özverili ve Profesyonel bir çalışma.
emeğinize sağlık.
Aytaç hocam kolay gelsin 9.Dersinizi merakla bekliyoruz,?
Aytaç hocam ellerinize sağlık yazı güzel bir biçimde değerlendirmeme yardımcı oluyorsunuz 🙂
MikroC nin kullanma kılavuzu hiçbirşey anlatmıyor. Özellikle yeni başlayanlara hiçbir faydası yok.
Ama böyle güzel net açıklayıcı bir yazı bulduğuma sevindim. Tebrik ederim iyi iş.