AVR - GCC'nin ürettiği HEX dosyası neden bu kadar kabarı

Başlatan Elektroemre, 12 Şubat 2008, 17:40:19

Elektroemre

Öncelikle merhaba arkadaşlar,
Atmel'le uğraşmaya yeni başladım, programlarımı " C " dilinde AVR-GCC 'de yazmaya çalışıyorum.İlk başlarda PIC VE Basic'e alışmış biri olarak inanılmaz zorluk çektim (makefile olayı,Hazır komutlar yerine library dosyalarının olması vb. nedenlerle) ancak 3-4 günlük ısınması turlarından sonra ilk programcıklarımı derlemeye başladım.

Şu an ise 2x16'lık LCD'ler yazı yazmak için kod yazmaya çalışıyorum başardımda ancak büyük bir sorun var ortada, sadece LCD'ye 2 satır yazı yazmak için derlediğim program 2000 küsür word!!! Bu rakamı görünce gözlerime inanamadım.Ben PIC için Basic dilinde bile LCD'ye 2 satırlık yazı için yazdığım programın HEX'i 500 - 600  Word'u geçmiyordu.

Kaldıki ATMEL mikrokontrolcülerin ASM'si PIC'lere göre daha gelişmiş olduğundan ve kodları C dilinde yazmam sebebiyle en fazla 300-400 Word'luk bir HEX dosyası bekliyordum ancak hayak kırıklığına uğradım :(
Bu HEX dosyasını bu kadar kabarık olmasınının nedeni nedir?Acaba MakeFile içerisindeki ayarlardan veya kullandığım Library dosyasından mı kaynaklanıyor?

Kod aşağıda >> www.berik.net <<ten alıntıdır.
http://berik.net/avr/projeler.html'de LCD Bağlantısı başlığı altındadır.

/*
 * Cem Berik
 * www.berik.net
 */

#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd.h"

//Bu satir ile bir stream objesi yaratilip lcd_put_char fonksiyonuna
//yönlendiriliyor. Printf ve türevleri için gerekli
FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);

//Ana Program Fonksiyonu
int main(void){
lcd_init();		//lcd'yi hazirla

//standart giris ve cikis lcd_str olsun
stdout = stdin = &lcd_str;

lcd_goto(1,4);  //satir 1, sutun 4e git
fprintf_P(stdout,PSTR("LCD Test"));

lcd_goto(2,1);  //satir 2, sutun 1e git
fprintf_P(stdout,PSTR("www.berik.net"));


while(1){		//sonsuz dongu
}
}


Şimdilik ATmega8'i isis'te simulasyon yaparak kullanıyorum ama hayata geçirmek isteğim projelerde ATTiny2313'ü kullanmayı düşünüyorum, ancak Mikrokontrolcünün bütün hafızası bi LCD'ye bilgi göndermekle mi bitecek?

Sormak isteğim bir soru daha var ATMEL'lerin PORT'larına direkt olarak Bit bazında erişemiyor muyuz? Yani PORTB.1=1 gibi ifade kullanamazmıyız?İllaki maskeleme işlemi yaparak mı isteğimiz portlara erişmek zorundayız?

Sitede ATMEL AVR ile ilgilenenlerin sayısını çok az olduğunu biliyorum ancak yinede bu konuda deneyimli üstadlar var ve yardımarını bekliyorum.

Saygılar....

parda

Merhaba;

Bu büyüklüğün nedeni kullanmış olduğun printf komutu.
make file dan printf ayarları var ama yinede sözünü ettiğin boyuta inmez, mecbur değilsen printf kullanma

Ayrıca aynı durum pic c derleyicileri içinde fazlasıyla geçerlidir.

Kolay gelsin
Bildiğim tek şey, hiç bir şey bilmediğimdir.

Elektroemre

Alıntı yapılan: "parda"Merhaba;

Bu büyüklüğün nedeni kullanmış olduğun printf komutu.
make file dan printf ayarları var ama yinede sözünü ettiğin boyuta inmez, mecbur değilsen printf kullanma

Ayrıca aynı durum pic c derleyicileri içinde fazlasıyla geçerlidir.

Kolay gelsin
Peki ben LCD'ye hangi komutla yazı yazdırmalıyım yada başka bir library dosyası mı kullanmalıyım az yer kaplaması için?

