microchip c18 de global değişkenler için yer almada problem var
MPLINK 4.20, Linker
Copyright (c) 2008 Microchip Technology Inc.
Error - section 'segdata4' can not fit the absolute section. Section 'segdata4' start=0x00000400, length=0x0000012b
Errors : 1
#define MAX_TIMERS 20
#pragma udata segdata4 = 0x400
struct Object{
struct Timers{
unsigned char ID;
unsigned char isTa:1;
unsigned long counter;
unsigned char isP:1;
unsigned long per;
void * a;
}tTimers[MAX_TIMERS];
unsigned char first;
unsigned char isT:1;
}Obj;
CCS te bu kodu denediğimde böyle bir hata vermiyor, CCS te 4K lık bir struct bile oluşturabiliyorum, C18 de ise o segmentten büyükse hata veriyor, burada Obj nin boyutu yaklaşık 200 byte
Bunun bir çaresi var mı?
Kullandığınız .lkr uzantılı dosyayı açıp, iki ram segmentini birleştirmeniz halinde çözersiniz. Oluşturduğunuz alan 256 bayttan büyük olduğundan, 1 RAM segmentine sığmıyor.
C18 profesyonelliği ve diğer derleyicilere göre daha alt seviyede C kullanarak program geliştirme ortamı sunduğundan birçok kontrol programcıya bırakılmıştır.
selam;
Ben C18 kullanıyorum bu yaşadıgınız problemin nedeni bir nevi bank hatası,
banklar 256 byte'dan oluşuyor.
18F452 nin datashette'inde sayfa 46 'ya bakarsanız orada var bu anlattıgım.
C18 GLOBAL olarak tanımlanan degişkenleride 0 degeriyle BAŞLATMAZ.
ancak çok iyi hazırlanmış dökümantasyonu var.
microchip'in application notlarındada örnek c18 kodlarına ulaşabilirsiniz.
bu şekilde bir deneyin
#define MAX_TIMERS 20
#pragma udata Object = 0x400 //Object olarak tanımlayın
struct Object{
struct Timers{
unsigned char ID;
unsigned char isTa:1;
unsigned long counter;
unsigned char isP:1;
unsigned long per;
void * a;
}tTimers[MAX_TIMERS];
unsigned char first;
unsigned char isT:1;
}Obj;
birde tanımladıgınız nesnenin uzunlugu 256byte'ı geçmemeli.
esen kalın;
Aşağıdaki linker kodunu bir projem için modifiye etmiştim. Bankları birleştirerek yaklaşık 1280 byte'lık veri bloğunu RAM'a yerleştirmiştim. Aşağıdaki kodu incelerseniz, linker mantığını daha iyi anlayacaksınızdır.
// File: 18f8722.lkr
// Sample linker script for the PIC18F8722 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f8722.lib
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
CODEPAGE NAME=page START=0x2A END=0x1FFFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF003FF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=Info START=0x100 END=0x5FF PROTECTED
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
DATABANK NAME=gpr8 START=0x800 END=0x8FF PROTECTED
DATABANK NAME=gpr9 START=0x900 END=0x9FF
DATABANK NAME=gpr10 START=0xA00 END=0xAFF
DATABANK NAME=gpr11 START=0xB00 END=0xBFF PROTECTED
DATABANK NAME=gpr12 START=0xC00 END=0xCFF PROTECTED
DATABANK NAME=gpr13 START=0xD00 END=0xDFF
DATABANK NAME=gpr14 START=0xE00 END=0xEFF
DATABANK NAME=gpr15 START=0xF00 END=0xF5F
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=INFO RAM=Info
SECTION NAME=TCBBUFFER RAM=gpr8
SECTION NAME=TCB_MEM RAM=gpr11
SECTION NAME=CONFIG ROM=config
STACK SIZE=0x100
Alıntı yapılan: "fatihvelid"Aşağıdaki linker kodunu bir projem için modifiye etmiştim. Bankları birleştirerek yaklaşık 1280 byte'lık veri bloğunu RAM'a yerleştirmiştim. Aşağıdaki kodu incelerseniz, linker mantığını daha iyi anlayacaksınızdır.
// File: 18f8722.lkr
// Sample linker script for the PIC18F8722 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f8722.lib
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
CODEPAGE NAME=page START=0x2A END=0x1FFFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF003FF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=Info START=0x100 END=0x5FF PROTECTED
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
DATABANK NAME=gpr8 START=0x800 END=0x8FF PROTECTED
DATABANK NAME=gpr9 START=0x900 END=0x9FF
DATABANK NAME=gpr10 START=0xA00 END=0xAFF
DATABANK NAME=gpr11 START=0xB00 END=0xBFF PROTECTED
DATABANK NAME=gpr12 START=0xC00 END=0xCFF PROTECTED
DATABANK NAME=gpr13 START=0xD00 END=0xDFF
DATABANK NAME=gpr14 START=0xE00 END=0xEFF
DATABANK NAME=gpr15 START=0xF00 END=0xF5F
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=INFO RAM=Info
SECTION NAME=TCBBUFFER RAM=gpr8
SECTION NAME=TCB_MEM RAM=gpr11
SECTION NAME=CONFIG ROM=config
STACK SIZE=0x100
tam olarak aradığım cevap, teşekkürler
Arkadaşlar MPLAB (v8.50) C18'e yeni başlıyorum. Elimde birkaç tane (yazılım açısından eksik ya da hatalı olduğunu zannetmiyorum) metin dosyasına kayıtlı c kod dosyası var. Bunu proje dosyası haline getirmem için hangi yolu izlemem lazım? Hıtech' ile MPLAB'ı entegre kullanırken izlediğim yolu da denedim ama olmadı. Birisi bana bunu adım adım anlatabilir mi?
Boş bir proje oluştur önce. Sonra elindeki c dosyalarını proje klasörünün içine at. Proje menüsünde "add files to project" tarzı bir seçenek olmalı. Bunun sayesinde dosyaları projene ekleyebilirsin. Bu başlıkta tartışılan hafızaya oturtma sorunu varsa, linker script dosyasını da projeye eklemen gerekecektir.
Sen hangi adımları uyguluyor ve başarısız oluyorsun?
Benim izlediğim yol şu;
File>New deyip yeni sayfa açıyor ve kodu oraya yapıştırıyorum. Farklı kaydet'i seçiyor ve kayıt türünü C olarak belirliyor ve masaüstündeki boş dosyama kaydediyorum. Sonra Project Wizard--İşlemci Seçimi--Dil Seçimi--Ve son olarak ta projemin kaydedileceği yeri ve proje adını soruyor. Adını gireceğim sırada listede baştan kayıtladığım .C uzantılı olan C1.c çıkıyor buna ok dediğimde de
Overwrite Existing File?
File 'C:\Documents and Settings\user\Dekstop\C18 SAMPLES\C1\C1.c ' already exists. Overwrite?
uyarısı geliyor. Mecburen kabul edip tamamlıyorum. Derlediğimde de başka bir hata veriyor. Söylediğinizi birkaç yolla yaptım ama değişen bir şey yok. Belki linker dosyasını eklemediğim için hata veriyor ama daha neredeyse workspace oluştururken hata veriyor.Büyük ihtimalle proje oluşturma aşamasında hata yapıyorum ama nerede? Assembly ile proje oluştururken böyle bir hata almıyorum.
Evet arkadaşlar bir cevap bekliyorum. Ayrıca yukarıdaki hataya rağmen derleme ortamına geçip derlediğimde de syntax hatası alıyorum. Sanırım derleme prosedürünü baştan yanlış ve eksik yaptığım belli. Text'ten kopyaladığım metini bile MPLAB için C dosyası haline getiremiyorum.
Sakıncası yoksa C dosyasını gönder, proje oluşturup derlemeyi deneyeyim.
Tamam işte yazılım. Zaten bu ticari amaçlı değil. Ben yıllardır asm ile prg yazıyorum. Bunun yanından C'ye geçme vakti geldi diye düşünüyorum.
#include <P18F458.h>
Void MSDelay(unsigned int);
void main (void)
{
TRISB=0;
while(1)
{
PORTB = 0x55;
MSDelay(250);
PORTB= 0xAA;
MSDelay(250);
}
}
void MSDelay (unsigned int itime)
{
unsigned int i; insigned char j;
for (i=0;i<itime;i++)
for(j=0;j<165;j++);
}
Gerekirse derleyinceye kadar olan aşamaların öz resimlerini sıralı olarak çeker gönderibilirim.
Birkaç yazım yanlışını düzelttikten sonra çok rahat derlendi. Aynen şöyle yaptım:
Project > Project Wizard > Buradan PIC modeli, toolsuite ve proje klasörünü seçtim.
Projeye başlangıçta hiç bir dosya eklemedim.
Project > Add New File to Project.. > Burada proje klasörünü seçip içine Test.c dosyasını oluşturdum. MPLAB bu dosyayı boş olarak açtı.
Senin kodu içine kopyala yapıştır ile attım. Bir kaç yazım yanlışı vardı, onları düzelttim.
Sorunsuz derlendi (İlk 2 denemem yazım yanlışları yüzünden hata verdi.)
Bahsettiğim iki hatadan ilkini az önce giderdim. Derleme adımlarımı yanlış yapmışım. Projeyi oluşturdum ancak SYNTAX hatasını sanırım sözdiziminden verdi. Bahsettiğiniz bu kelime hatası nerede idi? Ayrıca fotoğraflarını çektiğim link:
http://hotfile.com/dl/97710053/742553e/MPLAB_C18_DERLEME.rar.html (http://hotfile.com/dl/97710053/742553e/MPLAB_C18_DERLEME.rar.html)
2. satırda "Void" in V'si küçük olacak.
17. satırda "insigned char j;" ifadesi "unsigned char j;" olacak. Ayrıca alt satıra da geçirirsen daha hoş gözükür.
MPLAB zaten hatanın nerede olduğunu söylüyor. O mavi yazıya çift tıklarsan seni hataya götürür.
Sayın Tagli. Öncelikle ilgilendiğiniz için teşekkür ederim. Projeyi son mesajınızda belirttiğiniz gibi yapmaya çalıştığımda olmadı(daha doğrusu ben yapamadım). Ancak kelime hatalarını düzelttim. Syntax hatası oluşmadı. Derleme noktasına kadar hiçbir hata almadım. Derlediğimde gösterilen ve Error - could not find file 'c018i.o'. hatasını da şu şekilde düzettim
Project-->Build Options-->Project-->Directories-->Library Search Path'ı açtım ve New'e ""C:\MCC18\lib"" yazdım. Yani Path ettim.
Problemsiz bir şekilde derledi. Hatta linker dosyasını girmeme bile gerek kalmadı(?). Ancak programı çalıştırırken son satıra da (yani parantezin olduğu satıra "}" )imlecin gidip orayı da işliyor gibi gözükmesi-- problemin hatalarının sadece görsel olarak kapatıldığı gibi bir şüphe oluşturdu içimde. Gerçi hex. cof. vb dosyalar oluştu, hatta simülasyonu bile çalıştırdım hatasızca. Umarım bu normal bir durumdur.
'c018i.o' hatasını daha önce ben de almış ve bahsettiğin şekilde düzeltmiştim. Senin dosyanı denerken bu hatayı almadım ama.
Ben de C18'e yeni başlayan biri olarak çoğu şeyden emin değilim ama sanırım linker script dosyasını kendin özellikle belirtmezsen gidip program klasörünün içindekini kullanıyor. Ama bazı durumlarda hafızada alan açmak için bu dosya ile oynamak gerekiyor. Bu durumda linker script'in bir kopyasını proje klasörüne atıp, bu dosyayı da projeye ekledim, sonra değişiklik yaptım. O şekilde çalıştı.
İmlecin paranteze gelmesine çok takılma. İstersen üzerine breakpoint koymayı bir deneyebilirsin ama sanki o tür satırlara konulmuyordu diye hatırlıyorum. Devre istediğin gibi çalışıyorsa sorun yok. O sadece bir gösterim.
linker file dosyasını değiştirdim ama hala hata almaya devam etmekteyim
nasıl yapıyoruz array i tanımlarken farklı mı tanımlıyoruz acaba
Üzerinden 5 sene geçmiş ama zamanında bu sorunla karşılaştığım ve çözdüğüm dosyayı ve linker betiğini buldum. Yine de tam olarak neyi neden yaptığımı hatırlamıyorum.
Linker betiğinde aşağıdaki gibi bir alan tanımlamışım. Ancak önceden tanımlı başka bir şeyleri silip onun yerine mi yaptım bilmiyorum. PIC18F2550 için.
DATABANK NAME=genis START=0x400 END=0x7FF PROTECTED
En alta da şunu eklemişim:
SECTION NAME=q_data RAM=genis
Burada q_data öylesine verdiğim bir isim, özel bir anamalı yok.
Kodda da değişkeni şu şekilde tanımlamışım:
#pragma udata q_data
float q[8][8][4];
Bu arada, tavsiyem C18'i terkedip XC8'e geçmen. Aralarında ciddi bir fark yok zaten, göç zor olmayacaktır. C18 artık desteklenmiyor. Ayrıca sanırım XC8'de linker betiği ile uğraşmana gerek yok.
c18 deki tcp/ip stackı kullanıyorum eğer xc8 de varsa geçeyim ama sanırım yok