Advertisement  

Thursday, 28 March 2024
     
 
Main Menu
Home Home
Shop Shop
News News
BASCOM-AVR BASCOM-AVR
BASCOM-8051 BASCOM-8051
Products Products
Application Notes Application Notes
Publications Publications
Links Links
Support Center Support Center
Downloads Downloads
Forum Forum
Resellers Resellers
Contact Us Contact Us
Updates Updates
MCS Wiki MCS Wiki
Online Help
BASCOM-AVR Help BASCOM-AVR Help
BASCOM-8051 Help BASCOM-8051 Help
Contents in Cart
Show Cart
Your Cart is currently empty.
Search the Shop

Products Search

User Login
Username

Password

If you have problem after log in with disappeared login data, please press F5 in your browser

RSS News
 
     
 

 
   
     
 
AN #153 - MP3 Player Print
MP3PLAYER with BASCOM-AVR by G. De Luca







Source code:

'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
'
' MP_3_PLAYER with VS1001k FOR MP3.FILES FORMAT Name 8.3 FAT16 AVR-DOS 5.5
' data 14-06-2007 versione BASCOM 1.8.11.3 AVR-DOS 5.5
' written by GIOVANNI DE LUCA
' HTTP://delucagiovanni.interfree.it robot applications and others
' HTTP://WWW.LNS.INFN.IT nuclear phisics applications
' HTTP://www.youtube.com/tubincolo my video mobile-robots
' deluca@lns.infn.it my e-mail
' to control it's used serial port com1 and pul "UP" to change songs
' to make test I used 64Mb MMC with 20 songs in the MMC
' but I thing that it's possible read bigger MMC memory without problem
'
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////

$prog &HFF , &H4F , &HC5 , &HFF 'FUSE BITS generated
$regfile = "M128def.dat" 'IT'S POSSIBLE USE DIFFERENT AVR-CHIPS
$crystal = 14745600 'BUT this NOT TESTED
$baud = 115200
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 64
Config Clock = Soft
Enable Interrupts
Enable Timer1
Enable Urxc 'abilita rs232
On Timer1 Timer_1
On Urxc Rs_232 'salto per rs232
Config Date = Dmy , Separator = .
'-------------------------------------------------------------------------------
 Avanti
Alias Ping.0
 Led
Alias Portg.1
 Vs_miso
Alias Pinc.0
 Vs_mosi
Alias Portc.1
Vs_clock
Alias Portc.2
 Xcs
Alias Portc.3
 Xreset
Alias Portc.4
 Dreq
Alias Pinc.5
 Bsync
Alias Portc.6
'-------------------------------------------------------------------------------
Config Avanti = Input 'pulsante avanti
Config Led = Output 'led
Config Vs_miso = Input 'serial input vs-1001
Config Vs_mosi = Output  'serial out vs-1001
Config Vs_clock = Output 'serial clock vs-1001
Config Xcs = Output 'VS Chip Select
Config Xreset = Output 'VS Reset
Config Dreq = Input 'VS Data Request
Config Bsync = Output 'VS Stream Request
'-------------------------------------------------------------------------------
Declare Sub Vs_init()
Declare Sub Soft_reset()
Declare Sub Vs_write(byval Vs_address As Byte , Byval Data1 As Byte , Byval Data2 As Byte)
Declare Function Vs_read(byval Vs_address As Byte) As Word
Declare Sub Send_mp3(byval Filename As String)
'-------------------------------------------------------------------------------
Const Vs_rd = &B0000_0011 'Write command vs1001
Const Vs_wr = &B0000_0010 'Read command vs1001
Const Vs_mode = 0
Const Vs_status = 1
Const Vs_clockf = 3
Const Vs_decode_time = 4
Const Vs_audata = 5
Const Vs_volume = 11
'-------------------------------------------------------------------------------
Dim B As Byte
Dim I As Integer
Dim J As Long
Dim Curbyte As Long
Dim S As String * 20
Dim Sample_rate As Word
Dim Bit_rate As Word
Dim Is_stereo As Word
Dim Audata As Word
Dim Filename As String * 11
Dim Mmc_data(512) As Byte '512 byte
Dim Tempo_new As Word
Dim Tempo_old As Word
Dim Flag_read As Bit
Dim Flag_play As Bit
Dim Comando As String * 10
Dim Mode_low As Byte
Dim Mode_hig As Byte
Dim Volume As Word
Dim Volume_low As Byte
Dim Volume_hig As Byte
'-------------------------------------------------------------------------------
$Include "Config_MMC.bas" 'include mmc

