PIC Mikrodenetleyici SD Kart Kullanımı MikroBasic Projesi

| Ekim 16, 2015 Tarihinde güncellendi
PIC Mikrodenetleyici SD Kart Kullanımı MikroBasic Projesi

SD Memory Card (Secure Digital Memory Card), Türkçesi ‘Güvenli Sayısal Hafıza Kartı’ anlamına gelmektedir. İlk olarak SanDisk [1] tarafından 2001’li yıllarda ortaya çıkan bu kartlar MMC (Multimedya Kart) kartların bir gelişmiş şekli olarak da düşünülebilir. SD kartlar günümüzde birçok elektronik cihazlarda kullanılmaktadırlar. Örneğin, cep telefonlarında, sayısal kameralarda, MP3 çalanlarda, GPS alıcılarında, PDAlarda, ve daha bunlar gibi birçok elektronik cihazlarda SD hafıza kartlarını görmemiz mümkündür. Hafıza kartı olarak kullanılan diğer kartlar şunlardır: SM (“Smart Media”), CF (“Compact Flash”), MMC (“Multi Media”), ve MS (“Memory Stick”).

PCBway Türkiye PCB Manufacturer PCB Assembly

Bu yazımızda PIC18F452 modeli bir mikrokontrolöre SD kart bağlantısının nasıl yapılacağı açıklanmaktadır.
Projede PIC mikrokontrolör bir hava basıncı sensörü sayesinde basıncı algılayıp okumuş olduğu basınç verilerini her saniye bir SD kart üzerinde saklamaktadır. Projede mikrokontrolör yazılımı MikroElektronika firmasının [2] geliştirmiş olduğu mikroBasic derleyici kullanılarak yapılmıştır.

SD KARTLAR

Şekil 1 de resmi gösterilen standart SD kartlar içerisinde mikroişlemci, hafıza, ve giriş-çıkış devreleri bulunmaktadır. 32mm x 24mm x 2.1mm ebatlarında olan SD kartların 16MB, 32MB, 64MB, 128MB, 256MB, 512MB, 1GB, 2GB ve 4GB kapasiteli çeşitleri bulunmaktadır.

Sonraları, daha küçük cihazlarda kullanılmak için miniSD kartlar geliştirilmiştir. Bu kartların boyutları standard SD kartın yarısı kadar olup 20mm x 21.5mm x 1.4mm ölçülerindedirler. miniSD kartlar genellikle 32MB ce 2GB arasında bir kapasitede üretilmektedirler. MiniSD kartları adapterler sayesinde standart SD soketlerinde kullanmak mümkündür.

sandisk-sd-kart

2005 yıllarında teknolojinin gelişmesiyle daha küçük boyutlu hafıza kartlarına olan ilgi artmıştır. Bu
yıllarda mikroSD kartlar üretilmiştir. Boyutları sadece 11mm x 15mm x 1mm olan mikroSD kartlar 32MB ve 2GB arasında bir kapasitede üretilmektedirler. mikroSD kartları adapterler sayesinde miniSD ve standart SD soketlerinde kullanmak mümkündür.

SD kartlar yaklaşık 2MB/s veri aktarımı yapabilmektedirler. Veri transfer hızı genellikle standard CDROM okuma hızı baz alınarak verilmektedir. 1x olarak da bilinen standart CDROM hızı yaklaşık 150kB/s dir. Bu durumda, 32x diye satılan bir SD kartın hızı 32×150 = 4,8MB/s kadardır.SD kartlar 9 bacaklıdır.

Şekil 2 de standart bir SD kartın bacak bağlantıları gösterilmiştir. Şekilden de görüleceği gibi kolay tanınması için 9 nolu bacak diğerlerinden daha aşağıdadır.

sd-kart-bacak-baglantilari

Tablo 1 de SD kartın bacak bağlantıları açıklanmıştır. SD kartlar iki modda çalışmaktadır: SD kart modu, ve SPI (Seri Arayüz Bus modu). Genellikle daha kolay olduğu için birçok projelerde kart SPI
modunda kullanılmaktadır. Bu modda kullanıldığında sadece aşağıdaki 7 bacağa gerek olmaktadır:

tablo-sd-kart-bacak-baglantilari

• 2 tane toprak (bacak 3 ve 6)
• Güç kaynağı (bacak 4)
• Çipi seç (bacak 1)
• Çıkış (bacak 7)
• Giriş (bacak 2)
• Saat (bacak 5)

Burada 3 tane bacağın güç kaynağı ve toprak için kullanıldığı göz önünde bulundurulursa veri alış-verişi için sadece aşağıdaki 4 bacağın kullanıldığını görürüz:

• Çipi seç (bacak 1)
• Çıkış (bacak 7)
• Giriş (bacak 2)
• Saat (bacak 5)

Karta güç kaynağı bağlandığında ilk olarak kart SD modunda çalışmaktadır. Daha sonra karta gönderilen komutlar sayesinde kart SPI moduna geçirilmektedir. mikroC derleyici kartı SD moduna koyup çalıştırmaktadır. Tablo 2 de bazı SD kartların kapasiteleri verilmiştir:

sd-kart-kapasiteleri

Kart üzerinde bir bölüm güvenli veri saklamak için ayrılmıştır. Bu bölüm göz önünde bulundurulursa, kullanıcının yazıp okuyabileceği bölüm Tablo 3 de gösterildiği gibidir. Örneğin, 1GB SD kart üzerinde 20,480 güvenli sektör ve kullanıcının yazıp okuyabileceği 1,983,744 sektör bulunmaktadır. Kullanıcı bu sektörlerin herhangi birine veri yazıp okuyabilir (1 sektör = 512 bayt).

sd-kart-sektor-alanlari

SD kartlar tipik olarak 2.7V gerilim ile çalışmaktadırlar. Karta verebileceğimiz maksimum gerilim 3.6V geçmemelidir. Eğer kart mevcut 5V ile çalıştırılacaksa gerilimi 5V dan 2.7V – 3.6V düşüren regülatör devresi kullanmamız gerekmektedir.

SD KART MIKROBASIC KOMUTLARI

MikroBasic PIC derleyicisinin SD kartlara yazıp okumak için birçok özel fonksiyonları bulunmaktadır. Bu fonksiyonlar sayesinde SD kartlar üzerinde dosyalar yaratabilir ve veri saklayabiliriz. SD kart fonksiyonları sadece PIC18 serisi mikrokontrolörler için yazılmıştır (PIC16 serisi için bu fonksiyonları kullanamayız)

Önemli olan mikroBasic SD kart fonksiyonları Tablo 4 de verilmiştir. Bu fonksiyonları iki bölüme ayırabiliriz: Direk olarak SD kart sektörlerine veri yazıp okumak için kullanılan fonksiyonlar (ilk 3 fonksiyon), ve SD kart üzerinde dosya yaratıp bu dosyaya veri yazıp okuyan fonksiyonlar.

SD kartın herhangibir sektörüne veri yazıp okumak için şu işlemleri yapmalıyız:

• Kartı hazırla (Mmc_Init)
• Kartın istenilen sektörüne veri yaz (Mmc_Write_ Sector)
• Kartın istenilen sektöründen veri oku (Mmc_Read_ Sector)

Yukarıdaki işlemlere ilaveten, kart üzerinde olan bir dosyaya veri ilave etmek istediğimizde şu işlemleri yapmalıyız:

SD KART ÜZERİNDE HAVA BASINCI VERİLERİNİ SAKLAYAN PIC MİKRODENETLEYİCİ PROJESİ

• Kartı Hazırla (Mmc_Fat_Init)
• Dosya ismini tanımla (Mmc_Fat_Assign)
• Dosyanın sonuna git (Mmc_Fat_Append)
• Dosyaya veri yaz (Mmc_Fat_Write)

