This post is also available in:
Kütüphaneler Hangi Dosyalardan Oluşur
Kütüphaneler Yapılsal Olarak Nasıl Yazılmalıdır?
KÜTÜPHANE HAZIRLAMAK
- Kütüphane aslında çok yakından bildiğimiz bir konu. Bilgisayara yeni bir ekran kartı aldığımızda “driver” kurulumu yaparız böylece bilgisayarımız ekran kartını tanımış olur ve kullanır. İşte kütüphane dediğimiz yazılımlar bu “driver” oluyor.
- Yani herhangi bir ekranı , sensörü , ram vb. donanımı PIC yada farklı MCU lar ile kullanmak veya bir takım hesaplamaları yapmak için kütüphaneler yazılır.(örnek: CRC kütüphanesi bir donanım kullanmaz ancak veri üzerinde gerekli CRC kodunu hesaplar )
- MikroC içerisinde birçok hazır kütüphane mevcut fakat ben kendi kütüphanemi yazmaktan yanayım hazırı olsa da, çünkü hazır demek kısıtlanmak demektir. Kendi kütüphanemi yazmak zor olabilir ancak sınırsız bir özgürlük vaad etmektedir.
- Bu sebeple ne konuda olursa olsun kendi kütüphanelerimi yapıp paylaşmaya devam edeceğim ;)
KÜTÜPHANELER HANGİ DOSYALARDAN OLUŞUR
- Kütüphaneler Header dosyası – Fonksiyon dosyası ve Main dosyasından oluşur.
- Main her zaman program yazdığımız bölgedir. Ana program burada bulunur.
- Fonksiyon dosyası ise yeni bir .c dosyası açıp kayıt ederiz. Yeni sistem ile ilgili fonksiyonları burada oluştururuz. Fonksiyon dışında en üstte oluşturulan değişkenler global olarak işlem görürler
- Header dosyalarında fonksiyon deklerasyonu yapılır ve portlar ile ilişkilendirilecek değişkenler belirlenir.
NOT: Bu dosyaları kullanmak için Fonksiyon dosyasına header dosyası include edilir ve main dosyasınada fonskiyon dosyası include edilir.
-Fonksiyonlar
- Kütüphaneler başlı başına bir fonksiyon kümesidir.
- Fonksiyonlar hazırlanırken mutlaka tek işleme uygun yapılmalıdır çok mecbur kalınmadıkça asla bir fonksiyon birden çok işlem yapmamalıdır.
- Fonksiyon isimleri mutlaka yaptığı işe uygun belirlenmelidir.
- Fonksiyonlar sürekli yapılan işlem yada hesaplamarın kolay kullanımı için yazılırlar
- Fonksiyonların tipini belirlerken mutlaka geriye döndürecek değer göz önüne alınmalı ve return yerine global değişken kullanıp kullanılmamasından hangisinin daha verimli ve mantıklı olduğuda ayrıca düşünülmelidir.
//FONKSİYON DOSYASI //Aşağıda örnek olarak hazırlanmış 2 adet fonksiyon görülmektedir #include "header.h"//header dosyası fonksiyon dosyasına çağırılmıştır //1. fonksiyon void LED_YAK(unsigned char sure) { LED_TRIS=0;//bu değişken header dosyasında belirtildi- main de portun giriş-çıkış ayarını //yapılması için ilişkilendirecek şu durumda port çıkış durumundadur LED=0;//bu değişken header dosyasında belirtildi - mainde istenilen port ile ilişkilendirilecek vdelay_ms(sure*saniye);//saniye headerda #define komutu ile 1000 rakamına eşitlendiğinden // şu an parantez içi aslında sure*1000 dir LED=1; } //2. fonksiyon void LED_FLASH(unsigned char flash_sure , unsigned char yanma_suresi)//fonksiyonlar değer döndürmedğinde void değer alır { int i; LED_TRIS=0; for(i=0;i<yanma_suresi;i++) { LED=0; vdelay_ms(flash_sure*saniye); LED=1; vdelay_ms(flash_sure*saniye); } }
-Header ve Port Tanımlamaları
- Fonksiyonlar dışında “header” dosyasıda bulunur. Bu dosyalar fazla karmaşık değildir. Pin tanımlamaları ve fonksiyon deklarasyonları burada yapılır.
- Pin tanımlamasının anlamı PIC te bulunan portların bir isme yönlendirilebilmesini sağlamaktır. Aşağıdaki örnekte LED adında sadece 0 yada 1 olabilen (sbit anlamı budur) bölge tanımlanır. Bu tıpkı port gibi hareket eder. Main programda ise PIC portu bu bölge ile istenildiği gibi ilişkilendirilerek kullanılır.
- Extern dışallık komutudur. Derleyiciye bu bölgenin dışarı ile bağlantılı olacağını belirtir.
- Port tanımlarken eğer 1 bitlik işlem yapılacaksa sbit kullanılır. Ancak tüm bir port kullanılacaksa ( LCD lerde 8 bitlik data girişlerine tam bir port bağlanır) tanımlama “extern sfr char LED” şeklinde yapılmalıdır. Bu halde mainde de tanımlarken “sbit LED at portb” şeklinde kullanılır. Bu durumda tüm port aynı anda kullanılabilir.” sbit LED at portb” yapıldığında LED=125; denirse 125 = 01111101 bu halde tüm 8 adet port 125 in binary karşılığındaki duruma gelir.
header.h Kodları extern sfr sbit LED;//port ilişkilendirilmesi için tanımlanan değişken extern sfr sbit LED_TRIS; //portun giriş yada çıkış ayarını yapmak için oluşturulan değişken #define saniye 1000 // saniye yazılan heryerde 1000 rakamı işlem görecektir
KÜTÜPHANELER YAPISAL OLARAK NASIL YAZILMALIDIR?
- Bir çok programda olduğu gibi MikroCde de kütüphane dosyaları içeriği okunamaz yada sizde yazdığınız kütüphanenin kullanılabilmesini fakat içeriğinin değiştirilmemesini isteyebilirsiniz. Ne şekilde olursa olsun kütüphane dosyaları esnek şekillerde yazılmalıdır.
- Esneklikten kastım , kütüphanelerde bulunan fonksiyonlar dışarıdan değiştirilebilir parametrelere sahip olmalıdır. PORT değerleri mutlaka dışarıdan kullanıcı tarafından istenildiği gibi değiştirme imkanı bulunmalıdır.Aksi taktirde kütüphane kullanılamaz ve anlamsız olur.
- Bu sebeple kütüphaneleri yazarken olabildiğince şartları – olasılıkları – ihtiyaçları düşünüp sistemleri bu veriler ışığında tasarlandıktan sonra yapılmalıdır yoksa çalışmalarımız bir zaman kaybı olur.
- Kütüphanenin rastgele değil bir sistem olduğunu unutmayın. Öncelikle sonuca varılacak sistem tasarlanmalı buna göre işlevsel fonksiyonlar yazılmalıdır. Ayrıca bir kütüphane için birden fazla .c dosyası oluşturulup kullanılabilir. Bu farklı konularda okunabilirliği ve düzeni sağlar.
- Ders temel seviyede C dilini bilenlere hitap etmektedir eğer bu dili yeni öğreniyorsanız veya öğrenmek istiyorsanız “C Öğrenmek İçin Hangi Kitaplar???” yazımı okumanızı öneririm!
- Daha detaylı bilgi için aşağıdaki video dersi izleyebilirsiniz
led_yak.c Kodları #include "fonksyonlar.c"//FONKSİYONLARIN YAZIDIGI DOSYA INCLUDE EDILIR sbit LED at RB4_bit;//PORT YÖNLENDİRMESİ YAPILIR BUNA GÖRE FONKSİYONDA LED YAZAN HER YERDE "RB4" PORTU KULLANILACAK sbit LED_TRIS at TRISB4_bit;//YÖNELDİRİLEN PORTUN GIRIS CIKIS OLUP OLMADIGININ AYARLANMASI SAĞLANIR.BUNA GÖRE FONKSIYONDA LED_TRIS=1 //İSE BU PORT GIRIS OLACAKTIR main() { LED_YAK(5); delay_ms(2000); LED_FLASH(2,10); }
“MIKROC KÜTÜPHANE HAZIRLAMA” VİDEO DERS
This post is also available in: