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....