MikroC Pwm sinyalinin bozulması

Başlatan Wadek, 12 Mart 2013, 17:54:04

Wadek

Öncelikle selamlar. Sorunumu kısaca açıklamak istiyorum. Wav dosyasını sd karttan okuduktan sonra pwm ile çıkışa aktaran bir proje üzerinde çalışıyorum. Ses dosyasını çalıyorum fakat çalarken tabiri caizse pat pat gibi bir ses duyuyorum aynı zamanda.
Sorunu anlamak için yaptığım testi şöyle açıklayayım.

PWM1_Set_Duty(10); diyerek  duty değeri 10 olan bir pwm sinyali alıyorum.

Aynı zamanda 90 mikro saniyelik bir timer kurulu. 90 mikro saniyede bir PWM1_Set_Duty(10); satırını işliyor.

Hoparlorümden sorunsuz bir bip sesi çıkıyor.

PWM1_Set_Duty(10); satırının altına
Mmc_fat_read(&datam); satırını eklediğimde seste kesilmeler oluyor ve pat pat şeklinde duyuluyor.

mmc_fat_read komutunun işlemini 90 mikro saniyenin altında yaptığını düşünüyorum.

peki sadece bu satırı eklemem pwm sinyalinde neden bozulmaya neden oluyor ?

Mmc_fat_read satırı yerine mmc_read_sector komutunu kullanmam durumu değiştirmiyor.

Spi_init_advanced komutunda osc_div 4 yaptığımda pat pat sesi daha az osc_div 64 yaptığımda daha fazla.

mmc_fat_read komutunun işlemini 90 mikro saniyenin altında yaptığını yanlış mı düşünüyorum yoksa ?

Peki öyleyse sd karttan düzgün bir wav player yapmak nasıl mümkün olabilir ? (mikroc library si ile)

Basit bir şekilde açıklamaya çalıştığım sistemin kodu aşağıdadır. Yardımlarınız için şimdiden teşekkürler.

Wav dosyaları 8 bit mono 11025 khz'dir. PIC18f4550 kullanılmıştı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;



int i=0;
int cnt=0;
unsigned short datam;
unsigned long zz;
unsigned long zx;
unsigned long size;
unsigned short duty1;
unsigned long sectorNo;
//char duty1;
unsigned short veri[512];
char oke;


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 setup(){
 ADCON1 |= 0x0F;                  // AN pinleri I/O olarak yapılandırıldı
 CMCON  |= 7;                     // Komparatörler kapatıldı
 TRISA=0  ;
 PORTA=255 ;
 TRISD.RD0=0;                     // Trans pini çıkış
 PORTD.RD0=0;                     // Transistör kapalı

 TRISC.RC2=0;
 PORTC.RC2=0;
 zx=0;

PWM1_Init(187500);               //Pwm frekans değeri atandı
PWM1_Start();
 // SPI1 modülü yapılandırılıyor
  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 mmc(){
Mmc_Fat_Read(&datam);
}

void main() {
   setup();
   sdsetup();
   InitTimer0();
   PORTD.RD0=1;
    sectorNo=0;


   while(1)
   {
    PWM1_Set_Duty(datam);
   mmc();

   oke=0;
   while(oke==0)
   {
   }

   }


}









Wadek

Bu konuda herhangi bir fikri olan yok mu acaba ?

Ali_54

epey zaman geçmiş ama şunu söyliyeyim yinede. kullandığın komutlar 90us üzerinde gecikmeye neden olduğu için pat pat duyuyorsun. clk div 64 yaparsan zaten sd kart okuma hızını düşürdüğün için daha çok pat pat duyman normal. 90u KESME ZAMANINI AŞMADAN ara işlemleri bitirmek zorundasın. Bunun için önerilerim

mümkün olan en hızlı kristali kullan. (48Mhz olabilir.)
iletişim hızlarını en yükseğe ayarlamaya çalış.
1 harf öğretenin 4 gün kölesi olurum.

emre salman

öncelikle bu projenizde başarılar şuan benimde stm32F407vg ile sd karttan wav dosyası okuyup seslendirmem gerekiyor hocam bunu kısa sesleri flasha atıp seslendirebiliyorum ama hiç sd kart kullanmadım ve mikrocnin mmc kart kütüphanesi hakkında hiç tecrübem yok bu konuda beni biraz aydınlatabilir misin hangi kodları kullanmam gerekiyor onlar hakkında

LukeSkywalker

STM32F407 için de aynen yukarıdaki arkadaşın yazdığı komutları kullanarak mmc karttan dosya okuyabilirsiniz. Zaten mikroc'nin help dosyasında yeterince örnek var. Examples klasöründeki mmc fat16 örneklerine de bakabilirsiniz. Wav dosyasını mmc karta atacaksınız, daha sonra attığınız dosyayı assign edip, verileri sırayla okuyacaksınız. Okuduğunuz verileri ise ya DAC birimine ya da PWM birimine gönderip sinyal çıkışı alacaksınız. DAC birimi daha kullanışlı... Eğer wav dosyasının örneklemesi 8KHz ise 8KHz'lik bir timer kurup dosya içerisindeki verileri timer kesmesi içerisinde alacaksınız. 8KHz 8bit ile başlayın gerisi gelkecektir..

emre salman

anladım hocam çok teşekkür ederim peki aklıma takılan birşey daha var stm32f4 discovery kitinde bildiğiniz gibi stereo çıkışı var sesi stereo olarak bu jaktan nasıl çıkartabilirim yani programı sanırım tamamen değişecek mono olmuycak çift kanal olucak bu durumda aynı anda iki dac çıkışımı vermem gerekiyor biraz aydınlatabilir misiniz

LukeSkywalker

stereo olunca işler biraz karışır. wav formatını bir inceleyin.

emre salman

anladım hocam son bir soru mikroc kütüphanesine göre stm32f407vg nin mmc pinleri hangileridir bu konuda bir bilgi bulamadım acaba z hocamızın kütüphanesindeki gibi aynı pinlermidir yoksa farklımıdır help menüsündede yok sanırım pinleri varsada ben bulamadım :S bir hatam varsa affola

LukeSkywalker

#8
SPI pinlerini kullanacaksınız. Kendiniz seçebiliyorsunuz SPI kanalını. Help dosyasına bakarsanız anlamanız uzun sürmez.

mesaj birleştirme:: 30 Mart 2014, 16:13:14

MMC_FAt_init()
komutunu inceleyin.

emre salman

SPI3_Init_Advanced(_SPI_FPCLK_DIV2, _SPI_MASTER | _SPI_8_BIT |
                   _SPI_CLK_IDLE_LOW | _SPI_FIRST_CLK_EDGE_TRANSITION |
                   _SPI_MSB_FIRST | _SPI_SS_DISABLE | _SPI_SSM_ENABLE | _SPI_SSI_1,
                   &_GPIO_MODULE_SPI3_PC10_11_12);

yani burda c portunun 10,11 ve 12. pini diyor doğrumu anlıyorum hocam

emre salman

öğrendim hocam spı3 yani pb3 pb4 pb5 sizin yayınlamış olduğunuz mikroc ile arm programlamakitabında  yazıyordu

emre salman

hocam hiç ses alamadım acaba nerde yanlıslık yapıyorum muhtemelen bir yerde çok büyük bir yanlışlık yapıyorum ama çözemedim yardımcı olabilir misiniz kodlar aşağıdaki gibidir bu işlerde çok yeniyim ondan tecrübem çok az c dili ve arm konusunda piclerlede iyi sayılmaz ama

sbit Mmc_Chip_Select at GPIOE_ODR.B3;
int i=0;
int cnt=0;
unsigned long z=0;
unsigned short datam;
unsigned long zz;
unsigned long zx;
unsigned long size;
unsigned short duty1;
unsigned long sectorNo;
unsigned short veri[512];


void kurulum()
{
RCC_APB1ENR.TIM7EN = 1;
TIM7_CR1.CEN = 0;
TIM7_PSC = 0;
TIM7_ARR = 10499;
NVIC_IntEnable(IVT_INT_TIM7);
TIM7_DIER.UIE = 1;
TIM7_CR1.CEN = 1;
RCC_APB1ENR.DACEN=1;

GPIO_Analog_Input(&GPIOA_BASE,_GPIO_PINMASK_4);
DAC_CR=1;
Mmc_Fat_Init();
Mmc_Fat_Assign("DENEME1.WAV",0x01);
Mmc_Fat_Reset(&size);
}
void mmc(){
Mmc_Fat_Read(&datam);
}



void main() {
kurulum();
mmc();

}

void Timer7_interrupt()iv IVT_INT_TIM7
{
 TIM7_SR.UIF = 0;
 DAC_DHR12R1=(datam);
 i++;
 if(i==512)i=0;
}

Karamel

#12
LukeSkyWalker hocam. sd card wav okuma konularini arastirirken bu konuya rast geldim. mikroc for arm kutuphanelerinde spi ile ilgili butun ornekler spi3 uzerinden verilmis. ben yazin spi1 yada spi2 yi kullanmak istiyorum.

SPI3_Init_Advanced(_SPI_FPCLK_DIV2, _SPI_MASTER | _SPI_8_BIT |
                   _SPI_CLK_IDLE_LOW | _SPI_FIRST_CLK_EDGE_TRANSITION |
                   _SPI_MSB_FIRST | _SPI_SS_DISABLE | _SPI_SSM_ENABLE | _SPI_SSI_1,
                   &_GPIO_MODULE_SPI3_PC10_11_12);

u soyle modifiye etsem calisirmi?

SPI1_Init_Advanced

&_GPIO_MODULE_SPI1_PC10_11_12 (kararttigim yerlerde spi1 hangi pinlere denk geliyorsa iste)

mesaj birleştirme:: 31 Mayıs 2015, 02:24:48

bunu derledi. ama suan deney yapma sansim yok....  :-\

SPI1_Init_Advanced(_SPI_FPCLK_DIV16, _SPI_MASTER  | _SPI_8_BIT |
                     _SPI_CLK_IDLE_LOW | _SPI_FIRST_CLK_EDGE_TRANSITION |
                     _SPI_MSB_FIRST | _SPI_SS_DISABLE | _SPI_SSM_ENABLE | _SPI_SSI_1,
                     &_GPIO_MODULE_SPI1_PA567);

LukeSkywalker