NASIL?
PIC
18F2550/4550
ASSEMBLY
DİLİNDE
FAT
OKUMA
18F
serisinde hem flash bellek hem ram artırıldığı için sd kartı
okuyup ve yazabiliyoruz. Ancak dosya sistemi olmadan kullanılan sd
karttaki bilgileri normal bilgisayarlar ile göremeyiz. Bu sorunu
aşmak için pic ile sd karta bir dosya sistemi ile yazıp okumamız
gerekiyor.
Değişik
dosya formatları arasında pic için en çok kullanılanı FAT16
dosya sistemidir. FAT16 nın avantajı içindeki adresler 8+8 16 bayt
olarak adreslidir. Kısıtlılık ise en fazla 2gb lık sd karta
uygundur. Daha büyük sd kartı FAT16 ile formatlarsanız sd kartın
2 gb ını kullanabilirsiniz.
Bu
kılavuz SD kart okuma kılavuzu ve ram kılavuzu ile birlikte
kullanılabilir. Önce sd kart kılavuzunu uygulayıp sonra FAT
işlemlerini yapın...
SD
kartı FAT16 formatında formatlayıp içine 32kb tan küçük yazı
dosyaları kopyalayın. Daha büyük dosyaların işlemleri biraz
farklıdır.
SD
kartın bağlantılarını yapıp sd giriş işlemlerini
kılavuzdakine göre yaptığınızı varsayıyorum.
FAT16
dosya sisteminde sektör 512 bayttır. Tüm sd kart bu 512 baytlık
sektörlerden oluşur.
Bir
cluster ise 32 kb yani 63 sektörden oluşur. Sd karttaki dosyalar
cluster ve sektör numaraları ile bulunur.
SD
karttaki ilk sektör 0 nolu sektördür. İlk olarak bu sektör
okunur.
Sd
kart kılavuzunda ki cmd17 ve sdoku ile 0 adresini okuyup ram e
yazarız.
3
baytlık bir değişken oluşturuyoruz. 454. 455. 456. baytları
okuyup değişkene atıyoruz. Dikkat edilmesi gereken işlem şu:
diyelim 454 te 75 455 te 02 456 da 00 değerlerini okuduk. Bu
değerler 16 lık sistemdedir. Ve küçük ten başlar. Yani 0x750200
sırasıyla alınır ve 0x000275 bulunur. Ondalık değeri 0x275 =
629 bulunur. Diyelim sıasıyla 3 baytlık abc abca abcb olarak
sıralı bir değişken oluşturduk. Bu değişkene okuduğumuz
değerleri yazalım.
Değişkenler
temizlenir.
clrf
REGA0 ; toplam 4 baytlık değişkenin 1. baytı clrf ile temizle
clrf
REGA0+1 ; 2. bayt
clrf
REGA0+2 ; 3. bayt
clrf
REGA0+3 ; 4.bayt
clrf
REGB0 ; 4 baytlık işlem değişkenimizi clrf ile temizle
clrf
REGB0+1 ; 2.bayt
clrf
REGB0+2 ;3.bayt
clrf
REGB0+3 ; 4. bayt
clrf
ilkadres ; 4 baytlık değişkenimizi clrf ile temizle
clrf
ydk+1 ; 2.bayt
clrf
ydk+2 ;3.bayt
clrf
ydk+3 ; 4. bayt
clrf
ilkadres ; 1.bayt
clrf
ilkadres+1 ; 2.bayt
clrf
ilkadres+2 ;3.bayt
clrf
ilkadres+3 ; 4. bayt
clrf fatadres ; 1. bayt
clrf
fatadres+1 ; 2.bayt
clrf
fatadres+2 ;3.bayt
clrf
fatadres+3 ; 4. bayt
clrf
kokadres ; 1. bayt
clrf
kokadres+1 ; 2.bayt
clrf
kokadres+2 ;3.bayt
clrf
kokadres+3 ; 4. bayt
clrf
temadres ; 1. bayt
clrf
temadres+1 ; 2.bayt
clrf
temadres+2 ;3.bayt
clrf
temadres+3 ; 4. bayt
sdoku2
_ydk ; _ydk =0 olduğundan sdoku2 komutu ile 0. sektörü
okuyoruz . Ramdeki alan 256-768 baytları arasına yazıyoruz. İlk
256 baytı pic kullanır. Bu yüzden biz 256 ile 768 arasına
yerleştirdik. 454.bayt için de 256 elersek 710. baytı okuyoruz.
movlw
LOW(710) ; okuyup _ydk değişkenine yazalım.
movwf
FSR0L ; 454 ün alt değeri FSR0L
movlw
HIGH(710) ; üst değeri
movwf
FSR0H ; FSR0H a yazdık. 3. bayt boş ve temiz.
movf
INDF0,0 ; 454. bayt FSR okuma
movwf
ilkadres
incf
FSR0L ;1.bayt FSR okuma
movf
INDF0,0
movwf
ilkadres+1
incf
FSR0L ;456.bayt FSR okuma
movf
INDF0,0
movwf
ilkadres+2
Bu
şekilde yukarıda açıkladığım sıralamaya uygun verileri aldık,
_ ilkadres değişkeninde tutuyoruz. Bu değer ilkadres tir (boot
sector entry). İlkadres bize kök dizin adresini verecek. İlkadres
teki sektörü okuyoruz. Bu sektördeki 11. 12 baytlar ve 14. 15.
baytların çarpımı bize
FAT
adresini verir. 11 12 baytları 16. bayt ve 22 23 .baytların
çarpımı da kök dizin adresini verir.
FAT
= 11 12 * 14 15
KÖK
= 11 12 * 16 * 22 23
256
bayt ekliyoruz. Yani FSR0H ı 1 yapıyoruz.
sdoku2
_ ilkadres ; ilkadres sektörünü oku.
movlw
.11 ; okuyup _ REGA0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 11
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 11. bayt FSR okuma
movwf
REGA0
incf
FSR0L ;12.bayt FSR okuma
movf
INDF0,0
movwf
REGA0+1
movlw
.14 ; okuyup _ REGB0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 14
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 14. bayt FSR okuma
movwf
REGB0
incf
FSR0L ;15.bayt FSR okuma
movf
INDF0,0
movwf
REGB0+1
SD
kart kılavuzunda verdiğim 4 bayt çarpma makrosu ile sonuç REGA0
da saklanır.
call
carpma
movf
REGA0,0
movwf
fatadres
movf
REGA0+1,0
movwf
fatadres+1
movf
REGA0+2,0
movwf
fatadres+2
movf
REGA0+3,0
movwf
fatadres+3
Böylelikle
fat adreside bulduk. Benzer yolla kök dizin adresini buluruz.
movlw
.11 ; okuyup _ REGA0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 11
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 11. bayt FSR okuma
movwf
REGA0
incf
FSR0L,1 ;12.bayt FSR okuma
movf
INDF0,0
movwf
REGA0+1
;
temizle REGB0
movlw
.22 ; okuyup _ REGB0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 22
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 22. bayt FSR okuma
movwf
REGB0
incf
FSR0L ;23.bayt FSR okuma
movf INDF0,0
movwf REGB0+1
call
carpma ; REGA0 * REGB0 sonuç REGA0 da.
;
temizle REGB0
movlw
.16 ; okuyup _ REGB0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 16
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 16. bayt FSR okuma
movwf
REGB0
call
carpma ; REGA0 * REGB0 sonuç REGA0 da.
movf
REGA0,0 ;
movwf
kokadres
movf
REGA0+1,0
movwf
kokadres+1
movf
REGA0+2,0
movwf
kokadres+2
movf
REGA0+3,0
movwf
kokadres+3
Evet.
Sonunda kök dizin adresini bulduk... Kök dizinde dosyaların adı
uzunluğu ve ulaşmak için gerekli sektör no bulunur.
1
adres daha gerekiyor. O da dosyalar için temel adres. Tüm
dosyalara bu temel adresle erişiriz. Kök adrese 32 ekliyerek temel
adrese ulaşırız. REGA0 da kök adres vardı. REGB0 a 32 yazıp
toplama yaptırırız.
;
temizle REGB0
movlw
.32
movwf
REGB0
call
toplama
movf
REGA0,0 ;
movwf
temadres
movf
REGA0+1,0
movwf
temadres+1
movf
REGA0+2,0
movwf
temadres+2
movf
REGA0+3,0
movwf
temadres+3
sdoku
kokadres yazarak kök dizini rame aktarırız. Kök dizinde her dosya
için 32 bayt veri tutulur. Önemli kısım : İlk 11 bayt dosya adı.
26 ve 27. baytlar dosya cluster no sudur. İlk dosya 96. bayttan
başlar. Daha önceki baytlar sistem dosyalarıdır.
FAT
her bir dosyaya bir cluster ayırır. İsterseniz bir baytlık veri
yazın. Bu bir bayt için bir cluster 32 kb yer ayırır.
sdoku kokadres
movlw
.96 ; okuyup _ REGB0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 96
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 0. bayt FSR okuma
LCD_Char
incf
FSR0L ;1.bayt FSR okuma
movf
INDF0,0
LCD_Char
.
.
.
.
istediğimiz
verileri alır kullanırız.
26
ve 27. baytları okuyup o dosyanın clusterini öğreniriz.
;
temizle REGA0
movlw
.26 ; okuyup _ REGB0 değişkenine yazalım.
movwf
FSR0L ; FSR0L = 26
movlw
.1 ; üst değeri
movwf
FSR0H ; FSR0H =1
movf
INDF0,0 ; 26. bayt FSR okuma
movwf
REGB0
incf
FSR0L,1 ;27.bayt FSR okuma
movf
INDF0,0
movwf
REGB0 +1
dosya
clusterini biliyoruz. Sdoku komutu için sektör numarası lazım.
Sektörünü nasıl bulacağız.
Cluster
nodan 2 çıkarıp 64 ile çarpıyoruz sonuca temeladresi ekliyoruz.
Böylelikle dosya sektörünü bulmuş oluyoruz.
REGB0
= cluster no
Dosya
sektor no = ((REGB0 -2 )* .64) + temadres
;
temizle REGA0
decf
REGB0,1
decf
REGB0,1
movlw
.64
movwf
REGA0
call
carpma ; REGA0 * REGB0 sonuç REGA0 da.
;
temizle REGB0
movf
temadres,0
movwf
REGB0
movf
temadres+1,0
movwf
REGB0+1
movf
temadres+2,0
movwf
REGB0+2
movf
temad
res+3,0
movwf
REGB0+3
call
toplama ; REGA0 + REGB0 sonuç REGA0 da.
sdoku
REGA0
komutuyla
istediğimiz dosyayı ram e aktarmış oluruz.
sdoku
REGA0
movlw 0xff
movwf
ydk ; ilk 255 baytı için sayıcı
movlw
.1
movwf
FSR0H
clrf
FSR0L
dongu
movf
INDF0,0 ; 26. bayt FSR okuma
LCDChar
incf
FSR0L,1 ;27.bayt FSR okuma
decfsz
ydk
goto
dongu
kodlarıyla
sd karttaki verileri lcd ekrana basarız.