Dealy komutu programımızdaki tüm işlemlerin bir süre beklemesini sağlar. Delay fonksiyonları zamanlayıcı değildir. Zamanlayıcılar programdan bağımsız çalışan yapılardır. Ancak Delay fonksiyonu program akışını durdurur. Bu komut program akışını durdursa da kesme işlemleri çalışır.
CCS C dilinde 3 adet bekletme fonksiyonu vardır. Bunlar;
Şimdi bu belkeme fonksiyonlarını bir bir inceleyelim.
delay_cycles() fonksiyonu, saat darbesinin bir saykıl süresinin belirlenen katları kadar bekleme işlemi yapmak için kullanılır. Bilindiği üzere PIC denetleyicileri, osilatör freaknsının 1/4 kadarını kullanır. yani osilatör frekansı 4 MHz ise, denetleyici bu frekansı 4’e böler ve 1 Mhz olarak kullanır. delay_cycles() fonksiyonunda ise bu frekans 1 MHz’i baz alarak bekleme işlemi yapar. 8 bit integer türünden (1-255 arası) parametre alır ve geriye değer döndürmez.
Sözdizimi: delay_cycles(sayi);
sayi; 1 ila 255 arası 8 bitlik tamsayı
Örneğin 20MHz osilatör kullanan bir devrede 25 saykıl süresi kadar bekleme işlemi yaparsak;
PIC denetleyicimiz osilatör frekansının 1/4 kadarını kullanacağı için öncelikle osilatör frekansını 4’e bölelim;
20/4 = 5 MHz
5MHz frekans demek, saniyede 5 Milyon periyot demek. Biz bu 5 milyon peryot’un sadece bir tanesinin tamamlanması için geçen süreyi hesaplayacağız. Bunun için 1 saniyeyi 5 milyona bölersek, bir peryotun tamamlanması için geçen süreyi, yani saykıl’ı buluruz:
1 saykıl = 1/5000000 = 0.0000002 saniye;
Şimdi 25 saykıl süresi kadar bekletme yapmak demek;
25 * 0.0000005 = 0.000005 saniye yani 5mikrosaniye bekletme anlamına gelir.
Şimdi kodlarımız ile uygulayalım;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <16F877A.h> // Denetleyici başlık dosyamız #use delay(crystal=20000000) // Osilatör frekansımız void main(){ // Ana fonksiyonumuz output_b(0); // b portunun tüm pinlerini sıfırla while(true){ // sonsuz döngümüz output_high(pin_b5); // b portunun 5 nolu pinini 1 yap delay_cycles(25); // 25 saykıl bekle (5 mikrosaniye) output_low(pin_b5); // b portunun 5 nolu pinini 1 yap delay_cycles(25); // 25 saykıl bekle (5 mikrosaniye) } } |
Yukarıdaki örnek kodlarımızın uygulamasında, 5 mikrosaniye çok küçük süre olduğu için görsel olarak çalışmasını farkedemeyiz ancak, B portunun 5 nolu pinine osiloskop bağlarsak kodların çalıştığını görebiliriz.
Proteus ile simule ettiğimiz yukarıdaki kodların çalıştığı görülüyor.
delay_ms() fonksiyonu ise milisaniye cinsinden bekletme yapmak için kullanılır. Programlama sırasında en çok kullanacak olduğumuz foknsiyondur. Alabileceği değer 16 bitlik tamsayı değeri olduğu için 65.5 saniyeye kadar bekletme işlemi gerçekleştirebilir. Yani 1 ile 65535 arası değer alabilir ve geriye değer döndürmez.
Sözdizimi: delay_ms(süre);
süre; int16 türü değer, yani 1 ile 65535 milisaniye arası
Şimdi bunu bir örnekle açıklayalım. Örneğin B portunun 5 nolu pinine bağlı olan ledi 5 saniye aralıklarla yakıp söndürelim;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <16F877A.h> // Denetleyici başlık dosyamız #use delay(crystal=20000000) // Osilatör frekansımız void main(){ // Ana fonksiyonumuz output_b(0); // b portunun tüm pinlerini sıfırla while(true){ // sonsuz döngümüz output_high(pin_b5); // b portunun 5 nolu pinini 1 yap delay_ms(5000); // 5000 milisaniye bekle (5 saniye) output_low(pin_b5); // b portunun 5 nolu pinini 1 yap delay_ms(5000); // 5000 milisaniye bekle (5 saniye) } } |
Bu fonksiyonumuz ise mikrosaniye cinsinden bekletme yapmak için kullanılır. Milisaniye fonksiyonumuzdaki gibi 16 bit tamsayı cinsinden değer alır ve geriye değer döndürmez.
Sözdizimi; delay_us(süre);
süre; 16 bitlik tamsayı cinsinden değer. 1 ile 65535 arası
Örnek kullanım:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <16F877A.h> // Denetleyici başlık dosyamız #use delay(crystal=20000000) // Osilatör frekansımız void main(){ // Ana fonksiyonumuz output_b(0); // b portunun tüm pinlerini sıfırla while(true){ // sonsuz döngümüz output_high(pin_b5); // b portunun 5 nolu pinini 1 yap delay_us(50); // 50 mikrosaniye bekle output_low(pin_b5); // b portunun 5 nolu pinini 1 yap delay_us(50); // 50 mikrosaniye bekle } } |
Tekrar hatırlatmakta fayda var, bekletme fonksiyonu ile zamanlayıcı aynı şey değildir. Bekletme fonksiyonu, kullanıldığı noktada program akışını durdurur. Zamanlayıcı ise program akışından ayrı çalışır. Zamanlayıcı işlemlerini ileriki derslerde Timer başlığı altında inceleyeceğiz.