Mikroc ile SD kart kullanımı Proteus isis simulasyonu örnek kod ve kısa anlatmm.

Başlatan RaMu, 12 Temmuz 2014, 23:56:27

RaMu

YApacağımız şey basit,
devre kurmadan sd kart örneği yapıp ısınacağız,
mikro c nin help dosyasındaki örnekten faydalanarak
bir sd kart programı yazacağız ve
bunu proteus ile simule edeceğiz,
yardımcı olarak sd card image programı kullanacağız.


Öncelikle mikro c for pic ide sini açıyoruz,
Help kısmına tıklıyoruz ve arama kısmına gelip sd yazıyoruz
Multi Media Card Library çıktı karşımıza tıklayıp bakıyoruz,
oh oh ne güzel bütün fonksiyonları tek tek açıklamış,
buda yetmezmiş gibi örnek bir program yazyınlamış yazının sonunda,
hatta hiç durmamış devrenin şemasınıda çizip komuşlar önümüze
biraz daha arasak herhalde baskılı devresinide buluruz.

Bende mikroc yüklü değil
surf help deki bu örneğe bakmak için
mikroc mi yükleyecem diyen varsa
mikroc bu help kısımlarını nettede yayınlıyor
direk bakmak isteyen için link
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/mmc_library.htm
(bu linkte donanım fotosu gözükmüyor onada basic içinyazdıkları örneky-ten bakabilirsiniz
http://www.mikroe.com/download/eng/documents/compilers/mikrobasic/pro/pic/help/mmc_library.htm)

Kod şöyle;
// MMC module connections
sbit Mmc_Chip_Select           at LATC0_bit;  // for writing to output pin always use latch (PIC18 family)
sbit Mmc_Chip_Select_Direction at TRISC0_bit;
// eof MMC module connections

const LINE_LEN = 43;
char err_txt[20]       = "FAT16 not found";
char file_contents[LINE_LEN] = "XX MMC/SD FAT16 library by Anton Rieckertn";
char           filename[14] = "MIKRO00x.TXT";          // File names
unsigned short loop, loop2;
unsigned long  i, size;
char           Buffer[512];

// UART1 write text and new line (carriage return + line feed)
void UART1_Write_Line(char *uart_text) {
  UART1_Write_Text(uart_text);
  UART1_Write(13);
  UART1_Write(10);
}

// Creates new file and writes some data to it
void M_Create_New_File() {
  filename[7] = 'A';
  Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info
  Mmc_Fat_Assign(&filename, 0xA0);          // Find existing file or create a new one
  Mmc_Fat_Rewrite();                        // To clear file and start with new data
  for(loop = 1; loop <= 99; loop++) {
    UART1_Write('.');
    file_contents[0] = loop / 10 + 48;
    file_contents[1] = loop % 10 + 48;
    Mmc_Fat_Write(file_contents, LINE_LEN-1);   // write data to the assigned file
  }
}

// Creates many new files and writes data to them
void M_Create_Multiple_Files() {
  for(loop2 = 'B'; loop2 <= 'Z'; loop2++) {
    UART1_Write(loop2);                  // signal the progress
    filename[7] = loop2;                 // set filename
    Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info
    Mmc_Fat_Assign(&filename, 0xA0);     // find existing file or create a new one
    Mmc_Fat_Rewrite();                   // To clear file and start with new data
    for(loop = 1; loop <= 44; loop++) {
      file_contents[0] = loop / 10 + 48;
      file_contents[1] = loop % 10 + 48;
      Mmc_Fat_Write(file_contents, LINE_LEN-1);  // write data to the assigned file
    }
  }
}

// Opens an existing file and rewrites it
void M_Open_File_Rewrite() {
  filename[7] = 'C';
  Mmc_Fat_Assign(&filename, 0);
  Mmc_Fat_Rewrite();
  for(loop = 1; loop <= 55; loop++) {
    file_contents[0] = loop / 10 + 48;
    file_contents[1] = loop % 10 + 48;
    Mmc_Fat_Write(file_contents, LINE_LEN-1);    // write data to the assigned file
  }
}

// Opens an existing file and appends data to it
//               (and alters the date/time stamp)
void M_Open_File_Append() {
   filename[7] = 'B';
   Mmc_Fat_Assign(&filename, 0);
   Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 20, 0);
   Mmc_Fat_Append();                                    // Prepare file for append
   Mmc_Fat_Write(" for mikroElektronika 2010n", 27);   // Write data to assigned file
}

