Merhaba,
18f4550 kullanarak bir sd kart uygulaması üzerinde çalışıyorum. İsis simülasyonunda çalışan devreyi ve yazılımı gerçek ortamda çalıştıramadım. Sorun kartı bulamaması. Donanımsal bir hata olduğunu düşünüyorum. Pic 48Mhz de çalışıyor. Rs232 haberleşmesinde problem yok o çalışıyor. Ve ekranda sürekli "kart bulunamadı" yazısı çıkıyor.
Microc de derlemiş olduğum kod şu şekilde,
sbit Mmc_Chip_Select at LATC0_bit;
sbit Mmc_Chip_Select_Direction at TRISC0_bit;
int mmc_deg=15;
void main() {
ADCON1|=0x0F;
CMCON|=0x07;
UART1_Init(19200);
delay_ms(10);
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_LOW,_SPI_LOW_2_HIGH);
while(1)
{
delay_ms(1000);
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_LOW,_SPI_LOW_2_HIGH);
mmc_deg=Mmc_Init();
if(mmc_deg==0)
{
UART1_Write_Text("kart bulundu\r");
delay_ms(1000);
}
else if(mmc_deg==1)
{
UART1_Write_Text("kart bulunamadi\r");
delay_ms(1000);
}
else if(mmc_deg==255)
{
UART1_Write_Text("sistem taninmadi\r");
delay_ms(1000);
}
else
{
UART1_Write_Text("hata!\r");
delay_ms(1000);
}
}
}
Gerçekte kurmuş olduğum devrenin şeması, (Güncellendi)
(http://s11.postimg.cc/iw4p67se7/mmc.jpg) (http://postimg.cc/image/iw4p67se7/)
Kullandığım adaptör ve sd kart,
(http://s12.postimg.cc/cwzywl09l/20151014_214405.jpg) (http://postimg.cc/image/cwzywl09l/)
Sorunu nerede aramalıyım?
Merhaba SD kartı 1GB olarak deneyin.
Alıntı yapılan: M_B - 14 Ekim 2015, 22:29:52
Merhaba SD kartı 1GB olarak deneyin.
Elimde olmadığı için denememiştim. En yakın zamanda deneyeceğim.
while içerisinde SPI birimini sürekli init etmenize gerek yok. Ayrıca bu sd card işinde lojik seviye önemli oraya bir göz atın.
Mmc_Init()
içinde okunan veya biryerde tanımlı olan
acaba sd kart takılı mı diye kontrol edilen bir pin olur,
sd kart okuma yazma fonksiyonlarıyla bir alakası yoktur,
fiziksel olarak kartın takılı olup olmadığını anlamak için
bir butonmuş gibi düşünülebilir,
bu kısmı bulup iptal etmelisin
veya
bu kısma denk gelen pini bulup sd kart okuyucu soketinle kullanabilirsin.
mesaj birleştirme:: 15 Ekim 2015, 01:38:37
Ayrıca picden çıkan 5V u sd karta 3.3V olarak vermek için
kurduğun gerilim bölücü bağlantısı yanlış gibi.
Alıntı yapılan: kantirici - 14 Ekim 2015, 23:22:11
while içerisinde SPI birimini sürekli init etmenize gerek yok. Ayrıca bu sd card işinde lojik seviye önemli oraya bir göz atın.
Sd kartın uçlarına gelen gerilimler (gerilim bölücüler yardımıyla) 2.89-2.90V. Yeterli değil mi?
mesaj birleştirme:: 15 Ekim 2015, 09:02:31
Alıntı yapılan: RaMu - 15 Ekim 2015, 01:34:49
Mmc_Init()
içinde okunan veya biryerde tanımlı olan
acaba sd kart takılı mı diye kontrol edilen bir pin olur,
sd kart okuma yazma fonksiyonlarıyla bir alakası yoktur,
fiziksel olarak kartın takılı olup olmadığını anlamak için
bir butonmuş gibi düşünülebilir,
bu kısmı bulup iptal etmelisin
veya
bu kısma denk gelen pini bulup sd kart okuyucu soketinle kullanabilirsin.
mesaj birleştirme:: Ekim 15, 2015, 02:38:37
Ayrıca picden çıkan 5V u sd karta 3.3V olarak vermek için
kurduğun gerilim bölücü bağlantısı yanlış gibi.
-Mmc_Init() fonsiyonunu hiç kullanmasam da olur diyorsunuz. Sadece takılı olup olmadığını kontrol amaçlı bir fonksiyon.
-Devre şemasındaki gerilim bölücüleri konuya eklemek için tekrar çizerken yanlış çizmişim. Gerçek devrede güncellemiş olduğum şekilde bağlı.
Çalışan kod.
/*..............................................................
SD CARD PROJECT
===============
In this project a SD card is connected to PORTB as follows:
CS RB2
CLK RB1
DO RB0 mosi
DI RC7 miso
The program opens a file called Test.TXT on the SD card
and writes the string "Writing to SD Card..." to this file.
Author: studentcompanion.co.za
Date: July 2013
File: Test.C
..............................................................*/
// MMC module connections
sbit Mmc_Chip_Select at LATB2_bit;
sbit Mmc_Chip_Select_Direction at TRISB2_bit;
unsigned cnt;
sbit Led1 at RE0_bit;
sbit Led2 at RE1_bit;
sbit Led3 at RE2_bit;
char filename[] = "Test.TXT";
unsigned char txt[] = "Writing to SD Card...";
void main()
{
ADCON1 |= 0x0F; // AN pinleri I/O olarak yapılandırıldı
CMCON |= 7; // Komparatörler kapatıldı
TRISE = 0; // PORTE çıkış yapıldı
PORTE = 0x00; // PORTB ayarlandı
Delay_ms(10);
Led1=1; // Power on led. RE0
Led2=0; // Hata Led RE1
Led3=0; // Hata yok ledi RE2
delay_ms(500);
// Initialise the SPI bus
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV16,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
if (Mmc_Fat_Init() == 1)
{
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
Mmc_Fat_Assign(&filename, 0x80); // Find existing file or create a new one
Mmc_Fat_Rewrite();
Mmc_Fat_Write(txt,21);
Led3=1;
}
Led2=1;
for(;;);
}
Alıntı yapılan: hasankomur - 15 Ekim 2015, 08:57:43
-Mmc_Init() fonsiyonunu hiç kullanmasam da olur diyorsunuz. Sadece takılı olup olmadığını kontrol amaçlı bir fonksiyon.
Öyle demedim,
muhtemelen mmc_init in içinde bir yerde,
belkide mmc_init ile hiç alakası olmayan ayrı bir fonksiyon olarak bir yerde,
program acaba sd kart fiziksel olarak takılı mı diye bir pini kontrol ediyor olabilir.
isis de denediğim şu örnek anlatım var,
belki faydası olur
https://www.picproje.org/index.php?topic=54274.0 (https://www.picproje.org/index.php?topic=54274.0)