Gömülü C – 2 : Gömülü C’ye Giriş : Merhaba dünya

Yol haritamız malumunuz, karanlıkta klavuzumuz. Efendim ne diyor harita, sanatsal programlama pratikleri diyor. Peki nerden başlayacağız? C dilinden başlayacağız. C dili ile ilgili bir çok yorum yapılır;  orta seviye bir dil,  hem makinaya, hem insana yakın gibi… Hepsi geyik muhabbeti! Şu yıllarda, C dili hala varsa ve hala bu kadar popülerse bunun sebebi dilin gömülü sistemlerle olan şahane uyumudur. Mevzuya aşkın bu penceresinden bakalım. Gömülü C, en nihayetinde özünde bildiğimiz C dili. O sebeple bu kısım aman aman gömülü yazılıma özgü değil, ama merhaba dünya kodunu gömülü sistemci kafasından pestil edeceğiz. Sıksak ne kadar suyu çıkar? Göreceğiz…

C dili malumunuz,  ISO/IEC 9899 standardları ile tanımlanmış bir ifade biçimi. Bir dil bir insan derler ya, o misal bir dil 🙂 Kendisi diller familyasında,”yapısal” diller sınıfında yer alıyor. Yani ne diyor? Benim tasarımım yapılar (struct, enum, union) üzerine dayanır diyor. Benimle konuşacaksan, yapılar üzerinden konuşsan sen karlı çıkarsın diyor. İyi de neymiş bu yapılar? Struct, enum, union dedin, de ne bunlar? Hemen döndük yol haritasına, ne yazıyordu bilinene referans ver kıymetliyi anlat. O zaman bu yazıyı okumadan önce C dilini bir yerden tanımış olmanız gerekiyor. Üç beş örnek kodu çalıştırmanız gerekiyor. Yani dostlar, dost acı söyler, struct, enum, union nedir bilmeniz gerekiyor ki sonraki adım olarak işin felsefesini konuşalım. Çok da tatava yapmayacağım, inanıyorum ki bilmeyen de gitti okudu öğrendi geldi. Bilmeyen ama öğrenmek isteyenleri de duyar gibiyim; iyi de kaynak önermedik? Kitap olarak: Deitel&Deitel. Online kaynak olsun ve Türkçe olsun: ahanda burada.  Online olsun İngilizce olsun eyvallah o da burada. Şimdi heyecanıma yenik düşüp hemen struct, enum, union dedim ama onlardan daha önce çok önemli sorular var. İbretlerle dolu “Merhaba Dünya” var. Ezber bozan Merhaba Dünya!

Yazdığınız kodları derlemek için program olarak, dev C++’ı, codeblocks’u, eclipse cdt’yi önerebilirim. Sadistseniz, komut satırından Gcc ile de derleme yapabilirsiniz, ki çok keyiflidir, bilen bilir. 🙂

Şimdi, bir C kitabının gittiği sıra ile mevzunun inceliklerini konuşacağız. Anlı şanlı, Sanatsal Gömülü C başlıyor!

SANATSAL GÖMÜLÜ C!

Yanlış Bildiklerimizi Bir Kenara Koyabilmek, Öğrenmeye Açık Olmak…

C diliyle yazılan en basit kod diye tanıtılan merhaba dünya kodu ile başlayalım. Dakika bir, gol bir olsun. Acaba bin defa gördüğümüz merhaba dünya kodundan ne kadar ibret çıkarabiliriz ki? Üç beş satır kod. E hadi bakalım, suyunu sıkacağız demiştik. Kodun suyunu sıkalım neler neler çıkacak, görelim 🙂

Şimdi bir kere, iş yapan, bir şey döndüren en basit C kodu bu mu? Merhaba dünya hakikaten temelin temeli mi? Hiç alakası yok. Ahanda size, Bahçeli’ye yardımcı iş yapan çok daha basit C kodu. Koda hiç bir şey eklemeye gerek yok, derleyicide aynen çalışır. Bir şey eksik diye düşünmeyin.

