XC8 Başlangıç

Başlatan Mucit23, 04 Mayıs 2014, 01:08:52

Tagli

Proje ayarlarında header dosyaları için bir include adresi (veya birden fazla) tanımlama gerekiyordu ama tam yerini tarif edemeyeceğim, şimdi önümde bulunan bilgisayarda yüklü değil. Aynı şeyi .c dosyaları için de yapmak gerekiyor olabilir. Yarın bir bakarım.

Aslında galiba include yollarını (header seach path) tanımlamak yerine #include "adres/dosya_adi" şeklinde doğrudan yol da yazılabilir ama XC8 rehberinde CCI (Common C Interface) standardı uyarınca bu tavsiye edilmiyor. Adres include yoluna eklenip #include "dosya_adi" şeklinde yazılması öneriliyor.
Bkz. XC8 C Compiler User's Guide 2.4.3 Header File Specification

Ancak, bir süre ben de o şekilde kullandıktan sonra eski usule geri döndüm. Klasör içinde saklamak biraz daha zahmetli olabiliyor. Genelde proje klasörü içine src diye bir klasör açıp tüm .c ve .h dosyalarını oraya koyuyorum. Zaten genelde proje çok büyük olmuyor. Belki harici kütüphaneleri lib adında bir klasörde toplamak iyi bir organizasyon şekli olabilir. Tartışmaya açık bir konu bu.
Gökçe Tağlıoğlu

Mucit23

#16
Hocam başka bir proje dosyası oluşturup çözdüm problemi.

Proje ağaıcı konusuna gelirsel, Bende STM32 den alıştım bu olaya. Bir proje ile uğraşırken proje ağacının düzenli olmasını istiyorum. Gerçi STM32 ilede karıştırmamak lazım. STM32'de kendi iç donanımlarını kullanabilmek için bile kütüphanesini eklemek gerekiyor. Bu yüzden çok karmaşa oluyor.

Dediğiniz gibi tartışmaya açık bir konu.

mesaj birleştirme:: 04 Mayıs 2014, 23:25:22

iyi gitmiyoruz.

kütüphane eklemede ciddi sıkıntılar çekiyorum. Mesela LCD kütüphanesi ekleyeceğim. LCD.h ve LCD.c Dosyalarım proje klasöründe.

Header Files ve Source Files Dosyalarının içine LCD.h ve LCD.c yi ekliyorum ama dosya bulunamıyor hatası alıyorum..

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Pid_Test.X.production.hex
make[2]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe" --pass1  --chip=16F877A -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/main.p1  main.c 
main.c:3: error: (141) can't open include file "LCD.h": No such file or directory
make[2]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make[1]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
(908) exit status = 1
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUİLD FAILED (exit value 2, total time: 307ms)


mesaj birleştirme:: 05 Mayıs 2014, 00:56:20

projeye bir dosya include ederken <> işareti ile çift tırnak "" arasında ne fark var.

Yukarıdaki hatayı çözdüm projeye dosya include ederken çift tırnak kullanmak gerekiyor.
Ayrıca aynı isimli library dosyalarını (Örneğin lcd.h ve lcd.c) projeye eklerken header files altına lcd.h'ı eklemek yeterli. LCD.c'yi eklemeye gerek yok.

Sonradan main.c içerisinde #include "lcd.h" komutu ile gerekli dosyayı projeye dahil ettim. Şimdide aşağıdaki hatayı alıyorum.

Örneğin LCD_init() fonksiyonunu çağırıyorum. Gelen hata aşağıdaki gibi.
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Pid_Test.X.production.hex
make[2]: Entering directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe" --pass1  --chip=16F877A -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/main.p1  main.c 
"C:\Program Files (x86)\Microchip\xc8\v1.31\bin\xc8.exe"  --chip=16F877A -G -mdist/default/production/Pid_Test.X.production.map  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"     -odist/default/production/Pid_Test.X.production.elf  build/default/production/main.p1     
Microchip MPLAB XC8 C Compiler (Free Mode) V1.31
Copyright (C) 2014 Microchip Technology Inc.
:0: error: undefined symbol:
        _lcd_init(dist/default/production\Pid_Test.X.production.obj) 
(908) exit status = 1
make[2]: *** [dist/default/production/Pid_Test.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'
make[1]: Leaving directory `C:/Users/My_PC/Desktop/Son Projeler/Pid_Motor_Kontrol/XC_Software/Pid_Test.X'

BUİLD FAILED (exit value 2, total time: 1s)


2 saattir uğraşıyorum. Library eklemeyi adam akıllı çözemedim  :-\
@meftun nerelerdesin :o

Mucit23

Güncel

Çözemedim arkadaşlar.

JKramer

#18
Projeye lcd.c dosyasını eklemelisiniz. Projeye eklemek derken main.c içinde #include "lcd.c" yazmayı kastetmiyorum. Sonuçta tüm .c dosyaları tek tek (ayrı ayrı) derlenebilmesi lazım (object file oluşması için), siz lcd.c dosyasını eklemezseniz, program olmayan bir şeyi derleyemez.

Ek: http://www.cprogramming.com/compilingandlinking.html
http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work

Tagli

Proje klasörünü sıkıştırıp verebilirsen bir bakayım.
Gökçe Tağlıoğlu

Mucit23

Hocam proje dosyası burada
http://yadi.sk/d/tk32OGm3P5jmJ

LCD kütüphanesi benim stm32 ile kullandığım kütüphane. pic ile çalışacak şekilde düzenledim. Derleyebilsem kodlarda hata varmı yokmu göreceğim.

Başka bir kütüphaneyi yani aynı isimli c ve h dosyalarını nasıl projeye ekleyeceğimi anlatırsanız sevinirim.

Tagli

.c dosyası projeye eklenmemiş. Ekleyince derleme yapıyor. Eklemeyi resim ile gösterdim. Gerçi birkaç ufak sorun daha vardı onları da düzelttim. Örneğin LCD.h içinde xc.h include edilmemişti. LCD_E'nin kullanımıyla ilgili de birkaç yazım hatası vardı. Düzeltmediğim sadece bir warning kaldı, işaretli sayının işaretsiz değişkene atanması ile ilgili. Çalışma şeklini incelemediğim için o konuda yorum yapmaktan kaçındım.



Proje Linki: http://s3.dosya.tc/server22/FVkMp4/Pid_Test.X_duzeltilmis_.zip.html
Gökçe Tağlıoğlu

Mucit23

Hocam oraya c dosyası eklediğime eminim. Sonradan kaldırdım. Başka hatalar alıyordum. Bakayım tekrardan..

M_B

@Mucit23 Hocam;
XC8 icin Mplabx ile ugrasmaya gerek var mı ki?
Mplab icinde de xc8 'i kullanabiliyoruz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

t2

#24
Uğraşmak ne kelime? 

Mplabx varken Mplab kullanılmaz.  Mplabx > Mplab

seyityildirim

@Gökhan BEKEN hocam yeni konu açmayayım dedim. LAT komutunu xc8 tanımadı.

LATB=0xFF;

yazdım. hata mesajı şu
unable to resolve identifier LATB

t2

Kullandığınız picde LATB register yoktur. bu yüzden tanımamış olabilir.

Gökhan BEKEN

t2'nin dediği gibi bütün PIC'ler desteklemiyor. Bildiğim kadarıyla eski 16f serilerinde yok bu komut.
Özel mesaj okumuyorum, lütfen göndermeyin.

RaMu

16Fxx instruction set diye aratabilirsin, veya;
16F84 ün datasheet inde
9.0 INSTRUCTION SET SUMMARY
kısmında, Table 9.2 de hangi komutların olduğunu görebilirsin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

seyityildirim

Çok teşekkürler... kullandığım pic 16f84a idi. datasheetine baktım böyle bir register yok. tekrar teşekkürler