اطلاعیه

Collapse
No announcement yet.

مشکل در wav player ساده

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در wav player ساده

    با سلام خدمت دوستان.
    من کد زیر رو نوشتم و در atmega32a اجراش کردم.
    ولی اتفاقی که میوفته اینه که بلندگو فقط سوت میکشه.
    در ضمن فایل موجود در mmc به صورت نمونه های 8 بیتی ذخیره شده و هیچ هدری هم نداره.
    مونو هستش با فرکانس نمونه برداری 44100
    با تشکر
    کد:
    #include <mega32a.h>	
    #include <delay.h>
    #include "diskio.h"
    #include "ffconf.h"
    #include "ff.h"		
    #include "ff.c"	
    			
    
    unsigned char Buff1[256];
    unsigned char Buff2[256];
    bit B_NUMBER=0;
    bit B_RELOAD=0;
    unsigned char seek=0;
    unsigned long F_LSEEKS=0;
    unsigned char xy;
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {  
       if(!B_NUMBER){
        xy=(Buff1[seek]*181)/255;
       }
       else if(B_NUMBER){
        xy=(Buff2[seek]*181)/255; 
       }
       OCR1AL=(unsigned char)(xy & 0xFF);  
       seek++;
       if(seek>=255){
        B_RELOAD=1;
        B_NUMBER=~B_NUMBER;
        seek=0;
       }
       
    }
    void main (void)
    {   
      
    	UINT bw;
    	FATFS FatFs;		
    	FIL Fil;
      DDRD = 0xFF;
    	f_mount(&FatFs, "", 0);		
      if (f_open(&Fil, "x.raw", FA_READ) == FR_OK) {
             
              if(f_read(&Fil,Buff1,256,&bw)==FR_OK){
                if(bw==256){
                  F_LSEEKS+=256; 
                }
              }      
              f_lseek(&Fil,F_LSEEKS);
              if(f_read(&Fil,Buff2,256,&bw)==FR_OK){
                if(bw==256){
                  F_LSEEKS+=256;
                  DDRB|=0b00010000;
                  PORTB|=0b00010000;   
               }      
              } 
              
              TCCR1A=0x82;
              TCCR1B=0x19;
              TCNT1H=0x00;
              TCNT1L=0x00;
              ICR1H=0x00;
              ICR1L=0xB5;
              OCR1AH=0x00;
              OCR1AL=0x5A;
              OCR1BH=0x00;
              OCR1BL=0x00;
              TIMSK=0x04;
              #asm("sei");
              
          while(1){ 
            while(!B_RELOAD);
            
             if(B_NUMBER){
              f_lseek(&Fil,F_LSEEKS);
              if(f_read(&Fil,Buff1,256,&bw)==FR_OK){
                if(bw==256){
                  F_LSEEKS+=256;
                  PORTB.4=~PORTB.4;
                }
              }
             }
             if(!B_NUMBER){
              f_lseek(&Fil,F_LSEEKS);
              if(f_read(&Fil,Buff2,256,&bw)==FR_OK){
                if(bw==256){
                  F_LSEEKS+=256;
                  PORTB.4=~PORTB.4;   
               }      
              } 
             }
             B_RELOAD=0;   
           }           
      } 
      else{
        DDRB|=0b00010000;
        PORTB|=0b00010000;
        while(1){
          delay_ms(20);
          PORTB.4=~PORTB.4;
        }
      } 
      
    	while(1);
      
    }

    #2
    پاسخ : مشکل در wav player ساده

    من با ATmega128 دو سه بار wave player ساختم. این هم کدش ولی کیفیت صدا زیاد خوب نبود.
    امیدوارم این کد بدردتون بخوره

    کد:
    $regfile = "M128Def.dat"
    $crystal = 16000000
    
    
    'Const Xramdrive = 0
     Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db7 = Pinf.0 , Db6 = Pinf.1 , Db5 = Pinf.2 , Db4 = Pinf.3 , E = Pinf.4 , Rs = Pinf.5
     Config Pinb.7 = Input , Pind.6 = Input , Pind.7 = Input
    
     Cls : Cursor Off Noblink
    '--------------------------------------------------------------------------------
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    Pwm1a = 0
    Start Timer1
    '###########################################################################
    Config Timer2 = Timer , Prescale = 1
    Enable Timer2 : On Timer2 T2_isr
    Const Timer2_value = 235                  '211
    Stop Timer2
    '###########################################################################
    
    Enable Interrupts
    
    Dim Co_2 As Bit
    
    
    
    Dim Bufor As Byte
    Dim First As Bit
    
    Dim E As Bit
    
    Dim W As Word
    Dim B As Byte
    Dim S As String * 30
    
    '(Config Int0 = Falling
    On Int0 Ainit
    Portd.2 = 1
    sei
    Enable Int0
    ')
    $include "Config_MMC.bas"
    $include "CONFIG_AVR-DOS.Bas"
    
    
    
      If Drivecheck() <> 0 Then
       Do
         Locate 1 , 1
         Lcd "mmc not inserted"
       Loop
      End If
    
      If Driveinit() <> 0 Then
       Do
         Locate 1 , 1
         Lcd "mmc not insert"
       Loop
      End If
    
      If Initfilesystem(1) <> 0 Then
       Do
         Locate 1 , 1
         Lcd "Format isn't supported"
       Loop
      End If
    Locate 1 , 1
    Lcd "MMC OK"
    Wait 1
    '-------------------------------------------------------------------------------
    R:
    Do
    'S = Dir( "*.wav")
      Cls
    '  Lcd S ; " " ; Filedate()
    '  Lowerline
    
     S = "1.wav"
     Locate 1 , 1
     Lcd S
     ' Lcd Filetime() ; " " ; Filelen()
      Open S For Binary As #2
      E = 0
      First = 1
      W = 0
      Stop Timer2 : Timer2 = Timer2_value : Start Timer2
      Do
       Locate 1 , 1
       Lcd "Play"
       If E = 1 Then
         Locate 1 , 1
         Lcd "Next"
         Exit Do
       End If
      Loop
    Loop
    Play:
    T2_isr:
    Stop Timer2
    
      If Eof(#2) = 0 Then
         If W = 512 Then
          W = 0
          First = 0
          Pwm1a = 255
         End If
            If First = 1 Then
             Incr W
            Else
             Get #2 , Bufor
             Pwm1a = Bufor
            End If
       Timer2 = Timer2_value : Start Timer2
      Else
       Pwm1a = 255
       Close #2
       Locate 2 , 1
       Lcd "File End"
       E = 1
       Wait 1
      End If
    Return
    
    
    'Nex_t:
    'Pwm1a = 0
    'Close #2
    
    '  S = Dir()
    
    'Gosub Play

    دیدگاه


      #3
      پاسخ : مشکل در wav player ساده

      Homayon عزیز ممنونم از کدی که در اختیار گذاشتی.
      ولی ممنون میشم از دوستان اگر کسی بتونه ایراد کده من رو بگه.
      واقعا لنگ این تیکه ام که بفهمم ایراد کار از کجاست.

      دیدگاه


        #4
        پاسخ : مشکل در wav player ساده

        شما روی سخت افزارتون LCD دارید؟
        اگه دارید عددی که از روی رم داری میخونید بعد اون رو روی رجیستر PWM قرار میدید رو روی LCD ببین اگه تغییر کرد یعنی که اطلاعات داره از روی رم استخراج میشخه ولی سرعتش درست نیست.

        اگر هم تغییر نکرد که احتمال خیلی زیاد میدم از این قسمت باشه یعنی از رو رم اطلاعات Load نمیشه

        دیدگاه


          #5
          پاسخ : مشکل در wav player ساده

          اطلاعات رو مانیتور کردم.
          متاسفانه اطلاعات به طور درستی از رم خونده میشن.
          ولی راجع به سرعت pwm اصلا مطمعن نیستم.
          بدبختانه اسیلوسکوپ هم در دسترس ندارم. :angry:

          دیدگاه


            #6
            پاسخ : مشکل در wav player ساده

            آقا همایون مطمعنا میدونید که سرعت کلاک atmega32a یه چیزی حدود 8MHz هستش.
            ولی من هر چقدر تو پروتئوس دارم شبیه سازیش میکنم این تنظیماتم برای pwm سرعت 44100 نمیده.
            به نظرتون تنظیمات رجیستر های کنترل تایمر 1 درست هستش؟

            دیدگاه


              #7
              پاسخ : مشکل در wav player ساده

              برای ساخت wave player حتما باید میکرو رو رو 16 مگ تنظیم کنی بعد ایمیلت رو بده. یک پروژه کامل من قبلا ساخته بودم اسم فایل رو از طریق پورت سریال به میکرو میدادی بعد همون رو پخش میکرد برات این رو ایمیل میکنم شاید مشکلت کلا حل بشه :agree:

              دیدگاه


                #8
                پاسخ : مشکل در wav player ساده

                منونم.
                ایمیلم رو پ.خ کردم.
                فقط من منظورتون رو از تنظیم رو 16مگ متوجه نشدم.
                یعنی یک کریستال خارجی 16 مگ ببندم بهش یا اینکه میشه از کلاک داخلی خود میکرو استفاده کرد؟

                دیدگاه


                  #9
                  پاسخ : مشکل در wav player ساده

                  نوشته اصلی توسط php.console
                  منونم.
                  ایمیلم رو پ.خ کردم.
                  فقط من منظورتون رو از تنظیم رو 16مگ متوجه نشدم.
                  یعنی یک کریستال خارجی 16 مگ ببندم بهش یا اینکه میشه از کلاک داخلی خود میکرو استفاده کرد؟
                  پ.خ نرسید
                  آره باید کریستال خارجی 16 مگاهرتز بذاری . در ضمن کلاک اسیلاتور داخلی میکرو ماکزیمم 8 مگاهرتز هست.

                  دیدگاه

                  لطفا صبر کنید...
                  X