Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: z - 22 Aralık 2013, 08:41:09

Başlık: SD Card - Data Logger - Text File
Gönderen: z - 22 Aralık 2013, 08:41:09
Asagidaki  program,  10 saniye araliklarla ADC olcumu yapip SD kart icinde olusturdugu OLCUMLER.TXT dosyasina 36 saatlik kayit yerlestiriyor. SD karti PC'ye taktiginizda notepad ile dogrudan dosyayi acabiliyorsunuz.

Detaylar ve  proje klasoru icin tiklayin. (http://www.cncdesigner.com/wordpress/?p=3941)


#include "STM32F4xx.h"
#include "Zystem.h"

int  Zaman, MaviZaman=0, KirmiziZaman=0, YesilZaman=0;
int  findex=0,KayitNo=0, sector=0;
char err, TimeFlag, FlashEnb=1;

//   Kirmizi Led hata oldugunu gosterir
//   Yesil Led, kayit yapilirken yanip soner
//   Mavi  Led, ADC olcumu yapildiginda yanip soner
//   Kavunici Led 36 saatlik kayidin bittigini gosterir

void BirMiliSaniye()
{
      Zaman++;                    // Her 10 sn de bir olcum yapilacak     
      if (Zaman==10000)           // 10000 milisaniyede bir sifirla         
        {
          Zaman=0;
          TimeFlag=1;
        }
       
      if (err) GPIOD->ODR=0x4000; // Kirmizi ledi yakarak hata oldugunu bildir 
      else
        {   
          if(FlashEnb)
            {                     
              if (!YesilZaman){GPIOD->ODR^=0x1000; YesilZaman=250;} else YesilZaman--;
              if (MaviZaman)  {GPIOD->ODR|=0x8000; MaviZaman--;} else GPIOD->ODR&=~0x8000;
            } 
          else GPIOD->ODR&=~0x9000; // Islem bittiginde Yesil ve Mavi led sonuk kalsin
        } 
}

void Yaz(char Data)
{
int i;         
      File.Buffer[findex]=Data;
      findex++;
      if (findex==512)        // Ramdaki File Buffer alani 512 byte dir.
        {                     // 512 byte doldu ise verileri SD karta aktaralim
          err=fwrite(&File,sector);
          sector++;                 
          findex=0;
          for(i=0;i<512;i++) File.Buffer[i]=0;       
        }
}

void CRLF() { Yaz(0x0D);Yaz(0x0A);}

void ASCIYaz(char Data)
{
      Data&=0x0F;
      if (Data<0xA) Data+=0x30; else Data+=0x37;
      Yaz(Data);   
}

void StringYaz(char* Text)
{
char *p;
         
     p=Text;
     CRLF();     
     while(*p) Yaz(*p++);
     CRLF();         
}

void DosyayaYaz(short Data)
{
      ASCIYaz(Data>>8);         
      ASCIYaz(Data>>4);         
      ASCIYaz(Data);         
      CRLF();   
      KayitNo++;                        // ADC den yapilan olcum sayaci         
}

int main()
{
         
//    SD kartin formatlanmasini istiyorsaniz SD kartta README.TXT dosyasini silin.
         
      if(fopen("README.TXT",&File,0)) err=format(&File); // 2 Gb SD kartinizi ilk kez kullanacaksaniz formatlanmali
     
      err=fopen("OLCUMLER.TXT",&File,1); // Olcumler.txt dosyasi yoksa yarat varsa ustune yazacagiz 
         
/*    Her bir ADC sonucu 0..FFF araliginda
      Fantazi olsun diye SD kartta bunu ASCI karakterlerle saklayalim.
      Her bir kayit 3 byte olur. CR-LF de ekleyince 5 byte olur.
      Tek bir dosyaya (64K alana) en fazla 13107 kayit sigdirabiliriz.
      10 sn de bir kayit yaparsak bu 131070 sn demektir. (36.4 saat)   
      36 saat boyunca yani 12960 kayit yapalim.*/                 

      while ((KayitNo<12960)&& (!err))   
        {
          TimeFlag=0;
          MaviZaman=50;                // Mavi led 50ms yansin
          DosyayaYaz(ADC1->DR);        // ADC den (PA1 ADCIN1) giris voltajini ogrenelim
          if(KayitNo==12960) StringYaz("Kayit islemi tamamlandi");               
          while(!TimeFlag)             // 10 saniyeyi beklerken kullanici mavi butona basarsa islemi bitirelim
            {
               if(GPIOA->IDR & 0x1)    // Mavi butona basilmismi? 
                 {
                   StringYaz("Kayit islemini durdurdunuz");       
                   KayitNo=12960;      // Ana donguyu kiralim
                   break;       
                 }         
            }                   
        }

//    Islem bitti fakat Ramda kalmis veri varsa dosyaya yazalim
           
      if((!err)&&(findex)) err=fwrite(&File,sector);
           
      if(!err) GPIOD->ODR=0x2000;     // Kayit bitti, Kavunici ledi yakalim                 
      FlashEnb=0;
      while(1);                   
}


Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: pisayisi - 22 Aralık 2013, 15:29:57
Hocam güzel çalışma olmuş teşekkürler. Özellikle adc nin ölçüm yapmadığı geniş zaman diliminde işlemciyi olabilcek en düşük güç moduna alıp ölçüm gerektiğinde uyandırmak ve sd cardı bu zaman diliminde beslemek batarya ile beslenecek sistemler için süper olur. Ancak discovery kit de bulunan stlink bölümünü devre dışı bırakarak o bölümün sürekligüç tüketmesini önlemek lazım.  Ben de usb otg özelliğinden dolayı flash diske datalog yapan bir alkalin pille en az bir sene çalışması garantili ,olabilcek en düşük güç modunu kullanan pekçok sensörden aldığı bilgiyi  log yapan bir proje üzerinde kafa yoruyorum bakalım ne olacak. Bu iş için aslında stm32l serisi çok daha uygun görünüyor , o kiti de bir ele geçirmek lazım...
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: z - 22 Aralık 2013, 17:08:42
Aslinda amac "Data-Logger"dan ziyade file erisim isinin ne kadar kolaylastigini gostermek.

Bir de yazi yazdigim bir sitede bizim herzaman kullandigimiz SystemInit fonksiyonunu cok karmasik bulup begenmeyen birisi, insani ARM'dan ve C den sogutacaksin boyle fonksiyon mu yazilir seklinde yorum yapmisti. Kizmistim ama sonra da hak verip kutuphane kullanan orneklerimde SystemIniti kaldirip attim.

Program su haliyle daha sempatik gorunuyor. Ne dersin?
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: Gökhan BEKEN - 22 Mayıs 2014, 01:52:26
SD kart için modül önerisi olan var mı? Ben bir kaç yere baktım normal konnektörlerin hepsi farklı farklı, karar veremedim. Bu yüzden hazır modül almak istiyorum.
@z hocam bu modül Türkiye'de var mı?
(http://www.cncdesigner.com/wordpress/wp-content/uploads/STM32F4.jpg)
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: Kabil ATICI - 22 Mayıs 2014, 02:07:35
http://www.direnc.net/ARDUINO-SD-CART-MODUL,PR-15543.html (http://www.direnc.net/ARDUINO-SD-CART-MODUL,PR-15543.html)

(http://www.direnc.net/modules/catalog/products/pr_01_15543_min.jpg?rev=1383144314)
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: mehmet - 22 Mayıs 2014, 03:16:08
Aceleniz yoksa 2 tanesi 1.77$ dan başlıyor...
http://www.ebay.com/sch/i.html?LH_FS=1&LH_BIN=1&_from=R40&_sacat=0&_nkw=sd+card+arduino+2+pcs&_sop=15 (http://www.ebay.com/sch/i.html?LH_FS=1&LH_BIN=1&_from=R40&_sacat=0&_nkw=sd+card+arduino+2+pcs&_sop=15)

Alternatif:
http://www.aremelektronik.net/SD-KART-MODUL,PR-848.html (http://www.aremelektronik.net/SD-KART-MODUL,PR-848.html)
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: Gökhan BEKEN - 22 Mayıs 2014, 08:53:40
Teşekkürler.
Başlık: Ynt: SD Card - Data Logger - Text File
Gönderen: blg_a - 18 Kasım 2014, 16:17:42
4 gb sd kart fat32 de kullandım, yeşil ışık yanıp yanıp sönüyor , dosya oluşturulmuyor sorun nereden olabilir?
yardımcı olursanız sevinirim