arslan74

Merhaba,

Birde şöyle dene;

lcd_goto(2,1);
lcd_str("www.berik.net");


Selamlar

parda

Öncelikle Lcd ye tek karakter gonderen bir fonksiyon yazıp bu fonksiyonu kullanarak dizi gönderen kullanacağın fonksiyonu yazmalısın. Bu dediğim fonksiyonlara örnek forumda ve internette bolca bulacağını düşünüyorum rs232 için yapılmış örneklerede bakabilirsin.

Kolay gelsin
Bildiğim tek şey, hiç bir şey bilmediğimdir.

Elektroemre

@arslan74 kodu dediğiniz gibi yazınca
main.c:25: error: called object 'lcd_str' is not a function

hatsını aldım.Fonksiyonun bulunamadığına dair.

@parda sizin söyediğiniz en mantıklısı.Ancak kendim fonksiyon yazacak kadar iyi C bilgisine sahip değilim.Ancak AVRFreaks gibi sitelerden bulabileceğimi umuyorum.

Saygılar...

arslan74

Merhaba,

LCD de yazı yazdırmak cok basit bir işlem. Eğer tek bir katakter gönderen bir fonksiyon varsa. Örneğin " lcd_putch" gibi. O zaman benim kullandığım kodu kullanabilirsin. Anci-C standartına göre yazıldığı için zorunsuzca kullanabilirsin.

/* write a string of chars to the LCD */

void lcd_puts (const char * s)
{
	while(*s)   // yazının sonuna gelinmiş mi?
		lcd_putch(*s++);  // Tek karekter bilgi gönderir.
}



Ama sen kodunu aşağıdaki şekilde dene.


/* write a string of chars to the LCD */

void lcd_puts (const char * s)
{
	while(*s)   // yazının sonuna gelinmiş mi?
		lcd_putchar(*s++);  // Tek karekter bilgi gönderir.
}



Selamlar

Elektroemre

@arslan74 yardımların için teşekkür ederim.Ancak yine çalıştırmayı başaramdım.Anladımki C dili Basic gibi 2 günde öğrenilecek bir dil değil.
İlk önce daha temel şeyleri iyiyce kavrayıp daha sonra LCD vs. gibi uygulamalara geçmek lazımmış.

Bu arada arkadaşalar dün sırf deneme amaçılı olarak PIC için Proton+'ta sadece LCD'ye yazı yazan bir programı derlediğimde sadece 150 Word civarında  bir HEX dosyası derlendi!
Aynı şekilde ATMEL için FastAVR'de (Atmel'in Basic derleyicisi) LCD için derlediğim program 1200 Word civarı çıktı!

Bu denemelerin sonucunda artık kavram karmaşası yaşamaya başladım.
Sitede bir çok arkadaş C dilinin Basic diline göre Flash hafızayı daha verimli kullandığını söylüyorlardı.
C diline geçmek istememin en büyük sebeplerinden biriyde buydu.Ama artık yanlış yoldamıyım diye düşünmeye başladım.
Yola PIC ve Basic ile yolla devam etmek en iyisi mi acaba?

Saygılar....

arslan74

Alıntı yapılan: "Elektroemre"@arslan74 yardımların için teşekkür ederim.Ancak yine çalıştırmayı başaramdım.Anladımki C dili Basic gibi 2 günde öğrenilecek bir dil değil.
İlk önce daha temel şeyleri iyiyce kavrayıp daha sonra LCD vs. gibi uygulamalara geçmek lazımmış.

Bu arada arkadaşalar dün sırf deneme amaçılı olarak PIC için Proton+'ta sadece LCD'ye yazı yazan bir programı derlediğimde sadece 150 Word civarında  bir HEX dosyası derlendi!
Aynı şekilde ATMEL için FastAVR'de (Atmel'in Basic derleyicisi) LCD için derlediğim program 1200 Word civarı çıktı!

Bu denemelerin sonucunda artık kavram karmaşası yaşamaya başladım.
Sitede bir çok arkadaş C dilinin Basic diline göre Flash hafızayı daha verimli kullandığını söylüyorlardı.
C diline geçmek istememin en büyük sebeplerinden biriyde buydu.Ama artık yanlış yoldamıyım diye düşünmeye başladım.
Yola PIC ve Basic ile yolla devam etmek en iyisi mi acaba?