Ee ne farketti ki? Çok şey farketti. Bir kere <stdio.h> kütüphanesini kullanmadık. “Yahu o, olmazsa olmaz değil miydi ya?”. Hayır efendim değildi. <stdio.h> yalnızca adı üstünde standart giriş çıkış (i/o) işleri yapılacaksa kullanılır. Merhaba dünya kodunda printf fonksiyonu çağırıldığından elimiz kolumuz bağlandı, <stdio.h> kütüphanesini göreve çağırdık. Peki niye <> ile çağırdık, bazen “selam.h” gibi de çağırılıyor bunun hikmeti nedir? Derleyici, çağırılacak bazı header dosyalarının konumunu ezbere bilir. Derleyicinizin “include directories” ayarında bunları görebilirsiniz. Deleyicinin yerini ezbere bildiği, uzak yerlerde de bulunabilen headerlar #include <selam.h> şeklinde çağırılır. Eğer selam.h dosyası, bu header’ı çağırdığımız selam.c dosyası ile aynı dizinde(klasörde) ise onu #include “selam.h” ile çağırırız. Peki #include nasıl bişi? C dilinde “#” ile başlayan komutlar preprocessor komutları diye adlandırılır ve yalnızca derleme zamanında çalışır. Yani biz selam.c fonksiyonunda selam.h’ı include edince derleyici derleme esnasında gider _selam.c diye geçici bir dosya oluşturur, selam.h’da ne var ne yoksa gider selam.c’nin tepesine koyarak toplam içeriği _selam.c’de saklar.

İyi de int veri tipi var kodda, o nerden geliyor? Ahanda ibret detected, int veri tipi C dilinin standard tanımlamalarında bulunan bir veri tipi olduğunadan, derleyici adam olacak, onu kütüphane olmaksızın tanıyacak.

Ama main olmazsa olmaz dmi? Hiç alakası yok. En sevmediğim genellemelerden biri de budur. Ezberdir, kötüdür, kemdir. Örneğin ARM Cortex mimarisinde kod her zaman main’den değil ResetInterruptHandler’dan başlar. İnanmazsınız, bu platformda main, reset interrupt handler tarafından herhangi bir fonksiyon gibi çağırılır. Nasıl yani main demesek ecmain desek kod ecmain fonksiyonuna mı gidecek? Evet. Ne derseniz ona gider. Ama alışanları hayal kırıklığına uğratmamak adına yine yalandan bir main çağırılır. Hmmm. Belki bu birilerini şaşırtmıştır. Hemen aydınlanmış hissetmemek lazım çünkü mevzu biraz daha derin. Main fonksiyonu aslında linker dayının, kodun başlangıç noktası olarak adreslediği bir fonksiyon. Main her şeyin başlangıç noktası olsa, işletim sistemi nasıl çalışırdı 🙂 Siz kodu çalıştırmadan önce, onu çalıştıracak sistemin çalışması gerekiyor. Demişler ki “aga, biz bu dili bulduk, elemanlar da kod yazsın da nerden başlayacak olm bu kod?” Biri demiş ki “ilk satırdan başlasın işte”, öbürü demiş “yok aga ön bilgiler lazım bir sabit bir fonksiyon adı belirleyelim, derleyici gitsin en azından o fonksiyonu arasın onun adresini bulsun bizim işletim sistemi de gitsin programı da ordan başlatsın nasıl ama”? Ve akla yatmış tamam demişler. Biz bi linker yazsak, windows üzerinde çalışsa ne yazmamız gerekirdi? Window’s bunu nasıl çalıştırırdı? Mevzuyu anlamamızı sağlayan soru bu? C programı nasıl çalışır değil. Bu ters yönden hedefe varmamızı sağlayacak. Compiler gitti bizim dosyaları derledi biz de birleştirerek çalıştırılabilir hale getireceğiz. Ne yapacağız? Diyeceğiz ki; misal bizim program “bigbang” fonksiyonundan başlasın. Ben bir dil yazsam her şey bigbang ile başlardı çünkü. Neyse bizim c dosyalarında kullanılan sembolleri, başka dosyalarda da arayıp bulup birleştirdik. Adam düzgün yazdı diye varsayım yapıyoruz ki bigbang fonksiyonu da yazmış bir tane. Süper! İşletim sistemi ne yapacak? Gidecek bakacak; bu program ne kadar ram kullanacaksa, o kadar yeri ayıracak ayarlayacak. Sembollere adresler atayacak, kendi task scheduler’ının stack’ini filan ayarlayıp bizim programı “bigbang” fonksiyonunun bellekteki adresinden başlatacak. Sonra da malumunuz bizim merhaba dünya kodu çalışacak. Vay beee. Ne yolculuk görüyor musunuz? Bunun da öncesi var, bilgisayar nasıl ayağa kalkıyor filan? Ama onlar sonranın mevzusu. Almamız gereken ibret şu: main de neticede bir fonksiyon… Linker, bizim elemanların aldığı karar yüzünden onu arıyor. Arasın dursun madem. Şimdi ibretlere devam.

int main()” yazdık. Bu ne demek; “int main(void)” demek aslında ama biz kısa olsun diye öyle yazdık dmi? Değil. İkisi arasında ince bir fark var. Buna da geleceğiz ama, önce sırayla gidelim. Bir kere, fonksiyonu soldan sağa inceleyelim. int döndürmesi ne demek fonksiyonun? Şu demektir ki; fonksiyon bir makine gibi çalışırsa, işini bitirince bize bir sayı verecek demektir. İyi de bizim program çalıştı bitti 0(sıfır) döndürdü, bu 0(sıfır) kime, niye gitti, ne anlatmaya çalıştı? Burada main özel bir fonksiyon etiketi olduğundan verdiği mesaj işletim sistemine gider. Yani bizim Merhaba dünya, doğru düzgün çalışıp işini bitirirse, bir yerde takılmazsa işletim sistemine 0(sıfır) sayısını gönderir. Ama niye sıfır? Çünkü bir çok hata çıkabilir, ama programın hatasız tamamlanma ihtimali bir tanedir. Biz her bir hataya sıfırdan farklı bir sayı değeri atarsak, hatasızlığa da tek bir şekilde(tek bir sebeple) gerçekleşeceğinden sıfır değerini atarsak ne olur? Çiçek olur çiçek. Bizim programda diyelim bellek ayrılamadı… O hataya 1 desek, printf ekrana bir şey yazamadı; o hata 2 desek, başkasına 3 desek filan tüm hataları indeksleyebiliriz. Hata kodunun 0(sıfır) olması, hata yok demektir. O nedenle 0(sıfır) döndürülür. Hata kodu da sayı olacağından dolayı da main int döndürür, ki hakkıdır yapar.  Önceden main’in adı niye main onu anlatmıştık.Şimdi şu “()” vs “(void)” farkına gelelim. Bir fonksiyon parametre olarak “()” alıyorsa, bu şu demektir: sen parametre olarak ne verirsen ver ben sallamayacağım ve onu kullanmayacağım. “(void)” ise daha otoriter bir mesaj veriyor: sen parametre olarak bana bir şey veremezsin. Parametre olarak (void) alan bir “seviyorumDe(void)” fonksiyonu uydurun, çağırırken “seviyorumDe();” şeklinde çağırın derleyici hiç kızmaz. Ama “seviyorumDe(“Sevmiyorum”);”  şeklinde çağırırsanız derleyici size kızar. Sonra gidin fonksiyon tanımını  “seviyorumDe(void)” yerine “seviyorumDe()” olarak tanımlayın derleyici size hiç kızmaz. Ama fonksiyonun içinde “Sevmiyorum” argümanına doğrudan erişemezsiniz. Demek ki neymiş, bunun bile bir nedeni varmış. Bu bile aslında fonksiyonu çağıracak kişiyi yönlendiriyor, kısıtlıyormuş. Yeni ibret; ezber yok.

Dostlar, gördüğünüz gibi “hello world” kodu bile bize neler neler gösterdi. Ki mevzuyu kısa kestiğimizi de belirtmek isterim. printf’in nasıl çalıştığını da anlatmak isterdim, ama şimdi öyle yapsam burası çok uzun olacak, belki sıkılacaksınız. İleride yeri geldi mi ondaki ibretleri de anlatacağım 🙂 O zamana kadar sabırla okuyun olur mu? Bu daha başlangıç, mücadeleye devam!

