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”).
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.
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.
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:
• 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:
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 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ı
Şekil 4. Projenin elektronik devresi
Sensör Şekil 5 de gösterilmiştir.
MPX4115A hava basıncı sensörünün çıkış
gerilimi şu formül ile verilmektedir:
V = 5.0 * (0.009 * kPa – 0.095)
veya,
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:
Ş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.
Ş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.
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: mikrobasic proje, mpx4115a, pic sd kart, PIC18F452 örnekleri