| ![[Photo of the Author]](../../common/images/Guido-S.gif)  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![[Illustration]](../../common/images2/article352/illustration.gif)  Ö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
    ![[test circuit]](../../common/images2/article352/avrm8ledtest_circuit.jpg)
    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). ![[Linux AVR programmer]](../../common/images2/article352/avr_programmer.jpg)
    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