Dosya uzantıları: Selam.c ve selam.h örneklerini anlatmıştım. C programlamada muhakkak kaynak dosyaları .c uzantılı, header dosyaları .h uzantılı olmalı dimi? Alakası yok. selam.h dosyasını gidin selam.ozkaya dosyası olarak adlandırın. Sonra selam.c’de gidin #include “selam.ozkaya” yazın ve cayır cayır çalıştığını görün. gcc kullanmayı bilen varsa selam.c’yi de selam.ozen diye adlandırıp derlemeyi deneyebilir 🙂 Peki niye .c ve .h diye adlandırıyoruz? Çünkü derleyici bir dosyayı açtığında uzantısından, ona yapacağı muameleyi otomatik anlayabilsin istiyoruz. Aynı dili konuşalım istiyoruz.

DİPNOT: Sırf değiştirebiliyoruz diye header işlevi gören bir dosyanın uzantısını adınız soyadınız yapıp milleti kanser etmeyin 🙂 İnsan okuyacak o kodu, insan 🙂

Yukarıdaki yorum satırı hakkında ne düşünüyorsunuz? Ben kendisini iğrenç buluyorum çünkü bir amaca hizmet etmiyor. Koda bakan herkes o kodun C dili ile yazılmış bir merhaba dünya kodu olduğunu anlayabilir. Böyle yorum satırı olmaz, hiç bir işe yaramaz, sadece kalabalık yapar. Gereksiz kalabalığı da Gömülü C’ci sevmez. Buradan yorum satırlarına karşı olduğumu çıkarmayın, yorum satırları da sanatsal şekilde kullanılabilir. Yeri gelince detaylı anlatacağım 🙂

Şimdi devam…

Önceki Sayfa   Sonraki Sayfa

Gömülü C – 1 : Gömülü Programlama Yol Haritası

YOL HARİTASI

Düşündüm yazının başlığını, daha güzel ifade edemedim. Bu yazıda, bu yazı dizisine ilişkin hayallerimi, yol haritasını anlatacağım ve umuyorum ki hepsi adım adım gerçekleşecek. Kararlılıkla, sabırla gerçekleşecek. Ve diliyorum ki  hayatımıza bir katkı sağlanabilecek. Eğer bu yol haritasını sonuna kadar okuduysanız, ama heyecanlanmadıysanız lütfen yazı dizisine devam etmeyin.

Önceki yazılarda gömülü sistemler için gerekli donanım altyapısını tahsis etmeye katkı sağlamaya çalışmıştım. Nihayetinde heyecanla beklediğim an geldi çattı 🙂 Yazı dizisinin bu bölümünde her yerde bulunabilecek bilgilere referans vererek, her yerde bulanamayacak bilgileri paylaşmaya çalışacağım. Paylaşırken de öyle sıkıcı şekilde değil de, sohbet muhabbet tadında paylaşmaya çalışacağım. Neyse şimdi laga-lugayı kısa kesip konuya gireyim 🙂

Malumunuz gömülü sistemler kısıtlı kaynaklı sistemler. Gel gelelim bu ifade artık, her durumda doğru bir ifade sayılmaz. Hakikaten bir çok görev için son derece “kısıtlı kaynaklı” olarak değerlendirilebilecek sistemlerin yanında bayağı bayağı “bol kaynaklı” gömülü sistemler de mevcut. Bir “gömülü webserver” yapmak için Microchip firmasının PIC16F84A mikrokontolörü çok kısıtlı kaynaklı kalabilir, öte yandan bu iş ARM Cortex A15 barındıran, doğru tasarlanmış bir gömülü sistem için genelde çocuk oyuncağının bir kaç mertebe altında bir iştir. Sözün özü, kısıtlı kaynak, spesifik bir görev için söz konusudur. Ancak yine de, rekabette var olabilmek için genelde bir işi olabilecek en ucuz ve en kaliteli şekilde yapmak, amaçtır. Bu da kaynakların kısıtlı kalmasına neden olur.