Mmc_Fat_Assign fonksiyonu ile dosya ismini tanımlarken, dosya ismi büyük harf, 8 karakterli olmalı, ve 3 karakter dosya uzantısı verilmelidir. Dosya ismi ve uzantısı arasında nokta kullanmamalıyız. Dosya isminden sonra argüman olarak 0x80 kullanırsak yeni dosya yaratılir, aksi halde yeni dosya yaratılmaz (daha fazla bilgi için mikroBasic kullanım kılavuzuna bakınız).

MikroBasic SD kart fonksiyonlarını kullanmazdan önce ilk olarak kartı SPI moduna koymamız gerekmektedir. Bunun için ise programımızın başında aşağıdaki fonksiyonu olduğu gibi çağırmamız gerekmektedir:

Spi_Init_Advanced(MASTER_OSC_DIV16,
DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW, LOW_2_HIGH)

Tablo 4 : Önemli mikroBasic SD kart fonksiyonları

Komut

Tanımı

Mmc_Inıt

Fonksiyonları BAşlat

Mmc_Read_Sector

1 Sektör Oku

Mmc_Write_Sector

1Sektöre Yaz

Mmc_Fat_Init

FAT dosya sistemini başlat

Mmc_Fat_QuickFormat

Kartı format yap

Mms_Fat_Assign

Dosya ismini belirt

Mmc_Fat_Reset

Dosyanın başına git

Mmc_ Fat_Rewrite

Dosyanın başına git ve doyayı temizle

Mmc_Fat_Append

Dosyanın sonuna git

Mmc_Fat_Read

Dosyadan veri oku

Mmc_Fat_Write

Dosyaya veri yaz

PIC SD KART PROJESİ

Projenin blok şeması Şekil 3 de verilmiştir. Projenin elektronik devresi ise Şekil 4 de görülebilir. Projede PIC18F452 modeli bir mikrokontrolör [3] kullanılmıştır. Projede PIC18 serisinden PIC18F452 dışında başka herhangibir mikrokontrolör kullanmamız mümkündür. Mikrokontrolör 4MHz rezonatör ile çalıştırılmıştır, fakat arzu edilirse kristal de kullanılabilir. Mikrokontrolörün AN0 analog bacağı MPX4115A modeli [4] bir hava basıncı sensörüne bağlanmıştır. Bu sensör aşağıda gösterildiği gibi 6 veya 8 bacaklı olabilir:

6 bacaklı sensör

Bacak Tanım
1 Çıkış gerilimi
2 Toprak
3 +5V gerilim
4-6 Kullanılmaz

8 bacaklı sensör
Bacak Tanım
1 Kullanılmaz
2 +5V gerilim
3 Toprak
4 Çıkış gerilimi
5-8 Kullanılmaz

Şekil 3. Projenin blok şeması

projenin-elektronik-devresi-projenin-blok-sema

Şekil 4. Projenin elektronik devresi

Sensör Şekil 5 de gösterilmiştir.

mpx4115a-hava-basinci-sensorunun

MPX4115A hava basıncı sensörünün çıkış
gerilimi şu formül ile verilmektedir:

V = 5.0 * (0.009 * kPa – 0.095)

veya,

kpa-formul-1

burada,
kPa = Atmosferik basınç (Kilo Pascals)

V = Sensörün çıkış gerilimi (V)

Hava basıncı ölçümlerinde genellikle milibar birimi kullanılmaktadır. Deniz seviyesinde ve 15ºC sıcaklıkta hava basıncı 1013.3 milibardır. Yukarıdaki formülde basınç kPa olarak verilmiştir. kPa basınç birimini milibar basınç birimine dönüştürmek için formülü 10 ile çarpmamız gerekmektedir:

kpa-formul-2

Şekil 6 da MPX4115A sensor gerilim çıkışının basınç ile değişimi gösterilmiştir. Burada bizim ilgimizi çeken bölgeler basıncın 800 – 1000 milibar arasında olduğu bölgelerdir.

Hava basıncını milibar olarak okuyup kart üzerinde saklamak için gerekli işlemler şunlardır:

• Mikrokontrolörün analog giriş portlarından birini kullanarak analog basıncı 10 bitlik bir dijital sayı olarak oku.

millibars

