MPLAB C18 Tablo Okuma

Başlatan FEHMİ_ASM, 25 Eylül 2011, 20:41:25

FEHMİ_ASM

       Tablo okumada tablodaki "TÜM veriler" PIC'in RAM belleğinde (hepsi aynı anda) mi saklanıyor yoksa Flash'ta mı? İkisi arasında seçim yapma imkanım var mı? Eğer RAM'de ise Case komutunu kullanarak asm gibi yazacağım programımı. Ancak bu sefer 256 adet daha karşılaştırma alt programı gerekiyor ayrıca..

       RAM'i başka bir amaçta kullanmak üzere bankları dahi birleştirdim. Yani RAM'de fazla bir yerim yok. Belki 150-200 Byte falan..  Tablodaki toplam veri ise tahminen ~ 1000 Byte'ın üzerinde.

    MPLAB C18.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

Tagli

C18'de veriler, sen nerede olmalarını istersen orada saklanır. Ama bunu derleyiciye belirtmen gerekiyor. #pragma romdata ile yer gösterip altında tanımlamayı örneğin const rom int a[10]; şeklinde yapmalısın. Denemedim ama sanırım başına const koymazsan veriler yazılabilir de olabilir. Ama bu zaman alan ve bellek ömrünü yiyen bir işlem olacağından tavsiye etmem.
Gökçe Tağlıoğlu

FEHMİ_ASM

#2
Alıntı Yapbu tablodaki veriler read-only tipte mi?
Evet hocam, program çalışırken sadece 1 kez yazılacak ve bir daha değiştirilmeyecek. Sonra sadece okunacak. Zaten normal bir şekilde dizi oluşturduğumda SFR'de hemen gözüktü.

Alıntı YapAma bu zaman alan ve bellek ömrünü yiyen bir işlem olacağından tavsiye etmem.
Hocam 18F452 kullanıyorum ve sanırım Flash'ın en az yarısı boşta kalacak. Ama hızı, dolayısı ile performansı etkiliyorsa birşey deyemeyeceğim.

    Tablo örneği aşağıda. İki boyutlu olup 256 satır derinliğinde, 7 sutun genişliğinde. Dizi tanımının hatalı olduğunu zannediyorum ancak orasını halledebilirim galiba. Ancak static const char T1 ifadesi doğru mu? Ayrıca program buraya kadar geldiğinde nerenin okunacağı  x ve y indis belirleyicileri ile hazırlanmış durumda olacak.

static const char T1[x][y]  =  {0X81,0X81,0X91,0X91,0X91,0XFF,0XFF,
                                0X80,0X80,0X88,0X88,0X88,0XFF,0XFF,
                                   ...
                                   ...
                                0XFF,0XFF,0X10,0X10,0X10,0XFF,0XFF,
                                0X00,0X81,0XFF,0XFF,0X81,0X00,0X00,
                                0X00,0X01,0XBF,0XBF,0X21,0X00,0X00
                             };
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

FEHMİ_ASM

#3
Alıntı yapılan: gerbay - 25 Eylül 2011, 22:57:48
static const int TimingTable[5][2] =

Evet, x'in (yani satır değerinin) değerini kesinlikle veriyorum - ancak EEPROM'un filan adresinden ne çıkarsa ona göre veriyorum. Orası EEPROM'u okuduktan sonra ortaya çıkıyor. Yani;
  y = 0 ;   //Burası da ayrı bir yerde belirleniyor..
  x = EEPROM_Buff;   
static const int TimingTable [x][y]

Ancak siz
static const int TimingTable[5][2]
derseniz benim seçim hakkım nasıl olacak?
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

FEHMİ_ASM

     İlginiz için hepinize teşekkür ederim.   
Alıntı yapılan: gerbay - 25 Eylül 2011, 23:48:02
hocam neden eprom dan okuma gereği var?

    Hocam bir eksikliğim oldu sanırım. Bu EEPROM dahili değil, harici EEPROM. Hem EEPROM'dan olmasa da Flash'tan gelecek ama ben Flash'ı bu yönde kullanmayı bilmiyorum. Sanırım vakit bulursam onu da irdeleyeceğim.

Alıntı Yapo array in elemanlarının belli ve değişmez olduğunu varsaymıştım..
Evet Gerbay Hocam, varsayımınız doğru. Elemanlar 24CXX'de olduğundan sabit sayılır. Sadece erişeceğim index doğal olarak değişiyor.
   

Alıntı Yapbir blok luk yapı tanımlayıp o yapıda değişken tanımlayıp o değişkenin üzerine eprom dan okumanız gerekiyor sizin durumda..
static const int TimingTable [x][y]
----  demek istediğinizi tam anlayamadım ama EEPROM'dan okurken zaten Dizi'ye x değişkeniyle yükleniyorum.

Alıntı Yaphocam ayıptır sorması bu olay kayan yazı olayı mı?
Gerbay Hocam tabiki sorabilirsiniz. Evet bu bir kayan yazı. Algoritma ana hatlarıyla tamam. Sadece verinin kaynaktan alınıp ekrana verilmesi kaldı.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

FEHMİ_ASM

     Gerbay hocam detaylı anlatımlarınız için gerçekten teşekkür ederim.

     Şunu belirteyim ki, x (dizideki satır yani blok sayısı) en fazla dec.255 olabilir. Çünkü karakterin hex kodlarını tutacak. Şu durumda Flash Bellek en fazla 255x7 = 1745 Byte tutacak. Bu veri bloğunu Flash'ta 255 değişken bloğuna dağıtırsam sorun kalmıyor. Diziyi yapmamda amaç da bir karakterin sutunlarına bölüp dikey çözünürlüğünü elde etmek. EEPROM karakteri tutuyor, Dizi de bunu sutun için parçalara ayırıyor.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai