matrix dizi kapasite sorunu(ccs c)

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

radres

Verdiğin dizi değeri 96 byte 16F690 belleğini aşıyor.
char dizi_1[91]={1};
char dizi_2[79];

dizileri 16F690 için deneyim mi?  Biliyorsun 16F690'ın ilk bankı 96 diğerleri 80 byte. İlk bankta CCS C büyük ihtimalle 8 byte'ını kendisi kullanıyor.

fatihinanc

16f877 için;

       char dizi[96]={1};
       char dizi1[80]={2};
      char dizi2[11]={1};
       char dizi3[8][10]={2};


bu kodları hatasız bir şekilde derledim.

yanlız ram kullanımı yok.yani ilk değer atamama rağmen program memory=8 ,ram=0 olarak gözüküyor sizde durum nasıl?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

bymrz

arkadaşlar, sorununuzun nedeni kullandığınız işlemcinin bank yapısı olmasın?  ;)

aynı kodu bir de 18F452 için derle bakalım...

fatihinanc

yok 18 de herşey normal. 16 serisi için 9.71a versiyonunu yükleyince problem ortadan kalktı.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Gökhan BEKEN

Arkadaşlar konuda söylediğim sorunuma çözüm var mıdır?
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

Alıntı yapılan: fatihinanc - 09 Temmuz 2010, 22:49:20
16f877 için;

       char dizi[96]={1};
       char dizi1[80]={2};
      char dizi2[11]={1};
       char dizi3[8][10]={2};


bu kodları hatasız bir şekilde derledim.

yanlız ram kullanımı yok.yani ilk değer atamama rağmen program memory=8 ,ram=0 olarak gözüküyor sizde durum nasıl?

Aşağıda yazdığım şekilde programı PIC16F877A için derledim.

#include <16F877A.h>
#Fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay (clock=4000000)

char dizi[96]={1};
char dizi1[80]={2};
char dizi2[11]={1};
char dizi3[8][10]={2};

main ()
{
}

Sonuç: RAM=%74 ROM=%4

radres

Alıntı yapılan: meftun - 10 Temmuz 2010, 01:10:52
Arkadaşlar konuda söylediğim sorunuma çözüm var mıdır?

Konunun başındaki ilk mesajın için diyorsan mesajının arkasından yazdığım bank ile ilgili bilgiler sorunun cevabıdır.

Gökhan BEKEN

Alıntı yapılan: radres - 10 Temmuz 2010, 04:23:16
Alıntı yapılan: meftun - 10 Temmuz 2010, 01:10:52
Arkadaşlar konuda söylediğim sorunuma çözüm var mıdır?

Konunun başındaki ilk mesajın için diyorsan mesajının arkasından yazdığım bank ile ilgili bilgiler sorunun cevabıdır.
Hocam ilginiz için teşekkür ederim dediğiniz cevabınız aşağıdaki alıntılı bölüm değil mi?
Alıntı Yap
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.

Ö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.

Burdan anladığım banklar arası geçiş yaparak dizi tanımlayacağız. Öyle mi demek istediniz?
Bank geçişlerini ccs c otomatik yapmıyor mu?
Çözüm için örnek kod verir misiniz?
Burdan anladığım kadarıyla ben bu şekilde değişken tanımlayamam.
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

Evet dediğim gibi bir sınırlama söz konusu. Verileri yerleştirken bir bank dolunca diğerine geçmeyi CCS C otomatik yapıyor. Ama derleyiciden anladığım kadarı ile bir diziyi bölmeden bir banka yerleştiremiyorsa bu işlemde hata veriyor. Çare olarak şunu söyleyebilirim. Dizinizi tek olarak değilde ikiye bölüp tanımlayın dizi_1, dizi_2 diye. Okurken de belli indise kadar olanları dizi_1'den diğerlerini dizi_2'den okuyabilirsin. Şu an aklıma bu geliyor şimdilik.

fatihinanc

@raedes şimdi oldu o zaman.

yanlız ccs c dizi ayrıldığı zaman kullanılsada kullanılmasada bellekte dizi elemanı kadar yer ayırıyor.
az önce hesapladım 877 nin toplam 368 byte rami var bizim kullandığımız diziler ise toplam 267 byte yer kaplıyor. bu da yaklaşık olarak(ccs in kullandığı alan da dahil) %74 yapıyor.

hi-tech de ise böyle bir durum yok.arka arkaya 10 tane aynı diziden tanımlayabiliyorum.rom=8 ram=2.
bir for döngüsüyle içine ne kadar değer atarsam yine bellekte o kadar alan ayrılıyor.

neyse sonunda bir sonuca ulaşabildik artık :)
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

radres


Gökhan BEKEN

konuyu açalı çok oldu şimdi birşeyle karşılaştım anlam veremedim
char degisken[128];
şeklinde tanımlandığında belli birşeyden sonra hata veriyor tamam anladık eyvallah.
Ama şöyle bir tanımlama ile sorun yok
char const degisken[1024]; sınırı kaç diye merak ettim 2000 verdim derledi 5000 verdim derledi 10000 verdim hata vermedi ama derlerken program yanıt vermedi :D bende üstelemedim.
Bu şekilde tanımlayınca çok güzel oluyor da sorun şu "const"="sabit" olduğundan sadece ilk değer atanabiliyor. Daha sonra değer atanamıyor? Sizce bunun bir yolu var mıdır?
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

char const degisken[128]; komutunda dizi üyelerine değer vererek denedin herhalde. Dediğin gibi bende dizi üye sayısını çok arttırmama rağmen derleme sonucunda ROM hafızanın hiç değişmediğini gördüm. Sanki ROM bellekte benim o sabitlerime yer ayrılmıyormuş gibi bir şey oldu. Ama program içinde o sabiti bir kez kullanan bir komut yaz o zaman Out of ROM diye uyarı verdiğini göreceksin yine.

Gökhan BEKEN

Anladım teşekkürler. Ama bunun bir yolu olmalı.
Kayan yazı sistemi için uzun olması istiyorum.
Bütün bilgiler dizilerde tutuluyor.
7 satır için 7 dizi kullandım her dizi 32 byte alıyor. Bu durumda her karakter için 5 bit kullandığımdan+1boşluk toplam 6 bit ediyor. 32*8=256 bit var 256/6=42 eder. Yani en fazla 42 harflik bir cümle saklayabiliyorum. Piyasadaki kayan yazılara baktığımda uzun uzun cümleler kaydırabiliyor. Bunu nasıl yapabiliyorlar. Tamam bazıları daha gelişmiş mikrodenetleyici kullanmış olabilir. Ama hepside öyle yapmıyordur diye tahmin ediyorum.

Bu arada 10 adet 1024 byte lık const-sabit dizi değişken tanımlayıp kullanmıştım geçen gün bir projemde derlemede sorun olmamıştı.

İlginiz alakanız için teşekkürü borç bilirim.
Özel mesaj okumuyorum, lütfen göndermeyin.

radres

Bank sınırını ve kullandığın PIC'in program hafızasını (PIC16F877 için 8KB) aşmamak kaydıyla bayağı bir harf saklayabilirsin. Tabi harfleri saklayacağın dizinin boyutu bir bank'ın boyutunu aşıyorsa böleceksin. Böldüğün zaman da cümlendeki harflari alırken kuracağın bir algoritma ile ne biliyim işte 40 harfe kadar dizi1'den alacan, 40 ile 80 arası harfleri dizi2'den alacan gibi bir algoritma kurarsan sanırım sorun çözülür.