PIC mi AVR mi ? PIC ve AVR Mikrodenetleyicilerin Karşılaştırması

Gömülü sistem dünyasına hemen her giriş yapan aceminin yıllardır sorduğu soruya ayrıntılı ve tatmin edici bir cevap olarak bu makaleyi kaleme alıyorum. Normalde bu soru, uzmanlar tarafından kaale bile alınmayacak derecedeyken bir acemi için önemli bir nokta olabilir. Açıkcası benim böyle bir soruyu ciddiye almamın tek sebebi uzmanların tartışmaları değil acemilerin kafalarındaki sorunun açıklığa kavuşmasıdır. Ele aldığımız soru ise “AVR mi PIC mi?” ya da “AVR mi yoksa PIC mi öğrenmeliyim?” sorusudur.

Bu soruyu yıllar boyunca sürekli forumlarda ve tartışma guruplarında görmekteyim. Bu soruya çoğu kimse cevap olarak genellikle “PIC öğren” demektedir. Bunun sebebi kendileri PIC öğrenmiştir, kullanmaktadır ve memnundur hatta PIC’e bağlanmıştır ve o yüzden de “PIC öğren” demektedir. Ülkemizde AVR hakkında şu ana kadar yeterli kaynak olmadığı ve AVR mikrodenetleyicilerin PIC kadar göz önünde olmadığı için pek AVR bilen olmadığından “AVR öğren” diyen sayısının az olması gayet tabiidir. Fakat düz bir hükümle “PIC öğren” ya da “AVR öğren” demek bir uzmanın vereceği cevap değildir.

Fanboyluk da işin başka bir boyutudur. Teknolojide fanatik (fanboy) dediğimiz kitle sadece Android, Linux, Apple gibi platformlarla sınırlı kalmamıştır. Ne yazık ki geliştirici camiasında bile bir programlama diline veya bir donanıma aşırı bağlanmak ve onu sebepsizce savunmak olan fanboyluğu görebiliriz. Mikrodenetleyicilerde ise günümüzde bile PIC ve AVR fanboyluğu devam etmektedir. Bu fanboyluk konusunda AVR topluluğunun biraz daha önde olduğunu söyleyebiliriz. Son yıllarda bu fanboyluğa Arduino’nun da katılmasıyla iş başka bir boyut almıştır. “Arduinocu” dediğimiz Arduino’dan başka bir şey öğrenmeye gerek duymayan, Arduino ile her şeyi yapabileceğini sanan ve Arduino’ya söz söyletmeyen zararlı kitleleri fanboyluğun bir üst seviyesi olarak nitelendirebiliriz. Geliştirici olmak yolunda en büyük engellerden biri de bu marka ya da platform fanatikliğidir. Bu fanatikliğe sahip olan insanlar ne yazık ki bunu terk etmedikçe ilerleyemezler. Arduino fanatiği olan biri de bunu terk etmedikçe hazır projeleri, kütüphaneleri ve fonksiyonları kullanmaya mahkum olur ve ses getirecek bir iş yapamaz. Ne yazık ki bazı sözde eğitimciler pazarlamacı ağzıyla bu platformların eğitimini verdiğini iddia etmekte ve pazarlamacı ağzıyla çektikleri videoları Youtube gibi platformlarda yayınlamaktadır. Arduino konusunda bu kadar bilgisiz fanatiklerin olmasının en büyük sebebini bu tarz paylaşımlara bağlamaktayım.

AVR ve PIC konusuna dönersek iki mikrodenetleyicinin donanımına hakim olduğumuzu düşünmekteyiz. İki mikrodenetleyicinin donanımını C ile AVR Programlama, AVR Mimarisi ve PIC mimarisi gibi yazı dizilerimizde datasheetten faydalanarak size da açıklamıştık. Bir yandan da uzun zamandır PIC ve AVR ile tanışıklığım sebebi ile işin yazılım ve geliştirme boyutunu da çok yönlü olarak gözlemleme şansı buldum. Son yıllara kadar AVR ve PIC 8-bit mikrodenetleyici piyasasında iki rakip firmanın en kuvvetli ürünleriydi. Fakat Microchip Atmel’i satın almasının ardından PIC ve AVR birbirinin rakibi değil aynı firmanın iki farklı ürünü olarak piyasaya sürülmektedir. Bu soruyu anlamsız kılan noktalardan biri de budur.

