avr dersleriMerhaba, bir şekilde geleneksel hale getirdiğimiz fakat nedense ağırdan aldığımız C Dili ile Atmel AVR Programlama Derslerimizin yedincisine hoş ve sefa geldiniz. Bu dersimizde, kullanım kolaylığı ve esnekliği sayesinde taraflı tarafsız tüm programcıların gönlünde yer etmiş bir kontrol yapısını görmeye, hazır mıyız? -Hazırıııız! Peki, nedir bu maharetli yapı? Switch case yapısı…

Bir önceki dersimizi çalışan takipçiler hatırlayacaktır, if - else if – else yapısı ikiden fazla şartı kontrol etmek için kullanılıyordu. Hatta aklından bir sayı tut diye bir program parçacığı yazmıştık:

if (sayi ==”1”) printf(“tuttuğun sayı birdir”);
if (sayi ==”2”) printf(“tuttuğun sayı ikidir”);
if (sayi ==”3”) printf(“tuttuğun sayı üçtür”);

Else Print (“dude, are you kidding me?”);

Şimdi yukarıdaki örnekte nedir durum; if ibaresinden sonra dilediğimiz kadar else if yapısıyla şartlarımızı sıralayabiliriz. Yukarıdaki örnekte, if ve else if kontrollerinden sonra sadece birer satır işlettiğimizden o kadar da karışık durmuyor. Fakat if ve else if şartlarından sonra satırlarca kod işlettiğimizi ve onların içinde de if ifadeleri uçuştuğunu düşünün, mesela aşağıdaki gibi:

if (x == falan filan)

{ burada biraz kod var…

if(cart curt)

burada da biraz Kod var

Else if (kem küm)

Eccük kod da burada var

}Else if(x == bla bla)

{ kodlar kodlar…

if (etc.) kod

Else if (xyz) bir başka kod

}Else if(x== selamunkavlen)

{

Biraz Kod ve bilinçaltı mesajlar...

}Else Print (“arapsaçına döndüm”);

Gördünüz mü abiler ve ablalar ne kadar karışık ve anlamsız, gerçi anlamsız olması, galiba biraz benim suçum ama karışık olması inatla if - else if yapısını kullanmamdan kaynaklıdır. Çünkü if else yapıların arasında başka if else yapıları kullanıyorum ve hangisi ana if hangisi yavru if, takip zorlaşıyor. If yapısını programımızın her yerinde yavru halde kullanıyoruz, O halde hiç değilse ana arterlerde switch case yapısını kullanabiliriz, biraz sonra ana if –else if yapısı yerine kullanıp farkı görelim.

Önce söz dizimine bakalım:

Switch(şart aranacak değişken)
{

Case şart1:  şart1’e bağlı işlemler break;

Case şart2:  şart2’e bağlı işlemler break;

Case şart3:  şart3’e bağlı işlemler break;

Default: hiçbir şarta uymadıysa burayı işle; break;

}

Yukarıdan da anlaşıldığı üzere switch yapısı için şart arayacağımız bir değişkene ihtiyaç var. Ve case komutlarıyla değişkenin hangi şarta uyduğunu kontrol ediyoruz. Eğer bir şarta uyarsa o şartın case’i ve break’ı arasındaki işlemleri işler ve artık alttaki kontrol etmeden switch-case yapısından çıkar. Eğer herhangi bir case şartına uymayan başka bir şart varsa onu da Default ile varsayılan kabul değeri olarak atayabiliriz. Default orada Opsiyoneldir.

Şimdi bir örnek yapalım.

Televizyon kumandasından kızılötesiyle gelen tuş bilgisini düşünelim. Dört ana tuşumuz olsun. Sesi birer dilim azaltmak için SES- tuşu, birer dilim artırmak için SES+ tuşu, kanalı bir artırmak için PROGRAM+ tuşu ve Kanalı bir azaltmak için PROGRAM- tuşu.

Değişkenlerimiz ne olsun:

Char TusBilgisi; // Kızıl ötesi alıcısına gelen karakter kodunu tutsun. Yani hangi tuşa basıldı bilgisini.

Unsigned int SesMiktari =100; // Sesin ne kadar açık olduğunu tutan değişken, varsayılan değişken 100 olsun.

Unsigned int KanalDurumu = ; // Şuan hangi kanalda olduğunu tutsun, varsayılan olarak 42.kanal olsun.

Şimdi de tuş kontrolünü yapacağımız kontrolü şöyle yazmaya başlayalım bakalım:

Switch (TusBilgisi)   // kumandadan gelen tuş bilgisini alıp TusBilgisi değişkenine atamıştık.
{

Case SesAzalt: SesMiktari--;  break; // Sesi Azalt butonuna mı basılmış? O zaman sesi bir azalt

Case SesArtir: SesMiktari++; break; // Sesi Azalt butonuna mı basılmış? O zaman sesi bir artir

Case KanalYukari: KanalDurumu++;break; // Kanal yukarı tuşuna basılmışsa kanalı bir artir.

Case KanalAsagi: KanalDurumu--;break; //Kanal aşağı tuşuna basılmışsa kanalı bir azalt

Default: break;

}

Şimdi yukarıdaki örnekte switch case yapısının en basit halini ve de kullanım kolaylığını görüyorsunuz zaten yanlarına da açıklamaları yazdık o yüzden tekrar tekrar anlatmaya gerek duymuyorum.

Yukarıdaki örnekte bir problemimiz var o da örneğin ses sonuna kadar kısıldıysa ses tuşu kısma işleminin işe yaramaması lazım, aynı şekilde ses zaten sonuna kadar açıksa ses artir butonu bir işe yaramamalı. Kanal değiştirme işi bunun için geçerli değil çünkü TV 0.kanaldayken yine kanal azaltma butonuna basıldığında maksimumuncu kanala döner yani burada 255.

if ile ses kontrollerini daha cazip yapalım. Programımızı yeniden ve tam şekilde düzenleyelim:

#include <avr/io.h> // giriş çıkış registerlerin tutulduğu dosya

#define F_CPU 4000000UL // Osilatör frekansı 4MHz

unsigned char TusBilgisi; // mikrodenetleyici portuna gelen tuş bilgisini tutar

unsigned int SesMiktari =100; // varsayılan ses miktarı 100 dilim

unsigned int KanalDurumu = 42; // varsayılan kanal 42.kanal

unsigned char tus_bilgisi_al(void);

#define SES_AZALT 0xF1

#define SES_ARTIR 0xF2

#define KANAL_ASAGI 0xF3

#define KANAL_YUKARI 0xF4

int main()

{

do{

TusBilgisi = tus_bilgisi_al();

switch (TusBilgisi)

{

case SES_AZALT:

if (SesMiktari !=0) SesMiktari--; //Ses zaten sonuna kadar kısıksa, kıs butonu işe yaramasın

break;

case SES_ARTIR:

if (SesMiktari != 255) SesMiktari++; //Ses zaten sonuna kadar açıksa, ses aç butonu işe yaramasın

break;

case KANAL_ASAGI:

KanalDurumu++;

break;

case KANAL_YUKARI:

KanalDurumu--;

break;

default: break;

}

}while(1);

return 0;

}

unsigned char tus_bilgisi_al()

{

// Denetleyiciye gelen hexadecimal kodu al ve ana programa döndür

return TusBilgisi;

}

(NOT: Program AVR Studio ve WinAVR compilerda Atmega8 için başarıyla derlenmiştir.)

Programa dair kısa notlar vererek, yazıyı bitiriyorum:

1. Değişkenleri “Unsigned int” olarak kullandık bunun manası 0-255 arası değer alabilir demek. Normal “int” kullansaydık -127 ve 128 arası değişecekti. Bizim bu örnekte eksi değerlere ihtiyaç yok. (Bkz: 4. Ders: Değişkenler ve Operatörler)

2. Switch case yapısının en sonundaki Default: break; kısmı kullanılmasa da olur. Yukarıdaki case şartlarından hiç birine uymadığı takdirde bir kod çalıştırmak isterseniz kullanırsınız.

3.tus_bilgisi_al(); bir fonksiyondur, fonksiyonun içi şimdilik boş, kafanız karışmasın diye doldurmadım. Çünkü o fonksiyonun içi bir interrupt ile dolardı ki ben daha interrupt anlatmadım daha. O yüzden boş kalsın şimdilik.

Bir dersimizden daha sonuna geldik. Bu vesileyle bir dahaki dersimizde fonksiyonları görelim. Fonksiyon nedir, fonksiyonlar nasıl tanımlanır ve kullanılır, ne amaçla kullanılır, kullanmasak olmaz mı vb… gibi gerekli gereksiz birçok soruyu cevaplandırırız.

Anahtar Kelimeler: Mikrodenetleyici, Atmel AVR Dersleri, Atmel AVR Programlama Dersleri, Atmel Mikrodenetleyicileri, AVR Studio Kullanımı, C dili ile Atmel AVR Dersleri, C dilinde Mikrodenetleyici, Switch Case Yapısı, WinAVR Kullanımı

peynir6 suyu tozu , 18/05/2010-16:56 Facebook'ta Paylas