PIC Programlama Dersleri 5 – Delay_ms ve Delay_us Komutları

guclusat

Tanınmış Üye
Süper Moderatör

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);
Bu komut yaklaşık 1000 milisaniye, yani 1 saniye bekler.

Bazı örnekler:

KomutYaklaşı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
Bu sürelerin doğru oluşması için mikroC proje ayarındaki işlemci frekansının gerçek PIC çalışma frekansıyla eşleşmesi gerekir.

2. Delay_us komutu​

Delay_us() mikrosaniye düzeyinde kısa beklemeler oluşturmak için kullanılır.

Örnek:
Kod:
Delay_us(100);
Bu komut yaklaşık 100 mikrosaniye bekler.

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​

  1. PORTB çıkış olarak ayarlanır.
  2. RB0 lojik 1 yapılır ve LED yanar.
  3. Program yaklaşık bir saniye bekler.
  4. RB0 lojik 0 yapılır ve LED söner.
  5. Program tekrar bir saniye bekler.
  6. İş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
rada program önce buton girişinin aktif olduğunu görür, kısa bir süre bekler ve girişi tekrar kontrol eder.

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;
Bu kodda RB0 yaklaşık beş saniye açık kalır. Program bu gecikme sırasında ana döngüdeki diğer komutlara devam etmez.

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 (==, !=, &&, ||, !).
 
Geri
Yukarı