PIC Programlama Dersleri 3: if, else ve while Komutları – Karar Verme ve Döngüler
PIC mikrodenetleyici programlarında işlemciye yalnızca komut vermek yeterli değildir. Bazen bir butona basılıp basılmadığını kontrol etmek, bir koşula göre çıkışı açmak veya bir işlemi sürekli tekrarlamak gerekir.C programlama dilinde bu işlemler için if, else ve while komutları kullanılır. Bu derste örneklerimizi mikroC PRO for PIC ve PIC16F628A üzerinden inceleyeceğiz.
1. if komutu nedir?
if, belirtilen koşul doğru olduğunda bir kod bloğunu çalıştırır.Örnek:
Kod:
if (PORTA.F0 == 1) {
PORTB.F0 = 1;
}
- RA0 girişini kontrol et.
- RA0 lojik 1 ise RB0 çıkışını lojik 1 yap.
- Koşul doğru değilse bu blok çalışmaz.
= ile == birbirinden farklıdır:
- a = 1; değişkene değer atar.
- a == 1 değişkenin 1 olup olmadığını kontrol eder.
2. else komutu nedir?
else, if koşulu doğru olmadığında çalıştırılacak kodu belirtir.Örnek:
Kod:
if (PORTA.F0 == 1) {
PORTB.F0 = 1;
} else {
PORTB.F0 = 0;
}
- RA0 lojik 1 ise RB0 açılır.
- RA0 lojik 0 ise RB0 kapanır.
3. while komutu nedir?
while, belirtilen koşul doğru olduğu sürece içindeki komutları tekrarlar.Örnek:
Kod:
while (PORTA.F0 == 1) {
PORTB.F0 = 1;
}
PIC uygulamalarında sık kullanılan başka bir örnek de şudur:
Kod:
while(1) {
// Sürekli çalışacak komutlar
}
4. Uygulama: Butona basınca LED yakma
Bu örnekte RA0 girişine bağlı butonun lojik durumunu okuyup RB0 çıkışındaki LED'i kontrol edeceğiz.
Kod:
void main() {
CMCON = 0x07;
TRISA = 0b00000001;
TRISB = 0b00000000;
PORTB = 0;
while(1) {
if (PORTA.F0 == 1) {
PORTB.F0 = 1;
} else {
PORTB.F0 = 0;
}
}
}
Programın açıklaması
- CMCON = 0x07; karşılaştırıcıları kapatır.
- TRISA RA0 pinini giriş yapar.
- TRISB PORTB pinlerini çıkış yapar.
- while(1) programın sürekli giriş kontrolü yapmasını sağlar.
- if buton girişinin lojik 1 olup olmadığını kontrol eder.
- else buton girişi lojik 0 olduğunda LED'i kapatır.
Donanım notu: RA0 girişini boşta bırakmayın. Uygun pull-up veya pull-down bağlantısıyla kararlı lojik seviye sağlayın. LED'e seri akım sınırlama direnci bağlayın.
5. Uygulama: Butona her basışta çıkış durumunu değiştirme
Önceki örnekte LED yalnızca butona basılı tutulduğu sürece yanıyordu. Peki butona bir kez basınca LED yansın, tekrar basınca sönsün istersek ne yapmalıyız?Bunun için bir değişken kullanabiliriz:
Kod:
void main() {
unsigned char led_durumu = 0;
CMCON = 0x07;
TRISA = 0b00000001;
TRISB = 0b00000000;
PORTB = 0;
while(1) {
if (PORTA.F0 == 1) {
Delay_ms(50);
if (PORTA.F0 == 1) {
led_durumu = !led_durumu;
PORTB.F0 = led_durumu;
while (PORTA.F0 == 1) {
Delay_ms(10);
}
Delay_ms(50);
}
}
}
}
- led_durumu değişkeni LED'in mevcut durumunu saklar.
- !led_durumu ifadesi değişkenin mantıksal değerini tersine çevirir.
- İlk basışta LED yanar.
- İkinci basışta LED söner.
- İç içe kullanılan if ve while komutları, basışın algılanmasına ve buton bırakılana kadar beklenmesine yardımcı olur.
- Delay_ms(50) mekanik butonlarda oluşabilen kısa süreli kontak sıçramalarını azaltmak için kullanılır.
Sonuç
if bir koşulu kontrol eder, else koşul yanlış olduğunda alternatif işlemi yürütür, while ise koşul doğru olduğu sürece komutları tekrarlar. Bu üç yapı, buton ve röle kontrolünden sensör okumaya kadar birçok PIC uygulamasının temelini oluşturur.Sonraki ders: PIC Programlama Dersleri 4 – Değişkenler ve Veri Tipleri (char, int, unsigned char).