| 
 ![[Photo of the Author]](../../common/images/Guido-S.gif)  tarafından  Guido Socher (homepage)
 
 Yazar hakkında:
 
 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.
 
 Türkçe'ye çeviri:
 Erdal MUTLU <erdal(at)linuxfocus.org>
 
 İçerik:
 | 
 
AVR Mikroişlemcisini GCC ile programlamak
 ![[Illustration]](../../common/images/article231/illustration.jpg) 
Özet:
    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.
    
     
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]](../../common/images/article231/schematic.gif) 
 
    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]](../../common/images/article231/avr4433.jpg)  | 1 x AT90S4433, Atmel 8 bit Avr risc işlemcisi. | 
      
        | ![[socket]](../../common/images/article231/14pinicsocket.jpg)  | 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]](../../common/images/article231/resistor_crystal_capacitor.jpg)  | 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]](../../common/images/article231/connector.jpg)  | Programcı için herhangi 5 pin connector/socket.
        Ben genellikle daha uzun olanlarından alıyorum ve 5'lik
        olarak kesiyorum. | 
      
        | ![[matrix board]](../../common/images/article231/board.jpg)  | matris devre | 
      
        | ![[db25]](../../common/images/article231/db25male.jpg)  | paralel port için 1 x DB25 connector. | 
      
        | ![[led]](../../common/images/article231/led.jpg)  | 1 x LED | 
      
        | ![[beardboard]](../../common/images/article231/breadboard.jpg)  | 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ı]](../../common/images/article231/pcable.jpg)
    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
    
  
      
 
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.
2002-03-21, generated by lfparser version 2.27