AVR Mikroişlemcisini GCC ile programlamak
ArticleCategory: [Choose a category, do not translate
this]
Hardware
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
http://homepage]
original in en Guido Socher
en to tr Erdal MUTLU
AboutTheAuthor:[A small biography about the author]
Guido, Lınux'u sadece işletim sistemlerinin nasıl çalıştığını
öğrenmenin ilginç olduğu için değil, aynı zamanda onu tasarlayan kişiler
yüzünden sevmektedir.
Abstract:[Here you write a little summary]
Atmel firmasının AVR 8-Bit RISC Mikroişlemcisi çok yaygın
bir mikroişlemcidir. Tek bir çipte EEPROM, Ram, Analog'dan Digital'e
çevirici, birçok digital giriş ve çıkış hatı, zamanlayıcılar, RS 232
haberleşmesi için UART ve daha fazlasına sahiptir.
En iyisi ise, Linux için tam bir uygulama geliştirme ortamına
sahip olmasıdır: Bu mikroişlemciyi C ve GCC kullanarak
programlayabilirsiniz. Bu yazıda GCC nasıl yüklenip kullanılacağı
anlatılacaktır. Ayrıca, yazılımın Mikroişlemciye nasıl
yükleneceği de anlatılacaktır. Sahip olmanız gerek şeyler,
AT90S4433 Mikroişlemcisi, 4MHz kristal, kablo ve birkaç
ucuz parça daha.
Bu yazı sadece giriş seviyesinde olacaktır. Daha sonraki yazıda,
tuşları, digital ve analog girişleri, LED'leri olan bir LCD
ekran oluşturacağız. Oradaki düşünce, Linux için genel amaçlı
bir denetim paneli oluşturmak olacaktır. Ancak ilk önce, bu yazının amacı olan
uygulama geliştirme ortamını yüklemeyi öğrenelim.
ArticleIllustration:[This is the title picture for your
article]
ArticleBody:[The article body]
Yazılımn yüklenmesi: Gereksinimler
GNU C uygulama geliştirme ortamını kullanmak için aşağıdaki
yazılımlara gereksinim vardır:
binutils-2.11.2.tar.bz2 |
ftp://ftp.informatik.rwth-aachen.de/pub/gnu/binutils/
veya
ftp://gatekeeper.dec.com/pub/GNU/binutils/ adresinden elde
edilebilir. |
gcc-core-3.0.3.tar.gz |
ftp://ftp.informatik.rwth-aachen.de/pub/gnu/gcc/
veya
ftp://gatekeeper.dec.com/pub/GNU/gcc/ adresinden elde edilebilir. |
avr-libc-20020106 .tar.gz |
AVR C-kütüphanesi:
http://www.amelek.gda.pl/avr/libc/ veya
yazılım sayfası adresinden
elde edilebilir. |
uisp-20011025.tar.gz |
AVR programcısı:
http://www.amelek.gda.pl/avr/libc/
veya yazılım sayfası
adresinden elde edilebilir. |
Tüm programları /usr/local/atmel dizinine yükleyeceğiz. Bunun nedeni,
programı C derleyicinizden ayrı tutmaktır. Dizini aşağıdaki komut ile
yaratınız:
mkdir /usr/local/atmel
Yazılım yüklenmesi: GNU binutils
Bu yazılım, nesne dosyaları oluşturmak için gerekli
alt seviye herşeye
sahiptir. AVR assembler'i (avr-as), bağlayıcıyı (avr-ld),
kütüphane araçlarını (avr-ranlib, avr-ar),
Mikroişlemcinin EEPROM'una yüklenmesine olanak verek
nesne dosyaları oluşturan programlara (avr-objcopy),
disassembler'a (avr-objdump) ve avr-strip ve avr-size
gibi uygulamalara sahiptir.
binutils yüklemek için aşağıdaki komutları çalıştırın:
bunzip2 -c binutils-2.11.2.tar.bz2 | tar xvf
-
cd binutils-2.11.2
./configure --target=avr --prefix=/usr/local/atmel
make
make install
/usr/local/atmel/lib satırını /etc/ld.so.conf dosyasına
ekleyin ve bağlayıcı cache'ini güncellemek için /sbin/ldconfig
komutunu çalıştırın.
Yazılım yüklenmesi: AVR gcc
avr-gcc bizim C derleyicimiz olacaktır.
Yüklemek için aşağıdaki komutları çalıştırın:
tar zxvf gcc-core-3.0.3.tar.gz
cd gcc-core-3.0.3
./configure --target=avr --prefix=/usr/local/atmel
--disable-nls --enable-language=c
make
make install
Yazılım yüklenmesi: AVR C-kütüphanesi
C-kütüphanesi hala geliştirilme aşamasındadır. Bu yüzden
yükleme işlemleri sürümden sürüme değişiklik gösterebilir.
Eğer, buradaki yükleme adımlarını izlemek istiyorsanız,
yukarıdaki tabloda yer alan sürümü kullanmanızı tavsiye
ederim. Ben bu sürümü denedim ve bu ve bundan sonraki
yazılar için yazılmış tüm programlar sorunsuz çalışmaktadır.
Birkaç çevre değişkenin ayarlanması gereklidir
(yazımşekli bash kabuğu için):
export CC=avr-gcc
export AS=avr-as
export AR=avr-ar
export RANLIB=avr-ranlib
export PATH=/usr/local/atmel/bin:${PATH}
./configure --prefix=/usr/local/atmel --target=avr
--enable-languages=c --host=avr
make
make install
Yazılım yüklenmesi: Programcı
Programcı yazılımı Mikroişlemcinin EEPROM'una
özel hazırlanmış nesne dosyalarını yüklemek için
kullanılmaktadır.
Linux için olan uisp programcı yazılımı çok iyi bir yazılımdır ve
Makefile içerisinden doğrudan kullanılabilir.
Tek yapılması gereken "make load" kuralını eklemek ve
yazılımın derlenmesi ve yüklenmesi tek bir adımda gerçekleşecektir.
uisp aşağıdaki gibi yüklenmektedir:
tar zxvf uisp-20011025.tar.gz
cd uisp-20011025/src
make
cp uisp /usr/local/atmel/bin
Küçük bir deneme projesi
Küçük bir deneme devresi ile başlayacağız.
Bu devrenin amacı yazılımı denetlemek olacaktır.
Bunu programı derlemede, yüklemede ve denetlemede
kullanacağız. Programın yapacağı tek şey LED'in yanıp sönmesini
sağlamak.
Ben Mikroişlemci için küçük bir baskı devre kullanmanızı öneririm.
Daha sonra, kendi deneyleriniz için bu baskı devresini genişletebilirsiniz.
Bunu için breadboard kullanmak iyi fikir olabilir.
Ancak, AVR ve 4MHz kristali breadboard üzerine koymaya
çalışmamalısınız. Giriş ve çıkışlar için
kısa kablolar kullanabilirsiniz, çünkü breadboard'lar
hızlı digital bilgi alışverişleri için tasarlanmamışlardır.
4MHz kristal ve kondanstörler, Mikroişlemciye yakın olmalıdır.
Programcı için bağlayıcıdaki dirençlere şu an gereksinimimiz yok.
Onlara sadece, B bağlantı noktasının giriş/çıkış hatlarını
başka amaçlar için kullanacaksanız gereksiniminiz olacaktır.
Gerekli donanımlar
Aşağıdaki tabloda yer alan parçalara gereksiniminiz olacaktır.
Hepsi de kolay bulunabilen ve oldukça ucuz parçalardır.
Bir tek Mikroişlemci biraz pahalıdır, 7.50 Euro civarında.
Sık kullanılan bir mikroişlemci olmasına karşın, her elektronik
malzemesi satan dükkanda bulunamayabilir, ancak www.reichelt.de (germany),
www.conrad.de (germany), www.selectronic.fr (france) gibi
büyük dağıtıcılarda (Sizin ülkenizde de benzer yöreler olabilir.)
mutlaka vardır.
|
1 x AT90S4433, Atmel 8 bit Avr risc işlemcisi. |
|
2 x 14 pin IC socket
veya
1 x 28 pin 7.5mm IC socket
28 pin socket bulmak biraz daha zordur.
Genellikle,
28 socket 14mm genişliğindedir, ancak bize 7.5mmm genişliğindeki
olan gereklidir.
|
|
1 x 10K direnç (renk kodu: kahverengi,siyah,turuncu)
3 x 470 Ohm direnç (renk kodu: sarı, mor, kahverengi)
1 x 1K direnç (renk kodu: kahverengi, siyah, kırmızı)
1 x 220 Ohm direnç (renk kodu: kırmızı, kırmızı, kahverengi)
1 x 4Mhz kristal
2 x 27pf seramik kondansatör |
|
Programcı için herhangi 5 pin connector/socket.
Ben genellikle daha uzun olanlarından alıyorum ve 5'lik
olarak kesiyorum.
|
|
matris devre |
|
paralel port için 1 x DB25 connector. |
|
1 x LED |
|
Breadboard. Biz burada bunu kullanmayacağız,
ancak AVR ile ilgili başka deneyler yapacaksanız,
oldukça işinize yarayacaktır.
Ben, Mikroişlemci ile kristali matris devresi üzerinde
bırakmanızı ve giriş/çıkış hatlarını kısa kablolar ile
breadboard'a bağlamanızı öneririm.
|
Yukarıdakilere ek olarak 5V'luk doğru akım güç kaynağına
gereksiniminiz olacaktır. Onun yerine 4.5V'luk pil de kullanabilirsiniz.
Programcı donanımını yapılandırmak
AT90S4433 devre içi programlamaya (ISP ın circuit programming) yaramaktadır.
Yani, Mikroişlemciyi programlamak için devreden çıkartmanıza
gerek yoktur.
Programcı donanımını 50 ila 150 Euro arasında hazır olarak
satıldığını göreceksiniz. Bu kadar para harcamanıza gerek yoktur.
Linux, uisp yazılımı ve paralel port ile kolayca bir AVR programcısı
oluşturabilirsiniz.Basit bir kablodur. Programcı için kabloyu aşağıdaki şekilde
bağlayınız:
AVR'deki uç |
paralel porttaki uç |
SCK (19) |
Strobe (1) |
MISO (18) |
Busy (11) |
MOSI (17) |
D0 (2) |
Reset (1) |
Init (16) |
GND |
GND (18) |
kablo 70cm den daha uzun olmamalıdır.
Yazılım yazmak
AT90S4433 gcc'nin de yardımıyla C de programlanabilir.
Biraz AVR assembler bilmek yararlı olabilir, ancak gerekli değildir.
AVR libc kütüphanesi
avr-libc-reference
ile birlikte gelmektedir ve burada fonksiyonlar ile ilgili açıklamalar
yer almaktadır. Harald Leitner AVR'yi GCC ile nasıl kullanılacağına dair
birçok örneğin yer aldığı belge yazmıştır (
haraleit.pdf,
286Kb, gerçeğini
http://www.avrfreaks.net/AVRGCC/
adresinden bulabilirsiniz.).
Atmel'in sanaldoku yöresinden
(www.atmel.com avr products
-> 8 bit risc-> Datasheets kısmına bakın.),
tümünü
(yerel kopya: avr4433.pdf,
2361Kb) dan indirebilirsiniz.
Tüm registerleri ve MİB (CPU) nın nasıl kullanılacağını
anlatılmaktadır.
4433'yi kullanırken unutmamanız gereken şey, sadece 128 Byte belleğe
4K'lık EEPROM'a sahip olduğudur.
Bunun anlamı büyük veri yapıları ve karakter dizileri
tanımlamamanız gerektiğidir. Programız, içi içe geçmiş veya özyinelemeli fonksiyonlar
kullanmamalıdır.
char string[90];
gibi tanımlama yapmak çok fazla bellek gerektirir. Integer 16 bittir.
Eğer, daha küçük tamsayıya gereksiniminiz varsa,
unsigned char i; /* 0-255 */
kullanınız. Ancak, ne kadar büyük programlar yazabileceğinizi
gördüğünüzde çok şaşıracaksınız. Gerçekten müthiş bir
işlemcidir!
Tüm teoriden daha iyisi gerçek bir örnektir. 0.5 saniye arılaklarla
yanıp sönen bir LED için bir program yazacağız.
Pek kullanışlı değil, ancak başlamak ve yazılım geliştirme
ortamını ile programcıyı sınamak için yeterlidir.
void main(void)
{
/* enable PD5 as output
*/
sbi(DDRD,PD5);
while (1) {
/*
led on, pin=0 */
cbi(PORTD,PD5);
delay_ms(500);
/*
set output to 5V, LED off */
sbi(PORTD,PD5);
delay_ms(500);
}
}
Yukarıdaki program parçasından, ne kadar kolay yazıldığını
görüyorsunuz. Gördüğünüz sadece ana programdır, delay_ms fonksiyonu
tüm program
(avrledtest.c) da göreceksiniz.
PD5 ucunu çıkış olarak kullanmak istiyorsanız,
D (DDRD) bağlantı noktası için olan PD5 bitini ayarlamanız (açmanız)
gerekecektir. Daha sonra,
PD5'i cbi(PORTD,PD5) (5 biti kapat) fonksiyonu ile 0V'a veya
sbi(PORTD,PD5) (PD5 aç) fonksiyonu ile 5V'a
ayarlayabilirsiniz. "PD5"'in değeri io.h dan çağrılan io4433.h'de tanımlanmıştır.
Bunun için endişelenmenize gerek yoktur. Eğer, Linux gibi
çok kullanıcılı/süreçli ortamlar için programlar yazdıysanız,
sonsuz dögülü program yazmanın pek akkılıca bir iş olmadığını ve
çok fazla MİB zamanı gerektiğini ve sisteminizi yavaşlattığını
bilirsiniz. Ancak, bizin birden fazla sürecimiz yok ve başka çalışan
programımız da yok. Hatta çalışan bir işletim sistemi
bile yok. Dolayısıyla sonsuz döngü kullanmak normaldir.
Derleme ve yükleme
make'i çalıştırmadan önce /usr/local/atmel/bin nin
yoltanımınızda olduğundan emin olunuz. Eğer, isterseniz
.bash_profile veya .tcshrc dosyalarında aşağıdaki gibi
değişiklikler yapabilirsiniz:
export PATH=/usr/local/atmel/bin:${PATH} (for
bash)
setenv PATH /usr/local/atmel/bin:${PATH} (for tcsh)
Paralel port ve uisp'yi AVR'yi programlamak için kullanıyoruz.
Uisp çekirdeğin ppdev arayüzünü kullanmaktadır.
Dolayısıyla aşağıdaki çekirdek modüllerine gereksinim vardır:
# /sbin/lsmod
parport_pc
ppdev
parport
/sbin/lsmod komutuyla, modüllerin yüklenip yüklenmediğini
denetleyiniz. Eğer, yüklenmemiş iseler, root olarak aşağıdaki
komutları kullanarak modülleri yükleyiniz:
modeprobe parport
modeprobe parport_pc
modeprobe ppdev
Bu komutları bilgisayarın açılışında otomatik olarak çalıştırmak
iyi bir fikir olabilir. Bu komutları rc kabuk programına ekleyebilirsiniz
RedHat de /etc/rc.d/rc.local).
ppdev arayüzünü, normal kullanıcı olarak kullanabilmek için,
bir defaya mahsus olarak root kullanaıcısı olarak açağıdaki komut ile hak
vermeniz gerekmektedir:
chmod 666 /dev/parport0
Ayrıca, yazıcı daemon'un paralel portta çalışmadığından emin olunuz.
Çalışıyorsa, programcı kablosunu bağlamadan önce onu durdurunuz.
Şimdi, Mikroişlemciyi programlamak için gerekli herşeye sahibiz.
Programımızın arşiv dosyasında (avrledtest-0.1.tar.gz)
make dosyası vardır. Yapmanız gereken yalnızca:
make
make load
komutlarını çalıştırmaktır.
Bunlar yazılımı derleyecektir. Tüm komutları ayrıntılı olarak
anlatmayacağım.
Makefile
adresinden görebilirsiniz. Ben de zaten hepsini hatırlayamıyorum.
Başka bir program yazmak istiyorsanız, tek yapmanız gereken,
avrledtest geçen yerlere kendi program isminizi yazmanızdır.
Bazı ilginç binutils'ler
Derleme sürecinden daha ilginç olan bazı binutils'ler dir:
avr-objdump -h avrledtest.out
Komutu, programımızdaki farklı bölümlerin boyutlarını
göstermektedir. .text komut kısmıdır ve flash EEPROM'a yüklenmektedir.
.data
static char str[]="hello";
ilk değeri atanmış veriler ve .bss ilk değeri atanmamış
verilerin içerildiği kısımdır.
Bizim örneğimizde ikisi de sıfırdır. .eeprom eeprom'da
tutulan değişkenler içindir. Ancak, ben bunu hiç kullanmadım.
stab ve stabstr hata ayıklamak içindir ve AVR'ye yüklenmeyecektir.
avrledtest.out: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000008c 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00800060 0000008c 00000120 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00800060 0000008c 00000120 2**0
ALLOC
3 .eeprom 00000000 00810000 00810000 00000120 2**0
CONTENTS
4 .stab 00000750 00000000 00000000 00000120 2**2
CONTENTS, READONLY, DEBUGGING
5 .stabstr 000005f4 00000000 00000000 00000870 2**0
CONTENTS, READONLY, DEBUGGING
Tabii ki avr-size komurunu kullanarak daha sıkıştırılmış halini
elde edebilirsiniz:
avr-size avrledtest.out
text data bss dec hex filename
140 0 0 140 8c avrledtest.out
AVR ile çalışırken text+data+bss nin 4K'yı
ve data+bss+stack (stack'ın boyutunu görmenize imkan yoktur,
çünkü kullandığınız iç içe olan fonksiyonlara bağlıdır)
128 Byte'ı geçmemesine dikkat etmeniz gerekmektedir.
Bir de aşağıdaki komut çok ilginçtir:
avr-objdump -S avrledtest.out
Bu komut programın assembler kodunu yaratacaktır.
Sonuç
Şimdi artık AVR donımı ve GCC ile kendi projelerinizi
başlatacak yeteri kadar bilgiye sahipsiniz.
Tabii ki LinuxFocus'ta daha ilginç ve karmaşık projeleri anlatan
yazılar olacaktır.
Kaynaklar