mikroc fat32 library

Başlatan Karamel, 18 Ağustos 2015, 02:24:16

Karamel

#15
hocam simdi soyle.

program buraya while(Calma_izin == 0); gelene kadar zaten yeni bir 2048 byte okumus oluyor? ve okuma yapilmis. while da takinilmis oluyor? tim2 icerinde son byte gonderilince izin veriliyor ve geri donunce while bakiyor ki. tamama Calma_izin == 0 degil. bir asagi satira geciyor. iste simdi yaklasik 22 usn zamanimiz var. for yeni buffer i eskisinin icine aktarmaya basliyor. iste bu noktadan sonra bu isi 22 usn de halletmemize gerek yok? for icersindeyken interrupt occur etse. biz eski buffer uzerine yazdigimiz yeni byte lari gondermeye baslayacagimizdan. theory ime gore burada sorun yasanmamasi gerekir?  :-\

hocam soyle yapalim. ya ben. yada siz. hesaba katmadigimiz birsey yuzunden boyle olur diger turlu olmaz. yada ikisi de olabilir sakinca yok diyoruz. ben suan sizin algorithm i code lara yerlstirmeye calisiyorum.

sizde benim anlattigim seyi bir dusunun. bende yaniliyor olabilirim. sizin gozunuzden birsey kaciyor olabilir.  :-\

mesaj birleştirme:: 19 Ağustos 2015, 20:56:20

hocam ben bir trick yakaladim. sanirim sizi yaniltan sey su.

    fileHandle[0] = FAT32_Open(FileName, FILE_READ);
    err = FAT32_Size(FileName, &size);
    for (k = 0; k < size;)
    {
        err = FAT32_Read(fileHandle[0], rdbuf, sizeof(rdbuf));
        for (cnt = 0; cnt < sizeof(rdbuf); cnt++, k++)
        {
            if (k < size){}          ilk 2048 byte i oku ama hicbirsey yapma. cunku tim2 active degil
            else{break;}
        }
        TIM2_CR1.CEN = 1;  ilk 2048 byte simdi okundu. artik tim2 yi active et ve dac sending e basla
        while(Calma_izin == 0);   calma iznimiz yok. yani tim2 icersindeki value variable i 2048 olmadi ama olur olmaz. bu satiri gec
        for(f = 0; f<sizeof(rdbuf); f++) Ses_Buffer[f] = rdbuf[f];   simdi yeni buffer i ekisinin uzerine yaz. ama eger bu esnada tim2 interrupt i occur olursa tim2 sending e Ses_Buffer[0] ile baslayacagindan biz buffer lari tamamen copy edemesek bile bir sonraki 22 usn yada dahada sonraki 22 usn icersinde bu isi yapabilecegiz
        Calma_izin = 0;   calma iznimiz yok. bu saatten sonra her 22 usn icerinde tim2 bir byte bilgiyi dac unit e atarken. biz for un basina gidip. FAT32 yi read edecegiz. sonra hizlica 2048 byte i okuyup. yine Calma_izini kisminda takilacagiz. taki. tim2nin bufferi bitip. bize izin verene kadar.
    } 

    TIM2_CR1.CEN = 0;  ses calindi. tim2 yi disable et.
    err = FAT32_Close(fileHandle[0]); dosyayi kapat


mesaj birleştirme:: 19 Ağustos 2015, 20:57:21

hocam sanirim siz for icersindeyken tim2 nin kapatildigini dusundunuz? yada o sira tim2 nin bufferina yani Ses_Buffer a veri gonderilmedigini dusundunuz?  :-\

LukeSkywalker

Evet dediginde haklisin. Ben timeri durdurdugunu dusunmustum. Oyle bir durum yok. Senin kodunu bir deneyelim bakalim.

Karamel

#17
hocam simdi ben code a soyle birsey daha yapmak istiyorum.

Wav_Cal("A.WAV");

Wav_Cal funcfion ini nasil tanimlamam gerekli? FileName i direk function a nasil gonderebilirim?

LukeSkywalker

#18
Şimdi PC'de denedim gayet güzel çalıştı senin kodlar.

mesaj birleştirme:: 19 Ağustos 2015, 21:16:44

wavcal(const  char  *a)

mesaj birleştirme:: 19 Ağustos 2015, 21:22:03

for (cnt = 0; cnt < sizeof(rdbuf); cnt++, k++)
        {
            if (k < size){}          ilk 2048 byte i oku ama hicbirsey yapma. cunku tim2 active değil
            else{break;}
        }


Şurası fazla. Burdaki k++ kısmını önceki for döngüsünün sonuna ekleyebilirsin.

Karamel

#19
Alıntı yapılan: LukeSkywalker - 19 Ağustos 2015, 21:15:09
Şimdi PC'de denedim gayet güzel çalıştı senin kodlar.

mesaj birleştirme:: 19 Ağustos 2015, 21:16:44

wavcal(const  char  *a)

mesaj birleştirme:: 19 Ağustos 2015, 21:22:03

for (cnt = 0; cnt < sizeof(rdbuf); cnt++, k++)
        {
            if (k < size){}          ilk 2048 byte i oku ama hicbirsey yapma. cunku tim2 active değil
            else{break;}
        }


Şurası fazla. Burdaki k++ kısmını önceki for döngüsünün sonuna ekleyebilirsin.


hocam kendimce birseyler yapmaya calistim... ::) suan cok amatorce birsey. ama stm32 lerin digital analog converter inden kaliteli denebilecek kadar iyi sound cikartmayi basarabildik ve bunu hep beraber basardik. bunlar forumumuza mal olan seyler. insallah hep beraber cok guzel isler becerecegiz.(gerbay hocamin bu yazilari okudugunu biliyorum. bu message i okuyacaginida biliyorum. insallah gerbay hocamizda aramiza yeniden geri doner ve benim gibi. mesalesi suan icin az yanan genclere sizin gibi yol gosterir..... ::) )

hocam simdi hemen deneylere basliyorum.

yalniz ogrenmek istedigim birsey var. function i wavcal(const  char  *a) seklinde yapinca. wavcal("x.wav"); diye cagirinca oldu. ama bu nasil calisiyor? biz tam olarak ne yaptik?

mesaj birleştirme:: 20 Ağustos 2015, 01:44:05

birde hocam size variable imizi unsgined long seklinde  tanimlasam bile bir sarkinin boyunu aklinda tutacak kadar uzun deger alamadi. unsigned long long u da sanirim library kabul etmiyor?  :-\

4-5 dk lik bir sarkiyi wav yapinca. 15-20 mbyte oluyor. yaklasik bu kadar 20.000.000 byte olmasi gerekli? bunu unsgined long ta tam olarak icersine sayi olarak alabilmesi gerekli? burada hesaba katilmayan birsey var?  :-\

Gökhan BEKEN

Alıntı yapılan: Karamel - 20 Ağustos 2015, 01:37:48
yalniz ogrenmek istedigim birsey var. function i wavcal(const  char  *a) seklinde yapinca. wavcal("x.wav"); diye cagirinca oldu. ama bu nasil calisiyor? biz tam olarak ne yaptik?
wavcal(const  char  *a)
yerine
wavcal(char  *a)  yapsan da olur
eğer const yaparsan değişken giremezsin sadece tırnak içerisindeki sabit değeri girersin. Derleyici, programı derlerken sabit değeri gönderir.
ama const kullanmazsan, herhangi bir zamanda herhangi bir yerden aldığın dosya adını girebilirsin. Run time sırasında, seriporttan gelen bir string'i dosya adı olarak girebilirsin yani.

Peki nasıl çalışıyor dersen açıklayım.
char *a derken , bir adres talep ettiğin anlamına geliyor, o değişken sadece bir adres alıyor, ama char türünden yani okuma yaparken 1 byte okuyabilirsin ancak.
O adresi artırdığında, yani a++; yaptığında adres birer birer artar, eğer char değil de int olsaydı 4'er byte 4'er byte okur, 4'er byte  4'er byte  artardı ram'de.
Sen oraya "hede.wav" yazdığında, fonksiyon içerde
if(!*a) şeklinde bir kontrol yapıyor, veya while(*a) şeklinde bir kontrol yapıyor.
veri sıfır olana kadar içindeki karakterleri okuyor yani. Sıfır geldiğinde ise döngüden çıkıyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam surayi http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap7/subsection2.1.1.2.html da inceleyinec mesele anlasiliyor. bir stringin sonunda \0 var. bunu bulunca. tamam bu kadar diyor ve aliyormus ::) yeni birsey daha ogrenmis oldum ::) tesekkur ederim hocam.

simdi wav file calma ile ilgili birazcicik daha ilerleme katettim.

void Wav_Cal(const char *File_Name)
{
    for(f = 0; f<sizeof(rdbuf); f++) {Ses_Buffer[f] = 0x00; Ses_Buffer[f+1] = 0x80;}

    fileHandle[0] = FAT32_Open(File_Name, FILE_READ);   // file i ac!
    err = FAT32_Read(fileHandle[0], rdbuf, 44);                  // ilk 44 byte i oku. burasi information. 
    err = FAT32_Size(File_Name, &size);
    for (k = 0; k < size;)
    {
        err = FAT32_Read(fileHandle[0], rdbuf, sizeof(rdbuf));
        for (cnt = 0; cnt < sizeof(rdbuf); cnt++, k++)
        {
            if (k < size){}
            else{break;}
        }
        TIM2_CR1.CEN = 1;
        while(Calma_izin == 0);
        for(f = 0; f<sizeof(rdbuf); f++) Ses_Buffer[f] = rdbuf[f];
        Calma_izin = 0;
    }TIM2_CR1.CEN = 0;
    err = FAT32_Close(fileHandle[0]);
}


simdi bir onceki code umuzda bir sarkidan digerine gecerken. header information kisminida sarki diye caldigimizdan. ufak capli bir pat sesi cikiyordu. simdi onuda astim.

butun herseyi bitirdigimde bu header i okuyup. wav in turune gorede calmayi saglayacagim. wav file imiz illa 16 bit mono yada stereo olmaz zorunda degil.

16bit 44100hz mono - stereo
*
*
*
*
*
*
16bit 8000hz mono - stereo

8bit 44100hz mono - stereo
*
*
*
*
*
8bit 8000hz mono - stereo

seklinde butun araliklari caldiramaya calisacagim. header i okudugumda isim kolay. tim2 nun hizini header dan aldigim bilgiye gore degistirecegim. tim2 icersinde 8 bit mono. 8 bit stereo. 16 bit mono. 16 bit stereo kisimlarimida wav file in turune gore if ile kullandim mi olur gibi duruyor ::)

LukeSkywalker

#22
@Karamel. Her  dosyada wav file information 44 byte olmayabilir. Burada en basit yöntem "Data" kelimesini bulup bu kelimeden 4 byte sonra şarkıyı başlatmak.  Verileri okumaya başlayınca okuduğun karakterleri tek tek sorgula. Eğer ilk olarak "d" harfi gelir sonra "a" sonra "t" gibi bir sorgulama yapıp bu bilgileri eleyebilirsin.

string dosya adı meselesine gelince;
wavcal(const char  dosya[]) diye de tanımlayabilirdik. Sanırım şimdi daha anlaşılır olmuştur.
Mesela sen buraya wavcal("mikro") yazarsan burada dosya[] isimli diziye 6 byte boyunda bir alan ayrılır. Bu derleyici tarafından bilinir.  dosya dizisi program içerisinde çağrıldığında bu 6 bytelık alan çağrılmış olur. 

Bu bilgileri dediğin gibi @gerbay olsaydı mükemmel izah ederdi.

mesaj birleştirme:: 20 Ağustos 2015, 09:28:56

unsigned long long  değişkeninini kabul etmemesi için bir sebep göremedim. Denedim kabul etti.

Karamel

hocam gunaydin ::) ben unsigned long long yapinca derledi ama ses calamadi. yani size i duzgunce cekemedi. calma deneyi yapmismiydiniz hocam? yani long long ile size i duzgunce alip. file i calabiliyormu?

LukeSkywalker

Evet çalıyor.

Sadece size ve k değişkenlerini long long tanımla.

Karamel

anladim hocam. simdi ethernet deneyler iyapmak icin. sound kismini bread board umdan soktum. ethernet ile yeteri kadar bilgi edindikten yeniden sound kismini insa edip. bu sefer wav player codelarimi yapmaya baslayacagim ::) 1-2 gun icersinde long long deneyini yapacagim.

Karamel

surada https://www.picproje.org/index.php/topic,60578.0.html rtc unit i zor bela calistirabildim ::) sorun benim hardware imdaymis. benim microcontrollerim(stm32f103vet6) in rtc unit ini calistiramadim. ya ilk zamandan beri bozuktu. yada ben overclock deneyleri yaparken yada normal zamanlarda 72mhz te calistirirken. rtc unit i bozdum.

overclock ile bozdugum microcontrollerim 2 gun bu hizda durmadan calisinca bozulmustu. deney icin. circuit imi acik birakmistim. simdide boyle birsey yapmak istiyorum ama madem fat32 ile ilgili artik az cok bilgim var. dedim ki microsd card ima saati her saniyede yada dakikada bir yazarim. boylece eger bozulursa. bozulma saatinin log unu tutmus olurum.

hemen mikroc yi acip. txt file okuma deneyi yaptim. yalniz bir problem var. en son olcumu txt file in en altina yerlestirmek istiyorum. txt file in icerisi zamanla sismeye baslayacak. daha once okuma yaptik ama yazma yapmadik. txt file i okuyup. okudugumuz stringin sonuna yeni olcumu ekleyip. yenidenmi yazacagiz? eger boyle ise. icerik sisince ram nasil yetecek?  :-\

z

Kayıt sonune ekle seçeneği vardır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

LukeSkywalker

#28
Tabiki hayır. İmleç dosyanın en sonuna yerleştirilebilir.  Önce bir txt dosyası açıp bir kaç deneme yap. Kavrarsın hemen.
Ayrıca ben olsam 2 satır olarak düşünürdüm sistemi, böylece sürekli dosya boyutunun artmasını engellerdim. 2 satır dolunca yeni gelen veri tekrar bir önceki satıra yazılsın.

Karamel

hocam txt file i open edip. okuyabiliyorum. ama ona nasil ekmele yapacagimi ve imleci en sona nasil getirecegimi anlayamadim.  :-\