Şekil 6 MPX4115A hava basıncı – gerilim değişimi

• Formülü kullanarak okunmuş olan gerilimi milibar biriminden basınca dönüştür.

• Basıncı SD kart üzerindeki dosyaya yaz.

SD kart mikrokontrolörü PORT C bacaklarına şu şekilde bağlanmıştır:

Çip seç RC2
Saat RC3
Çıkış RC4
Giriş RC5

SD kart giriş bacaklarındaki maksimum gerilimin 3.6V geçmemesi gerekmektedir. Bunun için çıkışı +5V olan mikrokontrolör bacaklarındaki gerilim 3.3K ve 2.2K gerilim bölücü dirençler kullanılarak +3V a düşürülmüştür.

Projede SD karta gerilim sağlamak için MC33269 DT-3.3 modeli [5] ve +5V gerilimi +3.3V a düşüren regülatör kullanılmıştır.

Projenin yazılımı Şekil 7 de verilmiştir. Ana programın başında AN0 bacağı giriş olarak tanımlanmış ve A/D çevirici konfigür yapılmıştır. Daha sonra Spi_Init_ Advanced fonksiyonu çağrılarak kart SPI çalışma moduna konmuştur. mikroBasic SD kart dosya kullanan fonksiyonları kullanmazdan önce Mmc_ Fat_Init fonksiyonuna çağırmamız gerekmektedir.

SD kart üzerinde dosya yaratmak için Mmc_Fat_ Assign fonksiyonunu kullandık ve Mmc_Fat_Rewrite fonksiyonu ile dosyanın başına gidip Mmc_Fat_Write fonksiyonu il şu başlığı yazdık: BASINÇ VERILERI. Ana program esas olarak sonsuz bir döngü içerisinde çalışmaktadır.

SD KART UZERINDE HAVA BASINCI VERILERINI SAKLA

Bu projede PIC18F452 modeli bir mikrokontrolor kullanılmıştır. Mikrokontrolorun PORT C bacaklarına bir SD kart şu şekilde bağlanmıştır:

Kart CS – RC2
Kart CLK – RC3
Kart DO – RC4
Kart DI – RC5

Aynı zamanda mikrokontrolorun AN0 analog giriş bacağına MPX4115A modeli bir hava basıncı sensörü bağlanmıştır. Program kart üzerinde “BASINC.TXT” isimli yeni bir dosya açar ve her 15 saniyede bir sıcaklık ve hava basıncı verilerini bu dosyalarda saklar.

Dosya: BASINC.PBP
Tarih: Ocak 2007
Programlayan: Doğan Ibrahim
program BASINC

‘ Hava basincini AN0 analog portdan oku ve Veri
‘ degiskeninde sakla.

‘ Veri degiskeni basinci milibar olarak saklar

sub function Basinc_Oku() as Word
DIM Veri as Longint
Dim Temp as word
Temp = Adc_Read(0) Basinci oku
Veri = Longint(Temp)*10000/1024
‘ Volt’a donustur
Veri = Veri + 950
Veri = Veri / 9 Result = Word(Veri)
Basinc
end sub

main:
DIM basinc as Word
DIM Stat as Byte
DIM Basinclik as String[5]
DIM BBaslik as String[80]
DIM YeniSatir as Byte[1]

TRISA = 0x01 AN0 bacagi giris
ADCON1 = 0x8E

‘ A/D ceviriciyi hazirla

YeniSatir[0] = chr(10)
BBaslik = “BASINC VERILERI” + chr(10)
SPI bus baslat
Spi_Init_Advanced(MASTER_OSC_DIV16,DATA_
SAMPLE_MIDDLE,
CLK_IDLE_LOW,LOW_2_HIGH)
SD karti dosyalama islemi icin hazirla
Stat = Mmc_Fat_Init(PORTC, 2)

‘ Basinc Dosya ismini belirt, dosyanin basina git ve
‘ baslik yaz

Stat = Mmc_Fat_Assign(“BASINC.TXT”, 0x80)
Mmc_Fat_Rewrite()
Mmc_Fat_Write(BBaslik,16)