Kaynaklar kısıtlı olduğu gibi, zaman da çoğunlukla kısıtlıdır. Bu sebeple yazılan kodların son derece optimize, kolay anlaşılabilir, tekrar kullanılabilir, yani aslında “kaliteli” olması gerekmektedir. Efendim yazılım neye göre kaliteli olacak? Meselenin aslı ortaya kondu mu, cevap bulmak kolay olur demişler(N.E.). Cevap basit, “yazılım tasarımı kalitesi standartlarına” göre kaliteli olacak. Yani isim verecek olursak ISO/IEC-14598, ISO/IEC 250×0 standart serisine göre. Evet, sizi duyar gibiyim ve ben de aynı fikirdeyim ama var işte yazılım kalitesinin de standardı 🙂

Efendim neymiş bu standartlar? Standartlar mı yönetecek bizi? Hayır efendim, standartlar yönetmeyecek, standartlar tanımları yapacak, ortak dili belirleyecek sonra biz o ortak dilden konuşacağız ve yazılımlarımızın kalitesini ölçülebilir hale getireceğiz. İyi tamam, ama gömülü sistemler ne alaka? Gömülü sistemler, belki de kaliteli tasarıma en çok ihtiyaç duyulan yazılım tasarım ortamıdır. Zaten zaman kısıtlı, kaynaklar kısıtlı, işin içinde donanım olduğundan değişkenlerin sayısı çok fazla, ürün sürekli güncelleniyor gibi bir ton sebep, rekabette öne geçmek için tasarımın kaliteli olmasını zorunlu kılıyor. İyi de madem standard var, ben ne konuşuyorum? Dedim ya standardlar sadece ortak dili anlatıyor ve bazı ölçüm yöntemlerini belirliyor. İyi olana gitmek bize kalıyor. Dil ortak ama ne konuşacağımızı yine biz belirliyoruz.

Bu yazı dizisinde C dili, C++ dili anlatılmayacak. Deitel&Deitel’in kitabı o işi çok çok iyi yapıyor. Ancak bu yazı dizisinde onun yerine, sanatsal seviyede programlama pratikleri, gömülü sistemlere özel tasarım kalıpları, modelleme yöntemleri ve iyi programlama pratikleri anlatılacak. Bunların bir kısmının, benim bildiğim bir kaç düzine önemli kitaplarda dahi yer almadığını belirtmek isterim. Uzmanlar için bile faydalı olabilecek bir iki numaram olduğunu düşünüyorum 🙂 Peki nasıl olacak? Her şeyden önce sabırla, sebatla, ilim irfan aşkıyla, azimle olacak. Her zaman yaptığımız gibi, bitirememek üzere başladığımız 1632. iş olmayacak bu. Önce eğer C bilmiyorsanız, bir kaynaktan C öğreneceksiniz. Önerdiğim kaynak Deitel&Deitel’in kitabı. Ardından bu yazı dizisini okuduğunuzda hakikaten keyif alacaksınız. Gerçi bir dili bilmek iddiası fazla özgüvenlice bir iddia bence, her zaman birbirimizden öğrenecek şeylerimiz var o ayrı mevzu ama C dilini zaten biliyorsanız doğrudan yazılara devam edebilirsiniz. Böylelikle gömülü sistemler için çok net, taş gibi bir yazılım alt yapısı edinmiş olacaksınız. Zaten varsa da onu cilalamış olacaksınız. Yazıda C ile birlikte C++ konseptlerine de değineceğim.

