Sd kart okumanın pwm sinyali üzerinde etkisi olması

Başlatan Wadek, 25 Mart 2013, 15:28:19

Wadek

Selamlar. Mikroc derleyicisi kullanarak , örneğin duty değeri 170 olan bir pwm sinyali başlatıyorum. Donanımsal pwm kullanıyorum. Kodumun başında bu sinyali ayarlıyorum ve sürekli böyle kalmasını istiyorum.Bunda sorun yok. Fakat kodun devamında belli aralıklarla Sd karttan okuma yapmam gerekiyor, bunun için timer kesmesi kullanıyorum. Sd karttan okuma yapmaya başladığımda pwm sinyalinde gürültüler meydana gelmeye başlıyor. Nasıl bir sebepten ötürü sd karttan okuma yapmamın pwm sinyali üzerinde etkisi olabilir. Bu konu hakkında fikir verebilirseniz sevinirim.

LukeSkywalker

PWM modülü de sonuçta timer kullanıyor. Eğer PWM modülünün kullandığı timer modülünü kuruyorsanız sıkıntı oluşması kaçınılmazdır.

Wadek

Haklısınız fakat pwm modülü Timer2 kullanıyor, ben ise kesme için timer0 kullanıyorum.

LukeSkywalker

#3
Peki sd kartı nasıl okuyorsunuz? SPI kullanarak mı? Eğer dahili SPI kullanıyorsanız çok büyük ihtimal ile o bozuyordur. Çünkü büyük ihtimal ile kullandığınız denetleyicide o modül de Timer2 kullanıyor.
Soft SPI deneyin.

Wadek

Cevaplarınız için çok teşekkür ederim. Sd kart okumak için Mikroc derleyicisinin Mmc Fat16 library sini kullanıyorum. Bu library i kullanırken dahili spi kullanmaktan başka çarem var mıdır ? Bu arada mikrodenetleyici olarak 18f4550 kullanmaktayım.

LukeSkywalker

#5
Kaynak olarak ne kullanıyorsunuz bilmiyorum ama ben şu anda denedim, hiç bir problem olmadan hem pwm modülü hem de sd karttan veri yazma okuma işlemleri sorunsuz çalışıyor. Eğer Altaş'ın 18f4550 kitabını kullanıyorsanız oradaki mmc konusu hatalı.

Wadek

Altaşın kitabını kullanarak mikroc ye giriş yaptım. Fakat mmc konusunda birebir altaşın örneğine bağlı değilim. Hatta sektör okumuyor direk olarak Mmc Fat Read komutunu kullanıyorum. Pwm çıkışında yükseltecim mevcut ve hoparlorden dinleyerek bahsi geçen gürültüyü tespit ediyorum. Basit bir şekilde açıklamak gerekirse Mmc Fat Read komutunu kodlarım içerisine eklemediğimde düzgün tiz bir ses çıkışı alıyorum (pwm duty değeri 170 sabit), fakat 100 us de bir mmc fat read komutunu çalıştırmamla birlikte düzgün tiz sesi yerini bozuk bir sese bırakıyor.

Aslında yapmaya çalıştığım bir wav player. Sd karttan verileri okuyor ve müziği çalabiliyorum. Fakat bu bahsettiğim durumdan dolayı seste bir titreme oluşuyor.

Ben kodları ilk bahsettiğim gibi basite indirgediğimdede pwm sinyalinde bozulma olduğunu tespit ettim. Bu durumda sizin söylediğiniz gibi spi ve pwm modüllerinin aynı timerı kullanmasından kaynaklanan bir sorun olduğunu düşünüyorum. Mikroc mmc kütüphanesi kullandığımdan dahili spi modülünü kullanmam gerekecek sanıyorum. Bu yüzden pwm kısmını yazılımla halletmeyi düşünüyorum. Bunlar benim aklıma gelenler, sizin bir fikriniz ya da tavsiyeniz var ise lütfen benimle paylaşın.

Bu arada bahsettiğim koduda veriyorum. Belki gözümden kaçan bir nokta vardır.

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;
unsigned short datam;
char oke;
unsigned long size;

void Interrupt(){
  if (TMR0IF_bit){
  TMR0IF_bit = 0;
  TMR0H         = 0xfb;
  TMR0L         = 0xbf;
  oke=1;
  }
}
 void sdsetup(){ //burada sd card kuruluyor dosya acılıyor boyut alınıyor
  Mmc_Fat_Init();
  Mmc_Fat_Assign("DENEME12.WAV",0x01);
  Mmc_Fat_Reset(&size);
  }
void setups(){
 ADCON1 |= 0x0F;                  // AN pinleri I/O olarak yapılandırıldı
 CMCON  |= 7;                     // Komparatörler kapatıldı
 TRISA=0  ;
 PORTA=255 ;
 TRISD.RD0=0;                     // Transistör pini çıkış
 PORTD.RD0=0;                     // Transistör kapalı
 TRISC.RC2=0;
 PORTC.RC2=0;
 PWM1_Init(187500);               //Pwm frekans değeri atandı
 PWM1_Start();
 PWM1_Set_Duty(170);
 SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
}


void InitTimer0(){
  TMR0IF_bit = 0;
  T0CON         = 0x88;
  TMR0H         = 0xFb;
  TMR0L         = 0xbf;
  GIE_bit         = 1;
  TMR0IE_bit         = 1;
}

void main() {
   setups();
   sdsetup();
   InitTimer0();
   PORTD.RD0=1;
   while(1)
   {
   Mmc_Fat_Read(&datam);//BU SATIRI AKTİF ETTİĞİMDE ALDIĞIM SES SİNYALİ İLE DEAKTİF ETTİĞİMDEKİ SES SİNYALİ FARKLI OLUYOR.
   oke=0;
   while(oke==0)
   {
   }
   }


}

sadogan

#7
Sorun şu olabilir:
MMC karttan 512 byte lık paketler şeklinde okunuyor veriler.
bu paket sırayla pwm Duty ye yazıyorsunuz.
paketin son verisini yazdıktan sonra yeni 512 byte lık veri okuyorsunuz.
512 byte lık veriyi okurken pwm duty update edemiyorsunuz ve ses de parazit
oluşuyor.
Benim tahminim bu.


Wadek

Alıntı yapılan: sadogan - 26 Mart 2013, 01:13:04
Sorun şu olabilir:
MMC karttan 512 byte lık paketler şeklinde okunuyor veriler.
bu paket sırayla pwm Duty ye yazıyorsunuz.
paketin son verisini yazdıktan sonra yeni 512 byte lık veri okuyorsunuz.
512 byte lık veriyi okurken pwm duty update edemiyorsunuz ve ses de parazit
oluşuyor.
Benim tahminim bu.

Öncelikle sd karttan 512 byte (sektör) şeklinde okuma yapmıyorum. fat16 dosya sistemini kullanarak okuma yapıyorum.
Ki yukarıda anlattığım durumda pwm duty registerında herhangi bir değişiklik söz konusu değil. Duty değeri sabittir.

Wadek

Problemin çözümü için aklıma gelenleri şöyle anlatayım,

1.si Sd kartı okuma işini MikroC kütüphanesi kullanmayarak yapmak. Direk olarak sd kart ile spi iletişimi kurup sektörlerinden veri okumak. Fat dosya sistemini bir kenara bırakmak. Okumam gereken dosyanın başlangıç adresini bilmem gerekecek bunun için winhex vb. programlar kullanacağım.
Mmc_fat_read ile dosya okuma kolaylığını bir kenara bırakmam gerekecek.

2.si Yukarıda bahsettiğim kolaylıklardan vazgeçmeyeceğim. Ama tabiki donanımsal pwm kullanma işini rafa kaldırmam gerekiyor bu seferde. E malum yazılım içerisinde yazılımsal pwm de kullanamayacağım. Sürekli bir pwm sinyali alamayacağım için. Bu iş için DAC kullanacağım sanırım.

Tespitlerim de hatalar olabilir kimseyi yanlış yönlendirmek istemem. Herhangi bir fikrin çok yardımı olabilir.




sadogan

#10
Fat16 sistemi sd karttan nasıl okuyor veriyi ?
Ben wav dosyasını çalarken pazazit oluyor sanmıştım soryy.

Wadek

Mmc_Fat_Init();
Mmc_Fat_Assign("DENEME12.WAV",0x01);

komutlarını kullandıktan sonra direk olarak DENEME12.WAV dosyası ismiyle açılmış oluyor. Siz her Mmc_Fat_Read komutunu işlediğinizde 1 Byte veri alıyorsunuz. Tekrar Mmc_fat_read dediğinizde bir sonraki byte ı okursunuz.

LukeSkywalker

http://www.mediafire.com/download.php?sbs35lcjjc4acya
Burada hazırladığım örnekte bir problem olmuyor. MMC karttan veri okurken pwm sinyalinde herhangi bir değişim göremedim.