microchip c18 de global değişkenler için yer almada problem var

Başlatan piedos, 06 Temmuz 2008, 16:55:07

piedos

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ı?
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

fatihvelid

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.
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

F493

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;

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
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

piedos

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
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

FEHMİ_ASM

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?

Tagli

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?
Gökçe Tağlıoğlu

FEHMİ_ASM

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.

FEHMİ_ASM

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.

Tagli

Sakıncası yoksa C dosyasını gönder, proje oluşturup derlemeyi deneyeyim.
Gökçe Tağlıoğlu

FEHMİ_ASM

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.

Tagli

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.)
Gökçe Tağlıoğlu

FEHMİ_ASM

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

Tagli

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.
Gökçe Tağlıoğlu

FEHMİ_ASM

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.