Guido Socher (homepage)
Yazar hakkında:
Guido Linux'u, kendi donanımını geliştirmek için gerçekten
çok iyi bir işletim sistemi olduğu için beğenmektedir.
Türkçe'ye çeviri:
Erdal Mutlu <erdal(at)linuxfocus.org>
İçerik:
|
GCC libc-1.0.4 ile AVR mikroişlemcisini programlamak
Özet:
Atmel firmasının AVR 8-Bit RISC Mikroişlemcisi, çok yaygın
bir mikroişlemcidir. EEPROM, Ram, Analog'dan sayısala
(digital) çevirici, birçok sayısal giriş ve çıkış hatı, zamanlayıcılar, RS 232
haberleşmesi için UART ve daha fazlası tek bir çipte barındırmaktadır.
En önemlisi, Linux için tam bir uygulama geliştirme ortamına sahip
olmasıdır. Mikroişlemciyi C ve GCC kullanarak programlayabilirsiniz.
Aynı konu hakkında Mart 2002 sayısında
bir yazı yazmıştım. O günden bu güne bir çok şey değişti. Kullanmış olduğum
AT90S4433 mikroişlemcisi Atmel tarafından artık üretilmiyor. Bu yazı,
Mart 2002 yazısı için güncelleme niteliğindedir. libc-1.0.4 ile ATmega8
mikroişlemcisini kullanacağım.
Dolayısıyla, bu yazı konuya giriş niteliği taşıyacak ve
serinin ileriki yazılarında ATmega8 mikroişlemcisini kullanan
daha ilginç aletler oluşturacağız.
_________________ _________________ _________________
|
Giriş
2002 yılında yazdığım yazıdan sonra
mikroişlemcilerin programlanması bir çok insanın ilgisini çekmişti.
Ancak, uygulama geliştirme ortamının yüklenip ayarlanması en zor adımdır.
Eğer, bir şey çalışmıyorsa, hatanın nerede oluştuğu hakkında
hiçbir düşünce yürütülemiyor. Programlayıcı kablosu mu bozuk? Devre mi hatalı?
Yüklemede mi sorun var? BIOS'ta paralel bağlantı iptal mi edilmiş?
ppdev için olan çekirdek modülleri yanlış mı derlendi? Neden çalışmadığı
hakkında bir sürü neden olabilir.
Mikroişlemci dünyasına eylenceli bir giriş yapabilmeniz için
shop.tuxgraphics.org
adresinden, belgeleri içeren başlatılabilir bir CD ile
programlayıcı donanımını elde edebilirsiniz. Yapmanız gereken tek şey,
CD'den bilgisayarınızı açmaktır. Yazılım yüklemenize gerek
yoktur ve bilgisayarınızda hiçbir şeyi değiştirmeniz de gerekmiyor.
Hatta ben bile böyle bir CD kullanıyorum, çünkü
geliştirdiğim donanımlar, bilgisayarımdaki birkaç çekirdek nesli ile
Linux dağıtımını değştirmeme karşın, değişmeden kalmaktadır.
Elimde CD olduğu için, geliştirmiş olduğum yazılımda güncelleme
yapmak istediğimde, uygulama geliştirme ortamının bilgisayarımda hala
yüklü ve ayarlı olup olmadığı pek önemli olmamaktadır.
Yapmam greken tek şey, CD'den bilgisayarımı açmaktır.
CD'den bağımısız olarak, GCC avr uygulama geliştirme
ortamının yüklenişini burada açıklayacağım. tuxgraphics'ten
bu CD'yi elde ettiyseniz, okumaya "Küçük bir deneme projesi"
bölümünden devam edebilirsiniz.
Gerekli olan yazılımlar
GNU C uygulama geliştirme ortamını kullanabilmek için aşağıdaki yazılımlara gereksinim
duyacaksınız:
binutils-2.15.tar.bz2 |
ftp://ftp.gnu.org/gnu/binutils/
veya yansı yöresi olan
ftp://gatekeeper.dec.com/pub/GNU/binutils/ adresinden elde
edebilirsiniz. |
gcc-core-3.4.2.tar.bz2 |
ftp://ftp.gnu.org/gnu/gcc/
veya yansı yöresi olan
ftp://gatekeeper.dec.com/pub/GNU/gcc/ adresinden elde edebilirsiniz. |
avr-libc-1.0.4.tar.bz2.tar |
AVR C kütüphanesini
http://savannah.nongnu.org/projects/avr-libc/ adresinden elde
edebilirsiniz. |
uisp-20040311.tar.bz2 |
AVR programlayıcı yazılımını
http://savannah.nongnu.org/projects/uisp adresinden elde edebilirsiniz. |
Tüm yazılımları /usr/local/avr dizinine yükleyeceğiz.
Böylece yazılımları bilgisayarınızdaki C derleyicisinden ayrı
tutumuş oluruz. Bu dizini aşağıdaki buyrukla yaratın:
mkdir /usr/local/avr
Çalışabilir programlarının bulunduğu bin dizinini, PATH çevre
değişkenine ekleyebilirisiniz:
mkdir /usr/local/avr/bin
export PATH=/usr/local/avr/bin:${PATH}
GNU araçlarının yüklenmesi
Nesne dosyaları yaratmak için gerekli tüm düşük seviye
araçları binutils paketiyle birlikte gelmektedir.
Paket içerisinde, AVR assembler (avr-as), bağlayıcı (avr-ld),
kütüphane işleme araçları (avr-runlib, avr-ar), mikroişlemcinin
EEPROM'una yüklenebilir nesne dosyaları yaratmaya yarayan programlar
(avr-objcopy), avr-objdump, avr-size ve avr-strip gibi
araçlar bulunmaktadır.
binutils paketini oluşturmak ve yüklemek için aşağıdaki buyrukları verin:
tar jxvf binutils-2.15.tar.bz2
cd binutils-2.15/
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls
make
# ve root kullanıcısı olarak:
make install
/usr/local/avr/lib satırını /etc/ld.so.conf dosyasına
ekleyin ve bağlayıcı geçici belleğini yenilemek için /sbin/ldconfig
buyruğunu çalıştırın.
AVR gcc derleyicisinin yüklenmesi
avr-gcc bizim kullanacağımız C derleyicimiz olacak.
Derleyiciyi oluşturup yüklemek için aşağıdaki buyrukları verin:
tar jxvf gcc-core-3.4.2.tar.bz2
cd gcc-3.4.2
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c
make
# ve root kullanıcısı olarak:
make install
AVR C kütüphanesinin yüklenmesi
Şimdiki C kütüphanesi, Mart 2002 yazısında kullandığımdan daha
sağlamdır.
Kütüphaneyi oluşturup yüklemek için aşağıdaki buyrukları verin:
tar jxvf avr-libc-1.0.4.tar.bz2.tar
cd avr-libc-1.0.4
PREFIX=/usr/local/avr
export PREFIX
sh -x ./doconf
./domake
cd build
#ve root kullanıcısı olarak:
make install
Programlayıcı yazılımının yüklenmesi
Programlayıcı yazılımı, özel hazırlanmış nesne kodunu
mikroişlemcinin EEPROM'una yüklenmesini sağlamaktadır.
Linux için olan uisp programlayıcısı çok iyi bir programlayıcıdır.
Kendisini Makefile dosyası içerisinden doğrudan kullanabilirsiniz.
Yazılımı derleme ve yüklemek için yapmanız gereken tek şey
"make load" kuralını Makefile dosyasına eklemek olacaktır.
uisp aşağıdaki gibi yüklenmektedir:
tar jxvf uisp-20040311.tar.bz2.tar
cd uisp-20040311
./configure --prefix=/usr/local/avr
make
# ve root kullanıcısı olarak:
make install
Küçük bir deneme projesi
İşe, daha sonra geliştirebileceğiniz küçük bir deneme devresiyle
başlayacağız.
Devreyi, daha karmaşık donanımları denemek için de kullanabilirsiniz.
Yazılım yükleme denemesi, algılayıcı veya başka ölçüm aygıtı
ekleme gibi işleri, devre ile kolayca yapabilirsiniz.
Burada vermiş olduğumuz deneme programı sadece LED'in yanıp sönmesine
yaramaktadır.
Mikroişlemci için küçük bir baskı devresi yapmanızı öneririm.
Gerekli donanımlar
Gerekli parçaların listesi aşağıdaki tabloda verilmiştir.
İşlemcinin yaygın kullanılmına karşın, işlemciyi tüm yerel elektronik
malzemeleri satan dükkanlarda bulamayabilirsiniz. Almanya'daki
www.conrad.de, Fransa'daki www.selectronic.fr, ABD'deki
digikey.com vs. gibi elektronik malzeme satan büyük
dağıtıcıların elinde bu mikroişlemci kesin olarak bulunmaktadır.
Ayrıca, tüm parçaları veya sadece mikroişlemciyi
shop.tuxgraphics.org adresinden
de elde edebilirsiniz.
1 x ATmega8 DIP sürümlü, Atmel 8 bit Avr risc işlemcisi. |
1 x 28 pin 7.5mm IC socket
28 delikli (pin) socket zor bulunmaktadır.
28 delikli socket ler genillikle 14mm genişliğindedir.
Bize ise, 7.5mm genişliğinde olanı gerekmektedir.
|
Bir adet 10K direnç (Renk kodu: kahverengi, siyah, turuncu)
Bir adet 1K direnç (Renk kodu: kahverengi, siyah, kırmızı)
Bir adet 10uF electrolytic kapasitör
Kablo
Bir adet LED
Delikli matris devresi
|
Aşağıdaki parçalar programlayıcı için gereklidir.
"Linux AVR programming kit" i tuxgraphics ten aldıysanız,
gerekli değil.):
Paralel bağlantı noktasına bağlantı yapmak için bir adet DB25
bağlaçı.
Programlayıcı için 5 bacaklı herhangi bir bağlayici veya socket.
IC socket'lerine benzer olan bağlaçlardan kullanmanızı ve beş
bacaklı olacak şekilde onu kesmenizi öneririm.
Bir adet 220 Ohm direnç (Renk kodu: kırmızı, kırmızı, kahverengi)
Üç adet 470 Ohm direnç (Renk kodu: sarı, mor, kahverengi)
|
Yukarıdakilerin yanı sıra, elektronik olarak dengeleştirilen
5V doğru akım kaynağına veya 4.5V pile gereksiniminiz olacaktır.
Kristale gereksinim duymadığımızı belki de fark etmişsinizdir.
Bunun nedeni, ATmega8'in içinde bir osilatörüm olmasıdır.
Çok hassas zamanlama gerekmediğinde, bu osilatör kullanılabilir.
Eğer, hassas ölçü aletleri yapacaksanız veya UART/RS232 arayüzünü
kullanacaksınız, bir kristale gereksinim duyacaksınız.
Programlayıcı aracılığı ile sigorta bitlerini ayarlayarak, hangi tür
osilatörün kullanılacağı tanımlanabilir. Fabrikadan ayarlanmış olarak gelen
1Mhz'lik osilatör çalışır durumdadır.
Programlayıcı donanımı oluşturmak
AVR mikroişlemcileri devredeyken programlanmalarına izin vermektedir.
(in circuit programming - ISP).
Başka bir deyişle, mikroişlemciyi programlamak için
devreden çıkartmanıza gerek yoktur. Çeşitli programlayıcı
aletlerini 50 ila 150 Euro'ya satın alabilirsiniz.
Ancak, Linux'unuz varsa, basit ama işe yarayan bir
programlayıcı oluşturabilirsiniz. Aşağıdaki kablonun yanı sıra,
bilgisayarınızda boş bir paralel bağlantısına gereksinim
duyacaksınız:
Bu programlayıcı Mart 2002 yazısında oluşturduğumuz
programlayıcıdan daha gelişmiştir. Koruma dirençlerini
programlayıcının içerisine yerleştiriyoruz. Böylece,
devre üzerinde daha fazla boş yer kalmış oluryor.
Programlayıcı kablosunun bağlantıları aşağıdaki gibi
yapılmalıdır:
pcb bacağı |
AVR bacağı |
koruma direnci |
paralel bağlantısı bacağı |
5 |
Yenileme (Reset) (1) |
-- |
İlklendirme (Init) (16) |
4 |
MOSI (17) |
470 Ohm |
D0 (2) |
3 |
MISO (18) |
220 Ohm |
Meşkul (Busy) (11) |
2 |
SCK (19) |
470 Ohm |
Strobe (1) |
1 |
GND |
-- |
GND (18) |
Kablo 70 santimetreden daha uzun olmamalıdır.
Sağdaki resimde de gösterildiği gibi, koruma dirençleri
bağlaçın içine yerleştirilebilirler.
Uygulama geliştirmek
ATmega8 mikroişlemcisi gcc ve C programlama diliyle programlanabilir.
AVR assembler dilini biraz bilmeniz, size yarar sağlayabilir, ama
gerekli değildir.
AVR libc'si tüm C fonksiyonlarını anlatan bir
avr-libc kullanıcı kılavuzuyla PDF (1139921 bytes) birlikte
gelmektedir. Atmel'in sayfasından
(www.atmel.com, avr ürünleri kısmına
-> 8 bit risc-> Datasheets bakınız.), tüm verileri indirebilirsiniz.
Orada tüm yazmaçlar (register) ile işlemci kullanımı anlatılmaktadır.
Mikroişlemciyi kullanırken aklınızda tutmanız gereken şey, işlemcinin
sadece birkaç byte geçici belleğe sahip olmasıdır.
Başka bir deyişle, büyük veri yapıları veya karakter katarları
tanımlamamalısınız. İç içe girmiş fonksiyon veya özyinemeli
fonksiyonların programınızda kullanmaktan kaçınmalısınız.
Teori yerine gerçek bir örnek her zaman için daha iyidir.
Yazacağımız program, devredeki LED'in 0.5 saniye aralıklarla
yanıp sönmesini gerçekleştirecektir.
Pek kullanışlı bir örnek değil, ama başlangıç için yeterlidir.
avr-libc çok değişti. Bir bağlantı noktası için bir biti
bir yapmak için sbi ve sıfır yapmak için de cbi fonksiyonları
kullanılmaktadıydı. Şimdi ise, bu fonksiyonlar artık yok.
Ben ilk önce "eski güzel" fonksiyonları kullanabilmek için
ilgili fonksiyonları, makrolar aracılığı ile tanımlıyorum:
/* İleriki kullanımlarda uyumlu olması için tanımlanan fonksiyonlar */
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void main(void)
{
/* INITIALIZE */
/* enable PC5 as output */
sbi(DDRC,PC5);
/* BLINK, BLINK ... */
while (1) {
/* led on, pin=0 */
cbi(PORTC,PC5);
delay_ms(500);
/* set output to 5V, LED off */
sbi(PORTC,PC5);
delay_ms(500);
}
}
Aşağıdaki örnek, yeni kullanımla yazılmış ve aynı işi görmektedir.
void main(void)
{
/* İlklendirme */
/* PC5 çıkış olarak ayarla */
DDRC|= _BV(PC5);
/* Yan, sön, yan sön ... */
/* PC5, 5 dir (include/avr/iom8.h bakınız) ve _BV(PC5), 00100000 dır.*/
while (1) {
/* led on, pin=0 */
PORTC&= ~_BV(PC5);
delay_ms(500);
/* set output to 5V, LED off */
PORTC|= _BV(PC5);
delay_ms(500);
}
}
Yukarıdaki program parçası, mikroişlemciyi ne kadar kolay
programlayabileceğinizi göstermektedir.
Siz sadece ana program kısmını görüyorsunuz, delay_ms fonksiyonunu
tüm program
(avrm8ledtest.c) dosyasından elde edebilirsiniz.
PC5 bacağını çıkış olarak kullanmak isterseniz,
C (DDRC) bağlantı noktası için olan ve veri doğrultusundaki yazmaçta
PC5 bitini bir yapmanız gerekir. Bunu yaptıktan sonra,
PC5 bitini cbi(PORTC,PC5) fonksiyonu ile sıfır yaparsanız PC5'e 0V,
PC5 bitini sbi(PORTC,PC5) fonksiyonu ile bir yaparsanız PC5'e 5V
vermiş olursunuz. PC5'in değeri io.h tarafından dahil edilen iom8.h
başlık dosyasında tanımlanmıştır. Dolayısıyla bunun için endişelenmenize
gerek yoktur. Eğer, Linux gibi çok kullanıcılı ve çok işlemli
sistemler için program yazdıysanız, sonsuz döngülerinizi bir
bekleme olmaksızın yapılmaması gerektiğini biliyorsunuzdur.
Yoksa, işlemci zamanını boşa kullanır ve böylece sisteminizi
bayağı yavaşlatmış olursunuz. AVR işlemcisinde durum başkadır.
Birden fazla işlem yok ve çalışan başka bir program da yoktur.
İşletim sistemi bile yok. Dolayısıyla, meşkul döngüyü burada kullanmak
gayet doğaldır.
Derleme ve yükleme
İşe başlamadan önce /usr/local/avr/bin dizinin yoltanımı içerisinde yer
aldığından emin olun. Eğer, gerekiyorsa, .bash_profile veya
.tcshrc dosyasını aşağıdaki gibi değiştirin:
export PATH=/usr/local/avr/bin:${PATH} (bash için)
setenv PATH /usr/local/atmel/bin:${PATH} (tcsh için)
AVR'yi programlamak için uisp ve paralel bağlantı noktasını kullanıyoruz.
Uisp, çekirdeğin ppdev arayüzünü kullanmaktadır. Dolayısıyla,
aşağıdaki çekirdek modüllerine gereksinim duyacaksınız:
# /sbin/lsmod
parport_pc
ppdev
parport
lsmod buyruğu ile modüllerinin yüklü olup olmadığını denetleyin ve
eğer yüklü değiller ise, root kullanıcısı olarak modülleri aşağıdaki
buyruklarla yükleyin:
modprobe parport
modprobe parport_pc
modprobe ppdev
Bu buyruklerın sistem açılırken kendiliğinde verilmesinde
yarar vardır. Bunun için buyrukları rc betiklerine (Sözgelimi, RedHat için
olan rc betiği /etc/rc.d/rc.local dır.) ekleyebilirsiniz.
ppdev arayüzünü sıradan bir kullanıcı olarak kullanmak istediğinizde,
root kullanıcısı bir defa olmak üzere aşağıdaki buyrukla size yazma
hakkı vermesi gerekir:
chmod 666 /dev/parport0
Ayrıca, sisteminizde yazıcı servisinin çalışmadığından da emin olun.
Eğer, çalışıyorsa, programlayıcı kabloyu kullanmadan önce onu durdurun.
Programlarımızı derlemek ve mikroişlemcimizi programlamak için artık her şey
hazır.
Deneme programımız için olan
(avrm8ledtest-0.1.tar.gz)
paketinde bir Makefile dosyası vardır. Yapmanız gereken tek şey
aşağıdaki buyrukları vermek:
make
make load
Bunlar, yazılımı derleyip yükleyecektir. Tüm buyrukların ayrıntısına
girmeyeceğim. Onları
Makefile
dosyası içerisinde görebilirsiniz ve buyruklar hep ayynıdır zaten.
Ben bile tüm buyrukları hatırlayamıyorum. Tek bilmemem gereken
"make load" buyruğunu vermemdir. Eğer, yeni bir program yazmak istiyorsanız,
Makefile dosyası içerisinde avrm8ledtest sözcüğünü, yazdığınız program adıyla
değiştirmeniz yeterli olacaktır.
Bazı ilginç araçlar
Derleme sürecinden daha ilginç olan binutils araçlarıdır.
Ancak, bu araçlar Mart 2002'den beri pek değişmedi.
Daha fazla bilgi için
Mart 2002 deki 231 nolu yazının
"Bazı ilginç binutils'ler" bölümüne bakabilirsiniz.
Düşünce ve öneriler
Birçok kullanım için ATmega8 mikroişlemcisi AT90S4433 ile uyumludur.
Dış osilatörü kullanabilmek için sigorta bitlerini programlamanız
gerekecektir. Önceden yapmış olduğumuz donanımlar çok az değişiklikler ile
aynen kullanılabilir. Ancak, eski yazılarda AT90S4433 ile yapmış olduğum
devreleri zamansızlıktan deneme olanağım ne yazık ki olmadı.
Eğer, kendinizi sağlama almak istiyorsanız, eski devrelerle
AT90S4433 kullanın. Eğer, ben uğraşırım ve çıkabilecek sorunları seve
seve çözerim diyorsanız, eski devreleri ATmega8 ile kullanmayı
deneyebilirsiniz.
Eski yazıların listesi aşağıda verilmiştir:
Eski devrelerde devre üzerinde bulunan koruma dirençlerinin,
şimdiki programlayıcı üzerinde olduğunu unutmayın. Eğer,
programlayıcıyı eski devrelerle kullanmak isterseniz,
devre üzerinde bulunan koruma dirençlerini kablolar
aracılığı ile devredışı bırakabilirsiniz.
Kaynakça
Bu yazı için görüş bildiriminde bulunabilirsiniz
Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
2004-11-09, generated by lfparser version 2.50