PIC Programlama Dersleri 5: Delay_ms ve Delay_us Komutları – Zamanlama ve Gecikme
PIC mikrodenetleyicilerde bazı işlemlerin belirli aralıklarla yapılması gerekir. LED yakıp söndürme, buton sıçramalarını azaltma, röle kontrolü ve belirli süre bekleme gibi uygulamalarda gecikme komutları kullanılır.mikroC PRO for PIC içerisinde bu amaçla en sık kullanılan komutlar Delay_ms() ve Delay_us() fonksiyonlarıdır.
1. Delay_ms komutu
Delay_ms() belirtilen milisaniye kadar bekleme oluşturur.Örnek:
Kod:
Delay_ms(1000);
Bazı örnekler:
| Komut | Yaklaşık süre |
|---|---|
| Delay_ms(10); | 10 milisaniye |
| Delay_ms(50); | 50 milisaniye |
| Delay_ms(100); | 100 milisaniye |
| Delay_ms(500); | Yarım saniye |
| Delay_ms(1000); | 1 saniye |
2. Delay_us komutu
Delay_us() mikrosaniye düzeyinde kısa beklemeler oluşturmak için kullanılır.Örnek:
Kod:
Delay_us(100);
Mikrosaniye gecikmeleri, bazı haberleşme protokollerinde ve kısa zaman aralıklarının gerektiği uygulamalarda kullanılabilir. Ancak hassas zamanlama gerektiren işlerde yazılım gecikmesi yerine donanım zamanlayıcıları tercih edilebilir.
3. Uygulama: LED'i bir saniye aralıklarla yakıp söndürme
Aşağıdaki örnekte PIC16F628A'nın RB0 çıkışını sırayla açıp kapatacağız.
Kod:
void main() {
TRISB = 0;
PORTB = 0;
while(1) {
PORTB.F0 = 1;
Delay_ms(1000);
PORTB.F0 = 0;
Delay_ms(1000);
}
}
Programın çalışma şekli
- PORTB çıkış olarak ayarlanır.
- RB0 lojik 1 yapılır ve LED yanar.
- Program yaklaşık bir saniye bekler.
- RB0 lojik 0 yapılır ve LED söner.
- Program tekrar bir saniye bekler.
- İşlem sürekli tekrarlanır.
4. Butonlarda gecikme kullanımı
Mekanik butonların kontakları basma ve bırakma sırasında çok kısa sürelerle art arda açılıp kapanabilir. Bu olaya kontak sıçraması denir.Basit bir yazılımsal önlem şu şekilde uygulanabilir:
Kod:
if (PORTA.F0 == 1) {
Delay_ms(50);
if (PORTA.F0 == 1) {
PORTB.F0 = 1;
}
}
Bu
Bu yöntem basit uygulamalarda yardımcı olabilir. Daha güvenilir buton kontrolü için basışın ve bırakışın birlikte ele alınması gerekir.
5. Gecikme komutlarının önemli bir özelliği
Delay_ms() ve Delay_us() çalışırken işlemci çoğunlukla bekleme döngüsünü yürütür. Bu süre içerisinde ana program başka bir işi yapamaz.Örneğin:
Kod:
PORTB.F0 = 1;
Delay_ms(5000);
PORTB.F0 = 0;
Birden fazla işi aynı anda yönetmek veya kesin zaman aralıkları oluşturmak gerektiğinde Timer modülleri ya da kesmeler kullanılabilir. Bu konuları ilerleyen derslerde ele alacağız.
Sonuç
Delay_ms() milisaniye, Delay_us() ise mikrosaniye düzeyinde gecikme oluşturmak için kullanılır. Bu komutlar başlangıç seviyesindeki PIC uygulamalarında oldukça kullanışlıdır. Ancak zamanlama doğruluğu için işlemci frekansı doğru ayarlanmalı ve uzun gecikmelerin program akışını duraklattığı unutulmamalıdır.Sonraki ders: PIC Programlama Dersleri 6 – Mantıksal ve Karşılaştırma Operatörleri (==, !=, &&, ||, !).