SD kart okuma yazma


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

Pic lerde sd karta verileri yazma ve bu verileri okuma temel olarak 2 şekilde oluyor..
1- Fat dosya sistemli olarak
2- Raw (her hangi bir dosya sistemi olmadan.)

Fat dosya sistemli olarak kayıt ve okuma nispeten zordur ve işlemcide daha fazla yer kaplamaktadır.. Ancak sd karta kaydettiğiniz bilgilere bir bilgisayardan da ulaşmak isterseniz, mutlaka fat dosya sistemini kullanmanız gerekmektedir... Bu kılavuzda fat dosya sistemi anlatılmayacak..

Raw olarak kayıtta ise bir dosya sistemi yoktur. Sd kartın istediğiniz bir sektörüne kayıt yapar ve sonra yine okuyabilirsiniz..Çok az yer kaplar(4 - 5 kb.) ..uygulanması çok daha kolaydır... Raw dosya sistemi ile kaydettiğiniz bilgileri hex editör ile görebilirsiniz.. Linuxta WxHexEditor windowsta ise HxD programlarına ihtiyacınız olacaktır...

Bu genel bilgileri verdikten sonra istediğiniz bir yazım editörüyle (Gedit, notepad, wordpad..vb..) pic assembly dilinde ile sd kartın giriş kodlarını yazalım...


Kodlamada macrolar şeklinde yazmak çok daha uygundur.. Macro yu bir kere bir dosya olarak kaydetmeniz yeterlidir. Bundan sonraki tüm projelerde macroyu projeye dahil ederek tekrar yazma derdinden kurtulursunuz...

Sd karta iki şekilde ulaşmak mümkün.. Biz SPI yı kullanacağız...

SPI iletişimde pin bağlantıları ;
SCK-PORTB1 çıkış => bcf TRISB,1
MOSI-SDO-PORTC7 çıkış => bcf TRISC,7
MISO-SDI-PORTB0 giriş => bsf TRISB,0 dir..

sd karttaki diğer pinler
CS direk gnd ye veya bir port çıkışına bağlanabilir çıkış. => bcf TRISB,3
vcc 5v.
Gnd gnd ye bağlanır...
cs direk gndye bağlanırsa sd kart sürekli iletişim halinde olur... bir pine bağlanırsa SPI ile başka araçlarıda yönetebiliriz. Diyelim aynı SPI hattına birde 5110 lcd ekranı bağladık.. sd kartın cs sini 1 yapıp 5110 un cs sini 0 yaparak SPI komutlarını 5110 a gönderebiliriz...
spi iletişim için gerekli kodlar... sdgiris macrosunda kullanacağız...

spigiris macro
    movlw 0x00
    movwf SSPSTAT
    movlw 0x32
    movwf SSPCON1
    bsf TRISB,0
    bcf TRISB,1
    bcf TRISC,7
    bcf TRISB,3 (sd kartın cs sini bağladığımız pin kaçsa onu yazın..)
endm


İlk macromuz sdgiris. SD kartı hazırlama kodlarıdır..kullanılan macroları boş bir dosyaya kaydedin....

sdgiris macro
    spigiris ; spigiriş işlemleri...
    bcf sdport,cs ; sdport cs pininin bulunduğu port tur. Cs Portb deki 3 nolu pin ise
         ; Bcf LATB,3 şeklinde yazabilirsiniz....
     _bosa ; altta tanımlı makrodur.. SPI ya 10 kere FF gönderir...
     bsf sdport,cs ; cs pinini 1 yapar..cs pini 1 ken sd kartla iletişim yoktur..
     movlw 0xFF ; FF göndermeye devam...
     movwf SSPBUF ; SPI dan gönder
     bekle 20 ; 20 ms. bekle
     movlw 0xFF ;
     movwf SSPBUF ;
     bekle 20 ;
     movlw 0xFF ;
    movwf SSPBUF
    bekle 20
    movlw 0xFF
    movwf SSPBUF
    bekle 20
    movlw 0xFF
    movwf SSPBUF
    bekle 20
    movlw 0xFF
    movwf SSPBUF
    bekle 20

    bcf sdport,cs ; sd kartla iletişime geç...
    cmd0 ; cmd0 macrosunu çalıştır...
     bcf sdport,cs ; sd kart iletişimi aç
    cmd55 ; cmd55 macrosunu çalıştır..
    bcf sdport,cs ; sd kart iletişimi aç
    baytuzunluk ; sd karta girildi... kaç bayt uzunlukta işlem yapılacağını belirle..
    bcf sdport,cs ; sd kart iletişimi aç
    bekle 100 ; 100 ms bekle
endm ; dön...


cmd0 macro ; cmd0 macrosu...
local cmd0cvp
    movlw b'01000000' ; b'01000000'
    movwf SSPBUF ; gönder
    bekle 20 ; bekle
    movlw 0x00 ; 0 gönder
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw b'10010101'
    movwf SSPBUF
    bekle 20
cmd0cvp
        movlw 0xFF
        movwf SSPBUF
        bekle 20
        movlw .1 ; 1 çıkar
        subwf SSPBUF,0
        btfss STATUS, Z
    goto cmd0cvp
    movlw 0xFF
    movwf SSPBUF
    bekle 20
endm

cmd55 macro ; cmd 55 macrosu...
local cmd55bas,cmd55cvp,acmd41p0,son
cmd55bas
    movlw b'01110111'
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw 0x00
    movwf SSPBUF
    bekle 20
    movlw b'10010101'
    movwf SSPBUF
    bekle 20
cmd55cvp
        movlw 0xFF
        movwf SSPBUF
        bekle 20
        movlw b'00000001'
        subwf SSPBUF,0
        btfsc STATUS,2
        goto acmd41p
        movlw 0x00
        subwf SSPBUF,0
        btfsc STATUS, Z
        goto son
    goto cmd55cvp

acmd41p
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw b'01101001'
      movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
      movlw b'00010000'
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movlw b'01011111'
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
    goto cmd55bas
     son
endm
baytuzunluk macro
local uzunlukcvp
     movlw b'01010000'
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movlw b'00000010'
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movlw b'10010101'
     movwf SSPBUF
     bekle 20

uzunlukcvp
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0x00
     subwf SSPBUF,0
     btfss STATUS, Z
     goto uzunlukcvp
endm

Bu kısma geldiğinizde sd karta ulaşıldı ve her işlemde kaç bayt okuyup / yazacağımızı bildirdik. Normal olarak sd kart bir defada 512 bayt okur ve yazar. Çünkü bir sektör 512 bayttır. Ancak bu komutu değiştirerek istediğimiz kadar bayt yazıp okuyabiliriz... Yukarıdaki komutu aynen kullanırsanız 512 bayt lık kayıt ve okuma yı seçmiş olursunuz.....

Bu noktadan sonra yazma ve okuma komutlarını çalıştırabiliriz. İstediğimiz sektörü yazıp okuyabilmek için önce sektör nosunu gönderiyoruz.. ardından bilgileri gönderiyor veya alıyoruz...

SD ye KAYIT

Sd karta kaydedeceğimiz verileri FSRO(H L) adresi ile – INDF0 komutu ile 18f2550/4550 ramine kaydediyoruz....

fsryazsayi macro lit,deg1
     clrf FSR0
     movlw lit
     movwf FSR0L
     movf deg1,0
     movwf INDF0
endm

üstteki macro ile normal asm sayfanızda
cblock
ab
adr1
adr2
adr3
endc


movlw .65
movwf ab
fsryazsayi 5,ab
komutu verebilirsiniz.. bu komutla ram in 5 nolu adresine ab değişkenindeki 65 değeri yüklenir. Bu şekilde baytuzunluk ta belirttiğiniz kadar ram adresini doldurmanız gerekir..şimdi de bilgileri kaydedeceğimiz sektör no'sunu belirtmeliyiz... adr1 adr2 ve adr3 değişkenlerine sektör noyu giriyoruz...

baytayir macro sayi,deg
     MOVLW UPPER sayi
     MOVWF deg+2
     MOVLW HIGH sayi
     MOVWF deg+1
     MOVLW LOW sayi
     MOVWF deg
ENDM

bu macroyuda asm sayfamızda diyelim 148627 nolu sektöre yazmak için...
baytayir .148627,adr
şeklinde kullanabiliriz...
Verileri ram e yazdık. Kayıt yapacağımız sektör numarasını da bildirdik. Şimdi kayda geçelim...
kullanacağımız diğer macro yukle...

yukle macro deg1,deg2
    movf deg1,0
    movwf deg2
    movf deg1+1,0
    movwf deg2+1
    movf deg1+2,0
    movwf deg2+2
    movf deg1+3,0
    movwf deg2+3
ENDM

32bit çarpma komutu gerekecek... sayfanın sonunda yapılacakları anlatacağım...

sdkayit macro adr
local writeresp,sendstart,relaquad,decnsend,senddata ,wrote,kyt
     baytayir .512,REGA0
     yukle adr,REGB0
     call carpma
     yukle REGA0,adr
     movlw 0x58
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movf adr3,0
     movwf SSPBUF
     bekle 20
     movf adr2,0
     movwf SSPBUF
     bekle 20
     movf adr1,0
     movwf SSPBUF
     bekle 20
     movlw 0x4A
     movwf SSPBUF
     bekle 20
writeresp
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0x00
     subwf SSPBUF,0
     btfss STATUS,2
     goto writeresp
sendstart
     movlw b'11111110'
     movwf SSPBUF
     bekle 20
     clrf som
     movlw .256
     movwf tane2
decnsend
     DECFSZ tane2,1
     goto senddata
     goto wrote
senddata
     fsrokudeg som,dta1
     movf dta1,0
     xorlw 0x05
     skpz
     goto kyt
     movlw 0x00
     movwf SSPBUF
     bekle 20
     incf som,1
     goto decnsend
kyt
     movf dta1,0
     movwf SSPBUF
     bekle 20
     incf som,1
     goto decnsend
wrote
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw 0xFF
     movwf SSPBUF
     bekle 20
     movlw b'11000000'
     movwf SSPBUF
     bekle 20
     bsf sdport,cvs ;
     bekle 100
endm

sdkayit macrosunu işlettiğiniz zaman ram deki dataları adr1 ,adr2 adr3 adresine yazar...

SD KARTTAN KAYIT OKUMA
asm sayfamızda diyelim 148627 nolu sektörü okumak için...
baytayir .148627,adr
komutunu veririz.
Cmd17 komutu ile adresi sd karta göndeririz..

cmd17 macro ; adres =sektör no*512
     baytayir .512,REGA0
     yukle adr,REGB0
     call carpma
    yukle REGA0,adr
     bcf sdport,cvs ;
     movlw 0x51
     movwf SSPBUF
     bekle 20
     movlw 0x00
     movwf SSPBUF
     bekle 20
     movf adr3,0
     movwf SSPBUF
     bekle 20
    movf adr2,0
    movwf SSPBUF
    bekle 20
    movf adr1,0
    movwf SSPBUF
    bekle 20
    movlw 0xFF
    movwf SSPBUF
    bekle 20
endm


ve sdoku diyerek adresdeki veriyi ram e yükletiriz..

sdoku macro
local tkr4,tkr5,okas
tkr4
    movlw 0xFF
    movwf SSPBUF
    bekle 20
     movf SSPBUF,0
    xorlw 0x00
    btfss STATUS,Z
    goto tkr4

tkr5
    movlw 0xFF
    movwf SSPBUF
    bekle 20
     movf SSPBUF,0
    xorlw 0xfe
    btfsc STATUS,Z
    goto tkr5

    movlw 0xFF
    movwf SSPBUF
    bekle 20
    movlw 0xFF
    movwf SSPBUF
    bekle 20
    movlw 0xff
    movwf dta2
    clrf dta1
    fsrsil

okas
    movlw 0xFF
    movwf SSPBUF
    bekle 20
    movff SSPBUF,dtdeg
    fsryazdeg dta1,dtdeg
    incf dta1,1
    decfsz dta2,1
    goto okas

    bsf sdport,cvs ;
    movlw 0xFF
    movwf SSPBUF
    bekle 100
endm


ramdeki değerleri

fsroku macro lit,deg
    clrf FSR0
    clrf FSR0H
    movlw lit
    movwf FSR0L
    movf INDF0,0
    movwf deg
endm

macrosunu kullanarak
fsroku 5,ab

komutu ile alırız. Üstteki komut 5 nolu adresteki değeri ab değişkenine yükler....

çarpma konusu

değişkenlerin içine
cblok
REGA0,REGA1,REGA2,REGA3
REGB0,REGB1,REGB2,REGB3
REGC0,REGC1,REGC2,REGC3
DSIGN
DIGIT1
DIGIT2
DIGIT3
DIGIT4
DIGIT5
MTEMP
MCOUNT
DCOUNT
count1
counta
countb
key
bey
OUT
dgdeg
RANDOM
__i
__j
__k
Mem_Loc
w_temp
status_temp
erg
...diğer değişkenler...
endc ile bildirin.

adresinden matematik komutlarını asm sayfanızın sonuna ekleyin....