This works so far to play back 4 sounds repeatedly. The volume setting via apc2 works also. Next I plan to get rid of the PAUSE delays and monitor status to determine when each sound finished playing.
Code:
'DEMO PLAYER FOR ISD1700
'Code Version: 01
'Words Used = 354
'Revision Date: 8 Feb 2009
'PicBasic Pro Compiler version 2.50b
'Processor=PIC16F684 (WDT=ON, MCLR=INPUT, OSC=INTOSC)
'Modified from code posted by Jerson and Brenon
'Memory Reference:
'ISD17XX First Address = 0x010
'ISD1730 Max Address = 0x0FF
'ISD1760 Max Address = 0x1EF
'ISD1790 Max Address = 0x2DF
DEFINE OSC 8
'*************************************************************
'*************************************************************
'******************** DEFINE VARIABLES ***********************
'*************************************************************
'*************************************************************
temp_bit VAR BIT
temp VAR BYTE
spi_cnt var byte ' counter for SPI transfer
bSPI var byte ' the byte being transferred on SPI
s_addr VAR WORD ' Start Address
e_addr VAR WORD ' End Address
ISD_Data var byte[7] ' This array contains data to/from ISD
SR0a var ISD_Data[0]
SR0b var ISD_Data[1]
SR1 var ISD_Data[2] ' only valid after ReadStatus
isCmdErr var SR0a.0 ' 1=previous command failed/ignored
isFull var SR0a.1 ' 1=memory full
isPU var SR0a.2 ' 1=ISD powered up
isEOM VAR SR0a.3 ' 1=EOM detected (clear by CLR_INT command)
isINT var SR0a.4 ' 1=current operation completed (clear by CLR_INT command)
isReady var SR1.0 ' 1=Ready to receive SPI command (only valid after ReadStatus)
' Some SPI commands can still be sent when isReady=0
'*************************************************************
'*************************************************************
'******************** PIN ASSIGNMENTS ************************
'*************************************************************
'*************************************************************
Symbol sensor = PORTA.0 '
Symbol miso = PORTA.3 'ISD1760 SPI MISO
Symbol led1 = PORTC.1 '
Symbol led2 = PORTC.2 '
Symbol ss = PORTC.3 'ISD1760 SLAVE SELECT
Symbol sclk = PORTC.4 'ISD1760 SPI CLOCK
Symbol mosi = PORTC.5 'ISD1760 SPI MOSI
'*************************************************************
'*************************************************************
'******************** INITIALIZATION *************************
'*************************************************************
'*************************************************************
initialize:
CLEAR
OSCCON = %01111000
CMCON0 = 7 'turn off comparators
ANSEL = 0
PR2 = 35 'PWM Period (40K=49, 56K=35) (35 to 55)
CCPR1L = 15 'PWM Duty Cycle (1 to 15)
T2CON = 4 'Timer2 = ON; Prescale = 1:1
CCP1CON = 0 'PWM module off
OPTION_REG = %11111111 'Turn off PortA weak pull-ups
TRISA = %111111 'set PortA directions
WPUA = %000000 'enable weak pull-ups PortA
IOCA = %000000 'disable PORTA.0 Int On Change
TRISC = %000000 'set PortC directions
PORTA = %000000
PORTC = %000000 '
HIGH ss 'start with Slave Select HIGH
HIGH sclk 'start with SPI Clock HIGH
LOW MOSI 'start with MOSI LOW
INPUT sensor
LOW led1
LOW led2
start: 'Initialize the ISD
GoSub isd_pu
PAUSE 50 '50 mS Power Up Delay (per datasheet)
GoSub isd_wr_apc 'set volume and config bits
PAUSE 10
GoSub isd_clr_int 'clear interrupt and EOM
'*************************************************************
'*************************************************************
'********************* MAIN PROGRAM **************************
'*************************************************************
'*************************************************************
main_loop: '(MAIN PROGRAM LOOP)
PAUSE 2000
s_addr = $010
e_addr = $02b
GOSUB isd_set_play
PAUSE 2500
GOSUB isd_stop
PAUSE 2000
s_addr = $02c
e_addr = $048
GOSUB isd_set_play
PAUSE 2500
GOSUB isd_stop
PAUSE 2000
s_addr = $049
e_addr = $07c
GOSUB isd_set_play
PAUSE 4800
GOSUB isd_stop
PAUSE 2000
s_addr = $07d
e_addr = $093
GOSUB isd_set_play
PAUSE 2000
GOSUB isd_stop
GoTo main_loop
'*************************************************************
'*************************************************************
'********************** SUBROUTINES **************************
'*************************************************************
'*************************************************************
isd_pu:
LOW ss
bSPI=$01 'Power Up Command
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_wait_ready:
GOSUB isd_rd_status
IF isReady = 0 THEN isd_wait_ready
RETURN
'--------------------------------------------------------------------------
isd_set_play:
LOW ss
bSPI = $80 'Set Play Command (7 bytes)
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI = $00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI = s_addr.LowByte ' Start Address low byte.
GoSub isd_spi
ISD_Data[2] = bSPI 'SR0a
bSPI = s_addr.HighByte ' Start Address high byte
GoSub isd_spi
ISD_Data[3] = bSPI 'SR0b
bSPI = e_addr.LowByte ' End Address low byte
GoSub isd_spi
ISD_Data[4] = bSPI 'SR0a
bSPI = e_addr.HighByte ' End Address high byte
GoSub isd_spi
ISD_Data[5] = bSPI 'SR0b
bSPI = $00 ' Reserved Address - set to "0"
GoSub isd_spi
ISD_Data[6] = bSPI 'SR0a
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_wr_apc: 'Write to APC Register using bits D2:D0 to set Volume
LOW ss
bSPI = $65 'Write APC2
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI = %01000011 'Volume set by D2:D0 (000=Max)
'Output set by D7 (0=Aud, 1=Aux)
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI = %00000100 'PWM Speaker Output D8 (0=Enable, 1=Disable)
GoSub isd_spi
ISD_Data[2] = bSPI 'SR0a
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_spi: ' shift SPI data out and into SPI byte
FOR spi_cnt = 0 to 7 '
MOSI = bSPI.0 ' shift LSB of byte onto MOSI line
LOW SCLK ' clock MISO data out to uC (Falling Edge)
temp_bit = miso '
HIGH SCLK ' clock MOSI into ISD1700 (Rising Edge)
bSPI = bSPI >> 1 ' shift SPI byte Right
bSPI.7 = temp_bit
NEXT spi_cnt
RETURN
'--------------------------------------------------------------------------
isd_clr_int: ' CLEAR INTERRUPT AND EOM BITS
LOW SS
bSPI=$04 'Clear Interrupt Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH SS
RETURN
'--------------------------------------------------------------------------
isd_stop: ' Stop Immediately
LOW ss
bSPI=$02 'Stop Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_pd: ' Stop Immediately
LOW ss
bSPI=$07 'Power Down Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_rd_status: 'read status of ISD1700
LOW ss
bSPI=$05 'Read Status Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI=$00
gosub isd_spi
ISD_Data[2] = bSPI 'SR1
HIGH ss
RETURN
'*************************************************************
'*************************************************************
End
Bookmarks