If Gbdriveerror <> 0 Then End
$Include "Config_AVR-DOS.BAS" 'include avr-dos

B
= Initfilesystem(1) 'init file system
If B <> 0 Then Print "Errore MMC" 'se errore
'-------------------------------------------------------------------------------
Bsync
= 0
Xreset
= 0
Xcs
= 1
Portg.0 = 1  'res pull up
Flag_play
= 0 'sta suonando ?
Flag_read
= 1 'gia letto ?
'-------------------------------------------------------------------------------
'-------------------------- PROGRAM START -------------------------------------
'-------------------------------------------------------------------------------
Print "Dir *.mp3" 'dir mp3
Print
'-------------------------------------------------------------------------------
'---------------------- crea una lista dei brani mp3 presenti sulla MMC --------
'-------------------------------------------------------------------------------
Open "Lista.txt" For Output As #9 'create file.list in MMC
S
= Dir( "*.mp3")
While Len(s) > 0
 
Print S ; " " ; Filedate() ; " " ; Filetime() ; " " ; Filelen()
 
Print #9 , S 'memorizza la lista
 S
= Dir()
Wend
Close #9
'-------------------------------------------------------------------------------
Print "VS1001 Init"
Vs_init 
'reset hardware e inizializza
'-------------------------------------------------------------------------------
'--------------------------- MAIN PROGRAMM -------------------------------------
'-------------------------------------------------------------------------------
Do

 Open "Lista.txt" For Input As #9 'OPEN LA LISTA
 While Eof(#9) = 0
 Line Input #9 , S 'READ filename Mp3
 Call Send_mp3(s) 'play mp3
 Wend
 Close #9

 Loop
End
'-------------------------------------------------------------------------------
'---------------------------- TIMER 1 ------------------------------------------
'-------------------------------------------------------------------------------
Timer_1
:
  
If Bsync = 0 And Flag_play = 1 And Flag_read = 1 Then 'per leggere inforamzioni

 Flag_read = 0
 Audata = Vs_read(vs_audata)
 Sample_rate = Audata And &H1E00
 Rotate Sample_rate , Right , 9
 Bit_rate = Audata And &H1FF
  Is_stereo = Audata And &H8000
 Rotate Is_stereo , Right , 15
 Print Sample_rate ; "," ; Bit_rate ; " Kbs," ; Is_stereo 'print informations

 End If

 
If Bsync = 0 And Flag_play = 1 And Flag_read = 0 Then
 Tempo_new
= Vs_read(vs_decode_time)


 
If Tempo_new <> Tempo_old Then Print Tempo_new ; " Sec"

 Tempo_old = Tempo_new

 End If


Return
'-------------------------------------------------------------------------------
'---------------------- RS 232 -------------------------------------------------
'-------------------------------------------------------------------------------
Rs_232
:
 Comando
= Inkey()
 
If Comando = "1" Then

 Mode_low.7 = 1
 Bsync = 0
 Vs_write Vs_mode , &H0 , Mode_low 'no loudness

 End If
 
If Comando = "2" Then

 Mode_low.7 = 0
 Bsync = 0
 Vs_write Vs_mode , &H0 , Mode_low 'loudness

 End If
 
If Comando = "3" Then

 Mode_low.1 = 0
 Bsync = 0
 Vs_write Vs_mode , &H0 , Mode_low 'play normale

 End If
 
If Comando = "4" Then

 Mode_low.1 = 1
 Bsync = 0
 Vs_write Vs_mode , &H0 , Mode_low 'play veloce

 End If
 
If Comando = "5" And Volume_low < 250 Then

 Volume_hig = Volume_hig + 5
 Volume_low = Volume_low + 5
 Bsync = 0
 Vs_write Vs_volume , Volume_hig , Volume_low 'volume down

 End If
 
If Comando = "6" And Volume_low > 0 Then

 Volume_hig = Volume_hig - 5
 Volume_low = Volume_low - 5
 Bsync = 0
 Vs_write Vs_volume , Volume_hig , Volume_low 'volume up

 End If
 Comando
= ""
Return
'-------------------------------------------------------------------------------
'------------------------------ MP3 SUBROUTINES --------------------------------
'-------------------------------------------------------------------------------
Function Vs_read(byval Vs_address As Byte) As Word

 Xcs = 0 'Xcs low
 B = Vs_rd
 Shiftout Vs_mosi , Vs_clock , B , 1
 Shiftout Vs_mosi , Vs_clock , Vs_address , 1
 B = 0
 Shiftin Vs_miso , Vs_clock , B , 1
 Vs_read = B
 Shift Vs_read , Left , 8
 B = 0
 Shiftin Vs_miso , Vs_clock , B , 1
 Vs_read = Vs_read + B
 Xcs = 1 'Xcs high

 End Function
'-------------------------------------------------------------------------------
'-------------------------------- WRITE ROUTINE --------------------------------
'-------------------------------------------------------------------------------
Sub Vs_write(byval Vs_address As Byte , Byval Data1 As Byte , Byval Data2 As Byte)

 Xcs = 0
 B = Vs_wr
 Shiftout Vs_mosi , Vs_clock , B , 1
 Shiftout Vs_mosi , Vs_clock , Vs_address , 1
 Shiftout Vs_mosi , Vs_clock , Data1 , 1
 Shiftout Vs_mosi , Vs_clock , Data2 , 1
 Xcs = 1

 End Sub
'-------------------------------------------------------------------------------
'------------------------------- RESETTA E INIZILIZZA --------------------------
'-------------------------------------------------------------------------------
Sub Vs_init()

 Xreset = 0
 Waitms 5
 Xreset = 1
 Waitms 10


 Do : Led = Dreq : Loop Until Dreq = 1
 Vs_write Vs_mode , &H0 , &H4 'reset
 
 Do : Led = Dreq : Loop Until Dreq = 1
 Mode_low.7 = 1
 Vs_write Vs_mode , &H0 , Mode_low 'bass
 
 Do : Led = Dreq : Loop Until Dreq = 1
 Vs_write Vs_clockf , &H0 , &H0 'clockf 24,xx MHz
 
 Do : Led = Dreq : Loop Until Dreq = 1
 Vs_write Vs_volume , &H0 , &H0 'volume =0 massimo

 
End Sub
'-------------------------------------------------------------------------------
'--------------------------- SOFT RESET VS1001 ---------------------------------
'-------------------------------------------------------------------------------
Sub Soft_reset

 Do : Led = Dreq : Loop Until Dreq = 1 'wait Dreq
 Vs_write Vs_mode , &H0 , &H4 'reset

 End Sub
'-------------------------------------------------------------------------------
'---------------------------- SEND FILE MP3 ------------------------------------
'-------------------------------------------------------------------------------
Sub Send_mp3(byval Filename As String)

 Print "Play : " ; Filename
 Soft_reset 'resetta vs1001
 Flag_read = 1 'per leggere una volta sample rate etc
 Flag_play = 0 'inizia a leggere dopo che č stato letto il primo pacchetto
 
 Open Filename For Binary As #10 'apri il file mp3 e play song
 
 Do : Led = Dreq : Loop Until Dreq = 1 'wait Dreq
 
 While Eof(#10) = 0
 Get #10 , Mmc_data(1) , , 512 'preleva 512 byte
 Do : Led = Dreq : Loop Until Dreq = 1 'wait Dreq
 
 For I = 1 To 16
 For J = 1 To 32
 
 Bsync = 1
 Shiftout Vs_mosi , Vs_clock , Mmc_data(curbyte) , 1
 Bsync = 0
 Incr Curbyte
 Next J
 Do : Led = Dreq : Loop Until Dreq = 1 'wait Dreq
 Next I 'first 32
 Curbyte = 1 'after 16 16x32=512 byte
 If Avanti = 0 Then Goto Esci 'pulsante up
 Flag_play = 1 'playing primo pacchetto

 Wend

Esci
:
 Flag_play
= 0 'stop play
 
Close #10
 
For I = 1 To 2048 'send 2048 zeros to clear buffer

 B = 0
 Shiftout Vs_mosi , Vs_clock , B , 1 'send 2048 byte

 Next I
 
Print "MP3 End" 'end song

 
Waitms 100 'aspetta 100
End Sub
'-------------------------------------------------------------------------------