Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: RaMu - 22 Ekim 2014, 21:10:27

Başlık: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 22 Ekim 2014, 21:10:27
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 (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 (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 (http://www.ucontrol.com.ar/forosmf/programacion-en-c/manejo-de-memoria-sd-con-ccs-libreria-nivel-hardware/msg28979/#msg28979)

6)(https://lh6.googleusercontent.com/-bsITsOgBfH4/VC_LupCTckI/AAAAAAAAA4s/Q6f2b7tpyzM/w822-h486-no/sd8.PNG)

7) Yarın bir gün.

RaMu
Alıntı yaparken kaynak belirtiniz.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Taban - 22 Ekim 2014, 21:12:41
Eline sağlık.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Emre MERMİ - 23 Ekim 2014, 00:38:46
Elinize emeğinize sağlık hocam.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Recep METE - 23 Ekim 2014, 09:10:52
Hocam, mükemmel bir paylaşım yaptınız.Çok teşekkürler.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: ismailhtc - 23 Ekim 2014, 09:54:48
Usta çırak konusunda ki yorumlara açıklık getirmiş sanki :) teşekkürler.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: freeggCC94 - 14 Mart 2015, 13:35:50
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?
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 14 Mart 2015, 16:03:03
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.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: freeggCC94 - 14 Mart 2015, 16:08:41
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ı?
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 14 Mart 2015, 22:46:49
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.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: freeggCC94 - 15 Mart 2015, 13:29:44
Teşekkürler.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Tatala - 25 Ocak 2016, 13:33:05
merhabalar, bu işlermleri, sd kart okuma yazma işlemini, yazılımsal spi ile yapabilir miyiz?
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 25 Ocak 2016, 18:13:16
Evet yazılımsal spi ilede olur.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: dursuncemal - 25 Ocak 2016, 22:22:19
emeginize saglik
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Mucit23 - 08 Aralık 2016, 12:48:19
@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ı?
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 08 Aralık 2016, 23:18:39
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.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Mucit23 - 08 Aralık 2016, 23:29:20
Şuan elimde en düşük 1gb ve 2gb kart var. Onlarla deneyeceğim. Aslında biraz acil bir iş olduğundan çözüm odaklı gidiyorum. Sizin bu başlıkta verdiğiniz kütüphaneyi projeme ekledim. En azından şuanda derlenebilen bir örneğim var.  Yarın tekrar bi bakacağım. Fakat anlamadığım birkaç nokta var

Kendiniz bazı bölümlere uyarılar eklemişsiniz. Bunun amacı nedir? Kütüphaneyi bilmediğimden ne yapmam gerektiğini bilmiyorum.
Boş SD kart içerisine TXT dosyası oluşturma ve içeriğine yazma nasıl yapacağım. Okuma işlemini anladım az çok ama yazma işi nasıl olacak? Dediğim gibi daha önce hiç sd kart ile çalışmadım sayılır.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 08 Aralık 2016, 23:48:09
Bende pek hatırlamıyorum kütüphaneyi.
Kütüphaneyi yazan arkadaş
http://www.todopic.com.ar
forumunda yazan SUKY adlı üye.

Forumun bir çok yerinde bu kütüphane konuşulmuş,
İspanyolca forum ama google çeviri ile %95 ingilizceye dönüşüyor zaten.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Mucit23 - 09 Aralık 2016, 00:02:48
Ben yarın biraz uğraşayımda muhtemelen çözerim artık.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: Mucit23 - 09 Aralık 2016, 12:33:21
Hocam dosya oluşturma işine baktım. İspanyol arkadaşın paylaştığı dosyalarda yazma işlemi yapmış.

http://rigodenshi.blogspot.com.tr/2010/05/using-sd-card-with-fat16-pic18f2550-and.html

Oradaki kodları ben kendi projemde denedim. Fakat sıkıntı var.

18F4550 için Bağlantılar

MOSI PinC7
MISO PinB0
SCK   PinB1
CS     PinC0

Bağlantılar doğru eminim. SPI haberleşmesi yapılıyor.

Boş SD karta dosya açmak için ispanyol arkadaşın verdiği kodları yazdım.
#include <18F4550.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN,NOBROWNOUT // 20MHZ
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_D6,rcv=PIN_D7)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#include <lcd_driver.c>
#include "FAT16_3_v18.c"


void main()
{

char NombreArchivo[13]="Datos   .txt";  //Name of the file to create
int16 UbicacionFolder;
char Texto1[50]={"******ADC Data**********\r\n"};

   set_tris_a(0x00);
   set_tris_b(0x01);
   set_tris_c(0x00);
   set_tris_d(0x00);
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   
   lcd_init(); 
   InitHard_SDCard ();
   delay_ms (1000);
   
   SDCard_init ();
   FAT_init ();

   printf(lcd_putc,"\f");

   lcd_gotoxy(1,1);
   printf(lcd_putc,"SD_KART Test");

   if(FAT_CreateFile(NombreArchivo,NombreArchivo,UbicacionFolder,Texto1)==0){
        lcd_gotoxy(1,2);
        printf(lcd_putc,"Basarisiz");
   }
   else
   {
        lcd_gotoxy(1,2);
        printf(lcd_putc,"Basarili");   
   }

   
   while(TRUE)
   {

   }

}


Sonuç olarak Yazma fonksiyonu başarılı bir şekilde geri dönüyor ama SD karta herhangi bir dosya açılmıyor.. Şuan Elimde sadece 2GB sD kart var onunla deneme yapıyorum. 1GB vardı ama o bozuk çıktı.

Başka dikkat etmem gereken noktalar varmı? Çalışan bir kütüphane arıyorum.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 09 Aralık 2016, 13:48:24
Programı görünce hatırladım,
sanırım bu programıda denemiştim gerçek devrede,
Datos klasörünü oluşturup içine txt dosyası oluşturuyor ve
txt nin içine Texto1[50]={... dizisinde ne yazıyorsa onu yazıyordu.

Muhtemelen SD kart init olmuyordur,
sd kart desekte hepsine,
karttan karta, çok farklı init rutinleri olabiliyor.
Başlık: Ynt: Ccsc ile SD Kart nasıl kullanılır, çalışan örnek devre, isis simulasyon & kod.
Gönderen: RaMu - 11 Aralık 2016, 20:27:26
Buda SD karta yazma örneği CcsC ile:
https://www.picproje.org/index.php/topic,66663.0.html