AVR Mikroişlemcisini GCC ile programlamak

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

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]

[Illustration]

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.
[circuit diagram]
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.
[avr] 1 x AT90S4433, Atmel 8 bit Avr risc işlemcisi.
[socket] 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.
[resistor crystal capacitor] 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
[connector] Programcı için herhangi 5 pin connector/socket. Ben genellikle daha uzun olanlarından alıyorum ve 5'lik olarak kesiyorum.
[matrix board] matris devre
[db25] paralel port için 1 x DB25 connector.
[led] 1 x LED
[beardboard] 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. [AVR programcı]
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