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