pic ile smartmp3 kullanımı

Başlatan feyzi, 17 Mayıs 2011, 23:09:33

feyzi

Tüm camiaya selamlar!
Smartmp3 kartını, pic 18F452 ile çalıştırmak için uğraşıyorum.Üzerinde VS1011E çipi var.Kartı üreten firma,mikroC,mikroPASCAL ve mikroBASİC ile örnek kodları vermiş.Kolayıma geldiği için,mikroBASIC örneği üzerinde çalışıyorum.MP3 uzantılı dosyayı bir kere çalıp bırakıyor.RB6 butonuna basılınca,ses artıyor,
RB7 butonuna basılınca,ses azalıyor.MP3 dosyalarını sırayla veya butonlara basarak çalıştırmak istiyorum.Tekrar selamlar...MikroBASIC örnek kodu :

program MP3_DENEME

' Buttons for Left/Right Volume control
dim BtnLeftDown            as sbit at RB7_bit
dim BtnLeftUp              as sbit at RB6_bit
dim BtnRightDown           as sbit at RB5_bit
dim BtnRightUp             as sbit at RB4_bit
dim portb3             as sbit at RB3_bit                        ' kendim yazdım
dim BtnLeftDown_Direction  as sbit at TRISB7_bit
dim BtnLeftUp_Direction    as sbit at TRISB6_bit
dim BtnRightDown_Direction as sbit at TRISB5_bit
dim BtnRightUp_Direction   as sbit at TRISB4_bit
dim portb3_Direction   as sbit at TRISB3_bit             ' kendim yazdım

' Smart MP3 board connections
dim Mmc_Chip_Select           as sbit at RC0_bit
dim MP3_CS                    as sbit at RC1_bit
dim MP3_RST                   as sbit at RC2_bit
dim DREQ                      as sbit at RD0_bit
dim BSYNC                     as sbit at RD1_bit
dim DCLK                      as sbit at RD2_bit
dim SDATA                     as sbit at RD3_bit
dim Mmc_Chip_Select_Direction as sbit at TRISC0_bit
dim MP3_CS_Direction          as sbit at TRISC1_bit
dim MP3_RST_Direction         as sbit at TRISC2_bit
dim DREQ_Direction            as sbit at TRISD0_bit
dim BSYNC_Direction           as sbit at TRISD1_bit
dim DCLK_Direction            as sbit at TRISD2_bit
dim SDATA_Direction           as sbit at TRISD3_bit

' VS1011E constants
const WRITE_CODE  as byte = 0x02
const READ_CODE   as byte = 0x03
const MODE_ADDR   as byte = 0x00
const CLOCKF_ADDR as byte = 0x03
const VOL_ADDR    as byte = 0x0B

' global variables
const BUFFER_SIZE = 512
dim filename as string[13]
    i, file_size as longword
    data_buffer_32 as byte[32]
    BufferLarge as byte[BUFFER_SIZE]
    volume_left, volume_right as byte

' Write text and goto new line CR and LF
sub procedure UART1_Write_Line(dim byref text as string[50])
  UART1_Write_Text(text)
  UART1_Write(13)
  UART1_Write(10)
end sub

' Writes one byte to MP3 SDI
sub procedure SW_SPI_Write(dim data_ as byte)

  BSYNC = 1                              ' Set BSYNC before sending the first bit

  DCLK = 0
  SDATA = data_.0                        ' bitorder is LSB first
  DCLK = 1

  DCLK = 0
  SDATA = data_.1
  DCLK = 1

  BSYNC = 0                              ' Clear BSYNC after sending the second bit

  DCLK = 0
  SDATA = data_.2
  DCLK = 1

  DCLK = 0
  SDATA = data_.3
  DCLK = 1

  DCLK = 0
  SDATA = data_.4
  DCLK = 1

  DCLK = 0
  SDATA = data_.5
  DCLK = 1

  DCLK = 0
  SDATA = data_.6
  DCLK = 1

  DCLK = 0
  SDATA = data_.7
  DCLK = 1

  DCLK = 0
end sub

' Writes one word to MP3 SCI
sub procedure MP3_SCI_Write(dim address as byte, dim data_in as word)
  MP3_CS = 0                              ' select MP3 SCI
  SPI1_Write(WRITE_CODE)
  SPI1_Write(address)
  SPI1_Write(Hi(data_in))                  ' high byte
  SPI1_Write(Lo(data_in))                  ' low byte
  MP3_CS = 1                              ' deselect MP3 SCI
  while (DREQ = 0) nop wend               ' wait until DREQ becomes 1, see MP3 codec datasheet, Serial Protocol for SCI
end sub

' Reads words_count words from MP3 SCI
sub procedure MP3_SCI_Read(dim start_address, words_count as byte, dim data_buffer as ^byte)
dim i as byte
  MP3_CS = 0                              ' select MP3 SCI
  SPI1_Write(READ_CODE)                    ' Read command
  SPI1_Write(start_address)

  for i = 1 to (2*words_count)            ' read words_count words byte per byte
    data_buffer^ = SPI1_Read(0)            ' read and store a byte
    Inc(data_buffer)                      ' point to next byte
  next i
  MP3_CS = 1                              ' deselect MP3 SCI
  while (DREQ = 0) nop wend               ' wait until DREQ becomes 1, see MP3 codec datasheet, Serial Protocol for SCI
end sub

' Write one byte to MP3 SDI
sub procedure MP3_SDI_Write(dim data_ as byte)
  while (DREQ = 0) nop wend               ' wait until DREQ becomes 1, see MP3 codec datasheet, Serial Protocol for SCI

  SW_SPI_Write(data_)
end sub

' Write 32 bytes to MP3 SDI
sub procedure MP3_SDI_Write_32(dim data_ as ^byte)
  dim i as byte

  while (DREQ = 0) nop wend               ' wait until DREQ becomes 1, see MP3 codec datasheet, Serial Protocol for SCI

  for i = 1 to 32
    SW_SPI_Write(data_^)                  ' Write byte pointed by data
    Inc(data_)
  next i
end sub

' Set clock
sub procedure Set_Clock(dim clock_khz_ as word, dim doubler as byte)
  clock_khz_ = clock_khz_ / 2             ' calculate value
  if (doubler > 0) then
    clock_khz_ = clock_khz_ or 0x20000
  end if

  MP3_SCI_Write(CLOCKF_ADDR, clock_khz_)  ' Write value to CLOCKF register
end sub

' Set volume
sub procedure Set_Volume(dim left_, right_ as byte)
dim volume as word
  volume = (left_ << 8) + right_          ' calculate value
  MP3_SCI_Write(VOL_ADDR, volume)         ' Write value to VOL register
end sub

' If volume Buttons are pressed update volume
sub procedure Check_Volume()
  dim old_volume_left, old_volume_right as byte

  old_volume_left  = volume_left          ' save volume values
  old_volume_right = volume_right

  if (BtnLeftDown) then                   ' RB7 pressed = LEFT VOLUME DOWN command
    if (volume_left < 255) then
      Inc(volume_left)
    end if
  end if

  if (BtnLeftUp) then                     ' RB6 pressed = LEFT VOLUME UP command
    if (volume_left > 0) then
      Dec(volume_left)
    end if
  end if

  if (BtnRightDown) then                  ' RB5 pressed = RIGHT VOLUME DOWN command
    if (volume_right < 255) then
      Inc(volume_right)
    end if
  end if

  if (BtnRightUp) then                    ' RB4 pressed = RIGHT VOLUME UP command
    if (volume_right > 0) then
      Dec(volume_right)
    end if
  end if

  ' if volume values are changed, set volume to new values
  if  (volume_left <> old_volume_left) or (volume_right <> old_volume_right) then
    Set_Volume(volume_left,volume_right)
  end if

end sub

' Software Reset
sub procedure Soft_Reset(dim fill_zeros as byte)
  dim i as byte

  MP3_SCI_Write(MODE_ADDR,0x0204)         ' Write to MODE register
                                          '   set SM_RESET bit and SM_BITORD bit(bitorder is LSB first)
  Delay_us(2)                             ' Required, see MP3 codec datasheet -> Software Reset
  while (DREQ = 0) nop wend               ' wait until DREQ becomes 1, see MP3 codec datasheet, Serial Protocol for SCI

  if (fill_zeros > 0) then                ' feed 2048 zeros to the MP3 SDI bus:
    for i = 0 to 31                       ' clear 32byte buffer
      data_buffer_32 = 0
    next i

    for i = 0 to 2048/32 - 1              ' use 32byte buffer to clear MP3 buffer
      MP3_SDI_Write_32(@data_buffer_32)
    next i
  else
    MP3_SDI_Write(0)                      ' write zero once
  end if

end sub


' Initialize VS1011E
sub procedure MP3_init()
  Soft_Reset(0)                           ' SW Reset, do not feed zeros

  Set_Clock(25000,0)                      ' Set clock to 25MHz, do not use clock doubler

  volume_left  = 50                       ' Set volume to initial value
  volume_right = 50
  Set_Volume(volume_left,volume_right)
end sub