Saygılar....

Sakın böyle bir hattaya düşme yoksa ilerde cok pişman olursun. C dili öğrenilmesi Basic kadar cabuk olmaz. Bu işte cok emek harcaman gerek. Ancak doğru dürüst C dilini kullanabilirseniz, o zaman C gercek gücünü keşif etmiş olursunuz. Basic işi hazır komutlarla hallettiği için, ancak bu işi amatör seviyede yapmayı düşünüyorsanız tavsiye ederim. Ama mühendislik ve meslek olarak bu işi yapmak istiyorsan kesinlikle C öğrenmen gerek. İlk denemede fiyasko ile karşılaşip pes etmek cok yanlış olur. Herkez ilk denemesinde başarabilseydi ortalık C programcısından gecilmezdi. Seni bir adım ileri götürecek olan tek yılmadan yaptığın denemelerein sonucun da ulaşacağın başarıdır. Öncelikle C dili cok iyi öğrenmen gerek. Bunun için ben Necati Hocamızın bir E-Bootunu yayınlamıştım. Öncelikle onu alıb baştan sonuna kadar iyi oku. C bütün ayrtınlılarını anlatiyor, üstelik Türkçe kaynaktır ve ceviri değil kendi yazdığı bir kitaptır.

Sana verdiğin örnek kesinlikle çalışması gerek. Sen bir yerler de yanlışlık yapiyorsun. Öyle olmasaydı ben 1k'lik PIC'e LCD ekranında bilgi yazamazdım. Printf, sprint, fprintf gibi fonksiyonlar ortalama 2K yer kaplar. Bu PIC içinde gecerlidir. O yüzden ben genllikle bu fonksiyonu kullanmamaya çalışıyorum. Ancak Standart fonksiyon C nin taşınabilirniğini artırdığı için, genellikle kullanılıyor. Program hafızası yüksek olan işlemciler için 2K fazla yer işgal etmiyor. okunaklığı artığı için genellikle kullanılıyor.

Ben Hi-Teck bölümünde C için eğitim dökümanı hazırladım okumanızı tavsiye ederim. size faydası olacağını tahmin ediyorum.

Hata gelince olmayan kısımın neresi olduğunu yazabilirseniz sorunun cözümün de yardımcı olabiliriz. sizin yapmanız gereken proje upload etmektir.

Selamlar

Elektroemre

@arslan74 yazdıklarınız düşüncelerimi değiştirdi.
Necati Hocanın notlarını az önce indirdim, ilk 20 sayfasını hemen okudum ve C 'nin ne kadar kuvvetli bir dil olduğunu gördüm.
C Hakikaten öyle hemen bırakılacak bir dil değilmiş ama sabır istiyor.

Şimdilik LCD'ye yazı yazdırmayı filan bıraktım ve C'yi daha temelinden öğrenmeye karar verdim.

C'nin özellikle taşınabilirliği beni çok etkiledi, düşünsenize bir kere öğrendikten sonra PIC'e,  Atmel'e, ister ARM'ye hatta isterseniz bilgisayara program yazın.
C'yi öğrenmek için sabır ve kaynak gerekiyor.Sitede çok fazla kaynak mevcut olduğuna göre bana lazım olan şey sabır galiba:D

Bu arada Hi-Tech bölümünde yayılamış olduğunuz dökünmaları bi kaç önce indirmiştim gerçekten güzel kaynak vakit buldukça göz atıyorum ancak Hi-Tide'yi bir türlü Vista'da çalıştıramadığımdan kodları denemeyedim ancak Hi-Tech'i  MPLAB' a entegre edip en kısa sürede deneyeceğim.

Yardımlarınız için çok teşekkür ederim...

Saygılar...

SpeedyX

Verilen sitenin vitrin bölümünde yazanları okuyan insanlar bu avr yi çok bir halt sanarlar.

AVRcilerin çoğu (hepsi değil) PIC leri kötülerler ama PIC kullananların AVR ler hakkında kötü laf ettiğini görmedim pek :)
Adam daha fft nin ne olduğunu bilmiyor işlemciler hakkında ahkâm kesiyor...
Bence bu iş 30-40 keywordden oluşan C yi bilmekle de bitmiyor, eğitim şart!