GCC libc-1.0.4 ile AVR mikroişlemcisini 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 Linux'u, kendi donanımını geliştirmek için gerçekten çok iyi bir işletim sistemi olduğu için beğenmektedir.

Abstract:[Here you write a little summary]

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.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

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]
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]
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

mirror server hosted at Truenetwork, Russian Federation.