کد:
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
'
' 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
'-------------------------------------------------------------------------------
ConfigTimer1=Timer, Prescale = 64
Config Clock = Soft
EnableInterrupts
EnableTimer1
Enable Urxc 'abilita rs232
OnTimer1 Timer_1
On Urxc Rs_232 'salto per rs232
ConfigDate= Dmy , Separator =.
'-------------------------------------------------------------------------------
Avanti AliasPing.0
Led AliasPortg.1
Vs_miso AliasPinc.0
Vs_mosi AliasPortc.1
Vs_clock AliasPortc.2
Xcs AliasPortc.3
Xreset AliasPortc.4
Dreq AliasPinc.5
Bsync AliasPortc.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
'-------------------------------------------------------------------------------
DeclareSub Vs_init()
DeclareSub Soft_reset()
DeclareSub Vs_write(byval Vs_address AsByte,Byval Data1 AsByte,Byval Data2 AsByte)
DeclareFunction Vs_read(byval Vs_address AsByte)AsWord
DeclareSub Send_mp3(byval Filename AsString)
'-------------------------------------------------------------------------------
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 AsByte
Dim I AsInteger
Dim J AsLong
Dim Curbyte AsLong
Dim S AsString* 20
Dim Sample_rate AsWord
Dim Bit_rate AsWord
Dim Is_stereo AsWord
Dim Audata AsWord
Dim Filename AsString* 11
Dim Mmc_data(512)AsByte'512 byte
Dim Tempo_new AsWord
Dim Tempo_old AsWord
Dim Flag_read AsBit
Dim Flag_play AsBit
Dim Comando AsString* 10
Dim Mode_low AsByte
Dim Mode_hig AsByte
Dim Volume AsWord
Dim Volume_low AsByte
Dim Volume_hig AsByte
'-------------------------------------------------------------------------------
$Include"Config_MMC.bas"'include mmc
If Gbdriveerror <> 0 ThenEnd
$Include"Config_AVR-DOS.BAS"'include avr-dos
B =Initfilesystem(1)'init file system
If B <> 0 ThenPrint"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"ForOutputAs#9 'create file.list in MMC
S =Dir("*.mp3")
WhileLen(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"ForInputAs#9 'OPEN LA LISTA
WhileEof(#9)= 0
LineInput#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
EndIf
If Bsync = 0 And Flag_play = 1 And Flag_read = 0 Then
Tempo_new = Vs_read(vs_decode_time)
If Tempo_new <> Tempo_old ThenPrint Tempo_new ;" Sec"
Tempo_old = Tempo_new
EndIf
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
EndIf
If Comando ="2"Then
Mode_low.7 = 0
Bsync = 0
Vs_write Vs_mode ,&H0 , Mode_low 'loudness
EndIf
If Comando ="3"Then
Mode_low.1 = 0
Bsync = 0
Vs_write Vs_mode ,&H0 , Mode_low 'play normale
EndIf
If Comando ="4"Then
Mode_low.1 = 1
Bsync = 0
Vs_write Vs_mode ,&H0 , Mode_low 'play veloce
EndIf
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
EndIf
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
EndIf
Comando =""
Return
'-------------------------------------------------------------------------------
'------------------------------ MP3 SUBROUTINES --------------------------------
'-------------------------------------------------------------------------------
Function Vs_read(byval Vs_address AsByte)AsWord
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
EndFunction
'-------------------------------------------------------------------------------
'-------------------------------- WRITE ROUTINE --------------------------------
'-------------------------------------------------------------------------------
Sub Vs_write(byval Vs_address AsByte,Byval Data1 AsByte,Byval Data2 AsByte)
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
EndSub
'-------------------------------------------------------------------------------
'------------------------------- RESETTA E INIZILIZZA --------------------------
'-------------------------------------------------------------------------------
Sub Vs_init()
Xreset = 0
Waitms 5
Xreset = 1
Waitms 10
Do: Led = Dreq :LoopUntil Dreq = 1
Vs_write Vs_mode ,&H0 ,&H4 'reset
Do: Led = Dreq :LoopUntil Dreq = 1
Mode_low.7 = 1
Vs_write Vs_mode ,&H0 , Mode_low 'bass
Do: Led = Dreq :LoopUntil Dreq = 1
Vs_write Vs_clockf ,&H0 ,&H0 'clockf 24,xx MHz
Do: Led = Dreq :LoopUntil Dreq = 1
Vs_write Vs_volume ,&H0 ,&H0 'volume =0 massimo
EndSub
'-------------------------------------------------------------------------------
'--------------------------- SOFT RESET VS1001 ---------------------------------
'-------------------------------------------------------------------------------
Sub Soft_reset
Do: Led = Dreq :LoopUntil Dreq = 1 'wait Dreq
Vs_write Vs_mode ,&H0 ,&H4 'reset
EndSub
'-------------------------------------------------------------------------------
'---------------------------- SEND FILE MP3 ------------------------------------
'-------------------------------------------------------------------------------
Sub Send_mp3(byval Filename AsString)
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 ForBinaryAs#10 'apri il file mp3 e play song
Do: Led = Dreq :LoopUntil Dreq = 1 'wait Dreq
WhileEof(#10)= 0
Get#10 , Mmc_data(1),, 512 'preleva 512 byte
Do: Led = Dreq :LoopUntil 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 :LoopUntil Dreq = 1 'wait Dreq
Next I 'first 32
Curbyte = 1 'after 16 16x32=512 byte
If Avanti = 0 ThenGoto 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
EndSub