// Opens an existing file, reads data from it and puts it to UART
void M_Open_File_Read() {
  char character;
  
  filename[7] = 'B';
  Mmc_Fat_Assign(&filename, 0);
  Mmc_Fat_Reset(&size);            // To read file, procedure returns size of file
  for (i = 1; i <= size; i++) {
    Mmc_Fat_Read(&character);
    UART1_Write(character);        // Write data to UART
  }
}

// Deletes a file. If file doesn't exist, it will first be created
// and then deleted.
void M_Delete_File() {
  filename[7] = 'F';
  Mmc_Fat_Assign(filename, 0);
  Mmc_Fat_Delete();
}

// Tests whether file exists, and if so sends its creation date
// and file size via UART
void M_Test_File_Exist() {
  unsigned long  fsize;
  unsigned int   year;
  unsigned short month, day, hour, minute;
  unsigned char  outstr[12];

  filename[7] = 'B';       //uncomment this line to search for file that DOES exists
//  filename[7] = 'F';       //uncomment this line to search for file that DOES NOT exist
  if (Mmc_Fat_Assign(filename, 0)) {
    //--- file has been found - get its create date
    Mmc_Fat_Get_File_Date(&year, &month, &day, &hour, &minute);
    UART1_Write_Text(" created: ");
    WordToStr(year, outstr);
    UART1_Write_Text(outstr);
    ByteToStr(month, outstr);
    UART1_Write_Text(outstr);
    WordToStr(day, outstr);
    UART1_Write_Text(outstr);
    WordToStr(hour, outstr);
    UART1_Write_Text(outstr);
    WordToStr(minute, outstr);
    UART1_Write_Text(outstr);
    
    //--- file has been found - get its modified date
    Mmc_Fat_Get_File_Date_Modified(&year, &month, &day, &hour, &minute);
    UART1_Write_Text(" modified: ");
    WordToStr(year, outstr);
    UART1_Write_Text(outstr);
    ByteToStr(month, outstr);
    UART1_Write_Text(outstr);
    WordToStr(day, outstr);
    UART1_Write_Text(outstr);
    WordToStr(hour, outstr);
    UART1_Write_Text(outstr);
    WordToStr(minute, outstr);
    UART1_Write_Text(outstr);
    
    //--- get file size
    fsize = Mmc_Fat_Get_File_Size();
    LongToStr((signed long)fsize, outstr);
    UART1_Write_Line(outstr);
  }
  else {
    //--- file was not found - signal it
    UART1_Write(0x55);
    Delay_ms(1000);
    UART1_Write(0x55);
  }
}


// Tries to create a swap file, whose size will be at least 100
// sectors (see Help for details)
void M_Create_Swap_File() {
  unsigned int i;

  for(i=0; i<512; i++)
    Buffer[i] = i;

  size = Mmc_Fat_Get_Swap_File(5000, "mikroE.txt", 0x20);   // see help on this function for details

  if (size) {
    LongToStr((signed long)size, err_txt);
    UART1_Write_Line(err_txt);

    for(i=0; i<5000; i++) {
      Mmc_Write_Sector(size++, Buffer);
      UART1_Write('.');
    }
  }
}

// Main. Uncomment the function(s) to test the desired operation(s)
void main() {
  #define COMPLETE_EXAMPLE         // comment this line to make simpler/smaller example
  ADCON1 |= 0x0F;                  // Configure AN pins as digital
  CMCON  |= 7;                     // Turn off comparators
  
  // Initialize UART1 module
  UART1_Init(19200);
  Delay_ms(10);

  UART1_Write_Line("PIC-Started"); // PIC present report

  // Initialize SPI1 module
  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
  
  // use fat16 quick format instead of init routine if a formatting is needed
  if (Mmc_Fat_Init() == 0) {
    // reinitialize spi at higher speed
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
    //--- Test start
    UART1_Write_Line("Test Start.");
    //--- Test routines. Uncomment them one-by-one to test certain features
    M_Create_New_File();
    #ifdef COMPLETE_EXAMPLE
      M_Create_Multiple_Files();
      M_Open_File_Rewrite();
      M_Open_File_Append();
      M_Open_File_Read();
      M_Delete_File();
      M_Test_File_Exist();
      M_Create_Swap_File();
    #endif
    UART1_Write_Line("Test End.");

  }
  else {
    UART1_Write_Line(err_txt); // Note: Mmc_Fat_Init tries to initialize a card more than once.
                               //       If card is not present, initialization may last longer (depending on clock speed)
  }

}



Kodun uzunluğundan gözünüz korkmasın,
bu örnek sd kütüphanesisin tüm özelliklerini içeriyor,
biz lazım olan kadarını içinden aldığımızda küçülecek.

Devre şemasıda şu şekilde,




Şimdi proteus u açıyoruz ve devrenin aynısını isiste çiziyoruz,



tabiki sadece pic uart penceresi ve sd card ı çizmemiz yeterli gerisini isis umursamaz.
Uart ı solda açık görülen bölmeden aldık,
sd kart a sağ tıklayıp edit properities tısmına geleceğiz,



burada card image file içerisine birşeyler koymalıyız,
burada sd kartı sanki gerçekte devreye takılmış gibi olacak
ama bu sd kart nerede,
biz sd image programı ile bir sd card oluşturacağız
ve bu image dosyasını proteusda göstereceğiz
artık proteus bu image sanki gerçekte devreye takılmış bir sd kart mış gibi davranacak.

Winamage programı ile proteus için sd kart image dosyası nasıl oluşturulur
Creating Image for Memory Card of Proteus using WinImage
bu video dan öğrenebilirsiniz.





Burada mikroc nin örneğinde sadece main kısmını değiştirdim,
değiştirdiğim main kısmına bakalım
// Main. Uncomment the function(s) to test the desired operation(s)
void main() {
//  #define COMPLETE_EXAMPLE         // comment this line to make simpler/smaller example
  ADCON1 |= 0x0F;                  // Configure AN pins as digital
  // 18F452 İÇİN KAPATTIM CMCON  |= 7;                     // Turn off comparators

  // Initialize UART1 module
  UART1_Init(19200);
  Delay_ms(10);

  UART1_Write_Line("PIC-Started"); // PIC present report

  // Initialize SPI1 module
  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

  // use fat16 quick format instead of init routine if a formatting is needed
  if (Mmc_Fat_Init() == 0) {
    // reinitialize spi at higher speed
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
    //--- Test start
    UART1_Write_Line("Test Start.");
    //--- Test routines. Uncomment them one-by-one to test certain features
    //M_Create_New_File();
    #ifdef COMPLETE_EXAMPLE
      M_Create_Multiple_Files();
      M_Open_File_Rewrite();
      M_Open_File_Append();
      M_Open_File_Read();
      M_Delete_File();
      M_Test_File_Exist();
      M_Create_Swap_File();
    #endif
    UART1_Write_Line("Test End.");

   //ben

                          UART1_Write_Line("Mmc_fat_assign deneniyor");
                         // durum = Mmc_Fat_Assign("MIKRO007.TXT",0xA0);
                         //filename[12] = "ornek_01.TXT";

                          durum = Mmc_Fat_Assign("ornek_01.TXT",0xA0);
                          if(durum == 2)  UART1_Write_Line("2 yer yok eski acilan dosya kapatildi");
                          if(durum == 1)  UART1_Write_Line("1 dosya vardi yada dosya yoktu ama istenen adda yeni dosya olusturuldu");
                          if(durum == 0)  UART1_Write_Line("0 dosya yok ve yeni dosya olusturulmadi");

                          M_Open_File_Read();

                              UART1_Write_Line("noldu");


    UART1_Write_Text(" \n\rDosya adini uzantisi ile beraber,");
    UART1_Write_Text(" \n\rbosluksuz, toplam 12 karakter olarak giriniz");
    UART1_Write_Text(" \n\rve bosluk tusuna basiniz. ornek: MIKRO00x.TXT");
    UART1_Write_Text("\n\r");
while (1) {

  if (UART1_Data_Ready() == 1) {          // if data is received
    UART1_Read_Text(filename, " ", 13);    // reads text until ' ' is found
    UART1_Write_Text("girilen dosya adi:  ");
    UART1_Write_Text(filename);             // sends back text
    UART1_Write_Text("\n\r");


                             durum = Mmc_Fat_Assign(filename,0xA0);
                          if(durum == 2)  UART1_Write_Line("2 yer yok eski acilan dosya kapatildi");
                          if(durum == 1)  UART1_Write_Line("1 dosya vardi yada dosya yoktu ama istenen adda yeni dosya olusturuldu");
                          if(durum == 0)  UART1_Write_Line("0 dosya yok ve yeni dosya olusturulmadi");
                              UART1_Write_Text("\n\r");
                          M_Open_File_Read();
                                   UART1_Write_Text("\n\r");
                              UART1_Write_Line("noldu");

 }
}


  //den
  }
  else {
    UART1_Write_Line(err_txt); // Note: Mmc_Fat_Init tries to initialize a card more than once.
                               //       If card is not present, initialization may last longer (depending on clock speed)
  }
}




