Dijital GPIO pimlerinin çalışmasını anlamak ve simülasyon da görmek

Bu yazıda Arduino, PIC ve diğer Mikro denetleyici devrelerinde kullandığımız, (General-purpose input/output = GPIO ) Genel amaçlı giriş / çıkış portlarının çalışmasını anlamaya çalışacağız.

Öncelikle neden bunu anlayalım ki diyenleri aydınlatmalıyım. Bu tip entegrelerde GPIO pimleri birden fazla kullanımı olan pimlerdir. Her kullanım için arka planda Register ( Yazmaç ) sistemleri kullanılır. Bu register içeriğindeki bir bit ya da birkaç bit port pimine ait görevleri düzenleyecektir.


Yukarıdaki tablo PIC entegresinin, PORTB için registerlerini gösterir.
İlk satırdaki register içeriği, PORTB nin değerlerini gösterir.
2. Satırdaki register ise PORTB nin hangi bitinin giriş ya da çıkış olduğunu belirler.
3. Satırdaki register ise PORTB pull up direnci devreye alınıp alınmaması içindir.( Ve başka özellikler içindir)
Bazı entegrelerde Pull up devreye alma yoktur. Bundan dolayı bu tip entegrelerde kendimiz dışarıdan pull up direnci koyarız.

Şayet kütüphane kullanıyorsanız, bu tip register ayarlarını yapmanıza gerek yok. Arduinodaki gibi PINMODE komutunu kullanmakla, zaten portun giriş, çıkış olduğunu belirlemiş oluyorsunuz. Register’e sizin adınıza program tarafından yazılır.

Bu tip portlar Mosfetli ya da kontrollü buffer devreleri tarafından yapılabilir. Fakat şunu da unutmayalım bu kontroller register içeriklerine bağlıdır.

Videoda geniş anlatımını ve Proteus dosyası olarak çalışmasını göreceksiniz.

Şunu anlamamız lazım. Mikro denetleyiciler DATA+ CLOCK+ kontrol sinyallerinden oluşur. Bizler programlama yaparken DATA ları belirleriz gerekli yerlere yazarız. CLOCK için frekansı belirleriz. Hatta komutların işleneceği ve bazı işlerin yapılacağı saat palslarının aralıklarını da belirleriz. Program çalışmaya başladığında artık orkestra şefi mikro denetleyicidir. Bizim verdiğimiz verileri ve saat palslarını dikkate alarak, kontrol sinyallerini üreterek, işlem sırasına göre işlemleri yapar. Bunu program dahilinde yapacaktır. Kendisi bir şey katmaz. Fakat devamlı kontrol eder. Bazı zamanlar çakışma olur ve hemen mikro denetleyiciyi Resetler ya da bazı dış etkilere göre interrupt ( kesme) geldiyse, programın kesme ile ilgili yeri varsa oraya gider ve o işi bitirince kaldığı yere döner. Bütün bunlar artık mikro denetleyicinin kendi işidir.

Aşağıdaki 3 adet GPIO dizaynında ortak olanları bulmaya çalışalım.




Bu resimlerde ortak olan PULL UP direnci dediğimiz yerde, Mosfet kontrollü içeriden bağlı pull up kontrolü vardır. Ya da PULL DOWN da olabilir. ( pull down 1. resimde görünmektedir. Diğer entegrelerde yoktur. )


Bir diğeri ise Giriş ve çıkış için tek pim kullanılsa da Gelen ve giden bilgi yolları ayrı şekilde dizayn edilir ve mikro denetleyicinin kontrolündedir. ( Program dahilinde )
Bir diğeri ise D FF ( D Flip Flop ) devresidir. Bu devre kilit mekanizmasıdır.
Mesela program PORTA.1 bitini HIGH seviyeye çekti. D FF olmasaydı program HIGH seviyesine çektikten sonra orada beklemek zorundaydı. Çünkü O uca gönderdiği bilgi değiştiğinde çıkışta değişecekti.
D FF olduğunda D ucuna verdiği bilgi CLOCK palsı ile çıkışa yansır ve kilitlenir. Bu kilitlendikten sonra program diğer satıra geçse bile, bilgi değiştirilesiye kadar yeniden CLOCK palsı verilesiye kadar, çıkıştaki bilgi değişmeyecektir. D Flip Flop devresi program çalışmaya devam ederken çıkışın veya girişin sabit kalmasını sağlamaktadır.

Küçük 8 bacaklı bir mikro denetleyici entegre düşünün. Bu entegrede 5 tane GPIO var. Bu GPIO pimlerinde birden fazla görev var. Mesela bir pim hem giriş hem çıkış hem I2C haberleşme Hem SPI haberleşme hem de Seri haberleşmede kullanılabilir. O zaman bu pimi kontrol etmek için birçok kontrol işlemi yapılmalı. Bunun içinde o PORT’a ait birçok veri yolu ve kontrol yolu olmalı. Bu kadar yolun diğer port pimleri içinde olduğunu düşünürseniz, entegre içerisinde bir karmaşa olduğunu düşünebilirsiniz. Bu tip denetleyiciler de bir hiyerarşi olmalı.

Bunu bir örnek ile anlatmak istiyorum. Yıllar önce çalıştığım otomatik dizgi makinelerinde, CPU nun ( merkezi işlem birimi )  kontrol ettiği işleri yapan giriş çıkış kart sistemleri vardı. Bu sistem 50 adet kablo ile kontrol ediliyordu. Bunu sağlamak için 16 bitlik DATA kablosu, 16 bitlik Kontrol kablosu kullanılıyordu. Diğer kablolar ise besleme, clock, ve interrupt gibi kablolardı.
Sistem ikili kodlamaya göre çalışıyordu. Her kartın bir adresi vardı. Bu seri haberleşme I2C  sistemlerindeki gibi görünse de, adresler paralel sistem ile iletilirdi.
Öncelikle,16 bitlik bilgi DATA yoluna konulur. Sonrasında 16 bitlik kontrol bilgisi kontrol yoluna konulur ve bu kontrol bilgisini alan kart gelen bilginin kendisini ilgilendirdiğini anlar ve geri bildirim verir. Sonrasında yapılacak iş, bu haberleşilen karta gönderilmek üzere 16 bitlik bilgiyi ( komut ya da veri ) DATA yoluna koymaktır.
Sistem bu şekilde bir hiyerarşi içerisinde devamlı çalışmaktadır. Bu çalışma esnasında programın durumunu olumsuz etkileyen bir etki olduğunda koruma sistemleri devreye girer. INTERRUPT bilgisi iletilir ve interrupt durumunda yapılması gereken, gerekli işlemlere dönülür.

PORT pimlerine bakarken, sadece giriş çıkış pimi olarak değil de arkasında bir kontrol devresiyle, program dahilinde kontrol edebileceğimiz bir devre olarak bakmalısınız.
Bazen bu tip devreleri kendimiz tasarlamak zorunda kalabiliriz. Bizlerde bu tip devreleri anladığımızda benzerlerini kurabiliriz.

Buraya kadar bilginin kilitlenmesi gerektiğini düşündük. Fakat bu tip entegrelerde kontrol sinyalleri de oldukça fazla yer tutacak dedik. Bunun için ne gibi bir çözüm ya da simülasyon olabilir. Mesela yukarıda verdiğim örnekteki gibi ikili kodlama ile 4 bit kullanarak 16 bit bilgi elde edip bunları kontrol sinyallerinde kullanabiliriz. Mesela 16 bit ten ilk bit port pimini ÇIKIŞ olarak ayarlar. 2. Si GİRİŞ olarak ayarlar. 3. Diğer portu çıkış alarak ayarlar. Bunları yapabilmek için Merkezi kontrolün sadece 4 bitini bu iş için kullanabiliriz.

Şunu da unutmayalım. Mikro denetleyicileri üreten firmalar kendi çözümlerini bulmuşlardır. Biz GPIO çıkışlarını nasıl simüle ederiz dediğimizde, bu tip bir sistem olabilir diye fikir yürütüyoruz. Video da zaten gerçek simülasyonu görebileceksiniz. Bu size ileride yapacağınız devrelerde, bakış açınıza yardımcı olabilecektir.

Fakat şunu da söyleyebiliriz. Sadece GPIO portlarını incelediğimiz ( yukarıda resmi verilen ) 3 entegre de benzer sistemler kullanmışlar. Demek ki aklın yolu birmiş. Bizlerde bu tip bir GPIO tasarlamak istediğimizde, bu tip devrelerden faydalanarak gerçekleştirebiliriz. Tabii ki kendi mantığımız ve algoritmamızla uyumlu şekilde tasarlamamız gerek.

Bu anlatımın amacı, yeni tasarımlarınızda bu düşünce yoluyla, çıkıştan girişe doğru giderek devrenizi gerçekleştirebilmenizi göstermektir.
Devreler farklılaşabilir. Her zaman söylediğim gibi ALGORİTMA önemlidir. Nelere ihtiyacınız varsa bir mantık çerçevesinde oluşturmaya başlarsınız. İhtiyaç oldukça devreniz şekillenir. Bunun için zaten piyasa da bir çok entegre ve devre mevcuttur.

Devreleri anlamak, onları simüle etmeyi ve dizaynlarınızda kullanabilmeyi kolaylaştırır.

En önemlisi,
NASIL ÇALIŞIYOR?
BUNU NASIL VE NEREDE KULLANABİLİRİM?
BURADA NEDEN BU TİP BAĞLANTI KULLANILMIŞ?
BEN BU DEVREYİ NASIL SİMÜLE EDEBİLİRİM?

Gibi sorular sorarak devreleri anlamanız ve onları öncelikle kafanızda simüle edebilmeniz, sizin ilerlemenizi sağlayacaktır.

DİKKAT ETMEMİZ GEREKEN AKIMDIR. Her port piminden çekilecek bir akım miktarı vardır. Bu miktar datasheet denilen dokümanlardan öğrenilebilir.
Bunun yanı sıra daha önemli bir nokta vardır. Datasheet te port piminden 20mA çekeceğinizi öğrendiniz ve 16 port pimi var. O zaman tüm portlarda bir anda 20mA*16=320mA akım çekerseniz bu da devrenizi yakabilir. ( 2 farklı durum vardır. tüm Ledler yanık olarak beklenirse zarar verebilecek iken, tüm Ledler kısa zaman için yanıp söner pozisyonda olduğunda bu zarar vermeyebilir. Sebebi ise akımın ne kadar süre ile çekildiğidir. Bu süre önemlidir. Pik= kısa süreli çekilen akım, her zaman için devamlı çekilecek akımdan daha yüksektir. )
Bundan dolayı her port piminden maksimum çekilecek akımı görüp, bir de toplam çekilecek akımı da göz önünde bulundurmanız gerekir.
Bu tip bir durumdan dolayı LED gibi az akım çektiğini düşündüğünüz komponentlerde bile, toplam akıma riayet etmeniz lazım. Şayet motor gibi yüksek akım çeken cihaz bağlayacaksanız, bir transistör ya da mosfet ile sürmeniz yerinde olacaktır. Tabii ki tam izolasyon isterseniz Optokuplör entegrelerini de kullanmanız yerinde bir seçim olacaktır.

Datasheet lerde elektriksel bilgi tabloları vardır oradan faydalanabilirsiniz.


