Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.

Başlatan RaMu, 22 Ekim 2014, 21:10:27

RaMu

0)Hazırlayan: RaMu || uCanEL
1)Giriş
2)Neler paylaşıldı
3)Kütüphanenin nasıl kullanılacağına dair açıklamalar.
4) Örnek kodun main kısmı.
5)Projenin isis simulasyon, sd kart imaj, örnek kod ve kütüphane dosyaları indirme linki ve yararlanılan kaynak linki.
6)Çalışma ekran görüntüsü.
7) Devamı yarın :) bu kütüphane ile sd karta yazmada yapılabiliyor
bu ve benzeri fonksiyonları uygun olduğum bir zaman paylaşacam.
Ayrıca denemelerimi gerçek devrede nokia 6100 ekranı kullanarak yaptım
bununla ilgilide paylaşım olacak, ne zaman diye sormayın.

1)
Genellikle SD Kart uygulamalarında CcsC kütüphanesinin kullanımında sıkıntılar yaşanıyor,
ben SUKY adlı bir arkadaşın yazdığı kütüphaneyi denedim ve çalıştırdım
daha sonra üzerinde bazı değişikliklerde yaptım,
konunun ilerleyen zamanlarında kendi eklemelerimide paylaşacam.

2)
Suky nin CcsC SD kart kütüphanesi,
benim düzenlediğim örnek program,
proteus isis (8.1) örnek simulasyon devresi,
isis simulasyonu için SD kart imajı.

3)
Kod ekte mevcut fakat direk görünmesi için burayada ekliyorum.

Kodun içinde aslında kullanımını açıkladım yinede tekrarlayacağım;

FAT_OpenFileAndRead dosyayı hem açmaya hemde okumaya yarayan fonksiyondur.

FAT_OpenFileAndRead(NombreCorto,0, 'o', BufferFAT);

İlk parametre (burada NombreCorto) kısmına biz açmak istediğimiz dosya ismini yazıyoruz,
ilk parametre 13 elemanlı bir dizi olarak kullanıcı tarafından tanımlanıp kullanılabilir
dosya ismi kısa dosya adı olmak zorunda, yani
12345678.xxx 8 karakter dosya adı sonra nokta sonra 3 karakter dosya uzantısı,
dosya adı 8 karakterden küçükse 8 karakter olana kadar boşluk ilave edilmeli.

İkinci parametre (burada 0) girdiğimiz dosya adının sd kartta nereden itibaren aranacağı bilgisi
0 dediğimizde root directoryde en baştan itibaren dosyayı arar.

üçüncü parametre (burada 'o') 'o' veya 'r' olabilir,

'o' open yani dosyayı aç demektir,
fonksiyon ilk kullanılırken bu değer 'o' yapılıp dosya açılır
fonksiyon 'o' ile ilk defa çağrıldığındada BufferFAT içene değerleri okuyup yükler

daha sonra dosyanın geri kalanını okumak için 'r' ile fonksiyon çağırılır
fonksiyon her kullanıldığında BufferFAT içine sd karttan dosyanın sıradaki 512 byte ını
okuyup yerleştirir
yani son parametre (burada BufferFAT) ramde tanımlı 512 bytelık bir dizi olmalıdır

programcı fonksiyonu çağırdıktan hemen sonra BufferFAT i istediği gibi kullanır ekrana yazar vs.

fonksiyonun geri döndürdüğü değerler:
FAT_ERROR (0 olarak tanımlı), FAT_OK (1 olarak tanımlı), FAT_READ_COMPLETE (0xFF olarak tanımlı)
FAT_ERROR eğer hata olursa
FAT_OK eğer daha okunacak veri varsa (dosya sonuna erişilmedi ise) ve herşey yolundaysa
FAT_READ_COMPLETE daha okunacak veri yoksa (dosya sonuna erişildi, okuma bitti)

Örnek kodda,
paylaştığım sd imajının içine önceden pcde yazılmış olan
06.TXT adlı txt belgesi dosya adı ile çağrılıp açılıyor ve okunup
virtual terminalde rs232 ile gösteriliyor.

4)
Kod: (Ekteki gerekli kütüphaneler include edilmek zorunda tabiki.)
//#include <main_SD_8.h>



//#define SDCARD_DEBUG
#define FAT16_DEBUG

#include <18F4520.h> 
#device adc = 8 
#fuses NOWDT, NOPROTECT, NOLVP, NODEBUG//HSPLL, USBDIV, PLL5//, CPUDIV1, VREGEN 
#use delay (clock = 4000000) 
#use rs232 (baud = 9600, parity = N, xmit = PIN_c6, rcv = PIN_c7, bits = 8,UART1) //hardware uart 

#include "FAT16_3_v18.c" 
#undef USE_SD_DETEC  //sd detect kullanma

//UINT8 Text [512] = "Text Created with PIC .... \ r \ n"; 

void main () {

unsigned int16 k=0;
unsigned int8 durum=0;

char NombreCorto  [13];//={"01      .TXT"}; 
char NombreLargo  [50]; 

UINT16 UbicacionFolder = 0;

setup_adc_ports (NO_ANALOGS | VSS_VDD); 
setup_adc (ADC_OFF); 
//setup_psp (PSP_DISABLED);      18f2550 için kaldırdım
setup_wdt (WDT_OFF); 
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1); 
setup_timer_1 (T1_DISABLED | T1_DIV_BY_1); 
setup_timer_2 (T2_DISABLED, 0,1); 
setup_timer_3 (T3_DISABLED | T3_DIV_BY_1); 
setup_comparator (NC_NC_NC_NC); 
setup_vref (FALSE); 

InitHard_SDCard (); 
delay_ms (1000); 

printf("deneme1");

SDCard_init (); 
FAT_init ();

/*açıklama
//FAT_OpenFileAndRead dosyayı hem açmaya hemde okumaya yarayan fonksiyondur.
//ilk parametre (burada NombreCorto) kısmına biz açmak istediğimiz dosya ismini yazıyoruz,
//ilk parametre 13 elemanlı bir dizi olarak kullanıcı tarafından tanımlanıp kullanılabilir
//dosya ismi kısa dosya adı olmak zorunda, yani
//12345678.xxx 8 karakter dosya adı sonra nokta sonra 3 karakter dosya uzantısı,
//dosya adı 8 karakterden küçükse 8 karakter olana kadar boşluk ilave edilmeli.
//ikinci parametre (burada 0) girdiğimiz dosya adının sd kartta nereden itibaren aranacağı bilgisi
//0 dediğimizde root directoryde en baştan itibaren dosyayı arar
//üçüncü parametre (burada 'o') 'o' veya 'r' olabilir,
//'o' open yani dosyayı aç demektir,
//fonksiyon ilk kullanılırken bu değer 'o' yapılıp dosya açılır
//fonksiyon 'o' ile ilk defa çağrıldığındada BufferFAT içene değerleri okuyup yükler
//daha sonra dosyanın geri kalanını okumak için 'r' ile fonksiyon çağırılır
//fonksiyon her kullanıldığında BufferFAT içine sd karttan dosyanın sıradaki 512 byte ını
//okuyup yerleştirir
//yani son parametre (burada BufferFAT) ramde tanımlı 512 bytelık bir dizi olmalıdır
//programcı fonksiyonu çağırdıktan hemen sonra BufferFAT i istediği gibi kullanır ekrana yazar vs.
//fonksiyonun geri döndürdüğü değerler:
//FAT_ERROR (0 olarak tanımlı), FAT_OK (1 olarak tanımlı), FAT_READ_COMPLETE (0xFF olarak tanımlı)
//FAT_ERROR eğer hata olursa 
//FAT_OK eğer daha okunacak veri varsa (dosya sonuna erişilmedi ise) ve herşey yolundaysa
//FAT_READ_COMPLETE daha okunacak veri yoksa (dosya sonuna erişildi, okuma bitti)
*/


/*
//-----------------------------------------------------------------------------
if( FAT_OpenFileAndRead(NombreCorto,0, 'o', BufferFAT)==FAT_ERROR  ) 
{printf("error open file and read\r\n");}    
//20file, 10directory, file type 'o' leads Archivo(0x20)
//for(k=0;k<=512;k++)  {  printf("%c",BufferFAT[k]);  }

do{
for(k=0;k<=512;k++)  {  printf("%c",BufferFAT[k]);  }
}
while( FAT_OpenFileAndRead(NombreCorto,0, 'r', BufferFAT)!=FAT_READ_COMPLETE  );
for(k=0;k<=512;k++)  {  printf("%c",BufferFAT[k]);  }
//-----------------------------------------------------------------------------
******************************************************************************/
/*
*/
strcpy (NombreCorto, "06.TXT");               //ok
//strcpy (NombreCorto, "06      .TXT");         //ok
//strcpy (& NombreCorto [0], "06      .TXT");   //ok
//strcpy (& NombreCorto [0], "01.TXT");         //ok
//strcpy (& NombreLargo [0], "PIC folder");
//-----------------------------------------------------------------------------
   if( FAT_OpenFileAndRead(NombreCorto,DirectorioRaiz, 'o', BufferFAT)!=FAT_ERROR  ) 
   { 
  for(k=0;k<=512;k++)  { printf("%c",BufferFAT[k]); }

      do{
      durum = FAT_OpenFileAndRead(NombreCorto,0, 'r', BufferFAT);    //oku
      if( durum != FAT_ERROR  )                                      //hata değilse 
      {   for(k=0;k<=512;k++)  {  printf("%c",BufferFAT[k]);  }    } //yazdır
        }while(  (durum != FAT_READ_COMPLETE) && (durum != FAT_ERROR) );  
        //read complete değilse> birdaha oku hata değilse yazdır
   }
   if(durum!=FAT_READ_COMPLETE) {printf("error open file and read\r\n");}
//-----------------------------------------------------------------------------

 
printf("\r\n bitti");
   while(1)
   {
   output_toggle(pin_B7);
   delay_ms(300);
   }

} //main



5)
Bu örnek kütüphanenin versiyon 1.8 ile hazırlanmıştır,
versiyon 1.8 var şuan,
onunla ilgili başka denemelerimi yaptıktan sonra yine paylaşırım.

İNDİRME LİNKİ:
http://www.mediafire.com/download/osjxij689jb8tu2/8_SD_Suky_ver18.rar

Yararlanılan kaynak linki (versiyon 1.5 kullanılmış);
(ingilizce)
http://rigodenshi.blogspot.com.tr/2010/05/using-sd-card-with-fat16-pic18f2550-and.html
Yararlandığım kişinin yararlandığı asıl kaynak kişi :) (tüm versiyonlar)
(ispanyolca)
http://www.ucontrol.com.ar/forosmf/programacion-en-c/manejo-de-memoria-sd-con-ccs-libreria-nivel-hardware/msg28979/#msg28979

6)

7) Yarın bir gün.

RaMu
Alıntı yaparken kaynak belirtiniz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


Emre MERMİ


Recep METE

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

ismailhtc

Usta çırak konusunda ki yorumlara açıklık getirmiş sanki :) teşekkürler.

freeggCC94

Merhaba pic18f4550 ile picin analog girişine verdiğim akım ve gerilim bilgilerini grafik lcd ye yazdırmak ve elimdeki 512mb mikro sd kart içindeki txt dosyasına kaydetmek istiyorum. Glcd ye yazdıracak düzeyde biliyorum fakat verdiğiniz main_SD_8 dosyasındaki kodlarla okuduğum analog giriş değerlerini actığım txt dosyasına nasıl kaydedebilirim bu konuda bilgim yok, yardımcı olabilirseniz sevinirim ve son olarak mikro sd kartı sd kart adaptörüyle kullanacağım bu şekilde sorun olurmu veya direk sd kart mı kullanmalıyım? Format mutlaka fat16 mı olmalı öyleyse fat16 ya programlamı dönüştüreceğim?

RaMu

Mikro sd + adaptör veya direk sd kart kullanmanda bir fark yoktur,
rahatlıkla kullanabilirsin.

Fat16 konusunu araştırırsan göreceksin ki,
4gb a kadar olan kartlar genelde Fat16 formatlıdır,
Fat16 bir dosya sistemidir (File Allocation Table)
ve yapısı gereği ancak 4gb a kadar dosyaları adresleyebilir,
bu nedenle 4gb üstü kartlar Fat16 formatında değiller.
Elindeki 512mb sd kartı fat16 olarak formatlayabileceğini düşünüyorum,
yine bu konuda çok küçük bir araştırma yaparsan
gerek windows üzerinden direk olarak,
gerekse bazı sd kart format tool ları ile bu işlemi
gerçekleştirip gerçekleştiremeyeceğin ortaya çıkar.

Yazma konusuna gelince;
yararlandığım kaynakları incelemen ve öğrenmen gerekecek,
paylaştığım kütüphanenin yazma desteğide var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

freeggCC94

Teşekkürler. Bazı sitelerde sd kartı formatlarken format ekranında fat seçildiğinde bu fat16 anlamına geldiği belirtiliyor bunun doğruluğu hakkında bilginiz var mı?

RaMu

Net bir şey söyleyemeyeceğim,
nerde neyle neyi formatlarken ...?

512mb sd kartla hiç çalışmadım,
artık çalışılmasını da tavsiye edemem,
fiyat olarak 4gb üstü kartlar
4gb altı kartlara göre daha uygun hatta.

İstersen 512mb sd kartı fat16 olarak formatlamak
diye bir konu aç, daha net cevaplar alabilirsin,
deneyen biri büyük ihtimalle çıkar.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


Tatala

merhabalar, bu işlermleri, sd kart okuma yazma işlemini, yazılımsal spi ile yapabilir miyiz?

RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


Mucit23

@RaMu  Bu konuda baya çalışmışşın. Ellerine Sağlık. Banada şimdi CCS ile SD kart kütüphanesi lazım. Bu kütüphane Fat16 ile çalışıyor anladığım kadarıyla. 2GB üzeri bellekler için Fat32 lazım aslında. Bu konuda önerebileceğiniz bir kütüphane var mı?

RaMu

Evet ama 4gb kartlarıda FAT16 ile kullanabilirsin.

C de FAT32 tecrübem olmadı hiç,
asm ile FAT32 çalıştıran bir kütüphane yazıyorum bir zamandır ama
oda kendim için değil zaten.

CcsC nin kendi kütüphanesinde FAT32 vardı gibi hatırlıyorum.
Yalnız FAT32 CcsC de olsada kullanılan kartın sdHC vs. olması problem çıkarabilir.

SD kart ve FAT konusu çok detaylı ne desem bilemedim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html