PIC Programlama Dersleri 9: Fonksiyonlar (Functions) – MikroC PRO for PIC
Bu derste, MikroC PRO for PIC kullanarak fonksiyon oluşturmayı ve fonksiyonları programlarımızda kullanmayı öğreneceğiz.
Program büyüdükçe bütün komutları main() fonksiyonu içine yazmak kodun anlaşılmasını ve düzenlenmesini zorlaştırır. Fonksiyonlar sayesinde belirli işlemleri ayrı bölümlere ayırabilir ve gerektiğinde tekrar kullanabiliriz.
Örneklerimizde PIC16F628A mikrodenetleyicisini kullanacağız.
1. Fonksiyon Nedir?
Fonksiyon, belirli bir işi gerçekleştiren program bölümüdür. Örneğin LED yakma, LED söndürme veya belirli bir süre bekleme işlemlerini ayrı fonksiyonlar hâline getirebiliriz.
Bir fonksiyonun genel yazım biçimi şöyledir:
Kod:
geri_donus_tipi fonksiyon_adi(parametreler) {
// Yapılacak işlemler
}
Burada:
- Geri dönüş tipi: Fonksiyonun hangi türde bir değer döndüreceğini belirtir.
- Fonksiyon adı: Fonksiyonu çağırmak için kullanılan isimdir.
- Parametreler: Fonksiyona gönderilen değerlerdir.
- Fonksiyon gövdesi: Fonksiyon çalıştığında gerçekleştirilecek komutları içerir.
2. Değer Döndürmeyen Fonksiyonlar: void
Fonksiyon herhangi bir değer döndürmeyecekse void anahtar kelimesi kullanılabilir.
Örneğin LED yakma ve söndürme işlemlerini iki ayrı fonksiyonla gerçekleştirelim.
Kod:
void led_yak() {
PORTB.F0 = 1;
}
void led_sondur() {
PORTB.F0 = 0;
}
Bu örnekte led_yak() çağrıldığında RB0 çıkışı lojik 1, led_sondur() çağrıldığında ise lojik 0 yapılır.
3. Fonksiyonları main() İçinde Kullanma
Fonksiyonları tanımlamak tek başına yeterli değildir. Çalışmalarını istediğimiz yerde çağırmamız gerekir.
Aşağıdaki programda LED'i yakıp söndürmek için hazırladığımız fonksiyonları kullanacağız.
Kod:
void led_yak() {
PORTB.F0 = 1;
}
void led_sondur() {
PORTB.F0 = 0;
}
void main() {
CMCON = 0x07;
TRISB = 0x00;
PORTB = 0x00;
while (1) {
led_yak();
Delay_ms(500);
led_sondur();
Delay_ms(500);
}
}
Programın çalışma mantığı:
- CMCON = 0x07 komutu karşılaştırıcıları kapatır.
- TRISB = 0x00 komutu PORTB pinlerini çıkış olarak ayarlar.
- led_yak() fonksiyonu RB0 çıkışını lojik 1 yapar.
- Program 500 milisaniye bekler.
- led_sondur() fonksiyonu RB0 çıkışını lojik 0 yapar.
- Program tekrar 500 milisaniye bekler.
- while (1) döngüsü sayesinde işlem sürekli tekrarlanır.
4. Parametre Alan Fonksiyonlar
Fonksiyonlara parametre göndererek aynı fonksiyonu farklı değerlerle kullanabiliriz.
Örneğin, LED'in yanma süresini fonksiyona parametre olarak gönderelim.
Kod:
void led_yak_bekle(unsigned int sure) {
PORTB.F0 = 1;
Delay_ms(sure);
PORTB.F0 = 0;
}
void main() {
CMCON = 0x07;
TRISB = 0x00;
PORTB = 0x00;
while (1) {
led_yak_bekle(200);
Delay_ms(500);
led_yak_bekle(1000);
Delay_ms(500);
}
}
Bu programda led_yak_bekle(200) çağrısı LED'i 200 ms yakar. led_yak_bekle(1000) çağrısı ise LED'i 1000 ms yakar. Her iki çağrıda da aynı fonksiyon kullanılır.
5. Değer Döndüren Fonksiyonlar
Bir fonksiyon yalnızca işlem yapmakla kalmayıp sonuç da döndürebilir. Bunun için return komutu kullanılır.
Aşağıdaki örnekte iki sayıyı toplayan bir fonksiyon hazırlayacağız.
Kod:
unsigned int topla(unsigned int a, unsigned int b) {
return a + b;
}
unsigned int sonuc;
void main() {
sonuc = topla(10, 20);
while (1) {
}
}
Bu örnekte topla(10, 20) fonksiyonu 30 değerini döndürür ve sonuç sonuc değişkenine kaydedilir.
unsigned int türünün alabileceği değer aralığı derleyici ve hedef mikrodenetleyicinin veri modeliyle ilişkilidir. Bu örnekte 30 değeri için herhangi bir sorun yoktur.
6. Fonksiyon Prototipi Nedir?
Bir fonksiyon main() fonksiyonundan sonra tanımlanıyorsa derleyicinin fonksiyon hakkında önceden bilgi sahibi olması için prototip kullanılabilir.
Kod:
unsigned int topla(unsigned int a, unsigned int b);
void main() {
unsigned int sonuc;
sonuc = topla(10, 20);
while (1) {
}
}
unsigned int topla(unsigned int a, unsigned int b) {
return a + b;
}
İlk satırdaki ifade fonksiyonun adını, parametre türlerini ve geri dönüş türünü bildirir. Böylece fonksiyonun gövdesi daha sonra yazılabilir.
7. Fonksiyon Kullanmanın Avantajları
- Programın daha düzenli ve okunabilir olmasını sağlar.
- Tekrarlanan kodların yeniden yazılmasını önler.
- Hataların bulunmasını ve düzeltilmesini kolaylaştırır.
- Aynı işlemin farklı parametrelerle kullanılmasına imkân verir.
- Büyük projelerin küçük ve yönetilebilir bölümlere ayrılmasını sağlar.
8. Alıştırmalar
- RB0 çıkışını lojik 1 yapan led_yak() fonksiyonunu yazın.
- RB0 çıkışını lojik 0 yapan led_sondur() fonksiyonunu oluşturun.
- LED'i 100 ms ve 1000 ms sürelerle yakacak bir fonksiyon hazırlayın.
- İki sayıyı çıkaran ve sonucu döndüren cikar() fonksiyonunu yazın.
- Birden fazla LED çıkışını kontrol etmek için ayrı fonksiyonlar oluşturmayı deneyin.
Sonuç
Bu derste fonksiyon oluşturmayı, fonksiyon çağırmayı, parametre kullanmayı ve return ile değer döndürmeyi öğrendik. Fonksiyonlar, PIC mikrodenetleyici programlarının daha düzenli ve tekrar kullanılabilir olmasını sağlar.
Bir sonraki derste PIC16F628A üzerinde bit işlemlerini ve lojik kaydırma operatörlerini inceleyeceğiz.