Öncelikle #define COMPLETE_EXAMPLE kısmını // ile safdışı bırakıyoruz,
bu sayede program tüm örneği değil sadece istediklerimizi derleyecek
kod gereksiz yer kaplamayacak.

UART1_Init(19200); olarak tanımladığımızı görüyoruz,
isis te örneğin düzgün çalışabilmesi için
isiste ki virtula terminalin özelliklerinden baud rate 19200 seçilmek zorunda unutmayın,

SPI1_Init_Advanced ile sd card giriş işlemleri uygulanıyor,

Mmc_Fat_Assign("ornek_01.TXT",0xA0); denen bir fonsiyon var
burada ornek_01.txt yazan dosyaya işlem yapılacağını
bu dosyayı seçtiğimizi söylüyor
ve fonksiyon 1 2 3 diye gerideğer dönderiyor,
bunların anlamları help dosyasında yazıyor,
benim örneğimdede uart penceresine geri dönen değerin anlamı Türkçe olarak yazılıyor
(henekadar anlamsız gözüksede).

M_Open_File_Read(); ile
biraz önce Mmc_Fat_Assign ataması yapılan seçilen dosya açılıyor,

Şimdi bu işlemi biz programda dahili olarak yaptık bu bir örnek aslında,
artık bunu uart penceresinden kullanıcının girdiği dosya adına göre dosya açma işlemine çeviriyoruz,
yani kullanıcı uart penceresine sd kart içindeki tx-t beklgesinin adını yazacak
ve program bu txt belgesinin içindeki yazıyı uart penceresinde gösterecek;

  if (UART1_Data_Ready() == 1) {          // if data is received
    UART1_Read_Text(filename, " ", 13);    // reads text until ' ' is found

bu kısım ' ' yani boşluk karakteri gelene kadar
uarttan girilen harfleri alır ve toplam 13 harf alabileceği belirtilmiş,
bu aldığı 13 harfi filename denen katara yazar
(filename dizisi programın başında tanımlanıyor)

Artık dosya adını aldık
yukarıda yaptığımız gibi
Mmc_Fat_Assign(filename,0xA0) ve
M_Open_File_Read();
kullanarak dosya içeriğine erişiyoruz
ve sonra dosya içindeki tüm karakterleri
UART1_Write_Text("\n\r");
ile uart penceresine yazıp göstermiş oluyoruz.

Bu kadar hayırlı olsun.
Çalışır halde foto;


Proteus simulasyonu ve hazır derlenmiş kod, birde card imaj dosyasını paylaşıyorum,
https://www.dropbox.com/s/onzgx6wuddrx9bj/Mikroc_sd_RaMu_Ex_1.rar

Faydalı olamsı dileğiyle;
RaMu



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


tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

mhmtyldz


RaMu

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

mhmtyldz

Gerçek ortamda denediniz mi eğer denediyseniz bana yardımcı olur musunuz benim için çok önemli hâlâ halledemedim

RaMu

Oluruz neden olmayalım.

Dikkatini çektiyse 5 sene önce yazmışım yazıyı,
pek bir şey hatırlamıyorum nerede nasıl denediğim hakkında.
O sıralar CcsC ilede deneme yapıyordum,
CcsC olanı gerçek devrede denemiştim ama MikroC yi denedimmi hatırlamıyorum,
hatırlamadığıma göre muhtemelen gerçekte denememişimdir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mhmtyldz

Ben sizin yaptığınız çalışmayı gerçek ortamda yaptıktan sonra sorun olursa buradan size yazarım. Birde siz 8MHZ kullanmıştım demiştiniz ben 20MHz kullanicam konfigürasyon ayarlarindan başka herhangi bir değişiklik yapmama gerek var mı ? Şimdiden teşekkürler ☺️

PICaso


OptimusPrime

@RaMu

Araya baska soru sikistirayim. Proteus efendide pikin calisma frekansinin belirlendigi bir yer vardi, ozellikler penceresindeydi sanirim. Bunu dogrudan cekirdek frekansi olarakmi aliyordi yoksa yine 4 e mi boluyordu? :du:
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

dnacikaya

Alıntı yapılan: OptimusPrime - 12 Eylül 2019, 16:43:56@RaMu

Araya baska soru sikistirayim. Proteus efendide pikin calisma frekansinin belirlendigi bir yer vardi, ozellikler penceresindeydi sanirim. Bunu dogrudan cekirdek frekansi olarakmi aliyordi yoksa yine 4 e mi boluyordu? :du:

Bahsettiğiniz çekirdek frekans ayarı. Bu değeri 4e bölmez.

RaMu

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