Sonra ne olacak? Yazı dizisi nasıl devam edecek? Donanım bilgisi oluştu, yazılım bilgisi kültürü oluştu, sırada ne olacak. Sırada artık ellerin kirlenmesi var. Microchip firmasının 8 bitlik PIC mikrodenetleyicilerini programlama’yı ince detaylarla anlatacağım. Bu sayede küçük bir sistemde çalışmanın faydalarını,  temelleri ve detayları tertemiz görmeyi öğreneceğiz. Aynı zamanda basit sürücüler yazacağız, sensörleri ve komponentleri tanıyacağız. Ardından Atmel firmasının Atmega serisi ile analoji kuracağım, onu her şeyiyle kullanmayı da anlatacağım. Burada araya Arduino’nun iç yapısını, anlatılmayanlarını sıkıştıracağım, malum çoğunun içinde Atmega var. Sonra 16 bitlik bir mikrodenetleyici serisine geçeceğiz. Aynı zamanda bu ultra-low power bir seri olacak; Texas Instruments MSP430 serisi. Buradan hem 16-bit’lik bir mikrodenetleyici nasıl kullanılır, farkı nedir, low-power sistem tasarlamanın püf noktaları nedir onları da anlatacağım. Sonra geleceğiz ARM Cortex M3-M4 serisi işlemci barındıran 32-bit’lik mikrodenetleyicilere. Burada da STM32 ve LPC17 serisinden örnekler vereceğim. Hemen hemen aynı şeyler, ama aynılıkları farklılıkları bilmek bence önemli bir bilgi seti olacak. Aynı zamanda DMA gibi, EMC gibi yepyeni modülleri tanıyacağız. Bu sayede mikrokontolörlerin tüm çevresellerine hükümdar olacağız. TFT ekran, thermal printer, manyetik kart okuyucu, rf modem gibi cihazlar ile çalışacağız, sensörler kullanacağız. Seviye atlamış olacağız. Burada RTOS kullanmanın inceliklerine de değineceğim. Çok çok önemli bir bilgi seti RTOS. Ya sonra? Bitmedi mi bu mikrokontrolörler filan? Hayır efendim bitmedi. Çok çekirdekli sistemler nasıl programlanır onu anlatacağım. 64-bit’lik platformlara değineceğim. Malum son IPhone’larda 64 bitlik işlemciler var, neticede o da gömülü sistem. Ya sonra? Sonra 32-bit’e döneceğiz ama mikrobilgisayar seviyesindeki çekirdekleri inceleyeceğiz. Burada gömülü linux ile platform bazında kapanışı yapacağım. Kafama eserse VxWorks de yazabilirim ama elzem değil. En sonunda açık kaynaklı yazılımlarla çalışma, açık kaynak lisans tiplerine değineceğiz.

Burada yazı dizisi sonlanacak sanıyorsanız yanılırsınız. Neticesinde sadece gömülü sistem temeli tahsis edilmiş olacak. Ama öyle bir temel ki, üstüne artık ne kurarsan kur. Sonra her telden çalacağız, başına gömülü etiketi koyacağız. Ne demek istiyorum? Gömülü görüntü işleme yapacağız. Gömülü kontrol sistemi tasarlayacağız. Gömülü haberleşme tekniklerini ağlatacağız, havadan karadan giden gelen veriye hükmedeceğiz. Gömülü sistemlerde pastanın üstüne çilekler koyacağız, kriptopgrafi yapacağız. Sonra FPGA konuşuruz. Sonra PSOC konuşuruz. Ve daha nicesi 🙂

Bu yol uzun olacak, zaman alacak, fedakarlık isteyecek ama yol bu olacak. Her türlü öneriye açık olduğumu da belirtmek isterim. Ülkemizin, teknoloji üretiminde ileriye gitmesine, yani sizlere, hayatımıza bir nebze katkıda bulunabilirsem ne mutlu bana.

Şimdi devam.

Önceki Sayfa   Sonraki Sayfa

 

Gömülü Sistemler – 11 – Mikrodenetleyici I/O Modları

Mikrodenetleyicinin genel amaçlı giriş çıkış (general purpose input/output (GPIO)) pinleri, giriş çıkış bakımından farklı modlarda konfigure edilebilir. Giriş modları arasında pull-up, pull-down dirençleri, hysteresis, ya da benzeri kombinasyonlar söz konusu olabilir. Benzer şekilde çıkış modları push-pull, high-drive ya da open-drain olabilir.

gpio-output-types

Resim 1

ÖNEMLİ BİLGİ
Gömülü sistemler üzerinde çalışacak bir kişinin I/O modlarını mutlaka bilmesi gerekmektedir. 

Giriş Modları

GPIO giriş modları genellikle, yüksek empedans(high impedance, high-z), pull-up, pull-down ve tekrarlayıcı(repeater) olarak tasarlanır. Yine bazı mikrodenetleyiciler I/O arayüzlerinde histerizis (hysteresis) özelliği de barındırır ve bu sayede suni (bouncing gibi) durum değişiklikleri önlenir.

 