sub procedure Init()
  ADCON1 = ADCON1 or 0x0F                 ' Configure AN pins as digital
  'CMCON  = CMCON  or 7                    ' Disable comparators

  BtnLeftDown_Direction  = 1              ' set pin direction as input
  BtnLeftUp_Direction    = 1
  BtnRightDown_Direction = 1
  BtnRightUp_Direction   = 1
  portb3_Direction   = 1                   ' kendim yazdım
  BtnLeftDown  = 0                        ' set pin value to zero
  BtnLeftUp    = 0
  BtnRightDown = 0
  BtnRightUp   = 0
    portb.3=0                           ' kendim yazdım

  DCLK_Direction  = 0                     ' Set SW SPI pin directions to output
  SDATA_Direction = 0
  DCLK  = 0                               ' Clear SW SPI SCK
  SDATA = 0                               ' Clear SW SPI SDO

  MP3_CS_Direction  = 0                   ' Configure MP3_CS as output
  MP3_CS            = 1                   ' Deselect MP3_CS
  MP3_RST_Direction = 0                   ' Configure MP3_RST as output
  MP3_RST           = 1                   ' Set MP3_RST pin

  DREQ_Direction  = 1                     ' Configure DREQ as input
  BSYNC_Direction = 0                     ' Configure BSYNC as output
  BSYNC           = 0                     ' Clear BSYNC
end sub

' main
main:


  filename = "ELK4.mp3"
if (portb.3=1) then goto  elk3     ' kendim yazdım

  elk3:                                          ' kendim yazdım
  filename = "START.mp3"            ' kendim yazdım
  end if                                        ' kendim yazdım

  Init()

  ' Initialize USART for signaling
  UART1_Init(9600)
  Delay_100ms()

  UART1_Write_Line("Initializing SPI")
  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

  UART1_Write_Line("Initializing VS1011E decoder interface")
  MP3_init()

  UART1_Write_Line("Initializing MMC_FAT")
  if (Mmc_Fat_Init() = 0) then
    if (Mmc_Fat_Assign(filename, 0) <> 0) then
      UART1_Write_Line("File Assigned")
      Mmc_Fat_Reset(file_size)            ' Call Reset before file reading,
                                          '   procedure returns size of the file
      ' send file blocks to MP3 SDI
      while (file_size > BUFFER_SIZE)

        for i = 0 to BUFFER_SIZE - 1
          Mmc_Fat_Read(BufferLarge)
        next i

        for i = 0 to BUFFER_SIZE/32 - 1
          MP3_SDI_Write_32(@BufferLarge + i*32)
        next i

        file_size = file_size - BUFFER_SIZE

        Check_Volume()
      wend

      ' send the rest of the file to MP3 SDI
      for i = 0 to file_size - 1
        Mmc_Fat_Read(BufferLarge)
      next i

      for i = 0 to file_size - 1
        MP3_SDI_Write(BufferLarge)
      next i
    else
      UART1_Write_Line("File not assigned")
    end if
  else
    UART1_Write_Line("MMC FAT not initialized")
  end if

end.
"insanların hayırlısı ,onlara faydalı olandır."  (H.Ş.)

feyzi

RB2 butonuna basarak mp3 parçanın çalışmasını başardım.RB1 butonuna basarak diğer parçanın çalışması için uğraşıyorum.
"insanların hayırlısı ,onlara faydalı olandır."  (H.Ş.)

VFR

Ben de mp3 player yapmak istiyorum. Nereden temin ettiniz o kartı?

yildizelektronik

Alıntı yapılan: healme - 19 Mayıs 2011, 16:15:14
Ben de mp3 player yapmak istiyorum. Nereden temin ettiniz o kartı?

Bu siteden temin edebilirsin.Oldukça güvenilir bir sitedir.  ;)

http://www.elektrovadi.com/SmartMP3-BOARD,PR-76.html

feyzi

BETİ 'den aldık. Elektrovadi'de onların zaten.
"insanların hayırlısı ,onlara faydalı olandır."  (H.Ş.)

Maxim

çok pahalı değilmi ?
o paraya komple lcd ekranlı 4gb hafızalı mp3 playerlar var

VFR

Çok pahalıymış ama. Sadece vs1011 entegresini alsak ne kadardır acaba ve satan bir yer var mıdır?

feyzi

Alıntı yapılan: Maxim - 19 Mayıs 2011, 21:44:08
çok pahalı değilmi ?
o paraya komple lcd ekranlı 4gb hafızalı mp3 playerlar var
Dediğiniz mp3  pic ile kontrol edilebiliyor mu?Örnek yazılım var mı?
"insanların hayırlısı ,onlara faydalı olandır."  (H.Ş.)

Maxim

Alıntı yapılan: feyzi - 19 Mayıs 2011, 22:00:15
Alıntı yapılan: Maxim - 19 Mayıs 2011, 21:44:08
çok pahalı değilmi ?
o paraya komple lcd ekranlı 4gb hafızalı mp3 playerlar var
Dediğiniz mp3  pic ile kontrol edilebiliyor mu?Örnek yazılım var mı?

yok elbette ama buton ve switch leri dışarıdan pic ile kontrol eden arkadaşlar var