CcsC ile SD karta FAT16 .txt dosya yazma -logger-, kütüphane ve isis simulasyon.

Başlatan RaMu, 11 Aralık 2016, 20:25:37

RaMu


Linkten CcsC proje ve kütüphanelerini,
isis simulasyon çalışmasını,
sd kart için isis imajını,
sd imaj üretme ve okuma pc programını
.zip dosyası olarak indirebilirsiniz,

http://www.mediafire.com/file/58d5u8abnxvp4n9/4_SD_rigodenshi.7z

Kaynak şu sitedeki blog yayınıdır:
http://rigodenshi.blogspot.com.tr/2010/05/using-sd-card-with-fat16-pic18f2550-and.html
Asıl yazar Suky adlı İspanyol arkadaş sanırım:
şu forumda yazıyor,
http://www.todopic.com.ar/foros/index.php?topic=37477.msg311456#msg311456


Daha önceki konuda, sd kart okumadan bahsetmiştim,
o konudada kaynak kişiler mevcut.
https://www.picproje.org/index.php?topic=55841.msg520206#msg520206



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

Mucit23

@RaMu Selamlar.

Projeyi denedim. İsiste gayet iyi çalışıyor sıkıntı yok. Fakat reelde çalıştıramadım henüz.

Benim elimde şuan 18F4550 var. Senin verdiğin projede de 2550 kullanılmış Ben sadece config ayarlarıyla oynayıp 18F4550'ye yükledim ama sonuç alamadım.

Sonra kodu biraz sadeleştireyim dedim kendi projeme kütüphaneleri ekledim. Aşağıdaki gibi bir program 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 fast_io(a)
//#use fast_io(b)
//#use fast_io(c)
#use fast_io(d)

#include <lcd_driver.c>
#include <max6675.c>
#include <SDCard_hard.c>
#include <FAT16_SDCard.c>
#include <string.h>    

#define ARRAY_SIZE 512     //Array size according to the sector of SDcard size
#use rs232(baud=9600, xmit=PIN_D6, rcv=PIN_D7, FORCE_SW)  

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

float temp=0;
unsigned int8 time_counter=0;

void main()
{

   set_tris_a(0x00);
  //set_tris_b(0x00);
   //set_tris_c(0x04);
   set_tris_d(0x00);
   output_a(0x00);
   //output_b(0x00);
   //output_c(0x00);
   output_d(0x00);
   
   delay_ms(200);
   lcd_init();  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"SD Card Test!");
   
if(SDCard_init()==0)
{
   lcd_gotoxy(1,2);
   printf(lcd_putc,"SD Init Error!  ");
}
else
{
   lcd_gotoxy(1,2);
   printf(lcd_putc,"SD OK!          ");
   FAT_init();
   
   if(FAT_FindDirectory(Carpetas,DirectorioRaiz,UbicacionFolder)==0)
   {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Folder Not Found");
      delay_ms(10);
   }
   else
   {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Creating File   ");
      if(FAT_CreateFile(NombreArchivo,NombreArchivo,UbicacionFolder,Texto1)==0)
      {
        lcd_gotoxy(1,2);
        printf(lcd_putc,"Er Creating File");
        break;
      }
      if(FAT_OpenAddFile(NombreArchivo,UbicacionFolder,Data_ADC)==0)
      {
          lcd_gotoxy(1,2);
          printf(lcd_putc,"file not found ");
        break;
      }
  }
}

   while(TRUE)
   {
     delay_ms(200);
     output_high (PIN_A0);
     delay_ms(200);
     output_low (PIN_A0);     
   }

}


İlk başlarda sd init aşamasında hata alıyordum. Sonradan fast_io tanımlamalarını kaldırınca init işlemi yapılmaya başlandı. Şimdi ise FAT_FindDirectory kısmında takılıp kalıyor sistem. Çözemedim orayı.

SD kart içerisine pc den logger adında bir klasör oluşturuyorum. O klasörün içi de boş.  SD kartı yuvasına takıp test ettiğimde dediğim gibi FAT_FindDirectory kısmını geçemiyor.

Bu kısım olmadan yani SD kart init edildikten sonra Doğrudan dosya açayım dedim yani FAT_FindDirectory  felan olmadan doğrudan FAT_CreateFile fonksiyonu ile. Bu fonksiyonu çalıştırdığımda olumlu dönüş yapıyor ama sd kart içerisine TXT dosyası yine oluşturmadı.

@RaMu eksik birşeyler yapıyorum sanki. Sonuca az kaldı. Acaba Konfigürasyon ayarlarımmı farklı? fast_io neden problem yaratıyor? 

RaMu

PCde oluşturduğun dosyanın adı "logger" mı, "LOGGER" mı?




SD init başarılı ise önemli bir adım tamam demektir.
Sonraki önemli adım FAT init, onuda konrol et.
Bir sıkıntı varsa,
SD kartı formatla ama
ayırma birimi boyuttunu küçük tut,
.
.
.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

logger veya LOGGER ikisinide denedim olmadı. Yarın Tekrar deneyeceğim. Belli olmaz bazen çalışıyor. Bu ayırma birimi boyutu dediğiniz nedir?

RaMu

SD kartı fiziksel bir depoya benzetirsek,
bu depoda misal işaretlenmiş kutular içinde,
çeşitli ürünler saklayacağız diyelim,
işte ayırma birimi boyutu - File Allocation Size
bizim en küçük kutunun boyutu oluyor.
Yaani oluşturacağın en küçük veri dosyası
SD kartta ayırma birimi boyutu kadar yer kaplar,
ve her veri dosyası (büyüdükçe) SD kart bellekte
Ayırma birimi boyutunun katları kadar yer kaplar.

Şimdi depo görevlisi kutular çok büyük ise
onları taşıyamayabilir,
...


Aslında FAT16 da dosya aramanın bununla çok bir alakası yok,
Root Directory - kök Dizin
ve
Dosya Ayırma Tablosu - File Allocation Table
ile FAT16 da
(SD kartın örneğin PCde ilk açtığımızda karşımıza çıkan kısmındaki
yani dosya içinde dosya içinde dosya gibi değilde, kök kısımdaki dosyalar...)
Rootdaki dosyalar aranır bulunur.

Aklıma gelen bir problem var aslında,
bu paylaştığım örneğin öncesinde
okuma ile ilgili paylaştığım örnekte
bir düzeltme yapmıştım,
oradanda problem çıkıyor olabilir:

BOOL FAT_FindFileDir(UINT8 *Name,UINT16 NClusP,UINT8 Type,UINT32 *SecFileDir,UINT16 *AddDir,UINT16 *NClus,UINT32 *SizeFile){
#warning 7
UINT8 SecFind, k,NameFile[11];
UINT16 i, j, NextClus;
UINT32 SecClusP;

// SecFileDir, where industry is defined archivo.- 
// AddDir within the sector address where this additional definido.- 

   // Load Buffered name then compare.-
   FAT_LoadName(Name,Type,NameFile,0);
   
   if(NClusP==0){
      SecFind=RootDirSecNum;           // Number of sectors used by RootDirectory.
      SecClusP=FirstRootDirSecNum;     // Sector RootDirectory.-
   }else{
      SecFind=BPB_SecPerClus;
      SecClusP=FAT_SecClusN(NClusP);    // Nº de sector del Nº Cluster.-
   }
   
   NextClus=NClusP;
   while(1){
      for(j=0;j<SecFind;j++){             // Search Directory Number of entries
         if(SDCard_read_block(((UINT32)(SecClusP+j)*512),&BufferFAT[0])==0){
               return(0);  // Error.-
         }
         for(i=0;i<512;i+=32){
            if(BufferFAT[i]==0xE5){continue;} // Perform following iteración
            if(BufferFAT[i]==0x00){break;}   // No more entries in the directory?.-
#warning 12 IMPORTANT. Causing cant open file, i changed it (UcanEl)
//quote "if (attribute's) FAT[i+11] left (significent) nibble divisible by 2 
//its an archive, else its a folder" from internet
// original if(BufferFAT[i+11]!=Type){continue;}
        //1 if( (TYPE==Directorio) ^ (bit_test(BufferFAT[i+11],4)!=0) ){continue;} //don't need> )!=0)
            if( (TYPE==Directorio) ^ (bit_test(BufferFAT[i+11],4)) ){continue;}
            for(k=0;k<11;k++){               // review name.
               if(BufferFAT[(UINT16)(k+i)]!=NameFile[k]){
                  break;
               }
            }
            if(k==11){break;}                // Found the file.
         }
         if(k==11){break;}                // Found the file.
         if(i!=512 && BufferFAT[i]==0x00){break;}
      }
      if(i==512 && k!=11 && NextClus!=0){
          NextClus=FAT_ReadClusFAT(NextClus);     // Another cluster // to read? 
        if(NextClus!=0xFFFF){
           SecClusP=FAT_SecClusN(NextClus);    // Nº de sector del Nº Cluster.-
            continue;
        }
      }
       break;      
   }
      
   if(k<11){
     #if defined(FAT16_DEBUG)
         printf("No folder was found\r\n");
      #endif
      return(0);// has not been encotrado directory.
   }
   //    We keep Cluster where it is located and size.
   (*((UINT8*)NClus))=BufferFAT[i+26];
   (*((UINT8*)NClus+1))=BufferFAT[i+27];
   (*((UINT8*)SizeFile))=BufferFAT[i+28];
   (*((UINT8*)SizeFile+1))=BufferFAT[i+29];
   (*((UINT8*)SizeFile+2))=BufferFAT[i+30];
   (*((UINT8*)SizeFile+3))=BufferFAT[i+31];
   //We keep sector and additional address is located:
   *SecFileDir=SecClusP+j;
   *AddDir=i;
   #if defined(FAT16_DEBUG)
         printf("FAT_FindFileDir Found the directory;\r\nCluster Number of file:%Lu, Size of file:%lu\r\n",*NClus,*SizeFile);
   #endif
   return(1);
}
#warning 8
/** \ Brief Create and FAT2 FAT1 entry. 
   
    \ param NClus: Number of cluster where create entry.- 
    \ param EOC: If cluster is saved fine but 0xFFFF or is routed to the next cluster.- 
   
    \ return 1 if the initialization is successful, 0 if not.- 
*/
BOOL FAT_CreateEntFAT(UINT16 NClus,UINT16 EOC){

UINT16 j, i;

.
.
.


Buradaki şu kısmı düzeltmiştim:
            if(BufferFAT[i]==0x00){break;}   // No more entries in the directory?.-
#warning 12 IMPORTANT. Causing cant open file, i changed it (UcanEl)
//quote "if (attribute's) FAT[i+11] left (significent) nibble divisible by 2 
//its an archive, else its a folder" from internet
// original if(BufferFAT[i+11]!=Type){continue;}
        //1 if( (TYPE==Directorio) ^ (bit_test(BufferFAT[i+11],4)!=0) ){continue;} //don't need> )!=0)
            if( (TYPE==Directorio) ^ (bit_test(BufferFAT[i+11],4)) ){continue;}
            for(k=0;k<11;k++){               // review name.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

RaMu

// original if(BufferFAT[i+11]!=Type){continue;}
satırı yerine şunu yazmıştım;
if( (TYPE==Directorio) ^ (bit_test(BufferFAT[i+11],4)) ){continue;}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

@RaMu cevap için teşekkürler. Ayırma birimi konusunu anladım. Bu konuda da baya test yaptım ama sorun devam ediyor. SD init işleminde sıkıntı yok ama fat çalışmıyor. Ayırma birimi konusunda Stadart FAT için sadece 32K ve 64K seçenekleri var. ikisinide denedim. FAT32 ile de deneme yaptım. FAT32'de ayırma birimi boyutunu 1K yaptım yine düzelmedi.

Son olarak bahsettiğiniz düzenlemeleri yaptım ama değişen birşey olmadı malesef.

Herneyse SD Kart olayının aciliyeti şu anda geçti. Benim kartta da sorun olabilir. 1GB yada daha düşük bir kart ile deneme yapmam lazım.

RaMu

FAT32 nin çalışması mümkün değil.

Aslında sd_init başarılı oluyorsa,
ve sonra .txt yi oluşturdum diyorsa;
Winhex - HxD ile sd kartı raw olarak okusan
muhtemelen içine birşeyler yazıldığını göreceksin.

4GB ve küçük kartlarla deneyebilirsin bence.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

gokhangokcen

@RaMu hocam kütüphaneyi bende çalıştıramadım.Dosyayı indirdim derledim sorunsuz bir şekilde. Kartı init ediyor hatasız bir şekilde.Fakat txt'yi oluşturamıyor.Kartım 2gb.
RS232'den gelen veriler ise şöyle;

Starting SD card
The SD card has been correctly initialized!!!

Creating the TXT file
Error creating the TXT file

 0.006 
 
 0.000 
 
 0.041 
 
 0.041 
 
 0.000 
 
 0.051 
 
 0.038 
 
 0.000 
 
 0.035 
 
 0.000 
 
 0.003 
 
 0.045 
 
 0.000 
 
 0.025 
 
 0.000 
 
 0.000 
 
 0.029 
 
 0.019 
 
 0.077 
 
 0.016 
 
 0.022 
 
 0.048 
 
 0.000 
 
 0.041 
 
 0.000 
 
 0.045 
 
 0.000 
 
 0.058 
 
 0.006 
 
 0.022 
 
 0.025 
 
 0.000 
 
 0.019 
 
 0.006 
 
 0.000 
 
 0.032 
 
 0.006 
 
 0.012 
 
 0.006 
 
 0.009 
 
 0.012 
 
 0.048 
 
 0.000 
 
 0.067 
 
 0.000 
 
 0.070 
 
 0.000 
 
 0.000 
 
 0.041 
 
 0.000 
 
 0.045 
 
 0.000 
 
 0.000 
 
 0.048 
 
 0.000 
 
 0.038 
 
 0.019 
 
 0.000 
 
 0.054 
 
 0.000 
 
 0.000 
 
 0.058 
 
 0.000 
 Length before out 504
Appending data: 0 
Error the file can't be found
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

RaMu

Gerçek devrede deniyorsanız,
SD kartın beslemesinin iyi olması gerekiyor,
sırf zayıf besleme nedeniyle dahi,
init işleminin gerçekleştiği ama
başka bir şey yapılamadığı durumla karşılaştım.

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

gokhangokcen

besleme ayarlı güç kaynağı üzerinden geliyor. SD kart için hazır modül kullanıyorum beslemede sıkıntı olacağını sanmıyorum hocam.

Edit:

if(FAT_FindDirectory(Carpetas,DirectorioRaiz,UbicacionFolder)==0){
printf("Error, the file CARPETA can not be found\r\n");
}else{
printf("Creating the TXT file\r\n");
if(FAT_CreateFile(NombreArchivo,NombreArchivo,UbicacionFolder,Texto1)==0){
printf("Error creating the TXT file\r\n");
break;
}


FAT_FindDirectory komutunu atlıyor gibi sanki. Direkt olarak Creating the TXT file diyor seri port ekranında sonra error creating the txt file diye bilgi geliyor.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

RaMu


"FAT16_SDCard.c" kütüphanesinde bulunan
"FAT_CreateFile" fonksiyonunun içerisinde
"return 0" olan herbir satırın öncesine
printf(1 hata burada)
printf(2 hata burada)
gibi hata mesajları ekleyip
tam olarak nerede takıldığını
bulmaya çalışabilirsin ama
sonuçta başkasının yazdığı bir kütüphane
kimbilir nerede problem var.


Kaynak linklere bakıp benzer problem var mı bakılabilir.
Ben denediğimde çalıştırmıştım,
çalıştırdığım halinide paylaştım zaten.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

zamzam23

Alıntı yapılan: RaMu - 11 Aralık 2016, 20:25:37Linkten CcsC proje ve kütüphanelerini,
isis simulasyon çalışmasını,
sd kart için isis imajını,
sd imaj üretme ve okuma pc programını
.zip dosyası olarak indirebilirsiniz,

http://www.mediafire.com/file/58d5u8abnxvp4n9/4_SD_rigodenshi.7z


linki açılmıyor, yenileyebilir misiniz?

RaMu

Alıntı yapılan: zamzam23 - 13 Kasım 2018, 12:43:27linki açılmıyor, yenileyebilir misiniz?

Yeniden yükledim:
http://www.mediafire.com/file/h72swy4e672cgcs/4_SD_rigodenshi_20181113.7z/file

Eski linki üyeliğimle giriş yapınca dahi indiremiyorum,
diğer dosyalarımı denedim indirebiliyorum.
Başta dosya içindeki winima90.exe programı yüzünden
problem çıkarıyordur diye düşündüm ama değilmiş,
tekrar yükledim yukarıdaki link çalışıyor,
sonradan eski linkte çalışırsa şaşırmayacağım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html