Sunuyu indir
1
CCS C İLE PIC PROGRAMLAMA DERS-2-
2
KESME(INTERRUPT) İŞLEMLERİ
3
KESME MANTIĞI VE KESME OLAYLARINA GENEL BİR BAKIŞ
Mikrodenetleyicinin değişik kaynaklardan gelen sinyaller ile mevcut programının çalışmasını kesip, önceden tanımlanmış kesme programını(fonksiyonunu) icra edip, tekrar ana programa kaldığı yerden çalışmaya devam etmesi işlemini kesme olarak tanımlayabiliriz. Mikroişlemcili ve mikrodenetleyicili sistemlerde kesmeler olmazsa olmaz niteliktedir. Peki, neden kesmeler bu kadar önemlidir? Tasarlanan sistemlerde yapılan rutin kontrol işlemlerinin yanında çoğunlukla bazı giriş/çıkış uçları da denetlenmektedir –taranmaktadır-. Bu denetleme işlemleri sadece program vasıtası ile yapıldığında programın çalışma süresinin ve hızının neredeyse büyük kısmını işgal etmektedir. Bu kontrol veya tarama işlemi programda icra edilmesi gereken diğer işlerin yavaş yapılmasına veya kontrol edilmesi gereken diğer giriş/çıkış uçlarında veri kaybına yol açmasına sebep olabilir. Bu durumu engellemek, çok daha verimli ve esnek programlar yazabilmek için kesme(interrupt) kullanılır.
4
PIC denetleyilere ilk enerji geldiğinde veya PIC sıfırlandığında(resetlendiğinde) program sayıcı(Program Counter-PC, çalıştırılan komutun adresini tutan kaydedici) 0000h adresini gösterir. Bu adrese reset vektörü denir. Bu 0000h adresine PIC’e yüklenen programın başlangıç adresi yüklenir. Böylece denetleyici ilk enerjilendiği anda ilk başta 0000h adresine bakar ve bu adresin içinde bulunan adres değerine giderek programını icra eder. Kesme durumlarından biri oluştuğunda da program sayıcı(PC) program hafızasındaki 0004h adresine gider. Bu adrese kesme vektörü denir. 0004h adresindeki herhangi bir kesme sinyali geldiğinde ana program çalışması kesilir, kesme alt programına gidilir, kesme alt programı icra edilir ve ana programa geri dönülür.
5
KESME ÇEŞİTLERİ RB0 Harici Kesmesi
RB4-RB7 Pinlerindeki Değişiklik Kesmesi Timer0 Birimi Taşma Kesmesi Timer1 Birimi Taşma Kesmesi Timer2 Birimi Taşma Kesmesi A/D Çevrimi Yapıldığında Meydana Gelen Kesme CCP1 Modülü Kesmesi CCP2 Modülü Kesmesi Paralel Porttan Veri Gelme Kesmesi Seri Porttan Veri Geldiğinde Oluşan Kesme SPI veye I2C İletişimi Sırasında Veri Gelme Kesmesi EEPROM’a Veri Yazma İşlemi Sonlandığında Oluşan Kesme RS232 Seri İletişiminde Gönderilecek Veri Tamponu Boş Olduğunda Meydana Gelen Kesme Bus Collision Kesmesi
6
CCS’DE KESME OLUŞTURMA İŞLEMLERİ
CCS’de bir kesme komutu kullanıldığında ilgili kesme meydana geldiğinde işlenecek komutları içinde barındıran bir kesme fonksiyonunun tanımlanması gereklidir. CCS C’de kullanılacak kesme fonksiyonları mutlaka ana fonksiyondan önce tanımlanmalıdır. Kesme fonksiyonu tanımlanırken aşağıda verilen yapı kullanılır. #int_xxx //xxx yerine ilgili kesme ismi yazılır. [fonksiyon geri dönüş değeri türü][fonksiyon ismi]() { komut veya komutlar; } Örnek bir kesme fonksiyonu; #int_ext void dis_kesme () output_low(pin_d1); x++;
7
#int_xxx komutunda aktif edilen fonksiyon ismi yazılır
#int_xxx komutunda aktif edilen fonksiyon ismi yazılır. Bu kesme isimleri kullanılan denetleyicinin tanıtım dosyasında (örneğin 16f876a.h dosyasının içinde) tanımlanmıştır. Örnek : #int_EXT dış kesme Kesmelerin aktif veya pasif yapılması için aşağıdaki komutlar kullanılır; enable_interrupts(kesme ismi); // kesmeyi aktif yapmak için disable_interrupts(kesme ismi); // kesmeyi pasif yapmak için enable_interrupt(int_ext); // RB0/INT dış kesmesi aktif disable_interrupt(int_ext); // RB0/INT dış kesmesi pasif PIC denetleyicilerde kesmeleri aktif etmek yetmez. CCS C’de aşağıdaki komutlarla tüm aktif edilmiş kesmelere izin verilir veya verilmez. enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin verilir. disable_interrupts(GLOBAL); // Aktif edilen kesmelere izin verilmez.
8
Bir kesme meydana geldiğinde o kesme fonksiyonu icra edilirken başka bir kesme meydana gelse dahi aktif olmaz. İlk başta icra edilen kesme fonksiyonunun bitmesi gereklidir. Fakat aynı anda meydana gelen kesmeler de hangi kesmenin geçerli olacağını belirlemek için kesmelere öncelik verilmelidir. Öncelik vermek için aşağıdaki komut kullanılır. İlk başta yazılan kesme en fazla önceliğe sahip demektir. #priority kesme isme , kesme ismi,… #priority ext, timer0 PIC denetleyicilerde bir kesme meydana geldiğinde o kesmeye ait kesme bayrağı biti lojik-1 olur. Bunun nedeni kesme komutları işlenirken yine aynı kesme meydana gelirse kesme komutları icra edilirken kesmeden çıkılmamasıdır. Kesme komutlarının sonunda bu bayrak bitinin lojik-0 yapılması gerekir. Eğer bu bit lojik-0 yapılmazsa, aynı kesme şartı oluşsa dahi ikinci kesme meydana gelmez. CCS C derleyicisinde ise herhangi bir kesme meydana geldiğinde, CCS C programı kesme fonksiyonu çıkışında otomatik olarak kesme bayrağını siler. Kullanıcının bu son işlemi komut ile yapmasına gerek kalmaz.
9
DIŞ KESME (EXTERNAL INTERRUPT) UYGULAMASI
11
15 DAKİKA ARA ZAMANI
12
ZAMANLAYICI VE SAYICI İŞLEMLERİ
Zamanlayıcı(timer) ve sayıcı(counter) birimleri hem mikroişlemci hem de mikrodenetleyiciler için neredeyse bulunması zorunlu birimlerdir. Mikrodenetleyici yapılarının gelişim evresinde önemli bir yerde bu tip donanım birimlerinin mikrodenetleyici yapısına eklenmesidir. Zamanlayıcı ve sayıcı donanım birimlerinin yaptığı işlemler yazılımsal olarak da yapılabilir. Fakat bu durumda yazılımın büyük çoğunluğu meşgul edilmiş olur. Zamanlayıcı/sayıcı birimleri aynı birimlerdir, kullanım şekline göre zamanlayıcı veya sayıcı olarak kullanılabilir. Bir birimin zamanlayıcı olarak kullanılması için değer artışının düzenli(periyodik) olması gerekmektedir. Sayıcı olarak kullanımda ise değer artışının düzenli olması gerekliliği yoktur.
13
TIMER0 BİRİMİ Timer0 birimi zamanlayıcı ve sayıcı olarak kullanılabilen bir donanım birimidir. Bu birimin özellikleri aşağıda verilmiştir. 8 bit Zamanlayıcı/Sayıcı kullanım, Okuma-yazma yapılabilir. 8 bitlik yazılım ile programlanabilen bölme oranı (prescaler) Dahili ve harici saat(clock) sinyali kaynağı seçme, Harici saat kaynağı sinyal tetikleme kenarı seçimi(edge select)
14
Timer0 birimi ister dahili kaynakla ister RA4/TOCKI pininden uygulanan harici saat sinyali kaynağından beslenir. Kaynak seçimine göre çalışma tipi(zamanlayıcı veya sayıcı) seçilmiş olur. Seçilen kaynaktan gelen saat sinyali direkt olarak kullanılmaz. Bu sinyal bölme oranı(prescaler) değeri ile çarpılarak elde edilen değer sinyal kaynağı olarak kullanılır. Normalde Timer0 değeri başlangıçta sıfırdır. Programla data hattından istenen değer yüklenebilir. Böylece sayma işlemi istenen değerden başlatılabilir.
15
SETUP_TIMER_0() FONKSİYONU
Timer0 zamanlayıcı ayarlarını yapmaya yarayan bir fonksiyonudur. setup_timer_0(mod); Fonksiyondaki «mod» kısmına aşağıda belirtilen sabit tanımlamalardan biri veya birden fazlası yazılabilir. İki sabit arasında «|» operatörü konulur. Bu fonksiyonda kullanılacak sabitler denetleyicinin başlık dosyasında (16f876a.h) yazılıdır. Kesme Aktif Kenar Ayarı Sabitleri; «RTCC_INTERNAL»=Timer0 clock kaynağının denetleyici çalışma frekansı olacağını bildirir. «RTCC_EXT_L_TO_H»=Timer0 clock kaynağının dış çevreden alınacağını ve sinyalin her yükselen kenarında tetikleme olacağını bildirir. «RTCC_EXT_H_TO_L»=Timer0 clock kaynağının dış çevreden alınacağını ve sinyalin her düşen kenarında tetikleme olacağını bildirir. Bölme Oranı(Prescaler) Sabitleri; «RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256» Sabitin sonundaki rakamlar bölme oranını belirtir. Örnek; setup_timer_0(RTCC_DIV_4 | RTCC_EXT_L_TO_H); komutu ile Timer0’ın harici kaynaktan besleneceği (sayıcı olarak kullanılacağı), harici kaynak sinyalinin her yükselen kenarında artış olacağı ve bölme oranının 4 olduğu belirtilmiş olur.
16
SET_TIMER0 VE SET_RTCC() FONKSİYONU
SET_TIMER0 ve SET_RTCC() fonksiyonları aynı anlamdadır. İki fonksiyonda Timer0 birimin saymaya başlama değerini belirlemek için kullanılırlar. Tüm sayıcılar yukarı doğru sayar ve maksimum değere ulaşınca sıfıra döner ve tekrar yukarı saymaya başlar. set_timer0(değer); veya set_rtcc(değer); Fonksiyonda «değer» kısmında Timer0 biriminin saymaya başlama değeri yazılır. Timer0 birimi 8 bitlik olduğu için buraya yazılacak değer 0 ile 255 arasında (0 ve 255 dahil) olmalıdır. Örnek; set_timer0(45); komutu ile Timer0 birimi saymaya 45’den itibaren saymaya başlar.
17
TIMER0 KESMESİ(#INT_TIMER0)
Normal kesme oluşturma mantığı ile aynı mantıkla #int_timer0 komutu ile kesme fonksiyonu oluşturulur. Burada dikkat edilmesi gereken nokta kesme fonksiyonu içinde mutlaka set_timer0() komutu ile programda set edilen değerin tekrar kesme fonksiyonu içinde de belirtilmesi gerekliliğidir. Çünkü program kesme fonksiyonuna gittiğinde, içerik sıfırlanır. Timer0 biriminin tekrar başlangıçta istenen değer ile saymaya başlanması isteniyorsa kesme fonksiyonunda mutlaka tekrardan set_timer0() komutu ile set değeri belirtilmelidir.
18
Timer0 kaydedici için oluşturulacak kesmenin oluşma süresi aşağıdaki formül ile hesaplanabilir.
Kesme Oluşma Süresi=Tkomut x (Bölme Oranı) x (256-TMR0’a yazılan değer) Tkomut periyodu; Tkomut (sn)= 1/ fkomut(hz) formülünden bulunur. fkomut değeri bilindiği gibi PIC denetleyiciye bağlanan osilatör frekansının 4’e bölümü ile elde edilir(PIC denetleyicilerde kullanılan osilatör frekansının denetleyici tarafından 4’e bölünüp öyle kullanıldığını unutmayınız!)
19
Timer0 ile Sayıcı Uygulaması
22
Timer0 ile Zamanlayıcı Uygulaması
25
BİZİ DİNLEDİĞİNİZ İÇİN TEŞEKKÜR EDİNİZ
BU SLAYT HAZIRLANIRKEN SERDAR ÇİÇEK’İN CCS C İLE PIC PROGRAMLAMA KİTABINDAN FAYDALANILMIŞTIR.
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.