unsigned char code EEPROMDATA[3850]

Başlatan OptimusPrime, 17 Aralık 2009, 16:22:47

OptimusPrime

biraz fantazik bir çalışma olsada sorum şöyle;

240x128 GLCD üzerinde 30 model bir araç resmi çıkarıyorum.
resim için gerekli dataları
const unsigned char code Data1 []
şeklinde bir stringe yazdım. yaklaşık 3840 değişkenli bir data bu. daha sonra bu stringi alıp EEPROM a yazdım.
fakat epromdaki bu resim bilgisini geri çağırırken
unsigned char code EEPROMDATA[3850] isimli stringe bu değerleri yazamıyorum.
derleyici 3850 byte lık yeri bu iş için ayırıyor fakat içeriğini değiştiremiyorum.
bu şekildeki büyük datalar ı nasıl işleyebilirim?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

F493

Selam,
 Kullandıgınız işlemci nedir.  Okadar Ram bellegi olan bir işlemci olması gerekir birkere. 18F452 de 1536 byte diye hatırlıyorum. Birde diziyi (EEPROMDATA) tanımlarken ilkdeğer verilmesinde fayda var. (ör : 0)

Birde EEPROM' a yazma yaparken belli bir süre bekleme yapıyormunuz.

Şöyle bir test yapın.  İlk önce const olan dizideki elemanlardan  ilk 10 tanesini EEPROM'a yazın. Sonra bunları okuyup Seri port'a veya LCD gösterin. Sonrasında bu test başarılı olursa ,

2. aşama:   İlk önce const olan dizideki elemanlardan  ilk 10 tanesini EEPROM'a yazın. Sonra bunları okuyup RAM'de oluşturduğunuz diziye atın ve sonra tekrar  bunları okuyup Seri port'a veya LCD gösterin.

Sonra daha büyük verilerle işlem yapın. Adım adım ufak ufak çalıştırarak gidin.

Eğer bunlarda olmazsa ozaman başka bir problem var demektir, ozaman kodu buraya yazın illaki çözülür.

/Sonra eklendi\ -> unsigned char code EEPROMDATA[3850]  derken code ne oluyor acaba sonradan fark ettim. Yoksa oda bu diziyi proğram memoryde mi tanımlıyor.

Esen kalın.

OptimusPrime

selamlar,

mikro P89LPC954. 8051 tabanlı bir alet.

EEPROMDATA dediğim değerler aletin eppromuna yazılmıyor . I2C ile harici bir epproma yazılıyor. yazma ve okuma işlemlerinde herhangi bir sorun yok. daha küçük stringlerle başarılı yazma ve okuma yapabiliyorum.

fakat böyle büyük bir stringi ancak code bölümüne yazabiliyorum.
code olarak belirtmezsem keil değişkenin çok büyük olduğundan şikayet ediyor. code olarak tanımlarsamda ( bunu yeni fark ettim ) bu datayı const zannediyor.

mesela programa şöyle bir satır eklesem
EEPROMDATA
  • =0x00;
    hata veriyor. yani EEPROMDATA yı const olarak görüyor.

    sanırım data belleğinde belli bir alanı bu iş için calloc ile ayırmam gerekiyor. bir de onu deneyecem.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

CLR

Alıntı yapılan: "OptimusPrime"biraz fantazik bir çalışma olsada sorum şöyle;

240x128 GLCD üzerinde 30 model bir araç resmi çıkarıyorum.
resim için gerekli dataları
const unsigned char code Data1 []
şeklinde bir stringe yazdım. yaklaşık 3840 değişkenli bir data bu. daha sonra bu stringi alıp EEPROM a yazdım.
fakat epromdaki bu resim bilgisini geri çağırırken
unsigned char code EEPROMDATA[3850] isimli stringe bu değerleri yazamıyorum.
derleyici 3850 byte lık yeri bu iş için ayırıyor fakat içeriğini değiştiremiyorum.
bu şekildeki büyük datalar ı nasıl işleyebilirim?

Cevabını kendin vermişsin,
1) const olarak array açarsan müdahale edemezsin. İçeriğini değiştirmek istiyorsan RAM'e yazabilirsin. Tabii işlemcinde o kadar RAM varsa.
2) Program hafıza içine yerleştirirsen eeprom kullanmana gerek kalmaz.
3) Eeprom kullanmak istiyorsan ve RAM hafızan yeterli büyüklükte değilse, eepromdan parça parça RAM'e oku veya tek tek eepromdan oku ekrana yazdır.


Kutay
Knowledge and Experience are Power

OptimusPrime

const olarak tanımlamıyorum fakat keil const olarak kabul ediyor.

yazdığım şey aynen şu
unsigned char code EEPROMDATA[3850] ;
const demedim.
fakat 3850 yerine 100 yazarsan const olarak kabul etmiyor.  :?: istediğim gibi değiştirebiliyorum.

DATA Directly and indirectly addressable memory 128
IDATA Indirectly addressable memory 256
XDATA Indirectly addressable using MOVX, MOVC, DPTR, R0, R1 256

RAM seçeneklerim ise yukarıdaki gibi fakat benim data RAM den daha büyük.

dediğiniz gibi parça parçada okuyabilirim fakat bu durumdada ekrana çizim işlemi gecikecektir.

calloc olayını deneyeceğim. sonucu yazarım.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

CLR

Alıntı yapılan: "OptimusPrime"const olarak tanımlamıyorum fakat keil const olarak kabul ediyor.

yazdığım şey aynen şu
unsigned char code EEPROMDATA[3850] ;
const demedim.
fakat 3850 yerine 100 yazarsan const olarak kabul etmiyor.  :?: istediğim gibi değiştirebiliyorum.

DATA Directly and indirectly addressable memory 128
IDATA Indirectly addressable memory 256
XDATA Indirectly addressable using MOVX, MOVC, DPTR, R0, R1 256

RAM seçeneklerim ise yukarıdaki gibi fakat benim data RAM den daha büyük.

dediğiniz gibi parça parçada okuyabilirim fakat bu durumdada ekrana çizim işlemi gecikecektir.

calloc olayını deneyeceğim. sonucu yazarım.

Merhaba,

İşlemcide RAM hafıza ve program memory vardır. Derleyici yoktan hafıza var edemez. Diyorsun ki, harici eeprom'dan veri okuyup program memory hafızaya atacağım çünkü RAM yeterli değil. Program memory'nin flash özellikte değilse derleyicinin const yapması normal çünkü olmayan RAM hafıza kullanmaya çalışıyorsun. Bunu yapabilmen için
işlemci program memory'si flash özellikte olmalı ve bu özellik programlandıktan sonra kullanıcıya açık olması lazım. Flash'a Page page(sayfa sayfa) yazıp silip sonra yazman gerekir ki birnevi eeprom'a yazmaya benzer ve flash'a 1 page yazması 5ms'ye kadar zaman alabilir.
Knowledge and Experience are Power

OptimusPrime

evet şimdi jeton düştü ben neden böyle bir saçmalık yaptım ki. :(
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

CLR

Merhaba,

Eeprom'dan okuyup lcd'ye doğrudan yazdırabilirsin, spi eeprom(25LC serisi) kullanırsan hiç gecikmez(20mhz'e kadar bit okuma hızın olur), i2c kullanırsan 1mhz'e kadar destek verenleri var. 400Khz veya üstü haberleşme kullan resim atmayı göremezsin. 400Khz üstüne çıkman için işlemcin i2c için bu desteği veriyor olmalı.

KUTAY
Knowledge and Experience are Power