18f452 Ram Sorunu

Başlatan FEHMİ_ASM, 07 Eylül 2011, 14:12:03

FEHMİ_ASM

    18F452'nin yer aldığı aşağıdaki kod parçasında, daha programın başında iken T1 adında 8 Bitlik yaklaşık 255 elemanlı bir dizi tanımlamak istiyorum ancak MPLAB, 117 ve yukarına hata veriyor.


#include <p18f452.h>
#include <delays.h>
#include <stdlib.h>
#pragma    config WDT =OFF      //Watchdog timer disabled 
volatile unsigned int Data=0;
volatile unsigned int Addr=64;
volatile unsigned int T1[116];  //117 ve yukarısında hata veriyor.
void D_Load ();
void S_Load();
void Clk ();
void MSDelay ();

void main ()
 { 
unsigned int x;
unsigned int y;


LukeSkywalker

int olarak tanımladığınız dizi elemanları 8 bit değil 2 byte olurlar. Unsigned Char olarak tanımlayın..

FEHMİ_ASM

    Evet maytere hocam dediğiniz gibi char olarak tanımlayınca dizinin eleman sayısı 117 ile kalmadı. Ancak 232'yi de geçmedi. Ayrı ayrı dizi oluşturdumsa da toplamdaki eleman sayısı en fazla 232 oluyor
    Ben de 18F452  yerine 458 için bir proje oluşturdum ancak sonuç aynı. Nitekim 18F458'in de RAM'i 1536 Byte imiş. Sonradan farkettim.

    Düşündüğüm iki şey var, biri olmazsa diğerini deneyeceğim.
1. RAM'i daha yüksek 18F serisi bir PIC var mı?
2. Acaba dizi tanımını farklı bir şekilde ya da programın farklı bir yerinde mi yapmam lazım,      ancak dizideki elemanlara diğer fonksiyonlardan erişebilmeyim.

Tagli

#3
C18'de linker dosyası değiştirilerek 1 bank'tan daha büyük hafıza alanları tanımlamak mümkün. Forumda daha önce konuşulmuştu.

https://www.picproje.org/index.php/topic,21220.0.html
https://www.picproje.org/index.php/topic,31137.0.html

Ayrıca, #pragma udata bir_isim ifadesini de bir araştır. Böylece değişkenlerini birden fazla banka yerleştirebilirsin linker ile uğraşmadan. Linker dosyasını değiştirmek sadece 256 byte'tan büyük tek parça dizi tanımlarken gerekecektir.
Gökçe Tağlıoğlu

FEHMİ_ASM

#4
Gerbay hocam hoş bulduk.
    Dediğiniz üzere sanırım RAM'da bazı değişkenler gizli tutuluyor (arka planda). Eleman sayısını belirtmediğim bir diziye sayaç'la 255'ten fazla sayıda yüklendiğim halde BSR değişmedi. Ancak bunu sadece Watch ile gözlemledim. Sonrasını test edeceğim. İlk mesajınızdaki "extern unsigned char T1[]" parametresini inceleyeceğim. Sağ olunuz.

     T2 Hocam ilginiz için teşekkür ediyorum. Önerilerinizi araştırıyorum şuan.  pragma udata bir_isim ifadesi ile program hatasız derlendi ancak dizinin Watch'de adı var kendi yok. Dizinin alt hiçbir birimi (indexle atanan hücresi) yok.
     Zannediyorum ki linkerde modifikasyon yapacağım. Ama inşallah bu oynama, farklı banklar'a yönelirken sapmalara ya da kitlenmelere yol açmaz. Gerçi ortadaki banklardan seçmeye çalışacağım ;D

Tagli

gerbay, bank değiştirme işi otomatik yapılıyor. Ama disassembly koduna bakmadım, tam olarak nasıl çalıştığını bilmiyorum. Bir ihtimal, bu tür dizilere donanımsal pointer kullanarak, bank değiştirme yapmadan da erişiyor olabilir.

Microchip'in kendi dokümanlarında, bu şekilde linker betiği değiştirilerek oluşturulan dizilere sadece pointer ile erişilebileceğinden bahsetmiş ama o kısmı anlayamadım bir türlü. Bağlantısı vermiş olduğum başlıkta da bu meseleden bahsetmiştim. Orada, nasıl kullandığımı da yazmıştım. Benim tanımlamam gereken dizi float q[8][8][4] şeklinde idi. Linker betiğinde 4 bank'ı birleştirip tek alan gibi kullanmıştım. Doğrudan erişim mümkün oluyordu, örneğin q[1][2][3] = 5; gibi.

Ben C18'de .c dosyasının başında doğrudan değişken tanımlanabildiğini bilmiyordum. Örneklerde gördüğüm üzere, hep #pragma ifadeleri kullanarak veri alanlarını tanımlayıp onların altında değişkenleri tanımlıyorum. Bu şekilde, değişkenleri Access RAM'e, ROM'a yerleştirmek, veya aynı bankta olduklarından emin olmak mümkün oluyor. Örneğin #pragma udata alan_1 gibi bir yerde tanımlanan değişkenlerin aynı bankta olduklarından emin olunabiliyor. Ama linker, eğer sığdırabilirse, #pragma udata alan_2 altındaki değişkenleri de aynı bank'a yerleştirebilir, ancak bunun garantisi yok. Linker betiğinde özel alan tanımlanmadığı sürece, herbir #pragma udata altında en fazla 256 byte'lık değişken tanımlanabilir.
Gökçe Tağlıoğlu

FEHMİ_ASM

#6
    Linker dosyasında aşağıdaki değişikliği yaparak 4 bank'ı birleştirdim ve tam "1000" elemanlı bir dizi oluşturdum. Bunu (dizinin elemanlarını) Watch'den de görebiliyorum. Otomatik bank değişimine gelince, dizinin 257.byte'na sayaçla yüklenirken bank büyüdüğü için BSR değişmiyor ama dizinin 257. elemanı sıradaki veri ile normal bir şekilde yükleniyor.



    Bank geçişleri için birkaç test uygulayıp bir anormallik olursa bildireceğim.

    Bir de aklıma son anda gelen birşey var. Bu Linker dosyasındaki RAM tanım bilgileri, PIC'e program atılırken mi (tabiki otomatik olarak) yollanıyor (ya da güncelleniyor)? Eğer öyle değil ise boşa kürek çekmişim gibime geliyor..

Tagli

Hayır, o dosya link aşamasında kullanılıyor. Yalnız, dosyayı değiştirmeden önce proje klasörünün içine kopyalayıp oradan projeye eklemekte fayda var. Derleyicinin kurulum klasöründeki linker dosyasını değiştirmek, diğer projeleri de etkiler.
Gökçe Tağlıoğlu

FEHMİ_ASM

#8
        Hocam belirttiğiniz üzere linker dosyasını tanıttığım yer zaten C:/MCC18 değil, tamamen proje klasörünün olduğu yer ve yine de orjinal linker dosyasını çoktan yedeklemiştim.

        Bu dosya sadece linkleme sırasında kullanılıyormuş, olağandır. Önemli olan, "BANK adres tanımlama bilgileri PIC'e ben programı atarken yükleniyor"'un geçerli olması. Çünkü orjinal dosyada değişiklik yapıyorum.
     
       "Hayır" derken altı çizili yazımı onaylamaz nitelikte söylediğinizi sanıyorum. Umarım yanlış anlamışımdır.

Tagli

Itiraf etmeliyim ki alti cizili kismi tam anlamadim. Ancak, soyle soyleyeyim: Linker betigi .hex dosyasinin olusturulmasi sirasinda kullaniliyor. .hex dosyasinin PIC'e yuklenmesi ile bir ilgisi yok.
Gökçe Tağlıoğlu