Yukarıdaki tabloda GPIO piminden çekilecek maksimum akım,
Maximum output current sourced by any I/O pin  25 mA görünüyor. Bu entegrede 16 port çıkışı mevcut. 25mA*16= 400mA eder. Yani teorikte tüm portlardan aynı anda 25mA akım çekmeniz ve bunu da devamlı çekmeniz durumunda  Aşağıda gösterilen toplam akımları aşmış olacaksınız ve entegreye zarar vermiş olacaksınız.
Maximum current out of VSS pin…………………………………300 mA
Maximum current into VDD pin……………………………………250 mA
Bununla birlikte buradaki ifade ise sadece GPIO ile çekebileceğiniz akımın maksimum değerini gösterecektir. Yani akım limiti daha da düşük durumda. Maksimum PORTA ve PORTB den toplam çekilecek akım:
Maximum current sourced by PORTA and PORTB…………200 mA

Bunlar bize gösteriyor ki. Düşük akımlı sistemlerde sorun çıkarmasa bile yüksek akım çeken port kullanımlarında bir Transistör, Mosfet ya da optokuplör kullanmalıyız.
Arduino kullananlar ATMEGA 328’in  datasheet’ini incelemeleri gerekmektedir.

Akım bilgilerinde önemli bir husus daha vardır. Bu da VSS den çekilecek akımdır. VDD den çekilecek akımdır. Bunlar da tabloda belirtilmiştir. Ayrıca DIP entegre ve SMD tipi entegre olmasına göre de Akım sınırlamaları değişebilmektedir. Hatta DIP entegrelerde 1 adet GND (Vss) bacağı varken, bazı SMD tiplerinde akımı karşılayabilmesi için 2 adet GND(Vss)(Vdd) pimi bulunabiliyor. Aşağıdaki resimde bu fark görünmektedir.


GPIO proteus 7.10 ile çizilmiş çalışan devre: Eski proteus ile çizildiğinden, yeni versiyonların tamamında sorunsuz açılacaktır. Proteus dosyasını açıp çalıştırarak ve 1, 0 lojik anahtarları kullanarak denemelerinizi yapabilirsiniz.


Not: Videoda 8. Dakikada bir yanlış söylem var. Bu söylemi şu şekilde algılayın.

Z empedans : Ne GND ne de VCC dir. Yüksek bir direnç gösterecektir.
GPIO da kullanılmasına göre bakarsak.
Alıntı: Bir hat yüksek empedans durumuna getirildiğinde, çıkış devreden etkin bir şekilde ayrılır. Bu, birden fazla devrenin veya aygıtın aynı çıkış hatlarını paylaşmasına izin verir ve genellikle iletişim veri yollarını uygulamak için kullanılır. Gerektiğinde yüksek empedanslı bir durumun kullanılmaması, IO çekişmesine ve kısa devrelere yol açar.

Ayrıca Ağız alışkanlığı var. Bazı terimleri İngilizce ve Türkçe kullanırken kelimelerin okunuşu değişik oluyor.
Mikrokontrolır diye söylediğim kelime biraz Türkçe biraz İngilizce birleşimi gibi oluyor.
Aslında Microcontroller = mikro kontrolcü = mikro denetleyici olarak algılayın.
Bir de bazen mikrokontrolcü desek de bazen de mikroişlemci diyoruz. Bu da yanlış bir söylemdir.
Zaman içerisinde bunları yanlış söylesek de hepimiz Mikrokontrolcü
(Mikro denetleyici) den bahsettiğimizi biliyoruz.

 Mikroişlemci ve Mikrodenetleyici arasındaki fark bu linkte anlatılmaktadır.:
https://www.guru99.com/difference-between-microprocessor-and-microcontroller.html#:~:text=Microprocessor%20consists%20of%20only%20a,all%20integrated%20into%20one%20chip.&text=Microprocessor%20uses%20an%20external%20bus,uses%20an%20internal%20controlling%20bus.

GPIO konusunda ayrıntılı yazılmış bir makale buradadır. (ingilizcedir) 

TÜM DOSYALARA BURADAN ULAŞABİLİRSİNİZ.  


Konu hakkında sorularınızı ya da düzeltmelerinizi buradan iletirseniz, bu yazıyı okuyan arkadaşlar sizlerin bilgilerinizi de görebilecektir. 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir