Uzun zamandır özgür
yazılımlar ve dolayısıyla ücretsiz yazılımlar üzerinde
araştırma çalışmalarım devam etmekte. Mikrodenetleyici
programlamada bir çok mikrodenetleyici çeşidine taşınmış (port
edilmiş) derleyici olan SDCC dikkatimi çekti. Benim bildiğim
neredeyse ücretsiz tek mikrodenetleyici derleyicisi. Bu derleyici
üzerinde uğraşılması gerektiğini düşünüyorum. Şimdilik
arama motorlarında Türkçe kaynak hiç gözükmediğinden ilk
kaynak olması amacıyla bu yazıyı kaleme almaya karar verdim.
Yaptığım uzun araştırmalar sonucunda PARDUS E-Dergi Eylül 2011
1. sayısında SDCC den bahsedildiğine rastladım. Faydalı olması
açısından bu yazıyı alıntılayarak burada yayınlamaya karar
verdim. Burada Pardus için anlatınlar ubuntu gibi linux dağıtımlarında da rahatlıkla uygulabilir. Umarım faydalı olur. Ayrıca daha sonraki günlerde birebir
çalışır durumda test edilmiş, IDE gerektirmeden terminalde
derlenebilen kod örnekleri yapmak niyetindeyim. Allah nasip ederse
yine bu blogumda bunları bulabileceksiniz.
Pardus'ta
MCU Programlama – SDCC derleyicisi
Öncelikle “MCU
Nedir?” sorusuyla başlayalım.
MCU(Microcontroller=Mikrodenetleyici),karmaşık mantıksal
fonksiyonları tek bir entegrede toplayan bir cihazdır. Genelde,
başka bir sistemi yönetmek için kullanılırlar. MCU'nun bir
Microprocessor(Mikroİşlemci)'den farkı, CPU'ya ek olarak RAM,
I/O(G/Ç), EEPROM, CCP... gibi modülleri de dahili olarak
bulundurmasıdır.
MCU'lar nerede
kullanılır?
Uzaktan kumandalı
araçlar, alarm sistemleri, birçok robot çeşidi, beyaz eşyalar...
kısaca aklınıza gelebilecek bir çok elektronik cihazda MCU'lar
kullanılır.
Farklı MCU
üreticileri mevcut mudur? Hangisini tercih etmeliyim?
Piyasada birçok MCU
üreticisi mevcut. Bunların başında Microchip, Atmel, Motorola,
Zilog, Philips gelir. Ancak hangi marka ve modeli seçeceğiniz,
tamamen size kalmıştır. Bu tercihte dikkat edilmesi gereken nokta,
seçilen MCU'nun, kullanılacak proje için yeterli teknik donanıma
sahip
olmasıdır. Ancak
şunu belirtmem gerekir ki Türkiye'de en çok kullanılan MCU
markalarından biri Microchip firmasının üretimini yaptığı
PIC'lerdir. Ben de yazıma, daha çok PIC Programlama ile
devam edeceğim.
MCU nasıl
programlanır?
MCU'lar,
derleyiciler sayesinde birçok dille programlanabilirler. En fazla
kullanılan diller Assembly,C ve Basic'tir. Assembly'nin biraz
ağır,Basic'in ise biraz “basic” kalması nedeniyle,
MCU programlarken C
programlama dilini tercih etmek, birçok geliştiriciye daha mantıklı
gelmektedir.
Peki Pardus
GNU/Linux altında MCU programlanabilir mi?
Elbette.
Pardus/Linux üzerinde de MCU programlayabilirsiniz. Bunun için bazı
yazılımlar mevcut. Bunların başlıcaları Code::Blocks, Piklab,
KTechlab IDE'leri, gputils ve SDCC.
SDCC
SDCC(Small Device C
Compiler) tekrar hedeflenebilir, optimize bir AnsiC
derleyicisidir. Derleyicinin hedefleri (target), Intel 8051, Maxim
80DS390, Zilog Z80, Motorola 68HC08 temelli MCU'lar ile PIC16 ve
PIC18 serisi MCU'lardır. SDCC, ücretsiz ve açık kaynak bir
yazılımdır. GNU Genel Kamu Lisansı(GPL) altında dağıtılmaktadır.
Yani özgürdür.
En önemli
özellikleri:
Ücretsiz ve
açık kaynak olması
Kendi
içerisinde yazılımınızı hız ve boyut için optimize edebilmesi
Birçok MCU'yu
desteklemesi.
Herhangi bir
fonksiyon içerisine Assembly kodu ekleme yeteneği
Code::Blocks
IDE'si ile entegre olabilmesi
Eğer daha
önce HiTech C derleyicisi ile PIC programladıysanız, SDCC'nin
kodlaması Hi-Tech C derleyicisi ile yüksek oranda benzerlik
gösterdiğini görürsünüz.
Kurulum
SDCC için
hazırlanmış herhangi bir Pisi paketi bulabilmiş değilim. Ancak
kurulumunda da bir zorluk olmadığı için paket aramaya gerek de
yok. SDCC'yi kullanabilmeniz için sistemimizde gputils paketinin
kurulu olması gerekiyor. Bu paket Pardus Developer deposunda mevcut.
Ancak bu depoda, henüz test aşamasına geçecek paketler bulunuyor.
Yani son kullanıcılara bu depo tavsiye
edilmiyor. gputils
paketini kurduktan sonra, SDCC'nin kurulumuna geçebiliriz.Buradan
SDCC'nin son kararlı sürümünü indirelim. Dosya adında i386
yazıyor, ancak Pardus 2011 64 Bit sürümünde de herhangi bir sorun
olmadan kuruluyor ve çalışıyor. İndirdiğimiz sıkıştırılmış
dosyayı Ev dizinimiz içerisinde sdcc klasörü oluşturup
açıyoruz.Konsolu açıyoruz.
$
sudo -i
#
cd / home/ kullaniciadiniz / sdcc
#
cp -r * / usr/ local
*
Not: Pardus, /usr/local dizini kullanmamaktadır. Uygulamayı bu
şekilde kurmak, sisteme herhangi bir zarar vermemektedir; ancak
Pardus dizin hiyerarşisine uygun değildir. Bunun için, açtığınız
SDCC dizini altındaki çalıştırılabilir dosyaları /usr/bin;
“sdcc” dizinini ise /usr/share altına kopyalayabilirsiniz.
Ancak, yazının ileriki bölümlerinde anlatılan Code::Blocks
derleyici yollarını tanımlarken, kopyaladığınız dizinlere göre
yaplandırmanız gerekmektedir.
SDCC'yi
kopyaladıktan sonra, Code::Blocks'un kurulumuna geçiyoruz. Şu anda
Pardus depolarında Code::Blocks IDE henüz mevcut değil. Ancak bu
sitede [1] bir pisi paketi mevcut. İndirdiğimiz
paketi
kurup, Code::Blocks'u yüklemiş oluyoruz.
Şimdi
gelelim Code::Blocks'un SDCC ile entegrasyonuna.
lk
olarak Code::Blocks'u başlatın. Menüden Settings>Compiler
and Debugger'e girin:
1.
Derleyici olarak SDCC Compiler'ı seçin.
2.
Set as Default butonuna basın
3.
İkinci işlemden sonra uyarı vermediyse entegrasyon işlemi
tamamlanmıştır. Eğer hata veriyorsa dördüncü işlemden devam
edin.
4.
Toolchain Executables sekmesine gelin ve Yolları (Path) doğrulayın.
5.
Search Directories sekmesine gelin ve Compiler alt sekmesine
tıklayıp /usr/local/share/sdcc/include/
dizinini ekleyin.
SDCC 3.0 ve sonraki sürümler için yine aynı sekmede
/usr/local/share/sdcc/non-free/include/
dizinini ekleyin. Böylece entegrasyon işlemimiz de tamamlanmış
oluyor.
Şimdi
gelelim ilk uygulamamıza. Hemen menüden; File>New>Project'e
tıklayın. Gelen pencereden, Empty Project'i seçin. Hemen Next'e
tıklayın. Şimdi gelen kısımda projenizin kaydedileceği yolu,
projenin adını seçin ve tekrar Next'e basın. Bu kısımda:
Compiler olarak SDCC'yi seçin.
Create
Debug Configuration seçili olmayacak.
Create
Release Configuration seçili olacak.
Ben bu örnek projeyi,
PIC16F877A için hazırladım. O yüzden menüden, Project>Build
Options'u açalım. Compiler Settings sekmesinin Compiler Flags alt
sekmesinde [CPU]Microchip PIC 14 Bit'i seçiyoruz. Daha sonra Other
Options alt sekmesine gelip p16f877a yazıyoruz. Böylece
derleyicimize, projemizi hangi MCU için derleyeceğini anlatmış
oluyoruz.
Projemiz için bir main.c
dosyası oluşturduktan sonra, projemizin ayrıntılarına gelelim.
16F877A'nın B portunun birinci
pinine bir led, 2.pinine ise bir buton bağlı durumda. Amacımız;
buton basılı durumdayken ledin yanması, basılı olmadığı
durumda ise ledin sönmesi.
Bunun için hemen yazılıma
geçiyoruz.
#include "pic/pic16f877.h"
typedef unsigned int config;
// PIC
konfigurasyonları yapılıyor.
config at 0x2007 __CONFIG
=_RC_OSC & _PWRTE_ON & _BODEN_OFF
& _WDT_OFF &
_LVP_OFF;
void main( ) //
ana fonksiyonumuz
{
TRISB2 = 1 ; //
B portunun 2.pini dijital giriş olarak ayarlandı.
TRISB1 = 0 ; //
B portunun 1 pini dijital çıkış olarak ayarlandı.
while(1) //
Sonsuz döngüye giriliyor.
{
RB1 =RB2 ; //
RB1,RB2 'ye eşitleniyor
}
}
Yazılımı derlemek için
varsayılan olarak Ctrl+F9 tuşu kullanılıyor. Ayrıca menüden
Build>Build ile de derleme işlemini gerçekleştirebilirsiniz.
Programımızı da hazırladık
ve derledik. Şimdi sıra geldi hazırladığımız programı
denemeye. Bunun için iki yöntem mevcut:
1. Bir simülator
yazılımıyla(Örn. gpsim) test etmek.
2. Direk olarak yazılımı
MCU'muza atarak devre üzerinde test etmek.
Birincisi için gpsim'i kurup
kullanmanız gerek. Kurulum paketi Pardus Developer deposunda
bulunuyor. Ancak şunu belirtmem gerekiyor, bu depodaki paketler
henüz test aşamasında bulunuyor. Kurulumdan sonra tek yapmanız
gereken, gpsim'i açıp SDCC tarafından oluşturulan cod dosyasını
gpsim tarafından açmak.
İkincisi içinse bir
programlayıcı (programmer: Hazırladığımız yazılımı MCU'ya
yazmaya yarayan bir devre) lazım. Bu devreler, her MCU marka/modeli
için ayrı ayrıdır. Ben Brenner8 tabanlı bir
programlayıcı ve Microchip
firmasının üretimini yaptığı PIC'leri kullanıyorum. Programı
MCU'muza yazdırmak için bir de masaüstü arayüzü lazım. Sprut
firması, Brenner8 için bir GNU/Linux masaüstü arayüzü(GUI) ve
sürücüsü hazırlamış. Brenner8 kuıllanıyorsanız /
kullanacaksanız bu yazılımları buradan [2] indirip
kurabilirsiniz.
SDCC'nin kullanımı hakkında
detaylı bilgi almak istiyorsanız, buradan [3] SDCC Manual'i indirip
inceleyebilirsiniz.
"SDCC ile PIC programlama
hakkında Türkçe bir kaynak var mı?" diye soruyorsanız,
hatırlarsınız ki SDCC'nin önemli özellikleri arasında Hi-Tech C
derleyicisi ile benzerlik göstermesini belirtmiştim. Dolayısıyla
size, Fırat Deveci'nin hazırlamış olduğu Hi-Tech PIC Programlama
Kitabı'nı [4] önerebilirim. Kitapta karşılaştığım tek
farklılık, kesme (interrupt) fonksiyonlarının tanımlanmasında
idi. Onun dışında SDCC ile HiTech C derleyicileri
arasında ,PIC programlarken bir farkarastlamadığımı belirteyim.
SDCC üzerinde kesme
fonksiyonlarını aşağıdaki gibi tanımlayabilirsiniz.
void fonksiyonadi( ) __interrupt
0
{
//
Kod buraya gelecek.
}
Evet yazımın sonuna
yaklaşırken bu yazının bir dergi için hazırladığım ilk yazı
olduğunu belirterek, hatalarımın olabileceğini hatırlatayım.
Şayet bu yazıda bir hata ya da sorun ile karşılaşırsanız,
lütfen info@hckrtech.com
eposta adresim aracılığı ile bunu bana bildiriniz.
Bu konuda söyleyebileceklerim
şimdilik bu kadar. Hepinize kolay gelsin.
Kaynaklar
http://sdcc.sourceforge.net/
http://wiki.Code::Blocks.org/index.php?title=Using_the_Code::Blocks_IDE_with_SDCC_on_PIC_MCUs
Ek Bağlantılar
PIC16F serisi için bazı
include dosyaları mevcut.(Çok kullanılan Delay fonksiyonu için bu
siteyi http://burningsmell.org/pic16f628/ inceleyebilirsiniz.)
gpsim(PIC MCU'lar için simülatör) projesinin sitesi
http://gpsim.sourceforge.net/
[1]
http://code.google.com/p/siklon/downloads/list
[2]
http://sprut.de/electronic/soft/usburn/linux/usburn_linux.htm
[3]
http://sdcc.sourceforge.net/doc/sdccman.pdf
[4]
http://www.fxdev.org/muhendislik/hi-tech-pic-programlama/
(www.320volt sitesinde mevcut)
Not:
Burada verilen örnek kodlar derleme ayarlarının tam yapılamamasından dolayı çalıştırmakta sıkıntı yaşayabilirsin. Ancak dert etmeyin. Şimdilik yazıyı bilgi amaçlı olarak okuyun. Sonra nasıl yapılabileceği konusunda çalışmalar yapılacaktır.
Bu yazı
Pardus Eylül 2011 Sayı 1 dergisinin yazısının bir alıntısıdır.
Yazı ile igili tüm haklar yazı sahibi kuruluşa aittir. Bu sitede
sadece alıntı kaynak gösterilerek yasal çerçevede yapılmıştır.
duralikiraz.blogspot.com
12
Haziran 2015
Merhabalar,
YanıtlaSilKitaba aşağıdaki linkten ulaşabilirsiniz.
http://firatdeveci.com/programlar-kitaplar/kitaplar/
Çok teşekkürler Fırat bey.
Sil