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