16F628A nın tüm ram ini kullanmak istersek…

Ağır ağır da olsa yapmaya çalıştığım data logger çalışması için 628A yı kullanmak istedim, çünkü 628A kolay bulunabilen ve ucuz bir işlemci. Bu çalışmada her şeyden önce verileri kayıt edeceğim “ram” e iyi bir şekilde hakim olmam gerekiyordu, ilk başta kararsız kaldım asm mi, C mi, C olursa CCS C mi yoksa diğerleri mi diye. Normalde CCS C kullanıyorum ama HI-TECH C yi de biraz kurcaladım, ancak işimi kolaylaştıracak “help” ve örnek dosyalara kolayca ulaşamadığım için hi-tech C den vazgeçtim, belki de ben kolayca bulamadım. Sonra Microchip in C18 “compiler” ını indirdim, sanırım bu “compiler” sayesinde linker üzerinde düzenleme yapılarak “ram” i bir bütün gibi kullanabilme şansımız olabiliyor ancak 628A nın yukarıda saydığım 2 özelliğinden 628 den vazgeçmek istemedim. Uygulamanın diğer kısımlarını asm ile yazmak çok uzun süreceği için yine CCS C de karar kıldım.

Ben pic in bank yapısından şikayet ettikçe sevgili hocam bırak pic i artık(!), diğer mikroları kullan diye baskı yaptı. Bu baskılar altında CCS C nin helpini karıştırdım, “ram”i nasıl verimli kullanabilirim, bank geçişlerini nasıl yaparım sorularına cevap aradım. Öncesinde bu işlemleri “pointer”, döngü vs kullanarak kendim yapmaya karar vermiştim, ancak bank2 ye bir türlü geçemedim, sanırım kullandığım pointer in yazıldığı bankla pointerin ulaşmak istediği bank arasında bir karışıklık oluyor, her ne kadar C kodları içine asm yazsam da bu banktaki pointeri kullanacaksan başka banka yazamazsın gibi bir durumla karşılaştım, ya da ben öyle anladım. Üstelik kendim yazsaydım her ne kadar “ram”in tüm bölümlerine ulaşsam da compiler ın benim yazdığım datanın üzerine yazıp yazmayacağından emin olamazdım, bu riski en son CCS C nin ürettiği asm kodu adım adım okuyarak test etmeyi düşünmüştüm, zor ama başka çare yok gibiydi. “Help” te gözüme ilişen “memory allocation” fonksiyonlarını kullanmak istedim, ram de tahmini boş alan kadar -yaklaşık 200 byte- iptr=malloc(10); yazıp derledim, hiç hata vermedi. Dedim acaba bu malloc iş görür mü, ancak sonrasında deneme amaçlı yaptığım malloc(300), malloc(400) gibi ifadeler de hata vermedi, bu fonksiyon nerde ayırdığını sanıyor bu kadar yeri dedim ve kullanmaktan vazgeçtim.
Sonra baktım CCS C nin “help”inde write_bank, read_bank adında iki fonksiyon iş görür gibi duruyor. Bu fonksiyonlar hangi bankın kaçıncı gözüne okuma veya yazma yapacağınızı parametre olarak alıp okuma veya yazma işlemini yapabiliyor. Ayrıca “#include” satırının hemen altına yazılan “#reserve” ifadesiyle “ram”de herhangi bir bölge için “compiler” a bu bölgeye girme kardeşim, değişkenlerini başka yerlere yaz diyebiliyorsunuz. Ben de öyle yaptım ancak her alanı da alamıyorsunuz, mesela normalde 20H ile 7FH arasında olan bank0 için #reserve 0x2F:0x7F
diyerek 16 byte ı “compiler”a bırakayım 2FH ile 7FH arasını “reserve” edeyim dedim ancak “compiler” 7EH bana lazım hatası verdi, niye lazım diye sormadan “reserve” ettiğim alanı bir byte daha düşürdüm bu sefer de 7DH lazım dedi, düşe düşe 76H ye kadar düştüm. Böylece ilk bankta

#reserve 0x2F:0x76
  

ifadesiyle “reserve” ettiğim ve rahat rahat kullanabileceğim 72 byte lık bir alanım oldu. Diğer bankları da aşağıdaki bildirimlerle tamamını “reserve” edebildim, “compiler” herhangi bir hak iddia etmedi:)

#reserve 0xA0:0xEF
#reserve 0x120:0x14F

Böylece toplamda 72+80+48=200 byte “ram” alanı açmış oldum. Kalan 24 byte compiler a kaldı, helali hoş olsun:)

Peki bu alanlarda nasıl okuma yazma yapacağız?
Okuma ve yazma işlemi için basit iki geçiş fonksiyonu kullanacağız. Yazma için olana sadece 200 gözden kaçıncısına ne yazması gerektiğini söylüyoruz, bu fonksiyon verdiğimiz indisin bizim “ram”de hangi bank a tekabül ettiğini buluyor ve oraya yazıyor. Yani 200 gözlük bellek bölgesini bir dizi gibi kullanabiliyoruz. Ben şimdilik sadece yazma işlemi için olan fonksiyonu yazdım, okuma için olanı bu fonksiyon üzerinde küçük değişikliklerle elde edebiliriz. Deneme amaçlı “ram”e 1 den 200 e kadar sayıları doldurmak istedim ve sonuç gayet iyi. Bu satırları sonucu alır almaz yazdım, belki bir sorun çıkabilir, testler sonucunda bir gelişme olursa yine burdan haber veririm 🙂 Bakmak isterseniz ilgili kod ve resmi aşağıya koyuyorum, iyi çalışmalar.

/*Fatih Erdem 9 Ağu 08
Data logger çalışmasının bir parçası
*/
#include <16f628A.H>
#reserve 0x2F:0x76
#reserve 0xA0:0xEF
#reserve 0x120:0x14F
#fuses XT, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
void ram_yaz(int index, int data);

void main(void){
int i;

for(i=1;i<=200;i++){
 ram_yaz(i,i);
}

}

void ram_yaz(int index, int data){
   if(index>=1 && index<=72){ //bank0
      write_bank(0,index+0x0F-1,data);
   }

   if(index>=73 && index<=152){//bank1
      write_bank(1,index-73,data);
   }

   if(index>=153 && index<=200){//bank2
      write_bank(2,index-153,data);
   }


}



Dosyayı indirmek isteyen olursa : ram.c

2 thoughts on “16F628A nın tüm ram ini kullanmak istersek…

  1. Ali Alemdağ

    Kardeşim çok sağolasın. Banada bu RAM kullanımı ile ilgili bilgi lazımdı . çok işime yaradı . Aslında denemedim ama fonksiyonu iyi kurmuşsun… Kolay gelsin..

    Reply
  2. sefa ELMAS

    çalışma için teşekkür ederim. Ama ben bunu biraz geç gördüm gibi sanki halen siteyle ilgileniyormusun bilmihorum ama sesimi duyurabileceğim umudu ile 16f877 entegresine dizi oluşturdum ama diziyi almadı ram hatası verdi 652 elemanlı bir dizi bunu nasıl kabul ettirebiliriz işlemciye çözemedim.

    Reply

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir