FAT16 dosya sistemi



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.