matrix dizi kapasite sorunu(ccs c)

Başlatan Gökhan BEKEN, 05 Temmuz 2010, 02:05:18

Gökhan BEKEN

merhaba

byte satir[7][40];

şeklinde bir dizi değişken tanımlamak istiyorum lakin 40 yerine en fazla 18 yazabiliyorum fazlasını kabul etmiyor, yani hata veriyor. Fakat normalde 40 değişkenlik tek matrix tanımlayabiliyorum aşağıdaki gibi.
byte satir1[40];
byte satir2[40];
byte satir3[40];
byte satir4[40];
byte satir5[40];
byte satir6[40];
byte satir7[40];

Bu şekilde ise en fazla 40 değer tutabiliyorum. İlk şekilde neden 18 den fazla değer tutamıyor bilgilendiren olursa sevinirim.
Matrix şekilde en fazla değeri nasıl tutabilirim?
Teşekkürler
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

CCS C'de RAM alanı içinde tanımlanan dizi elemanlarının sayısı en fazla 128 diye biliyorum. 7*18=126 ediyor. Ama 7*19 yazarsan 133 eleman eder. Bundan dolayı kabul etmiyor olabilir. ROm bellek içinde 256 olması lazım.

fatihinanc

Dizilerde değişken tanımladığınız zaman bellekte hemen yer kaplamaz sadece dizinin başlangıç adresi tutulur.eğer o dizi üzerinden işlem yaparsanız o zaman yer ayrılır.sizin 7*40=280 byte lık alan tanımlayamamanız da bundandır. mesela char dizi[280]  yazın yine hata verecektir.ama siz isterseniz 15 tane char dizi[40] adında değişken tanımlayın kullanmadığınız için RAM alanını işgal etmeyecektir. ama char dizi[40]={0}; gibi ilk değer ataması yaparsanız o zaman 15 tane char dizix[40] diye değişken tanımlayamazsınız.ben az önce hi-tech de deneme yaptım maksimum 80 lik dizi oluşturabiliyorum.81 de hata veriyor. tabi bu ccs de farklı olabilir.MCU ya göre de değişebilir. denemek lazım.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

PIC'in bir bankına sırayla yerleştirebilek dizi boyutu sınırlıdır. Bu nedenle sınırı aşınca derleme yapmıyordur.

Bu arada fatihinanc, dizi tanımladığınızda kullanmayınca bellekte yer kaplamaz demişsiniz. Fakat ben denedim sadece tanımlama yaptım kullanmadım. Ama derleme sonucunda RAM belleğin dolduğunu gördüm. Kullanmasak bile bellekte dizi için yer ayırıyor derleyici.

Örneğin PIC16F877A'nın RAM belleği 4 kısımdan oluşmuştur. Bank0, Bank1, Bank2, Bank3. Bank0 kısmında 96 byte'lık genel amaçlı kaydedici alanı vardır. Bu nedenle örneğin char x[96]; yazın kabul eder. Ama char x[97]; yazın kabul etmez. Çünkü derleyici diziyi bölmeden tek bir bank içine kaydedemiyor.

fatihinanc

@rades evet dediğiniz doğru derleyici tek bank üzerinden gittiği için maksimum ram miktarı kadar ayırma yapabiliyor. Bendeki 80 elemanlik dizi ayırma sebebi başka kütüphaneler de kullandım ondan olabilir. Yoksa dediğiniz doğru.ama yer ayırma meselesi kod optimizasyonuyla ilgili birşey ben hi tech kullanıyorum.ilk mesajda dediğim gibi derledi.ccs de ilk değer vermeden tanımladıniz değil mi dizileri.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

Evet ilk değer vermedim. x[96]; şeklinde tanımladım. RAM'deki boyuta baktım. Hatta x[96]; ardına y[45]; yazdım. RAM kullanımından artışı gördüm. Sizin deneme yaptığınız mikrodenetleyici hangisi acaba? 80 üzerine izin vermediğine göre.

fatihinanc

Peki byte ile char aynı şeyler midir ccsde? Ben char olarak tanımladım.byte diye birşey yok hi tech de.80 elemana izin vermesi lcd sürüyorum devrede ondandir.16f690 ile deneme yapmıştım.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

Bende char diye tanımladım. Byte ve char ikiside işaretsiz 8 bitlik. 16F690'ın Bank0'ı 96 byte, Bank1 ve Bank2 80 byte genel amaçlı kaydediciye izin veriyor. CCS C'de 16F690 için char x[91];'e kadar izin veriyor. Demekki ilk bankın bir kaç yerini CCS C kullanıyor. PIC16F877A'da da CCS C RAM'de bazı yerleri kullanıyor. Ama PIC16F877A'da bank0, bank2, bank3 alanı 96 byte'lık genel amaçlı kaydedici alanına sahip olduğundan 96 byte'lık diziyi diğer banklara yerleştirebiliyor. Hi-Tech ilk bankda belli yerleri işgal ediyorsa 16F690'da diğer banklarda da maksimum 80 byte'lık yer olduğundan kabul etmiyordur.

fatihinanc

Kabul etmiyor derken derleyicinin hafıza olarak yer ayırmamasından mi bahsediyorsunuz.ilk değişkenim 80 byte lik iki boyutlu dizi.ikinci değişkenim de 40 byte lik tek boyutlu dizi. Ama şimdi aklıma geldi de arka arkaya ikisini de tanımlayınca ve de ilk değer verince hata veriyordu.otomatik olarak bank 1 e veya bank 2 ye atması lazım aslında değişkenleri.bugün vakit bulursam deneyeyim bakalım. Hem buraya asm çıktısıni da koyarım karşılaştırma yaparız.sizde böyle bir durum yok değil mi.yani hem 80 byte lik dizi hem de arkasından 40 byte lik bir dizi daha tanımlaması yapabiliyor musunuz?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

char x[96]={0};
char y[45]={0};
char z[80]={0};

şeklinde komutları CCS C'de PIC16F877A'da derleyebiliyorum. Senin derleyemediğin o iki dizi komutunu yazsana ben bir deneyim.

fatihinanc

char dizi[8][10]; char dizi2[40]; şeklinde yazdığımda galiba hata veriyordu.bu kodlari 16f690 için derleyin bakalım sonuç ne olacak.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

Verdiğin dizi tanımlamarını derliyor. Sorun yok.16f690 için denedim.

fatihinanc

        char satir1[40]={1};
   char satir[8][10]={1};

hi-tech bundan 1byte yukarısını dahi derleyemiyor.
garip bir durum açıkçası
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres

Boş programda mı deniyorsun yoksa başka komutlarla mı deniyorsun. Ben led yakıp söndürme programında denemiştim.

fatihinanc

bomboş programda deniyorum.
son durum bu.

char dizi[96]={1}; ve char dizi[96];
olarak yazdığın kodların asm çıktısını buraya koyabilir msiniz? Karşılaştıralım.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)