Pull Up/Down

Eğer bir giriş, dahili (mikrodenetleyicinin içindeki) pull-up modunda ise o pin içeride bir direnç ile lojik bir seviyesine çekilmiştir. Bu da şu demektir ki, o pin dışarıdan lojik sıfıra sürülene kadar, lojik 1 durumunda kalmaya devam edecektir. Tam tersi durum da pull-down için geçerlidir. Eğer bir giriş, dahili  pull-down modunda ise o pin içeride bir direnç ile lojik sıfır seviyesine çekilmiştir. Bu da şu demektir ki, o pin dışarıdan lojik bire sürülene kadar, lojik sıfır durumunda kalmaya devam edecektir.

Repeater: Bazı mikrokontrolörlerde bazı pinlerin durumu dinamik olarak pull-up ya da pull-down olarak değiştirilebilmektedir ve bunun için repeater mod kullanılır.

Floating, High Impedance, Tri-Stated

High Impedance: Bir giriş pini  yüksek empedans(high impedance, high-z) durumunda olduğunda pinin durumu, o pin lojik sıfıra ya da lojik bire bağlanana kadar bilinemez.

Floating: Yüksek empedans yapısındaki bir pin, lojik sıfıra ya da lojik bire bağlanmadıysa, pin floating (belirsiz, salınan) moddadır denir.

Tri-stated: Üç durumlu anlamındaki bu mod, floating ile aynı durum için kullanılır.

ÖNEMLİ BİLGİ
Mikrokontrolörün dışında herhangi bir yere bağlanmamış bir pinin floating durumda kalmasını önlemek için,mikrokontrolörün içerisindeki pull up/down dirençleri aktive edilir.  

Hysteresis

Bir pinin lojik sıfırda mı lojik birde mi olduğuna karar verebilmek için genelde bir eşik değeri kullanılır. Ancak bu eşik değeri bir aralık ifade etmediğinden eşik değerinin çok az üstü de lojik bir olur, epey üstü de lojik bir olur. Benzer şekilde eşik değerinin çok az altı da lojik sıfır olur, epey altı da lojik sıfır olur. Gerçek hayatta bu durum bouncing (sekme, salınma) problemini doğurur. Siz lojik birdeki bir pini lojik sıfıra çekerken pin eşik değerinin etrafında kararsız bir duruma girer ve ardışıl olarak 1,0,1,0,1,0 durumları görülür. Bunu önlemek için güvenli bir aralık belirlenmiştir.

Çıkış Modları

 

Push-Pull

Push-pull bir çıkış hem source hem de sink akımı akıtabilir. Bu da pin çıkışı sıfıra da çekilse, bire de çekilse o pin üzerinden akım akıtabilmeyi sağlar. TTL ve CMOS devreler push-pull çıkış kullanır.

Open-Drain

Resim 1’de “open-drain” yazan kısmı görebilirsiniz. Gerilimle sürülen bir transistör türü olan MOSFET’i tanıyanlar için “open-drain” kavramı zaten açıklamaya mahal gerek bırakmayacak kadar anlaşılırdır. Ancak MOSFET’i bilmeyenler için anlatmak gerekirse bir MOSFET üç pine sahiptir: gate(kapı, giriş), source (kaynak), drain(akaç). Open-drain durumda source toprağa bağlıdır,gate içeriden sürülmüş durumdadır ve drain açıktadır. Open-drain çıkış yalnızca sink akımı akıtabilir yani dışarıdan akım çekebilir. Dışarıya doğru akım basamaz. Esasen bu da iki durumda kalabilmesine imkan verir: düşük empedans ve yüksek empedans.

High Drive

High Drive (yüksek sürüşlü) pinler esasen yüksek akım verebilen push-pull pinlerdir. Normal bir push pull pin +/- 8mA akım akıtabilirken high drive pinler 40mA’e kadar akım akıtabilir. Ancak genelde elektriksel karakteristik datasheette belirtilir. Eğer pin ile doğrudan yüksek akım çeken elemanlar sürülecekse, pinin üst sınırına kadar akım çekecek cihazlar, ek bir devre olmasızın high drive pinler ile sürülebilirler.