18f4620 ve RAM sorunu

Başlatan halukece, 04 Ekim 2008, 13:28:02

halukece

Merhaba arkadaşlar;
pic18f4620 ile bir proje yapıyorum. Sistemde analog ve digital sensör ölçümleri yapıp yorumluyorum. Sorunum şu:
Projemde her bir sensoru bir fonksiyon olarak tanımlayıp ana dongumde çağıracak şekilde tasarladım. Bunları iç içe max 2-3 fonksiyon olacak şekilde çağırdım.
Projemde 131 lik 6 tane de dizim var.
dizi1[131], dizi2[131],.....dizi5[131]
Bunları const olarak ROM a gömmek istiyorum.
int16 const tablo[131]={......} şeklinde tanımladım.
Kendi yazdığım fonksiyonlarda local değişken kullanmamaya dikkat ettim.
Ama sorun ne ise bilmiyorum sonradan tanımladığım değişkenler bir şekilde önceki değişkenlerimi bozuyor. Bunu fonksiyonlarımdaki değişkenlerin değerlerini okurken fark ettim.

RAM kullanım %2-3 olmasına ragmen bu sorun var.

Yazılımımın düzeni:

degisken tanımları

fonksiyon protitipleri

Main(){
   initIO;
   initLCD;
   intRTC;
   while(1){
   fonk1();
   fonk2();
   fonk3();
   fonk4();
   fonk5();
   }
}


void fonk1(){
...
     altfon();
}

void fonk2(){
...
}
void fonk3(){
...
}

void fonk4(){
...
}

void fonk5(){
...

}

void altfonk(){
...
}

Ram ve ROM durumu:

              ROM used: 7838 bytes (12%)
                        Largest free fragment is 57698
              RAM used: 121 (3%) at main() level
                        148 (4%) worst case
              Stack:    5 locations

fatihvelid

C18 derleyicisini kullanıyorsanız linker üzerinde gerekli düzenlemeler yapıp herbir diziyi elle RAM bellek bölgesine yerleştirebilirsiniz.
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

halukece

Alıntı yapılan: "fatihvelid"C18 derleyicisini kullanıyorsanız linker üzerinde gerekli düzenlemeler yapıp herbir diziyi elle RAM bellek bölgesine yerleştirebilirsiniz.

CCS ile başladım. Aklımdan C18 e geçmek geliyor. :roll:
Deli olucam.

CCS ile bu ram bank bölgesini modify edebilir miyiz?

ferdem

Değişkenlerinizi global tanımlamışsınız belki gözden kaçırdığınız bir durum olmuştur, CCS C'nin bir değişkeni programcı bilgisi dışında değiştirdiği hatasına hiç rastlamadım. En olmadı değikenleriniz için "#locate" komutuyla RAM de özel bir alan ayırabilirsiniz. 18F serisi için CCS C'de RAM i bir bütün gibi kullanabilirsiniz, dizi tanımlamak için bank boyutlarıya uğraşmanıza gerek yok. Örneğin ilk bank 256 byte dahi olsa int dizi[600] tanımlayıp kullanabilirsiniz, CCS C ulaşmak istediğiniz dizi elemanına göre bank seçimini yapıyor. İyi çalışmalar.

halukece

Sorunun RAM lerde değil de, ROM a yazmaya çalıştığım dizilerde olduğunu gördüm.

Her biri 131 lik elemanı olan toplam 6 dizi yi const ile ROM a yazmak isteyince işlem sonuçlarımda değişme oluyor.(yazdığım değerleri kullanmadım bile).

Fakat 5 tane dizi yi const, 1 diziyi RAM de tanımlarsam sorun ortadan kalkıyor. Ama bu 5 e 1 durumu değil sanki. sabitleri rom a yazarken rom a yazılı diğer bilgilerin üzerine yazma ihtimali var mı?

Şimdilik sorunu halletmiş durumdayım. Ama anlamadım neden 131x6=736 tane 16 bitlik değeri ROM a yazarken böyle bir sorun yaşadım. Bilen var  ise, söylerse sevinirim.

Cevaplar için teşekkür.

mihri

CCS pic18f4620de 0x60 ile 0x7f ram adres bölgesine değişken tanımlayıp vei yazmaya çalıştığında sapıtıyor. Bu durumun çözümü bu adres bölgesini kullanmayacağın değişkenlerle bloke edip derleyicinin bu alanda otomatik değişken tanımlamasını engellemek.

https://www.picproje.org/index.php/topic,19906&postdays=0&postorder=asc&start=0

Kolay gelsin.


////////////////////// 0x60 ile 0x7f adres bölgesini bloke et
char doldur[33];	//
#locate doldur=0x60	//
//////////////////////
"Eppur si muove!"