Elektronik / Embedded / Mobil Cihazlar
PIC18F4550 SD Karttan Okuma (Mikroc For PIC)
PIC18F4550 SD Karttan Okuma (Mikroc For PIC)
-
Merhaba,
FAT16 biçimlendirilmiş SD karttaki dosyaları okuyan uygulama örneklerine bakıyordum. Yaptığım denemede aşağıdaki adımları takip ettim fakat kartın içindeki iki dosyadan birini görüyor diğerini görmüyor.
WinImage programıyla 64 MB boyutunda bir imaj oluşturup içine iki dosya attım. Bir adet .TXT ve bir adet .WAV (unsigned 8-bit PCM)
Proteusta aşağıdaki devreyi kurdum;
mikroC'de kodları;
// MMC modüle bağlantıları 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 modüle bağlantılar // Program içerisinde kullanılacak olan global değişkenler tanımlanıyor unsigned short fat_initi; unsigned char format_sonucu; void UART1_Write_Line(char *uart_text) { UART1_Write_Text(uart_text); UART1_Write(13); UART1_Write(10); } void main() { ADCON1 |= 0x0F; // AN pinleri I/O olarak yapılandırıldı CMCON |= 7; // Komparatörler kapatıldı TRISD = 0x00; LATD = 0xFF; Delay_ms(500); LATD = 0x00; UART1_Init(9600); UART1_Write_Line("SPI init"); // SPI1 modulu baslatiliyor SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); // fat16 dosya sistemi baslatiliyor fat_initi = Mmc_Fat_Init(); if (fat_initi == 0) { // MMC/SD card was detected and successfully initialized UART1_Write_Line("INIT: kart bulundu"); // goal_mono1.wav dosyasinin kartta yuklu olup olmadiginin kontrolu if (Mmc_Fat_Exists("goal_mono1.wav") == 1) { // dosya bulundu UART1_Write_Line("goal_mono1.wav bulundu"); } else { // dosya bulunamadi UART1_Write_Line("goal_mono1.wav bulunamadi !"); } // deneme.txt dosyasinin kartta yuklu olup olmadiginin kontrolu if (Mmc_Fat_Exists("deneme.txt") == 1) { // dosya bulundu UART1_Write_Line("deneme.txt bulundu"); } else { // dosya bulunamadi UART1_Write_Line("deneme.txt bulunamadi !"); } } else if (fat_initi == 1) { // FAT16 boot sector was not found UART1_Write_Line("INIT: boot sector bulunamadi"); UART1_Write_Line("formatlaniyor..."); format_sonucu = Mmc_Fat_QuickFormat("deneme.mmc"); if (format_sonucu == 0) { UART1_Write_Line("FORMAT: tamam"); } else if (format_sonucu == 1) { UART1_Write_Line("FORMAT: hata"); } else if (format_sonucu == 255) { UART1_Write_Line("FORMAT: kart bulunamadi"); } } else if (fat_initi == 255) { // MMC/SD card was not detected UART1_Write_Line("INIT: kart bulunamadi"); } UART1_Write_Line("bitti"); while (1) { } }
Devre şemasındaki Virtual Terminal ekranından görebileceğiniz üzere Mmc_Fat_Exists() fonksiyonu .TXT dosyası için 1, .WAV dosyasi için 0 döndürüyor.
Bu sorunun sebebi ne olabilir?
.WAV dosyasını görüp okuyabilirsem bir DAC veya PWM ile çalmayı deneyeceğim.
-
merhaba,
dosya ismini tamamen büyük karakterle yapar misin uzantisi dahil ve oyle bir dene. Ve de mümkünse kisa ve özel karakter bulunmayan bir isim ver A.WAV gibi
bir de devrede neden kristal yok? ve kartin düzenleme penceresinden boyutunu yine 64mb olarak görüyor musun?
-
Hocam ses dosyasını arayan Mmc_Fat_Exists() fonksiyonu ne döndürüyor kontrol ettiniz mi?
if
(Mmc_Fat_Exists(
"goal_mono1.wav"
) == 1) {
// dosya bulundu
UART1_Write_Line(
"goal_mono1.wav bulundu"
);
}
else
{
// dosya bulunamadi
UART1_Write_Line(
"goal_mono1.wav bulunamadi !"
);
}
yukarıda bulduysa 1 bulamadıysa 0 döndürdüğünü varsayarak kodu yazmışsınız ancak Mmc_Fat_Exists fonksiyonu çağrılırken de hata olmuş olabilir (SPI kaynaklı).if
(Mmc_Fat_Exists(
"goal_mono1.wav"
) == 1) {
// dosya bulundu
UART1_Write_Line(
"goal_mono1.wav bulundu"
);
}
else if (
Mmc_Fat_Exists(
"goal_mono1.wav"
) == 0)
{
// dosya bulunamadi
UART1_Write_Line(
"goal_mono1.wav bulunamadi !"
);
}
else {UART1_Write_Line("Mmc_Fat_Exists() hata");}şeklinde deneyip sonucu paylaşabilir misiniz? -
@unbalanced dosya adını değiştirince sorun çözüldü. dosya adı çok uzun olmadığı ve özel karakter içermediği için sorun olacağını düşünmemiştim. WinImage içinden dosyanın özelliklerine bakınca MS-DOS name kısmında kısaltılmış bir isim gösteriyordu. kristali de simülasyonda koymadım, Proteus öyle de çalıştırıyor. İstediğimi yapabilirsem devreyi çizerken koyacağım.
@aercys
Mmc_Fat_Exists() fonksiyonuna help'ten bakmıştım, sadece iki değer dönüyor, 0 ve 1. O yüzden sadece 1 mi diye kontrol ettim.
Şimdi bu dosya içeriğini okuyup DAC'a göndermeyi deneyeceğim.
Teşekkürler
-
https://download.mikroe.com/documents/compilers/mikroc/pic/help/mmc_library.htm#mmc_fat_exists şu linkteki kütüphaneyi kullandığınızı düşünerek kontrol etmenizi istemiştim.
status = Mmc_Fat_Exists("X_FILES.TXT");
if (1 == status) { ... } // if the file was found... else if (0 == status) { ... } // or if the file was not found... else { ... } // or if there was an error during function call, // which needs to be handled separately.
şeklinde verilmiş manual'de.
Osilatör için mikroişlemcinizin dahili osilatörü bulunmakta. Devreyi fiziki olarak kurarken de osilatör kullanmayabilirsiniz. -
evet ben de ordan baktım, şunu görünce aşağıdaki örneği okumamışım :)
Returns 0
- if file/directory doesn't exist1
- if file/directory exists