RAM kullanma


NASIL?
PIC 18F2550/4550
ASSEMBLY DİLİNDE
RAM OKUMA / YAZMA

         16F serisinde genelde çok küçük bir ram alanı vardır. 18F877 de 360 bayt lık ram alanı var.. Doğal olarak çok yetersiz olduğundan pek kullanılmaz. 18F serisinde ram alanı 1kb 2 kb hatta bazı piclerde daha da fazla ram alanı bulunuyor. 18F2550/4550 de 2kb. Ram bulunuyor.

           Ram bilindiği üzere geçici hafıza dır. Yani pic e elektrik verildiğinde ram e bilgileri depolar kullanırız. Elektrik kesilince bu bilgiler kaybolur..

           Peki bir ram alanına veriyi nasıl yazıp nasıl okuyabiliriz. Bunun için 2 yol vardır. FSR/INDF komutları ile ve table komutları ile. İkisi arasındaki fark FSR ile bir adresten sıralı olarak verileri alabilirken table komutları ile her defasında adres bildiririz.

           Ben daha çok FSR yi kullanıyorum. FSR 18F serisinde FSRL ve FSRH adında iki baytlık bir vei ile adreslenir. Zaten 2000 baytlık alan için en az 2 bayt ile adrese ulaşabiliriz.

          FSRH 1 FSRL 0 olduğunda FSR adresi 256. baytı okur. FSR0 ı artırarak 256 ile 512 baytlar arasına ulaşabiliriz.

Benzer şekilde
FSRH 1 olduğunda 256-512
FSRH 2 olduğunda 513-768
FSRH 3 olduğunda 769-1024
FSRH 4 olduğunda 1025-1280
FSRH 5 olduğunda 1281-1536
FSRH 6 olduğunda 1537-1792
FSRH 7 olduğunda 1793-2048

aralığındaki ram adresleridir.
Peki FSRH 0 ı neden yazmadık FSRH0 pic tarafından kullanılan ramdir. Yani biz 2 kb ı değil 1792 baytlık ram alanını kullanabiliyoruz.
256. ram alanına bir veri yazmak istersek . Örneğin 12 verisini yazalım

movlw .2
movwf FSR0H
clrf FSR0L
movlw .12
movwf INDF0

yazmamız yeterli.INDF0 bizim ram e yazma ve okuma baytımızdır. Direk yazamıyoruz. INDF0 bu işlemi yapmaktadır.


Sıralı olarak verileri yazmak istersek bir çevrim ile bunu yapabiliriz.

ramyaz macro
local dongu
movlw .7
movwf FSR0H ; 1792 – 2048 arasına yazıyoruz.
clrf FSR0L;
movlw 0xFF
movwf sayici ; sayıcıya 255 değeri yükledik
dongu
movlw 0x20 ; 0x20 verisini
movwf INDF0 ; ram adresine yazıyoruz
incf FSR0L,1 ; FSR0L yi bir artırarak bir sonraki adresi tanımlıyoruz.
decfsz sayici,1 ; sayıcı 0 olmadıysa döngüye devam...
goto dongu
endm

Yukarıdaki macro 1792 ile 2048 ram alanına 0x20 değerini yazar. (bilgi: 0x20 asci boşluk space tuşuna karşılık gelir. )

RAM OKUMA
Yazdığımız bir değeri okumamızda gerekir. Bunun için yine ramde okunacak adresi yaıp INDF komutunu kullanacağız. Üstte 256 alanına yazdığımız 12 verisini okumak için

movlw .2
movwf FSR0H ; 256 . bayt ı adresledik
clrf FSR0L
movf INDF0,0 ; INDF0 ı okuyup
movwf degisken ; bir değişkene yükledik.

Bunuda macro olarak 256 bayt veriyi okumak istersek.
ramyaz macro
local dongu
movlw .7
movwf FSR0H ; 1792 – 2048 arasını okuyoruz.
clrf FSR0L;
movlw 0xFF
movwf sayici ; sayıcıya 255 değeri yükledik
dongu
movf INDF0,0 ; ram adresini okuyoruz
movwf degisken ; değişkene atadık
lcdyaz degisken ; değişkeni lcd ye yazdırıyoruz.
incf FSR0L,1 ; FSR0L yi bir artırarak bir sonraki adresi tanımlıyoruz.
decfsz sayici,1 ; sayıcı 0 olmadıysa döngüye devam...
goto dongu
endm