AVR dediğimizde 8 bacaklı ATtiny ailesinden tutun 8/16-bit ATxmega serisine kadar büyük bir mikrodenetleyici ailesini kapsamaktadır. PIC’lere geldiğimizde durumun yine benzer bir şekilde 10F serisinden 32-bit PIC’lere kadar gittiğini görmekteyiz. Hatta bir dönem 32-bit AVR mikrodenetleyiciler de üretilmişti. Bu durumda farklı kulvarlardaki mikrodenetleyicileri karşılaştırmamız anlamsız olacaktır. İki firma da her alana yönelik mikrodenetleyicileri üretmektedir. Biz ATmega328p ile PIC 16F84’ü karşılaştırırsak elbette AVR’nin daha iyi olduğunu söyleriz. Fakat bu modelin karşısında 16F84 değil 18F2550 durmaktadır. Birbirine rakip mikrodenetleyicileri karşılaştırdığımızda ise özellik bakımından pek fazla fark göremeyiz. Hangi model olursa olsun değişmeyen bir nokta vardır ona da mimari deriz. PIC ile AVR mimarisini karşılaştırdığımızda daha isabetli bir netice elde ederiz.

Mimari Farklılıkları

İki mimariyi inceleyip anlayan biri olarak ben PIC mimarisini daha ilkel olarak görmekteyim. PIC mimarisinin AVR’den daha eski olduğu bir gerçek olsa da bu mimari olabilecek en ucuz ve minimal bir mikrodenetleyici sistemi tasarımı üzerine bina edilmiş gibi görünmektedir. Örneğin AVR mikrodenetleyicilerde 16 adet (R0-R15) genel maksatlı yazmaç bulunurken PIC mimarisinde W adlı akümülatör bulunur. Akümülatör bulunduran işlemcilerin daha ilkel işlemciler olduğunu rahatlıkla söyleyebiliriz. Akümülatör yani sadece bir adet genel maksatlı yazmaç bulundurması Assembly dilinde program yazarken AVR’de olduğu gibi bize bir esneklik vermeyebilir. Üstelik program yazmayı da sıkıcı bir hale sokabilir. AVR’de ise 16 adet genel maksatlı yazmacı istediğimiz gibi kullanabiliriz. Bu bize daha rahat bir çalışma alanı sağlamaktadır.

Yine Assembly dilinde program yazacakları ilgilendirecek bir konu da PIC’de sadece 35 komut, AVR’de ise 135 komut bulunmasıdır. AVR’de 135 komut bulunması aslında gerçekten 135 adet komut olduğu anlamına gelmemektedir. Bazı komutlar birbirinin aynısı olup sahte komut denebilir. Örneğin SREG yazmacının herhangi bir bitini manipüle etmek için operandlı bir komut yer alırken öte yandan CLI, SEI gibi SREG yazmacının bir bitini bir veya sıfır yapmak için ayrı ayrı operandsız komutlar yer almaktadır. Sadece bir yazmacın bir bitini bir yapmak için ayrı, sıfır yapmak için de ayrı komut koymak gerçek makine komutu olmasa gerektir. Biz bunu diğer Assembly dillerinde görememekteyiz. Genel olarak makine komutunda işlevsellik, esneklik ve zorunluluk esastır. Bütün bunları bir kenara bıraktığımızda bile AVR’de PIC’e göre oldukça zengin komutların olduğunu görmekteyiz. Örneğin PIC’in en fakir yönlerinden biri olan dallanma komutları AVR’de oldukça zengindir. Örneğin PIC’de dallanma komutları sadece CALL ve GOTO komutlarından ibarettir. AVR’de ise 30’dan fazla dallanma komutu bulunmaktadır ve bu komutlar yukarıda bahsettiğimiz gibi birbirinin takliti komutlar değildir.

Mikrodenetleyicilerin durum yazmacına baktığımızda AVR’de fazladan iki durum biti olduğunu görmekteyiz. PIC sadece elde, yarım elde ve sıfır bitlerini içerirken AVR’de buna ek olarak negatif sayılarla ilgili bitler de yer almaktadır. Ayrıca PIC’de özel fonksiyon yazmaçlarına erişirken bile hafıza bankasını seçmek gereklidir. Hafıza ikiye bölünmüştür ve bir yazmaç Bank 0’da yer alırken öteki yazmaç Bank 1’de yer almaktadır. Belleği iki bankaya ayırmanın tek sebebi maliyeti düşürmektir. Bir yazmaca erişmek için sürekli sürekli bankalar arasında geçiş yapmak ve bu geçişte veri yazma komutlarını kullanmak performans kaybına ve programın uzamasına yol açacaktır. AVR’de ise böyle bankalar arası geçiş söz konusu değildir ve özel fonksiyon yazmaçlarına (örneğin PORT, USART, EEPROM) erişim için daha performanslı özel komutlar bulunmaktadır.

Komut sayısı arasındaki var olan bu uçurum Assembly programlamayı öğrenenlerin de PIC tarafında işini zorlaştırmaktadır. Çünkü PIC komutlarına baktığımızda az komutla çok iş yapmamız gereklidir ve sürekli az bir komut kullanıldığından bunu anlayabilmek ve yazabilmek için daha fazla programcılık bilgisi ve tekniği gereklidir. AVR Assembly ise yeni başlayan ve programcılık yeteneği çok gelişmemiş geliştiricilerin komutları rahatça anlayabileceği bir yapıya sahiptir. AVR’ye baktığımızda mimarisinden geliştirme ortamına kadar her zaman amatör ve acemi dostu bir ilkede olduğunu görmekteyiz. Örneğin AVR uzun zamandır açık kaynak C derleyicisine sahipken PIC denetleyiciler için pahalı 3. parti derleyicilere talim oluyorduk.Ben açıkcası Assembly dilini AVR Assembly sayesinde anladım.O yüzden Assembly programlamaya başlayacakların ilk önce AVR Assembly öğrenmekle işe başlamasını tavsiye ediyoruz.

Bu bahsettiğimiz mimarileri ele alırken 16F/18F ve ATmega serileri üzerinden ele aldığımızı ve araştırma yapmak isteyenler için daha ayrıntılı kaynağın sitemizde mevcut olduğunu söyleyelim. Biz burada iki mikrodenetleyicinin datasheetini referans alarak bir mimari karşılaştırması yaptık.

Geliştirme Ortamları

Mimari farklılıkları ve mimari konusunda birinin diğerinden zayıf görünmesi elbette Assembly programcılarını ilgilendiren bir durumdur. Biz C dilinde program yazarken bankalar arası geçişi veya 35 komutu dert edecek değiliz. Onu yükü derleyiciyi yazanlar üzerine almış ve derleyici programı bize vermiştir. Bundan sonra yazmaç seviyesinde bir program yazsak bile yazmaç ve bit adlarından başka pek farklılık gözlemleyemeyiz. PIC’e ilk başladığım zamanlarda C dilinde program yazan pek kimseyi göremiyorduk. O dönemler Microchip sadece PIC Assembly ile program yazacağımız MPLAB adında basit bir çevirici program yayınlamıştı ve ücretsiz geliştirme ortamı olarak bunu kullanabiliyorduk. En iyi geliştirme ortamı resmi geliştirme ortamı olsa da 35 komutta Assembly programı yazmak istemeyen (yazmak da zorunda değildir.) geliştiriciler için ücretsiz bir seçenek yoktu. Bu boşluğu fırsat bilen bazı ufak firmalar Basic, Pascal, C tabanlı derleyicileri piyasaya sürmenin yanı sıra JAL, Flowcode, Parsic gibi PIC için özel geliştirme ortamlarını da piyasaya sürmüştü. AVR cephesinde ise WinAVR ya da IAR olsa da bunların Atmel Stuido’da yazılan koddan çok da farkı yoktu. Ana akım resmi geliştirme ortamı üzerinde çalıştığı gibi şimdi de Atmel Studio üzerinde çalışmaktadır. Örneğin internette bulacağınız kodların %95’inden fazlasını derleyici sıkıntısı çekmeden Atmel Studio’da çalıştırabilirsiniz. PIC için ise CCS C kodu, MikroC kodu, MPLAB kodu, Basic kodu, Proton kodu diye bir sürü ayrım vardır ve kütüphane ve kaynak kod bakımından böyle bir bölünmeyi sürekli yaşarsınız. AVR’de Arduino’nun hazır fonksiyon ve kütüphaneleri ile C dilinde program yazdığımız gibi PIC için de CCS C ve MikroC gibi derleyiciler vardır. Bu derleyicilerdeki sürücüler Arduino’ya göre oldukça gelişmiş ve performanslı olup sizin gerçekten iş yapmanıza olanak sağlayan seviyededir. Eğer donanıma çok hakim olamıyorsanız ve yazmaç seviyesinde çalışmak istemiyorsanız bu konuda CCS C ve özellikle Mikro C’yi tercih edebilirsiniz.

Şimdi ise PIC için resmi C derleyicisinin olduğunu görmekteyiz. Bu durumda geç de olsa Microchip bu eksikliği gidermiştir o yüzden geliştirme ortamı bakımından günümüz için ikisini de eşit seviyeye koyabiliriz. Biz burada resmi olmayanları kriter olarak değerlendirmiyoruz.

Kaynak Kitap, Kod ve Kütüphane

Kimse tekerliği yeniden icat etmek zorunda değildir. Siz bir proje yapmadan önce oturup haftalarca kullanacağınız kütüphaneleri yazmak zorunda değilsiniz. Bütün C derleyicilerinde standart kütüphane içerisinde karakter dizisi, matematik fonksiyonları, rastgele sayı üretme gibi temel fonksiyonlar yer almaktadır. Bunun gibi donanım üzerinde çalışırken de sizi seviyenizden çıkmanıza zorlayacak konuda kütüphane kullanmanız oldukça isabetli bir yol olacaktır. Üstelik sizin yazacağınız kütüphane de hazır kütüphane ile hemen hemen aynı komutları içerecekse uğraşmanıza gerek yoktur. Fakat önemli nokta sizin o kütüphane dosyasını açıp komutları zorluk çekmeden anlayabilmeniz ve gerektiği zaman üzerinde değişikliği ve eklemeleri yapabilmenizdir. Arka plandan habersiz bir şekilde sürekli kütüphaneler üzerinde çalışmak doğru değildir.

AVR için Github’a yazdıp da pek bulamadığımız kütüphane göremeyiz. Üstelik Arduino kütüphaneleri de AVR tabanlı olduğu için pek çoğu performanslı olması açısından AVR-GCC üzerine yazılmıştır. Diğerlerini de ufak oynamalar ile AVR’ye entegre edebilirsiniz. Ayrıca AVR için örnek kod ve projeleri yabancı kaynaklarda daha fazla bulabilirsiniz. Hobi elektronik kitlesi ülkemizde PIC’e yoğunlaşsa da Arduino’dan önce yurtdışında AVR üzerinde çalışmaktaydı.

PIC kütüphanelerini ve projelerini Türkçe kaynaklarda da sıkça görsek de bunlar arasında derleyici ayrılığından dolayı sıkıntı yaşanmaktadır. Fakat PIC mikrodenetleyiciler AVR’lere göre daha fazla pazar payına sahip olduğundan uygulamada daha fazla göz önüne gelmektedir.

Kitap konusunda PIC açık ara öndedir. AVR için İngiliz dilinde bile 3-4 adet iyi kitap bulabilirken PIC için yüzlerce yabancı ve onlarca Türkçe kitap bulmak mümkündür. Benim gibi kitaptan ve datasheetten öğrenenler için PIC daha iyi bir noktadadır.

Dokümantasyon konusunda ise AVR’nin bir parça daha iyi olduğunu söyleyebilirim. Özellikle datasheetleri anlaşılır ve ayrıntılı yazılmış ve uygulama notları oldukça zengin. Yine de ikisinin arasında çok derin bir uçurum yok o yüzden AVR’nin bir tık ileride olduğunu kabul edebiliriz.

 

En son olarak fiyat ve kılıf seçeneklerine baktığımızda PIC’in her zaman AVR’den daha pahalı olduğunu görmekteyiz. Yalnız bu pahalılık genelde %20-30 civarında olmaktadır. Bu pahalılık normalde çok fazla sıkıntı olmasa da doğru modeli seçememek ve bulamamaktan dolayı daha fazla hissedilir olmuştur. İki markada da DIP kılıfta mikrodenetleyicilerin bolca mevcut olduğunu görmekteyiz. Yalnız USB özellikli U serisine ait AVR mikrodenetleyicilerin DIP kılıfını görememekteyiz. PIC serisinde bu konuda sıkıntı yoktur. Fiyat konusunda AVR’nin üstün olduğunu söyleyebilsek de kılıf konusunda ikisini eşit sayıyoruz.

Bütün bunlardan önemlisi geliştiricinin yöntemini öğrenmeniz gerektiğidir. Bir geliştirici piyasada en iyisi olduğunu sandığı bir markaya bağlanıp bütün ömrünün bunun üzerine kod yazarak geçirmez. Az bir bilgiyle çok iş yapma derdinde olanlar acilen başka sektörlere yönelmelidir.  Çünkü gömülü sistemlerde öğrenecekleriniz başka sektörlerde öğreneceklerinizden kat kat fazla olacaktır ve sürekli de işin başında gibi yeni donanımları ve platformları öğrenmek zorunda kalacaksınız. Tek bir mikrodenetleyiciyi öğrenmekle ilerlemeniz mümkün değildir. Önemli olan mikrodenetleyici mimarisini, dijital elektroniği ve mantığını öğrenip kısa sürede yeni mikrodenetleyicilere geçiş yapabilecek noktaya gelmenizdir. Aynı durum programlama dilleri için de geçerlidir. Siz programlama mantığını ve algoritmayı öğrenmek zorundasınız. Sonrasında program yazdığınız diller size çok da farklı gelmeyecektir. Fakat siz bunun temelini ve mantığını anlamadıktan sonra her zaman sıfırdan öğreniyormuşsunuz gibi gelecektir.

Bir geliştirici için en iyisi uygulamaya en uygun olandır. Bu PIC veya AVR değil STM8, Renesas hatta 8051 de olabilir. Bunların donanımsal bakımdan birbirinden iyi veya kötü olmasının önemi yoktur. Eğer bu mantıkla gitseydik 32-bit dururken bizim 8-bit mikrodenetleyicileri öğrenmemizin bir anlamı yoktu. STM32 dururken neden PIC veya AVR öğrenelim? Fakat bizim uygulamamız 8-bit mikrodenetleyici ile yapılabilecekken binlerce sayfa datasheet ve referans kılavuzu ile zaman harcamanın da gereği yoktur. Bazı mühendislerin PIC veya AVR’ye zaman kaybı diyip STM32’yi övdüğünü duymaktayız. Bu tarz söylemler de yukarıda söylediğimiz fanboylukla aynı yola çıkmaktadır ve bir geliştiricinin söyleyeceği bir söz değildir.

Özetlersek, PIC mi AVR mi öğrenmeliyim diyen birine “Mikroişlemci mimarisini, temel bilgileri, dijital elektroniği öğren sonra hangisi lazım olursa onu rahatça öğrenirsin”, diye cevabımızı versek de yine şahsi bir tavsiye isteyen biri olursa yukarıdaki sebeplerden dolayı AVR’nin tercih edilesi olduğunu söyleyebiliriz.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.