Tekrar:
‘ Basinci oku ve acilmis olan dosyaya yaz
basinc = Basinc_Oku()
‘ Basinci oku
WordToStr(basinc,Basinclik)

‘ Karaktere donustur

Mmc_Fat_Assign(“BASINC.TXT”, 0x80)
‘ Dosyayi belirt
Mmc_Fat_Append()
Mmc_Fat_Write(Basinclik, 5)
Basinci karta yaz
Mmc_Fat_Append()
Mmc_Fat_Write(Yenisatir, 1)
Yeni satir yaz
Delay_Ms(15000)
‘ 15 saniye bekle
Goto Tekrar
‘ Tekrarla
End.

Basınc_oku fonksiyonu AN0 portundan basıncı okur ve sayısala dönüştürür. 10-bit analog-sayısal çevirici kullanıldığı için sayısala çevirilen sayı 0 ve 1023 arasında herhangibir değer alabilir (toplam 1024 değer). +5V referans gerilimi 1024 adım olarak gösterildiği için, okunmuş olan sayısal değeri Volt olarak gerçek gerilime dönüştürmek için 5/1024 ile çarpmamız gerekmektedir. Bu elde ettiğimiz Volt değeri daha önce verilen formülde gösterildiği gibi 2 ile çarpıp 0.95 ilave etmemiz ve sonra da 0.009 a bölmemiz gerekmektedir. Kısacası, basıncı gerçek milibar olarak hesaplamak için, eğer elde ettiğimiz sayısal sayı Temp ise yapmak istediğimiz işlem şudur:

milibar = ( 2 * Temp * (5/1024) + 0.95 ) / 0.009

veya,

milibar = ( 10* Temp /1024 + 0.95 ) / 0.009

Kesirli işlemleri ortadan kaldırmak için pay ve paydayı

1000 ile çerparsak,

milibar = ( 10000 * Temp /1024 + 950) / 9

Basınc_Oku fonksiyonunda yukarıdaki işlem yapılıp hava basıncı değeri elde edilmektedir. Programda yazmak istediğimiz dosya adını Mmc_Fat_ Assign alt-programı ile belirtmemiz gerekmektedir. Şekil 8 de BASINC.TXT dosyasının WORD programı ile açılımı gösterilmiştir.

basinc-txt

SONUÇ

Bu yazımızda SD hafıza kartlarının PIC mıkrokontrolör tabanlı sistemlerde kullanımlarına bir göz attık. Yazımızda hava basinci yarı-iletken bir basinç sensörü ile algılanır ve milibara dönüştürülüp her 15 saniyede bir SD kart üzerindeki bir dosyada saklanır. Yazımızda PIC18 modeli bir mikrokontrolör ve mikroBasic derleyici kulalnılmıştır.

SD kartlar boyutlarının küçük ve yüksek kapasitelerinden dolayı portabıl cihazlarda veri saklamak için ideal bir yapıya sahiptirler. SD kartların kapasiteleri hemen her yıl artmaktadır. Halen piyasada 4GB kapasiteli kartlar mevcuttur. Bu yazımızda prensipleri verilmiş ve tasarımı yapılmış olan SD kart sistemi geliştirilip çok daha kompleks SD kart sistemleri kurmak mümkündür.

6. KAYNAKÇA
1. www.sandisk.com
2. www.mikroelektronika.com
3. www.microchip.com
4. www.motorola.com
5. www.proactivecomponents.com
6. D. Ibrahim, “PIC Mikrokontrolör SD Kart
Projeleri”
Bileşim Yayıncılık ve Fuarcılık A.Ş., 2008,
www.bilesim.com.tr

Hazırlayan: Prof. Dr. Doğan İbrahimYakın Doğu Üniversitesi, Mühendislik Fakültesi, Bilgisayar Mühendisliği Bölümü, Lefkoşa, KKTC E-mail: [email protected]

Emeği geçen hazırlayan kişilere teşekkürler

Yayım tarihi: 2015/03/24 Etiketler: , , ,



Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir