CCS-C ile PIC Programlama, Gecikme Fonksiyonlarının Kullanımı

CCS-C ile PIC için yazacağınız kodların hemen hemen hepsinde gecikme (Delay) sürelerine ihtiyacınız olacak. Bu süreleri ede etmek için iki seçeneğiniz var. Birincisi PIC içerisindeki Timer’ları kullanmak. Bunun için bir dizi konfigürasyonu,  kullanacağınız CPU frekansına göre ayarlamak ve yine bununla ilgili kodları yazmanız gerekiyor. İkinci yöntem ise sadece gecikme süresi oluştumak için boş döngüler kullanmak. Örneğin 1 ms (Mili Saniye) sürecek,  içerisinde döngü olan bir fonksiyon yazabilir ve diğer süreleride 1 ms’nin katları olarak bu fonksiyonu o kadar çağırarak elde edersiniz. Böyle bir durumda da yine denetleyicinin çalıştırılacağı saat frekansına göre döngünüzü hesaplamanız gerekiyor.

Peki bunlarla uğraşmak istemiyorsak ne yapacağız? Cevabı çok basit, üçüncü bir yöntem var 🙂

CCS-C’nin gecikme süreleri elde etmek için bize sunduğu hazır fonksiyonları kullanacağız. Derleyici bu iş için bize üç adet hazır fonskiyon sunuyor.

delay_cycles() delay_us() delay_ms()

Bu üç fonsksiyondan herhangi biri kullanılacağı zaman. #use delay direktifi ile işlemcinin saat frekansının belirtilmesi gerekiyor. Örneğin denetleyicide 4 Mhz (Mega Hertz) kristal kullanmışsak

#use delay(clock=4000000) şeklinde

Eğer WatchDog Timer kullanmışsak ve gecikme sürelerimizi elde ederken watchdog timer’ın taşmasını istemiyorsak

#use delay(clock=4000000,restart_wdt) şeklinde tanımlama yapmalıyız.

Yeri gelmişken #use delay direktifi ile ilgili daha önce anlatmadığım ayarlardan bahsedeyim biraz

Saat frekansını şu şekillerde de belirtebiliriz

1
2
3
4
5
#use delay(clock = 4, 000, 000)
#use delay(clock = 4M)
#use delay(clock = 4M, oscillator) // XT Konfigürasyon biti set edilir
#use delay(oscillator=4M) // Yukarıdaki ifade ile aynı
#use delay(clock=40M,oscillator=10M) // krsital 10 MHZ ama PLL açık H4 biti set edilir

Konfigürasyon bitlerini #fuse direktifi ile kendinizin de tanımlayabileceğinizi unutmayın.

Şimdi bu üç fonksiyonun ne işe yaradığını anlatmadan önce “Instruction Time” denilen komut işletme süresinin ne olduğuna bir bakalım. PIC denetleyicilerinin herhangi bir komutu işletmek için gerek duyduğu zamana instruction time denir.

Instruction Time (IT) = 4 x (1/Saat frekansı) formülü ile hesaplanabilir

4 Mhz Saat frekansı için IT = 4 x (1/4000000) = 0,000001sn = 1 us (Mikro Saniye, saniyenin Milyonda biri)

20 Mhz Saat frekansı için IT = 4 x (1/20000000) = 0,0000002 sn = 200 ns (Nano Saniye, saniyenin Milyarda biri)

delay_cycles()

1-255 arası değer alan bu fonksiyon belirtilen sayı kadar Instruction Time gecikmesi sağlar. Parametre olarak sabit sayı verilebileceği gibi 8 bitlik değişken de verilebilir

1
2
3
4
int gecikme;
gecikme = 10;
delay_cycles(5) // 5 instruction time kadar gecikme üretir
delay_cycles(gecikme) // 10 instruction time kadar gecikme üretir
1
2
3
4
5
4 mhz Saat frekansı için ( IT = 1 us )
delay_cycles(100); komutu 100 us Gecikme oluşturur
20 Mhz Saat frekansı için ( IT = 200 ns )
delay_cycles(100); komutu 20 us Gecikme oluşturur

delay_us()

Mikro Saniye cinsinden gecikme süresi elde etmek için kullanılan bu fonksiyon parametre olarak 0-65535 arası bir değer alır. Bu sabit bir değer olabileceği gibi değişken de olabilir

1
2
3
4
5
6
4 Mhz saat frekansı için
delay_us(100); 100 us lik gecikme üretir
20 Mhz saat frekansı için
delay_us(100); 100 us'lik gecikme üretir
delay_us(10000); 10000 us = 10ms Gecikme üretir

Gördüğünüz gibi bu fonksiyonda saat frekansı ne olursa olsun derleyici buna göre kendini ayarlayarak istenilen süreyi oluşturur.

delay_ms()

Mili Saniye cinsinden gecikme süresi elde etmek için kullanılan bu fonksiyon parametre olarak 0-65535 arası bir değer alır. Bu sabit bir değer olabileceği gibi değişken de olabilir

1
2
3
4
5
6
4 Mhz saat frekansı için
delay_ms(50); 50 ms'lik gecikme üretir
20 Mhz saat frekansı için
delay_ms(50); 50 ms'lik gecikme üretir
delay_ms(1000); 1000 ms = 1 sn Gecikme üretir

Gördüğünüz gibi bu fonksiyonda da saat frekansı ne olursa olsun derleyici buna göre kendini ayarlayarak istenilen süreyi oluşturur.

Eğer Kesme kullanıyorsanız bu fonksiyonlardan elde edeceğiniz gecikme süreleri tam olarak doğru olmayabilir. Çünkü bu gecikmeler üretilirken program Kesme rutinine girebilir ve orada bir miktar zaman geçeceğinden süreler tam olarak tutmaz. Çok hassas gecikmeler elde etmek için Timer’ları kullanmak gerekir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir