Gömülü C – 7 : Fonksiyonlar ve Temiz Kodlama

İngilizce’de “clean coding” (temiz kodlama) denilen mevzu ile ilgi, cüz-i irademden dökülen bir takım fikir ve ilmi bilgileri,  siz değerli okurlarla paylaşacağım.

Temiz Fonksiyonlar

Malumunuz fonksiyonlar (methodlar) bir programın eli kolu değildir ama programın hayata dokunması sürecidir. Fonksiyonlar doğru kullanılmazsa, çok yanlış anlaşılabilir, büyük felaketleri doğurabilir.  Buradaki ibret doğal olarak fonksiyonlar için de aynen geçerlidir.

Bir program bir problemi çözmek üzere bir takım işler yapacağından, programda işi yapan, haliyle fonksiyonlardır. Bu sebepten ötürüdür ki fonksiyon isimlerinin ve tanımlamalarının iyi yapılması, programın işini hakkı ile yapmasında yadsınamaz bir paya sahiptir. Bir fonksiyon okunduğunda, okuyan kişinin beyninde bağlantı kuracağı bir şeyleri uzun süreler aramamalı, hemen gideceği yere gitmelidir. Bu da fonksiyonu yazanın pekala da yardımcı olabileceği bir konudur. Çiçek gibi kod yazmanın bazı basit, temel kuralları vardır. Bu kuralların bazıları biliniyor bazılarını ben uydurdum. Aklınıza yatmayanı zaten boş veriniz. Söz konusu kurallar şöyle:

  • Fonksiyonun adı, fonskiyonun sorumluluğunu ve söz konusu mevzuyu çok^5 temizlik seviyesinde açıklamalıdır. Temizlik, isimden başlamaktadır.
  • Fonksiyon, mümkünse tek bir iş yapmalıdır. Mümkün değilse bile fonksiyon tek bir iş yapmalıdır.
  • Fonksiyon çok uzun olamamalıdır. Bir fonksiyonu okurken afedersiniz skrol yapmak gerekiyorsa,  o fonksiyon hemen parçalanmalıdır.21″ monitörde tek fonksiyon içine skrol gerektirecek kadar kod yazmak hol değildir.
  • Fonksiyon pahalı bir olgudur. Bu sebeple fonksiyonun tekrar kullanılacağı düşünülmelidir.
  • Yazılan bir fonksiyon, makine için değil insan için yazılır. Fonksiyon makine üzerinde çalışacak diye bir tek makinenin anlayacağı şekilde yazmak kalite ve anlaşılabilirlik kaybına sebep olur. Kod çalışmak zorunda olduğundan makine zaten onu anlayacaktır. Asıl mesele, insanın anlayacağı şekilde kod yazmaktır.
  • Fonksiyon, dağıtılmadan önce doğrulanmalıdır ki kullanan kişilere aktarılmasının bir manası olsun.
  • Kolaya kaçılıp, afedersiniz kötü kod, yorum satırlarıyla sıvanmamalıdır. Yorum satırları geçici iken, fonksiyonun kendisi kalıcıdır. Madem ki yorum satırı yazılabiliyor, ondan önce fonksiyonun kendisi temiz yazılmalıdır. Kod yazarak yapılamayacak şeyler, yorum satırları ile yapılmaldır.
  • Bir fonksiyonun adında -meclisten dışarı- “ve(and), veya(and), oyleyse(then)” gibi kelimelerin geçmesi, o fonksiyonun birden fazla iş yaparak dünyayı kurtarmaya çalıştığını göstermektedir. Bu çok yanlıştır. Dünyayı kurtarmak  bir takım işidir. Bu fonksiyonlar derhal parçalanmalı ve temizlenmelidir.
  • Bir fonksiyonu her kullanan kişi, o fonksiyonun tepesindeki yorumları değil, bizzat ismini görecektir. Yorum satırını görebilmek için fonksiyonun implementasyonunu açmak gerekmektedir. Bu, orta çağdan kalma bir işkence yöntemidir ve yapılmamalıdır. Reçete olarak, temiz, yaptığı işi ismiyle anlatan fonksiyonların yazılması şifa verecektir.
  • Bir yazılımdaki tüm isimler, derleyici tarafından adres sembollerine çevirileceğinden, uzun ve derdi açıkça anlatan fonksiyon isimleri seçmek hiç kimseye zarar vermeyeceği gibi yazarın yaptığı işin kalitesini artıracaktır. Uzun isimli fonksiyon, kısa isimli fonksiyondan daha fazla bellek tüketmeyeceğinden eli korkak alıştırmanın lüzumu yoktur.

Maddeler bunlar. Şimdi kalem kalem bu başlığın önemli konularına değinelim.

Anlaşılabilirlik ve Modülarite

Hiç laf kalabalığı yapmadan, somut örneklerle mevzuya dalacağım. Zaten eski bir ahitte yazdığım bir örneği sizlerle bu perspektifte paylaşacağım.

Kötü Örnek:

Yukarıdaki rezil kodu hatırlarsınız. Bu tür kodlama yüzünden nice çok da olumlu yorulmlar alınmayacağı anlaşılmakta. Bir kere fonksiyonun adından “Ve” yazıyor. Bu fonksiyon dünyayı tek başına kurtarma gayretini, belki iyi niyetle ancak saf bir cehaletle göstermektedir. Cehalet kötüdür. Fonksiyonun adı hele iyice faciadır çünkü C dilini az çok bilen herkes bu fonksiyonun iki değeri toplayarak, bellekte bir yerlere yazdığını anlayabilecektir. Asıl soru bu işin neden, ne zaman, ne amaçla yapıldığıdır ki bu da gerçeğin altındaki hakikatin ta kendisidir.

Bir diğer şık olmayan davranış ise fonksiyon isminin Türkçe, yorumların ise Almanca + İngilizce olmasıdır. Bu yorumları kimse – belki İlber Ortaylı hariç – anlayamayacaktır (İlber Hoca da yorumları anlasa da kodu anlayamayacaktır). Dolayısıyla kodda tek bir insan dili tercih etmek daha hoş olacaktır.

Güzel Örnek:

Bu yukarıdaki kod da tanıdık. Ama ben kodu yeni görmüş gibi, “aaa ne güzel kod O_o” demek istiyorum. Paralel evrenin, bu kodu içeren, pek de ücrada kalmamış bu güzel köşesinde, kötü örnek kodunda yapılan işler bu defa çiçek gibi tertemiz bir şekilde, amme hizmeti bilinci ile yapılmıştır.  Kötü örnekteki kod derin kod olduğundan ne iş yaptığı bilinmemekte idi. Güzel örnekteki kod temiz kod olduğundan, kodun aslında ticaret işleri ile uğraştığı anlaşılmaktadır.

Gönderilecek veri serileştirilmek zorunda olduğundan, union kullanılarak +1 mühendislik puanı kazanılmıştır.

Değişken adları da mevzu hakkında çok sayıda açık bilgiyi, yazılım tutkunlarının hizmetine sunmaktadır. Bu kodu okuyunca u16BazUcretTL’nin TL cinsinden, 65536 TL’den küçük bir meblağ olduğu anlaşılmaktadır. Bu da, kodlamada şeffaflık ve temizliktir.

Kötü kod, kötülükle sıkı bağlar kurmuştur. Seri porttan veri gönderme işi er ya da geç başka yerlerde de kullanılacağından, kötü örnekteki yapıda kopyala yapıştır yapmak gerekcektir ki bu tekrar kullanılabilirlik kavramından çok uzaktır. Güzel örnekte ise bu işi yapan bir fonksiyon, ayrı bir bireydir ve tekrar kullanılabilir yapıdadır. Yani benzetme yapılacak olursa; hem dünyası, hem ahireti güzeldir.

Rekürsif Fonksiyonların Kullanımı

Mümkünse kullanmayalım efendim. Stack derinliği sabit olmayan rekürsif fonksiyonlar, gömülü sistemlerde kullanılmamalıdır. Zaten ters gidebilecek bir sürü şey varken neden bir şey daha ekleyelim ki?

Sayın muhterem… Eveeeet, bir programın daha sonuna geldiik.

Şimdi devam!

Önceki Sayfa   Sonraki Sayfa

 

Gömülü C – 6 : Lezzetli Dosya Formatı

Opratörlerden sonra, sizlere de bizlere de bir nefes aldıracak bir konuya değineyim istedim. Kafalarımızı dinlendirmek için araya güzel bir konu sıkıştırıyorum. C dilinde yazılacak bir yazılım için dosya formatı nasıl olursa yakışıklı olur ona değineceğim. Malumunuz C’de, terbiyemizi takınarak yazdığımız yazılımlarda, uzantısına göre iki çeşit dosya oluyor: c ve h dosyaları. Bunların adam akıllı organizasyonu, seneler içinde edinilen bilgi ve tecrübeler vesilesiyle, ibretlik bilgiler içeren bir hal alıyor. Ben de bu bilgiyi burada sizlere aktarmaya çalışacağım.

Her yiğidin bir yoğurt yiyişi vardır demişler. Dosya formatı mevsusu da bu mevzuya epeyce benzer. Her yiğit yoğurdu başka yiyebilir ama güzel yoğurt her zaman güzel yoğurttur. Ben de güzel bir yoğurdu, kendi tarzımla sizlere sunacağım. Öyleyse haydi başlayalım!

Not:Bu vesileyle bu yazının temasının yoğurt olduğunu bilgilerinize arz etmek isterim.

Source (Kaynak) Dosyaları

  • Kaynak dosyalarının uzantısı: *.c olmalıdır. Örneğin yogurt.c
  • Dosya isminde Türkçe karakter kullanmazsanız, yoğurdunuz ekşimez.
  • Dosya adları açık ve anlaşılabilir olmalıdır. Dosya adını kısa yazmanın Murphy dışında kimseye bir faydası yoktur.
  • Dosya adı küçük harflerle başlamalıdır. Örneğin YaRaLiKaRiZmA34.c gibi ergen isimlendirmeleri ile yapılan yoğurttan cacık bile yapılmaz.
  • Dosyanın uzantısı da küçük c olamalıdır. ayran.C gibi isimlendirmeler, cehalete delalet eder. Yapmamak lazım, çirkinleşmeye hiç gerek yok.
  • Yerel, lokal, private(umumi olmayan) elemanlar statik tanımlanmalıdır.
  • Extern sözcüğü, yoğurttaki zararlı bir bakteri çeşididir. Onsuz da güzel yoğurt yapılabilir.

Çok güzel ahkam kestim ama farkındayım ki vakit, lafa karnı tok olan siz değerli okuyucuma lezzetli bir yoğurt sunma vaktidir.

Sevgili okuyucu, yukarıdaki kod şablonunu ingilizce yazdım ama lütfen kırılmayın darılmayın. İngilizce bilmiyorsanız bile çeviri ile anlamlarını öğrenmek çok çok kolay. Öyle kompleks şeyler yazmadım. Önceden dediğim gibi bir yazılımı yazarken tek bir insan dilinde yazmak lazım. Ben, terminoloji İngilizce olduğundan ve profesyonel hayatımda da kodları İngilizce istediklerinden formatı İngilizce olarak paylaşıyorum. Dana yoğurdu deyip Angus yoğurdu göstermiş olabilirim ama beni anlayacağınızı biliyorum. Kızmayın, darılmayın, trip atmayın.

Yukarıdaki formatı incelediğimizde, formatın sayısız ibretler içerdiğini görebilirsiniz. Bir kere başlıklar filan bir ilginç. Bazılarınıza bu güzel yoğurt tanıdık geldiyse dilinizin ucundaki sözcüğü ben söyleyeyim. DOXYGEN!!! Kanlıca yoğurdunu, pudra şekeri olmadan yemek nasıl tarihi bir hata ise, bir dosyadaki yorumları DOXYGEN’i sallamadan yapmak da o derecede talihsiz bir hatadır. Nitekim Doxygen ile yazan bir üstad’ın yoğurdu, camış yoğurdu gibi taş gibi olacaktır. Kodu yazan bu büyük üstad, kodun dökümantasyonunu da aradan çıkarmış olacaktır. Şimdi ben Doxygen dedim ama burada onu anlatmayacağım. Çünkü tonla kaynak var ve öğrenmek çok kolay. Sadece haberiniz yoksa, duyduysanız ama çok önemsemediyseniz diye bir değineyim istedim.

Yukarıdaki define satırı da aslında yoğurttaki zararsız bir bakteri gibi görünüyor ama aslında bu zararsız bakteri, sayısız hastalığa iyi gelir. Eğer modüler bir tasarım yaptıysanız her bir dosyayı bir mini modül gibi düşünmek isteyebilirsiniz. Bu yukarıdaki define size, bir modül projenizde var mı yok mu anlama imkanı sunar. Başka bir kaynak dosyasında #ifdef SAMPLE_C diyerekten o varsa şunu yap, yoksa da yoğurt yapmaktan vazgeçme bunu yap diyebilirsiniz. Bu gibi nice ibret, bu yoğurttaki bu bakterinin, faydalı bir bakteri olduğunu bizlere göstermektedir.

Devam edecek olursak, defines & macros kısmı görürüz. Bi dakka! Define ifadelerinin h dosyasında olması gerekmez mi? Evet ne yazık ki yanlışlıkla koymuşum onu C dosyasına demeyeceğim çünkü bunun da ibretlik bir sebebi var. bazı makrolar ya da define’lar, diğer modülleri de ilgilendirecek onların da işine yarayebilecek şeyler olduklarından, umuma hizmet açısından bu define’lar h dosyasına konur. Ama bazı makrolar, define ifadeleri de vardır ki, onlar yiğidin yatak odası gibidir, dışarı açılmaları hoş olmaz (?). Neyse konuyu saptırmayayım, tıpkı değişkenler ve fonksiyonlar gibi, makroları da dışarıya açmamayı seçebilirsiniz, bu durumda bu makrolar C dosyasında tanımlanır.  Mevzuyu daha da uzatmayacağım, anladınız siz onu.

Dosyanın geri kalanını çok detaylı açıklamayacağım. Static olan fonksiyonlar umuma açık olmayan fonksiyonlar oluyor. Yoğurdu yemek için içindeki bakterilerle tanışıp çay partisi yapmaya gerek yok. Static olan bu fonksiyonlar, modülün iç meseleleri. Static olmayanlarsa umuma hizmet olarak, dışarıya açılan elemanlar. Bunlar da yoğurdun kaymağı. Static olmayan fonksiyonların prototipleri, h dosyasında yer alacak. Fonksiyon prototipini yazmak, derleyiciye “bak haberin olsun bro, böyle bi fonksiyon var sonra duymadım etmedim deme” demek olduğundan, umuma duyurulacak fonksiyonların prototipleri doğal olarak h dosyasında yer alır. Static fonksiyonların prototipleri de c dosyasında yer alır. Static fonksiyon prototipinin h dosyasında yer aldığı durum da vardır ve ibretlik bir durumdur ama çok çok istisnai olduğundan onu yok saymak hakkımızdır. Nedenleriniz çok kuvvetli değilse yapmayın etmeyin. Kanlıca yoğurdu gibi dosya formatı var. Monalisa tablosunun kopyası gibi, al evine duvarına as.

Header (Başlık) Dosyası

  • Başlık dosyalarının uzantısı: *.h olmalıdır. Örneğin yogurt.h
  • Kaynak dosyalarının isimlendirilmesindeki maddeler, 2. maddeden itibaren aynen geçerlidir.

Yukarıdaki başlık dosyasının hikmetlerinin bir çoğunu artık anlayabiliyorsunuz. Bir tek aşağıdaki kısmı açıklayayım:

Bazen, dostlar; bir kaynak dosyası istemeden de olsa aynı header dosyasını iki defa çağırabilir. Örneğin bizim kaynak dosyamız olan cacik.c, yogurt.h ve hiyar.h’ı include etsin. Eğer hem yogurt.h hem de hiyar.h dosyaları içerde yemek.h dosyasını include ediyorsa, bizim cacik.c aslında yemek.h dosyasını iki defa include etmiş olur. Bu da çok tatsız bir yoğurt yiyiş şeklidir ve besin zehirlenmesine sebep olabilir. Bunu engellemek için yukarıdaki ifdef yapısı kullanılır. Bu durumda header dosyası iki defa çağırılsa dahi ilk çağırmada defined olmayan H_SAMPLE, defined olacağından bir daha bu header dosyasının içine girilmez yani aslında bu header iki defa include edilemez. Bu da bir yiğide yakışan bir yoğurt yeme şeklidir.

Bendeniz, zat-ı alilerinize, dosya formatları hususundaki bakışımı aktardım. Artık bunu yorumlamak veya ilerletmek sizlere kalmış. Yazıyı okuduğunuz için teşekkürler 🙂

Şimdi devam…

Önceki Sayfa   Sonraki Sayfa

 

Gömülü C – 5 : Operatörler

Önceki yazılarda, bir C programı hakkında feyizli bir takım konular üzerinde konuşmuştuk. Merhaba dünya yazılımının anatomisinden sonra ibretlik veri tiplerini, değişkenler ile onlara atanacak sabitleri, ardından da alımlı kodun olmazsa olmazı yorum satırlarını incelemiştik. Bu defa ise, C dilindeki bir diğer önemli başlık olan operatörleri inceleyeceğiz.

Dünyada çeşit çeşit operatör vardır ancak ne mutlu bize ki C dilindeki operatörler çeşitleri sınırlı sayıda. 🙂 Neyse, “operatörlere özgü bir yazı” olması, ilk bakışta biraz garip guraba gelebilir ama, operatörler özellikle gömülü programlamada “çok bilinçli şekilde kullanılmak zorunda” olduğundan değer verilmesi gereken önemli bir konu. Bizim de niyetimiz operatörlerin hak ettiği saygınlığı kazanmasına yardımcı olabilmek.

Bazen aynı amaç, farklı operatörler ile gerçeklenebilir. Hatta genelde durum böyledir. Bu aşamada, hangisini seçmenin daha akıllıca olacağına karar vermenizi sağlayacak birtakım ince noktalara burada değinmeye çalışacağım. Operatörlerin doğru kullanımında dahi bazı kazan/kaybet (trade-off) durumları olduğundan, yine ibretlerle dolu bir yazının şanlı başlangıcında olduğumuzu hissediyorum. Haydi hayırlısı…

Aritmetik Operatörler

C dilinde aritmetik operatörler, bizleri çocukluğumuza, ilkokul sıralarına götürür 🙂

Not: Operatörlerin uygulandığı değişken veya sabitlere genel olarak operand denebilir. A=10, B=20 için;

Operatör Tanım Örnek
+ iki operandı toplar A + B = 30
Soldaki operanddan sağdaki operandı çıkarır. A – B = -10
* operandları çarpar A * B = 200
/ soldaki operandı sağdaki operanda böler B / A = 2
% Mod operatörü, bölmeden sonra kalanı verir B % A = 0
++ Bir artırma operatörü A++ = 11
Bir azaltma operatörü A– = 9

Aritmetik operatörleri etkin şekilde öğrenmenin en iyi yolu, bu operatörleri kullanarak programlar yazmak ve bunları çalıştırarak sonuçları görmektir. Benim derdim, operatörlerin ne iş yaptığını anlatmak olmamalı diye düşünüyorum. Herhangi bir C dersinde/kitabında bu zaten alenen anlatılıyor. Aşağıdaki örnek yazılımı yazmamın ardından asıl anlatılması gerken ince noktalara geçeceğiz.

Yukarıdaki kod çalıştırıldığında, çıktısı aşağıdaki gibi olur:

Toplama: 30.000000 Cikarma : -10.000000 Carpma: 200.000000 Bolme: 0.500000 Mod: 10
++ sonra kullanilinca i:30
bir sonraki adimda i:31
++ once kullanilinca i:31
bir sonraki adimda i:31

Önemli bir nokta olarak i++ yazdırıldığında, önce i’nin değerinin yazdırılıp ardından bir artırıldığında dikkat ediniz. Aynı şekilde ++i yazdırıldığında, önce i’nin değerinin bir artırıldığında ardından bu değerin yazdırıldığına çok dikkat ediniz. İnananlar için burada büyük ibretler var. ++ opratörünü bu bilinçle kullanmakta faydalar var.

Aritmetik operatörlerle ilgili önemli bir diğer nokta da öncelik sırası kavramı. Öncelik sırasına takılmamak ve kodu okunur kılmak adına, ardışıl aritmetik işlemlerde parantez kullanaraktan sorunu teğet geçmekte fayda var. Örneğin 13+227-12/3 ile ne demek istediğimi anlayamayabilirsiniz, demek istediğimi yanlış diyor da olabilirim ama 12+(227)-(12/3) ile ne demek istediğimiz çok açık olur. C dilinde malum her zaman parantezin içi öncelikli oluyor. Hem hataları önlemek için hem de toplum içerisinde anlaşılabilir olmak için bu alışkanlığı edinmekte faiderler, feyizler var.

Aritmetik operatörlerle ilgili bir diğer önemli nokta da, yerli yersiz kullanılmamaları. Kimi zaman (hatta çoğu zaman), bir işi yapmanın birden fazla yolu oluyor. Örneğin 8 bitlik iki sayıyı alıp yanyana koyup 16 bitlik tek bir sayı elde etmek istediğimiz yerler oluyor. Bunu yapmak aşağıdaki şekillerde mümkün:

Bazı platformlarda toplama, çarpma gibi aritmetik işlemler atomik değildir, yani bu operatörlerin işletilmesi 1 saat darbesi süresinden (1 cycle) fazla sürer. Halbuki her işlemcide AND,OR işlemleri tek cycle’da yapılır. Buna göre eğer yukarıdaki kodu MSP430 serisi mikrokontrolörler için yazıyorsanız, yöntem 0 sizi canınızdan bezdirir çünkü eğer HW multiplicator olmayan bir modelde çarpma 130 cycle kadar sürer, HW multiplicator olan bir modelde bile çarpma 8 cycle sürer. Daha bunun toplaması ve ataması da var. Halbuki Yöntem 3’te tüm olay hepi topu 3 cycle’da biter. Yöntem 4’ün ise çok sanatsal bir amacı var, umarım anlamışsınızdır ancak anlamadıysanız dahi ileride detaylıca anlatacağım zaten.

Neyse demek ki yerli yersiz aritmetik operatör kullanmamak lazımmış. Gerçi Arm Cortex M3 mimarisinde aritmetik operatörler de 1 cycle sürüyor (non-fp için). Orada elinizi korkak alıştırmayabilirsiniz ama yine de gün gelir o kodu 8 bitlik bir mikrokontrolöre taşımanız gerekirse başınız ağrır. En güzeli, en baştan çiçek gibi bilinçle yazmak 🙂

İlişkisel Operatörler/ Karşılaştırma Operatörleri

İlişkisel operatörler sağ ve solundaki operandlar belirli bir mantıksal ilişkiye göre karşılaştırılır ve eğer ilişki doğru ise doğru döndürülür, yanlışsa yanlış. 😀

Operatör Tanım Örnek
== İki operand birbirine eşitse, sonuç doğru(true,1) olur (A == B)
!= İki operand birbirine eşit değilse, sonuç doğru(true,1) olur (A != B)
> Soldaki operand sağdakinden büyük ise, sonuç doğru(true,1) olur (A > B)
< Soldaki operand sağdakinden küçük ise, sonuç doğru(true,1) olur (A < B)
>= Soldaki operand sağdakinden büyük ya da eşit ise, sonuç doğru(true,1) olur (A >= B)
<= Soldaki operand sağdakinden küçük ya da eşit ise, sonuç doğru(true,1) olur (A <= B)

Bu kısımla ilgili verilecek ibretlik mesajı önceki kısımlarda vermiştik. Ancak tekrar bir hatırlatma yapmak gerekirse;karşılaştırma operatörleri genellikle if,while gibi koşul/döngü işlemlerinde kullanılır ve doğal olarak en çok hata da buralarda yapılır. Örneğin sık yapılan hatalardan biri if(age == 18)  yazacakken yanlışlıkla if(age=18) yazmaktır. Bu durumda age değişkenini 18 ile karşılaştırmak yerine, age değişkenine 18 atamış ve dönüş olarak true almış olursunuz. If içinde atama yapmak mümkün olduğundan derleyici buna hata vermez, uyarı verebilir. Bu hatayı hiç yapmamanın yolu if(18 == age) formatını kullanmaktır. Yani sabiti sola, değişkeni sağa almaktır. Bu durumda yanlışlıkla if(18 = age) yazsanız bile, derleyici size sabite değişken atanmaz diye hata verir. Bu arada 18 yazdım ama, örnek anlaşılsın diyerekten sayıyı doğrudan yazdım 🙂 Yoksa MAGIC_NUMBER kullanmak yok 😉 Önerdiğim formatta yazacak olursam eğer if(ageOfDriverCandidate == AGE_LIMIT_TO_DRIVE) yerine if(AGE_LIMIT_TO_DRIVE == ageOfDriverCandidate) yazmakta fayda var. Ya da bu hususta sık hata yapıyorsanız, bir makro yaratarak, ve onu bir kez test ederek bu sorunu tarihin tozlu sayfalarına gömebilirsiniz :

 

Mantıksal Operatörler

Bazen birden fazla koşul aynı anda değerlendirilmek istenebilir. Bu durumda mantıksal ilişkiye göre (ve,veya,değil) koşullar değerlendirilebilir.

Operatör Tanım Örnek
&& Mantıksal VE(AND) operatörü çağırılır. Eğer iki taraf da sıfırdan farklı ise, sonuç doğru(true) olur. (A && B)
|| Mantıksal VEYA(OR) operatörü çağırılır. Eğer iki taraftan herhangi biri sıfırdan farklı ise, sonuç doğru(true) olur. (A || B)
! Mantıksal DEĞİL(NOT) operatörü çağırılır. Operandın mantıksal tersi alınır; operand 1 ise sonuç 0, operand 0 ise sonuç 1 olur. !(A && B)

Mantıksal operatörler birleştirilerek kullanılabilir. Ancak insan aklının almayacağı uzunlukta bir koşul söz konusu ise, o koşul ya indirgenmeli, ya da yorum satırları ile açıklanmalıdır. İnsan aklı derinlik olarak ortalama 7 seviye ilişkiye kadar hafızada tutabilir. Fazlası olmaz 🙂 if içinde 9 tane koşul yazmamakta fayda var.

Bitsel/İkili (Bitwise/Binary) Operatörler

Esasen bitsel operatörlerin ciğerini BURADA, çiçek gibi açıkladık. Hatta elektronik olarak nasıl gerçeklendiğini de konuştuk. Ancak tabi ki olayı bir de yazılım perspektifinde incelemekte sayısız feyizler var. Zira gömülü sistemlerde kimi zaman bir bitin bile hesabı yapılır. Hesabının yapılmadığı yerde bile, kullanılan mikrokontrolörün bir registerındaki bir biti 1 ya da 0’a çekmek için bitsel operatörler kullanılabilir. Bu söylediğim ilk aşamada bir anlam ifade etmemiş olabilir, ancak ileride değineceğimiz üzere mikrokontolördeki donanımı kullanabilmek için, genişliği genelde işlemcinin adres yolu genişliği kadar olan (8/16/32 bit), ayırılmış özel bellek alanlarına (register) bir takım veriler yazmak gerekir. Belleği verimli kullanmak için bir register içindeki her bitin ayrı ayrı işlevi olur. Bu nedenle registerlara bitsel olarak erişmek gerekir. Burada da genellikle bitsel operatörler kullanılır. Yani mevzu, o kadar önemli ki, ateş ediyor =)

Misal A = 60; ve B = 13; olsun. Bunların ikili tabanda gösterimi şöyle olur:

A = 0011 1100

B = 0000 1101

Buna göre

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

Operatör Tanım Örnek
& Bitsel VE Operatörü (A & B) = 12, yani 0000 1100
| Bitsel VEYA Operatörü (A | B) = 61, yani  0011 1101
^ Bitsel XOR Operatörü (A ^ B) = 49, yani  0011 0001
~ Tümleyen operatörü. Operandın 1 olan bitlerini 0, 0 olan bitlerini de 1 yapar. (~A ) = -61, yani  1100 0011
<< Sola kaydırma operatörü. Soldaki operandın bitleri, sağ operand kadar sola kaydırılır ve her kaydırmada en sola 0 eklenir. (Karışık oldu, örnek üzerinden görmekte fayda var) A << 2 = 240 yani 1111 0000
>> Sağa kaydırma operatörü. Soldaki operandın bitleri, sağ operand kadar sağa kaydırılır ve her kaydırmada en sağa 0 eklenir.(Karışık oldu, örnek üzerinden görmekte fayda var) A >> 2 = 15 yani 0000 1111

Şimdi gelelim fasülyenin faydalarına 🙂 Yani her yerde yazmayan önemli bilgilere…

& (VE) operatörü ile maskeleme yapılarak bir sayının 1 olan bitlerini 0’a çekmek yani temizlemek mümkündür. Misal:

 

| (VEYA) operatörü ile maskeleme yapılarak bir sayının 0 olan bitlerini 1’e çekmek yani set etmek! (kurmak) mümkündür. Misal:

^ (XOR) operatörü candır! Bu operatör ile maskeleme yaparak bir sayının herhangi bir bitini (ya da bitlerini) terslemek mümkündür.

Ek olarak kaydırma operatörünün, cyclic olup olmadığı her platformda mutlaka test edilmelidir. Normalde cyclic olmaz, ama test etmekte fayda var =)

Yazdığım örneklerde zaten kaydırma operatörünün kullanımı da var. Bir de ^=, +=, |= gibi örneklerden atama operatörünün diğer bitsel ve aritmetik operatörlerle birleştirilebildiğini de göstermiş olduk diye düşünüyorum.

Bu gün bu yazımı Mustafa Keser üstadımızın sözü ile sonlandırıyorum.

“Eveeeeet, bir proğramın daha sonuna geldiiik. Tekrar görüşmek üzere efeem.”

 

Önceki Sayfa   Sonraki Sayfa

 

Gömülü Sistemler – 02 – Temel Elektronik Tanıtımı

2. TEMEL ELEKTRONİK TANITIMI

2.1 AMAÇ

Bu yazıda amaç; pratik ağırlıklı bir bakış açısıyla temel elektronik bilgisi ve kültürünü yalın şekilde anlatmak, gömülü sistemler için genel geçer olarak kullanılabilecek bir donanım altyapısı oluşturmaktır. Özellikle gömülü sistemlerle ilgilenen ancak donanım bilgisi olmayan kimseler de bu yazıdan faydalanabilir. Bu yazıdaki bilgiler devre tasarımı yapmanızı sağlamaz, ancak yapılan tasarımları anlamanıza yardımcı olur. Bu kısım zaman içerisinde sürekli olarak büyüyecek ve güncellenecektir. Bu sebeple ileride bir içerik listesi de eklenecektir.

2.2 ELEKTRİKSEL GÜÇ KAYNAKLARI

Zaman uzayında ele alındığında iki çeşit elektriksel işaret bulunmaktadır. Alternatif işaret ve doğru işaret. Hemen herkes günlük hayatta bu kavramları Alternatif Akım (AC) ve Doğru Akım (DC) formatında duymuştur. Özünde akım, elektron hareketiyle, elektronların hareketinin tersi yönde oluşan bir olaydır. Bu olayın oluşabilmesi için elektronları hareket ettirecek bir kuvvet gereklidir. Bu kuvvet ise potansiyel fark ya da gerilim olarak adlandırılır.Neticede eğer potansiyel farkın uygulandığı cisim bir direnç ise, direncin uçlarındaki potansiyel fark ile direncin üzerinden akan akım aynı cinstedir, yalnızca direnç oranında ölçeklenmiştir. Yani direnç üzerinde alternatif gerilim uygularsanız alternatif akım elde edersiniz. Doğru gerilim uygularsanız, doğru akım elde edersiniz. Bu nedenle aksi belirtilmediği sürece şimdilik alternatif akım dendiğinde aklınıza alternatif gerilim kaynağı gelmesinde bir sakınca bulunmamaktadır. Akım da gerilim de birer çeşit işarettir. Gerilimin birimi Volt(V), akımın birimi Amper(A)’dir.

Alternatif gerilim kaynağına örnek olarak evlerdeki prizler verilebilir. Doğru gerilim kaynaklarına örnek olarak ise bataryalar/piller verilebilir.

alternatif/dogru işaret

Resim 2.2.1

Alternatif işaretten başlayalım. Alternatif işaret, değeri zamanla periyodik olarak değişen ve bir periyot boyunca ortalaması sıfır olan işarettir. Aksi belirtilmediği sürece işaretin şekli sinüsoidal’dir. Buna göre alternatif işaret iki parametre ile tarif edilebilir: genlik ve frekans. Genlik işaretin uçtan uca büyüklüğüdür. Frekans ise, işaretin tekrarlanma süresinin çarpmaya göre tersidir. Ortalaması sıfır olmasına rağmen alternatif gerilim, bir efektif değere sahiptir. Bu değer genlik değerinin  (1/√2) katı kadardır. Evlerimizde prizlerdeki işaret alternatif işarettir. Prizlerdeki gerilimin efektif değeri 220V, genlik değeri 310V, frekansı ise 50Hz olmaktadır. Akımın pozitif ya da negatif olması yalnızca akımın yönünü belirler. Buradan anlaşıldığı üzere alternatif akım sürekli yön değiştirmektedir. Bu nedenle adına alternating (salınan) akım denilmiştir.

Doğru akım idealde zamanla değişmez. Pratikte bu bir pil için konuşursak asla bitmeyen, gerilimi hiç düşmeyen bir pile tekabül ediyor 🙂 Esasında doğru akım, periyodik olmayan, yönü zamanla değişmeyen akımdır. Yani aslında zamanla biraz azalmasında tanımsal açıdan bir problem yoktur. Malumunuz pilin bir pozitif(+) ucu bir de negatif(-) ucu vardır ve bu ikisinin arasındaki potansiyel fark, pile bir yük(direnç) bağlandığında akıma dönüşür. Pilin negatif ucu genelde sıfır volt referansı olarak alınır. Piller farklı gerilim değerlerinde olabilir. Çok kullanılan piller 1.5V, 9V, 12V seviyelerindeki pillerdir. Pillerin bir yük kapasitesi vardır. Bu da zaman içerisinde akıtabilecekleri maksimum akımı sınırlar. Bu nedenle Ohm kanununa göre 9V’luk bir alkaline pile 0.01 Ohm’luk direnç bağlayıp 900A akım çekebileceğinizi ummayın.  Çoğunlukla 9V’luk pillerin azami akımı 500mA olmaktadır. Ancak pilleri paralel bağlayarak akımı artırmak (gerilim sabit kalır), seri bağlayarak da gerilimi artırmak (akım sabit kalır) mümkündür.

!!! Paralel bağlanacak pillerin gerilimleri aynı olmalıdır yoksa piller birbirini bitirir/bozulur.

Gerilim, fark ölçeğinde bir büyüklüktür. Yani bir referanstan ne kadar fazla olduğu anlamlıdır. Örneğin bir pilin bir ucunda toprağa göre 1010V diğer ucunda ise toprağa göre 1015V varsa o pil aslında 5V’luk bir pildir çünkü potansiyel farkı 1015-1000 = 5V olmaktadır. Akım ve gerilim arasındaki en temel ilişki Maxwell denklemlerinden gelir. Bir takım idealleştirmeler neticesinde ise Ohm kanununa ulaşılır.

Ohm kanunu:

V= I.R

Yani R direncine sahip bir maddenin iki ucuna V potansiyel farkı uygulanırsa bu maddenin üzerinden I kadar akım akar. Örneğin 12 V’luk bir pilin iki ucu 10 Ohm’luk bir dirence bağlanırsa bu direncin üzerinden 1.2 A akım akar.

Çoğunlukla basit elektronik devreler doğru akım ile çalışır. Hatta prize takılan elektronik devrelerde bile çoğunlukla önce işaret doğru işarete çevirilir, ardından devre yine bu doğru akım/gerilim kaynağı ile beslenir/sürülür.

2.3 DEVRE

Bir devre, elektrik akımın üzerinden akabileceği kapalı bir çevrimi ifade eder. Örneğin kumandaya ya da oyuncak arabaya taktığınız pilin, cihazı çalıştırabilmesi için pilin iki ucu arasında kesintisiz bir hat olması gerekmektedir. Bu da kapalı devreyi yani kısaca devreyi ifade eder. Eğer bu hat bir şekilde kesilirse, yani kapalı çevrim oluşmuyorsa bu, açık devre olarak adlandırılır. Açık devre, sonsuz direnci temsil eder. Bu nedenle açık devrede akım oluşmaz. (R/(sonsuz) = sıfır) Bu nedenle bir pil, bir cihaza (kapalı devreye) takılmadığında idealde bitmez. Çünkü akan akım sıfır kabul edilir.

Gerçekte havanın iyonize olması sebebiyle çok çok küçük bir miktar sızıntı akımı oluşur. Bu da pili çok yavaşça bitirir. Yine zamanla pildeki kimyasalların  özelliğini bitirmesiyle de pil çok çok küçük miktarda azalır. Ancak bunlar ihmal edilecek kadar azdır.

Kısa devre: Bir kaynağın (+) ve  (-) uçları, yeterli bir direnç olmaksızın doğrudan bir araya gelirse kısa devre oluşur. Bu durumun oluşmamasına dikkat edilmelidir. Kısa devre hem güç kaynağının hem de devrenin diğer elemanlarının bozulmasına yol açabilir. 

Elektrik akımının elektronların hareketiyle oluştuğunu belirtmiştik. Elektronlar her zaman en düşük dirençle toprağa yani devrenin referansına varmayı isterler. Bunun sebebi oldukça basittir. Kendilerini engelleyen kuvvet olan direncin az olduğu yerden daha çok elektronun geçmesi akla son derece yatkındır.  Eğer devrede bir kısa devre var ise, elektronlar o yolu tercih edecek ve diğer kısımlardan akım akmayacaktır.

Devreye switch yani anahtar koymak devreye bir direnç eklemez. Switch kapalı olduğuna açık devre oluşturur. Kapatıldığında ise kısa devre oluşturur. Dolayısıyla bir kaynağa yalnızca switch bağlanmaz. Devre üzerindeki seri hatta en azından bir direnç elemanı bulunmak zorundadır.

Bir DC motor, bir DC gerilim kaynağına bağlandığında motor üzerinden akım akmaya başlar ve motor döner.

motor_devre

Resim 2.3.1

Buradan motorun bir çeşit iç direnç barındırdığı sonucuna varılabilir. Motorun elektriksel modeli bundan daha karmaşık bir yapıdadır ancak şimdilik basit düşünmekten bir zarar gelmeyecektir.

Bir motorun genel geçer matematiksel modeli bir yana dursun, motorlar çeşit çeşittir ve farklı fiziksel/elektriksel özelliklere sahiptir. Resimde gördüğünüz motor, 6V’luk bir motordur ve bu 6V’luk bir potansiyel farkın motoru hareket ettirmek için yeterli olduğunu anlatmaktadır.

2.3.1 SERİ BAĞLANTI ve PARALEL BAĞLANTI

İki şeyi birbirine bağlamanın iki yolu vardır ve bu yollar seri ve paralel bağlantı olarak adlandırılır. Örneğin karşılıklı el ele tutuşan iki sevgili birbirine paralel bağlıdır. Halaydaki kişiler ise birbirine seri bağlıdır. Aynı bağlantı mantalitesi devre elemanları için de aynen geçerlidir. Ancak bu bağlantılar neticesinde elemanların davranışları iyi bilinmelidir. Besleme kaynakları seri bağlandığında ve paralel bağlandığında neler olduğunu anlatmıştık. Bir devrede bir seri kol üzerinden akan akım tüm elemanlar için aynıdır. Paralel kolların ise iki ucu arasındaki potansiyel fark aynıdır. Bu bilgiler ölçüm ve hata bulmak için çok önemlidir. Her bir elamanın seri ve paralel bağlantıda nasıl davranış gösterdiğine ilerideki bölümde değineceğiz. Öyleyse yeri gelmişken devre elemanlarına geçelim.

2.3.2 TEMEL DEVRE ELEMANLARI

 

basic_components

Resim 2.3.2.1

Temel anlamda devre tasarımı yapabilmek ya da mevcut devrelerin işlevlerini anlayabilmek için temel devre elemanları hakkında fikir sahibi olmak gerekmektedir. Bu temel devre elemanları çok basit modellere sahip olsalar da bir çok elektronik devrenin temelini oluştururlar. Bu devre elemanlarının işlevlerini ve davranışlarını öğrendiğinizde önemli miktarda yol katetmiş olacaksınız. Bu elemanları sırayla kısaca işleyeceğiz.

2.3.2.1 DİRENÇ

Adından da anlaşılabileceği üzere direnç devrede, potansiyel fark altındaki elektronların hareketine yani akımına karşı duran, onu azaltan elemandır. Devrede sembolik olarak testere dişi şeklinde çizgilerle ifade edilir. Bir örneği Resim 2.3.2.1.1’de görebilirsiniz.

res

Resim 2.3.2.1.1

Direncin üzerindeki renkler direncin değeri ve hata marjı hakkında bilgi vermektedir. Bir direncin değeri Ohm ve katları cinsinden ifade edilir. Örneğin Resim 2.3.2.1.1’deki direnç 47000 Ohm değerinde olduğundan 47K Ohm olarak belirtilmiştir.

Dirençler için bir diğer önemli parametre ise direncin dayanabileceği azami güçtür. Güç, gerilim ile akımın çarpımı ile ifade edilebilmektedir. Buna göre:

P=V.I= I.R.I = I²R [Watt]

Tıpkı Resim 2.3.2.1.1’deki gibi, düşük güçlü devrelerde kullanılan dirençler 0.25 Watt’lık yani çeyrek Watt’lık bir azami güce dayanabilmektedir. Bu değer düşük güçlü devreler için yeterlidir. Gömülü sistemlerdeki uygulamaların çok büyük bir kısmında bu tip dirençler yeterli olmaktadır.

Direncin değerini soldan sağa doğru (sağda altın rengi ya da gümüş rengi kalacak şekilde) okuyabilirsiniz. İlk iki renk direnç değerini ifade ederken, üçüncü değer 10^(çarpan) değerini ifade eder. Dördüncüsü yani altın renkli olan ise direncin toleransını yani hata yüzdesini ifade eder. Hata yüzdesi %5 olan 2K Ohm’luk bir direnç ölçüldüğünde 1.9K ile 2.1K arası bir değer görülebilir.1K Ohm = 1,000 Ohm olmaktadır, benzer şekilde 1M ohm 1,000,000 Ohm olmaktadır. Direnç renk kodları ile ilgili tablo Resim 2.3.2.1.2’de yer almaktadır.

Direnç-Renk-Kodları1

Resim 2.3.2.1.2

Ya da bu hesapları el ile yapmak yerine direnç renk kod hesaplayıcı herhangi bir program kullanmak mümkündür. Bu tür programların bir örneğine ve renk kodlarıyla ilgili daha fazla bilgiye buradan ulaşabilirsiniz.

Farklı direnç çeşitleri de bulunmaktadır. Örneğin direnç değeri mekanik olarak ayarlanabilen potansiyometre, ya da direnç değeri sıcaklıkla değişen PTC, NTC gibi elemanlar bulunmaktadır.

2.3.2.2 KONDANSATÖR / KAPASİTÖR

Kondansatör, iki ucuna yeterli bir potansiyel fark uygulandığında  elektriksel yükü depolar. Daha kondansatörü besleyen gerilim kaldırıldığında, kondansatör bağlı olduğu kapalı devreyi üzerinde biriktirdiği yük ile bir süre besler. Kondansatör’ün yani devredeki kapasite elemanının asıl davranışını anlamak için esasen onun matematiksel modeline bakmak gerekir. Ancak yazı dizisinin bu kısmı, fikir verme amacı güddüğünden bu yazıda matematiksel detaylara inilmeyecektir.

Kapasite değeri Farad cinsinden ölçülür. Ancak ölçek olarak Farad çok büyük bir değerdir. Bu sebeple kapasite değeri genelde picoFarad(pF), nanoFarad (nF), microFarad(uF), ya da miliFarad(mF) olarak ölçülür. Bu büyüklükler metrik sistem cinsinden ifadelerdir ve metrik birim tablosu aşağıdaki gibidir ulaşabilirsiniz.

Birim Sembol Çarpan
tera T 1000000000000
giga G 1000000000
mega M 1000000
kilo k 1000
hecto h 100
deca da 10
(none) (none) 1
deci d 0.1
centi c 0.01
milli m 0.001
micro μ 0.000001
nano n 0.000000001
pico p 0.000000000001

Farklı farklı kondansatör çeşitleri bulunabilmektedir. Ancak en çok kullanılan kondansatör çeşitleri seramik (kutupsuz) ve elektrolitik (kutuplu) kondansatörlerdir. Seramik kondansatörler minik bir bonibondan çıkan iki tel şeklindedir. Elektrolitik kondansatörler ise silindirik bir tüpün içinden çıkan iki tel şeklindedir. Bu iki elemanın kutuplu/kutupsuz oluşundan dolayı devredeki sembolü de farklıdır. Söz konusu kapasiteler ve sembolleri Resim 2.3.2.2.1’de yer almaktadır.

capjpg

Resim 2.3.2.2.1

Elektrolitik kapasiteler polarizedir, yani (-) uçları toprak referansına bağlanmalıdır. Bu aslında şunu ifade etmektedir, elektrolitik kapasitelerin (+) ucundaki potansiyel dark (-) ucundaki potansiyel farktan küçük olmamalıdır. Aksi durumda eleman beklendiği gibi çalışmaz ya da bozulabilir. Seramik kapasitelerin ise hangi yönde bağlandığının bir önemi yoktur. Bu durum elemanların sembollerine de yansımıştır.

Kondansatörler devreye seri bağlandıklarında DC işaretleri geçirmezler. Yani DC işaretler için sonsuz bir direnç elemanı gibi, yani açık devre gibi davranırlar. Kapasite, üzerine uygulanan gerilimin değiştiği durumda bu gerilim değişimine karşı durur ve üzerindeki yükü ters istikamette akım olarak basar. Bu da aslında bir nevi filtre davranışıdır. Kapasite bi devrede paralel bağlandığında, paralelindeki kolu ani gerilim değişimlerinden korur. Ani bir gerilim değişimi olduğunda kapasite üzerinden bu artışın sebep olduğu yük boşaltılır ve artış yumuşatılır. Bu sebeple kapasiteler genelde gerilimi filtrelemek amacıyla, temel devrelerde kullanılır. Kapasitenin alternatif işaret davranışı ise daha sonra işlenecektir. Çoğu tasarımda AC işaret söz konusu olmamaktadır.

2.3.2.3 DİYOT

Diyotlar, elektrik akımının tek bir yönden geçmesine izin veren kutuplu elemanlardır. Elektrik akımının yanlış yöne gitmesinin engellenmek istendiği uygulamalar için oldukça kullanışlıdır.

Diyot üzerine doğru yönde yeterli bir potansiyel fark uygulandığında (genelde > 0.7V) diyot üzerinden akım akmaya başlar. Ancak unutmamak gerekir ki diyot işlevini yerine getirirken bir miktar güç tüketir ve yapısı gereği üzerinde sabit bir gerilim oluştuğundan gerilim düşümüne yol açar. Örneğin 5V’luk bir pile seri olarak bir diyot ve bir direnç bağlanırsa, diyot üzerinde 0.7V gerilim düşümü olacağından direnç üzerindeki gerilim 4.3V olacaktır. Bu bilgi diğer diyot çeşitleri için de geçerlidir yalnız diyotun çeşidine göre eşik gerilimi (örnekte 0.7V idi) değişmektedir. LED’de bir diyot çeşididir. (Light Emmiting Diode)

Örnek diyod resmini ve devre şemasını Resim 2.3.2.3.1’de bulabilirsiniz.

 

Resim 2.3.2.2.1

Resim 2.3.2.3.1

Diyot’un sonuda görünen gri halka, diyotun (-) referasa bağlanması gereken ucunu ifade etmektedir. Bu pine katot denir. Diğer pin ise (+) referansa bağlanacak olan anot’tur.

Bir diyotun kodu, genelde üzerinde yazılı olarak bulunmaktadır. Bu kodu üreticinin web sayfasında arayarak diyot ile ilgili parametrelere ulaşmak mümkündür. Örnek bir diyot olarak 1N4001’i inceleyebilirsiniz.

Önceden de belirttiğimiz üzere LED de bir diyot çeşididir. Ancak led üzerine yeterli gerilim uygulandığında LED ışık saçmaktadır. Farklı renkte ışık saçan LED’ler bulunabilmektedir. Yine farklı ışık şiddetleri sağlayan LED’ler de bulunmaktadır. LED

2.3.2.4 Transistör

Transistörler günümüz elektroniğinin en temel yapı taşı durumundadır. Bunun sebebi transistör’ün anahtarlama ya da kuvvetlendirme elemanı olarak kullanılabilmesidir. Bu yazıda bipolar jonksiyonlu transistör (BJT) bahsedilecektir.

Bir transistör baz(base) pinine uygulanan küçük miktardaki elektrik akımını alıp kuvvetlendirerek daha büyük bir akımı kolektör(collector) ve emetör (emitter) uçları arasından geçiren bir elemandır. Bu şekilde transistör bir nevi akım musluğu gibi çalışır. Baz ucu musluk gibidir ve baz ucundan ne kadar fazla akım geçirirseniz, kolektör-emetör arası direnç o kadar düşer ve buna bağlı olarak kolektör-emetör hattından o denli fazla akım geçer. Resim 2.3.2.4.1’de transistörleri ve devredeki sembollerini görebilirsiniz.

İki çeşit BJT transistör bulunmaktadır; bunlar NPN ve PNP’dir. Bu transistörler kolektör ve emetör arasındaki polarite bakımından zıt polaritededir. Transistörlere detaylı olarak ileride değinilecektir. Ancak temel anlamda bazdan akım basarak anahtarlamak için NPN, akım çekerek anahtarlama yapnak için PNP kullanılır. NPN’de elektrik akımı kolektörden emetöre doğru akar.PNP’de ise elektrik akımı emetörden kolektöre doğru akar.

 

Resim 2.3.2.4.1

Resim 2.3.2.4.1

Transistör, çalışabilmek için bir güce ihtiyaç duyar ve neticesinde girişindeki işareti kuvvetlendirir.Bu sebeple transistör bir aktif devre elemanı olarak adlandırılır.

Transistör seçilirken baz akımı, maximum CE (Collector-Emitter) akımı, maksimum güç gibi bir çok parametre incelenir. Bu parametreler spesifik olarak ürünün datasheet’inde yer almaktadır. Örnek bir datasheet olarak BC548’i inceleyebilirsiniz.

2.3.2.5 Entegre Devreler (Integrated Circuits – ICs)

Bir entegre devre, bir çok eleman ile küçük bir alanda gerçeklenen ve özel bir fonksiyonu gerçekleştiren elemandır. Bu tür elemanlar bir fonksiyonu gerçekleştiren devrelerin bir blok olarak küçük paketlere yerleştirilmesi amacı ile yapılır ve genelde içeriğinde transistör, diyot, direnç gibi elemanlar içerir.

Entegre devreler, görece basit yapılardan başlamak üzere, çok kompleks yapılara kadar uzanan bir aileyi tanımlar. Örneğin LM555 entegresi basit bir bir entegredir ve kare dalga üretmek için kullanılır. Öteyandan STM32F403 entegresi bir mikrodenetleyicidir ve oldukça kompleks işlevler barındırır.

Tıpkı transistörlerde olduğu gibi, entegreleri de kullanabilmek için datahseet’leri okumak gerekmektedir. Datahseet’lerde entegrenin fonksiyonu ve karakteristiklerinin yanı sıra her bir pinin de işlevleri detaylıca açıklanmaktadır. Çoğu entegrenin datasheet’inde örnek bir kullanım şeması da verilmektedir. Bu sayede gerçekleştirilmek istnen işlevin referans tasarımı aynen kullanılabilmekte ve tasarım hızı çok artmaktadır. 555 entegresinin resmi Resim 2.3.2.5.1’de yer almaktadır.

555

Resim 2.3.2.5.1

3. Basit Bir Devre

Çok basit bir devre ile şu ana kadar gördüğümüz temel elemanların bir kaçını kullanarak tasarım yapalım. Bu basit devrenin şeması ve breadboard üzerinde gerçeklenmiş hali Resim 3.1 ve 3.2’de yer almaktadır.

 

Resim 3.1

Resim 3.1

Devre 2

Resim 3.2

Şematiği incelediğimizde 1K Ohm’luk çeyrek watt’lık bir direncin, bir kırmızı LED’in, bir anahtarın (switch), 9V’luk bir pile seri şekilde bağlandığını görürüz. Devre gerçeklendiğinde anahtar yardımı ile LED’i açık kapatmak mümkün olmaktadır.

Devrenin açık olduğu durumda LED’in üzerinden 8-9 mA akım geçmesi istenmiştir. Bu sebeple LED üzerindeki gerilim düşümü de hesaplandığında Ohm kanununa göre devrenin akım gerilim ilişkisi aşağıdaki gibi olur.

V = I.R

VBatt – VLed = I . R

9V – 1V = 8mA. R

R = 1000 Ohm

Breadboard bağlantı şekli bilmeyenler için karışık gelebilir. Breadboard kullanımı için sizi Mertcan Cibooğlu’nun hazırladığı SUNUM’a yönlendiriyorum.

NOT: Bu yazıda Instructables içeriklerinden yararlanılmıştır.

Gömülü Sistemler -01- Giriş:4N

NE DİYORUM?

Gömülü sistemler konusunda 8 yıldır edindiğim tecrübelerimi, sistematik şekilde bir yazı dizisine döksem de konuyla ilgilenen kimseler, ihtiyaç durumunda faydalansa diye düşündüm. Hatta belki aramızda bir sinerji oluşsa, insanlar da yaptıklarını paylaşsa, yeni bir kaç kişi bu konuları sevse, onlar da uzmanlıklarını paylaşsa filan diyorum. Çok zor değil gibi geldi 🙂

NEDEN Kİ?

Malumunuz tanıyanlar bilir ben işimi çok severim. İş demişken aslında bilinmeyene ulaşmayı, araştırmayı, öğrenmeyi çok severim. Bütün bu teknik sevgi uzayında ise gömülü sistemler en çok keyif aldığım alt-uzay olmuştur. Uzunca bir zamandır bir çok arkadaşım da beni gömülü sistemler konusundaki bilgilerimi yazmam konusunda teşvik ediyordu ve nihayetinde gün geldi çattı. Çok da kısa olmayan bir düşünme sürecinin ardından yazı dizisinin şeklini şemailini de az çok kararlaştırmış bulundum. Neticede yazı dizisi Türkçe olacak çünkü, hedef kitlem ülkemizde bu konularla uğraşmak isteyen arkadaşlar. Çünkü bilginin hayata dokunduğu, hatta hayatı yumrukladığı onu şekillendirdiği, yönettiği bir alan gömülü sistemler. Dolayısıyla bir güç unsuru. Bilginin gücünün giderek arttığı gelecekte, daha güzel bir ülkede yaşamamıza minik de olsa bir katkı sağlayabilmek bence fazlasıyla büyük bir motivasyon. İşte bu yüzden gömülü sistemler diyerek bu kısmı sonlandırıyorum.

NASIL OLACAK?

Nasıl kısmı hakikaten zor, çünkü gömülü sistemler malumunuz deniz derya misali çok geniş. Alakalı alakasız hemen her şeyi gömülü sistemler üzerinde gerçekleştirmek mümkün. Ne demek istiyorum; misal görüntü işleme, ya da gui/ui tasarımı, ya da kriptografi… Bunlar bambaşka alanlar gibi görünse de kolları sıvayıp işin içine girince, gün geliyor bir projenizde gömülü sistem tasarımınızın içine giriveriyorlar. Bu bir bakımdan zor bir olay çünkü söz konusu bilgi uzayı korku hatta umutsuzluk verecek şekilde büyüyor. Öte yandan sonsuz büyük bir özgürlükler dünyasının kapıları aralanıyor. Temeli sağlam kurduktan sonra, gömülü sistemler kisvesi altında hemen her konuya değinmek mümkün. Yani hareket alanı çok geniş 🙂 İşte bu analizde nasıl sorusunun cevabını veriyor. Önce temel kısımları anlatmaya çalışacağım, ardından da uzmanlıklarımı ve deneyimlerimi aynı çatı altında paylaşmaya çalışacağım. Yani burası çok farklı tadlar içeren bir yer olsun, insanlar okurken de sıkılmasın istiyorum. Bence her yazı biraz muhabbet gibi, bu tadı yitirmeden bildiklerimizi paylaşalım istiyorum. Umuyorum ki bu hedeflere ulaşabilirim.Yine de az laf çok iş tabi 🙂

NE LAZIM?

Her şeyden önce istek, sonra sabır, sonra motivasyon. Hiç bir şey sihirli değneklerle olmuyor. Tabi her şeyi olduran bir sihirli değneğe sahip biri varsa da biz bilmiyorsak onu bilemem. Öğrenme eğrisi ve bilgi bariyeri malumunuz. Öğrenme zaten başlı başına zor ve yorucu bir yolculuk. Lakin öğrenmenin tadına varan da bir daha o tadı bırakamıyor. Velhasılkelam önce istemek gerek. Ardından gömülü sistemlere özgü iki alt-yapı gerekiyor.  Bunlardan birisi temel anlamda bir elektronik/donanım altyapısı.Diğeri ise ciddi bir yazılım altyapısı. Gömülü sistem tabiri temel anlamda yazılım ve donanımın birleşimi olduğundan bu temel unsurların sağlam olmasında büyük faydalar var. Şahsi fikrim, gömülü sistem tasarımındaki yazılımsal mücadele(challenge) unsurlarının donanım kısmından çok daha fazla olduğu yönünde. Bu sebepledir ki ağırlıklı olarak o kısımlara değinmeyi planlıyorum. Peki dönelim baştaki kısıma, biraz donanım bilgisi biraz da yazılım temeli hakikaten lazım.

 

Şimdi devam…