PDA

View Full Version : ISD17240 on PIC16F88



drewcog
- 17th December 2008, 20:07
I'm trying to get the SPI transfer going using the SSPBUF on the PIC. I'm getting data back from the ISD, but every byte is %11111111. I'm unsure if I'm sending the commands incorrectly.

Any ideas? The code is below.

'************************************************* *****************
'* Name : UNTITLED.BAS *
'* Author : Drew Cogbill *
'* Notice : 2008 Creative Commons Licence- Share and share alike*
'* Date : 12/5/2008 *
'* Version : 1.0 *
'* Notes : ISD1700 on PIC16F88 *
'* : *
'************************************************* *****************

include "modedefs.bas"
OSCCON = %01100110 '4MHz INTERNAL OSCILLATOR
ANSEL = %00000000 'MAKE PortA PINS ALL DIGITAL
TRISB = %00000010 'sets pins as inputs and outputs [1=in 0=out] - 2nd is SDI
TRISA = %00000011

'for SPI
SSPSTAT = %10000000
SSPCON = %00100000 'bit 5 enables SSPEN

SERIAL var PortB.6 'for LCD screen debugging
SS var PortA.2
SCK VAR PortB.4
MOSI VAR PortB.2
LED VAR PortB.5
RECORD_BUTTON VAR PortA.0
PLAY_BUTTON var PortA.1

INBYTE var byte[5]
OUTBYTE VAR byte[5]
ITER var byte
CMD_ERR var BYTE
POWERED VAR BYTE
RDY VAR BYTE
REC_BUTTON_SENSOR var bit
PLAY_BUTTON_SENSOR VAR BIt
INT VAR BYTE

PU con 1
STOP_ con 2
CLR_INT con 4
RD_STATUS con 5
PLAY CON 64
REC con 65
MODE CON 4

powered = 0
RDY = %00000000
PLAY_BUTTON_SENsor = 0
rec_button_sensor = 0
inbyte[0] = %00000000
inbyte[1] = %00000000
inbyte[2] = %00000000

Setup:
High serial
pause 100
serout2 serial,396,[12] 'clear LCD screen 'mode 396= 2400 baud, Driven, True, No Parity
pause 10 'must pause at least 5ms after clearing LCD
serout2 serial,396,[17] 'turn on the LCD backlight
serout2 serial,396,["Signal: "] 'print "Signal:" only once for clear output
PAUSE 500
HIGH SS
HIGH SCK
LOW MOSI
gosub SEND_STARTUP
Goto main

MAIN:
gosub check_rdy

rec_button_sensor = record_button
play_button_sensor = play_button
if rec_button_sensor == 1 then
pause 10
rec_button_sensor = record_button
if rec_button_sensor == 1 then
serout2 serial,396,[12]
serout2 serial, 396, ["REC!"]
gosub SEND_REC
' cmd_err = inbyte[0] & %00000001 'bitwise operator to isolate 0 bit
' serout2 serial, 396, [bin8 inbyte[0], " "]
' while cmd_err == %00000001
' gosub send_rd_status
' GOSUB SEND_REC
' wend
pause 6000
gosub send_stop
' int = INBYTE[0] & %00010000
gosub send_clr_int
endif
endif

if play_button_sensor == 1 then
pause 10
play_button_sensor = play_button
if play_button_sensor == 1 then
serout2 serial,396,[12]
serout2 serial, 396, ["PLAY!"]
gosub SEND_PLAY
' cmd_err = inbyte[0] & %00000001 'bitwise operator to isolate 0 bit
' while cmd_err == %00000001
' GOSUB SEND_PLAY
' wend
pause 6000
gosub send_clr_int
' int = INBYTE[0] & %00010000
endif
endif

GOTO MAIN

SEND_STARTUP:
gosub SEND_PU
gosub send_rd_status
serout2 serial, 396, [BIN8 InByte[2]]
powered = inbyte[0] & %00000100
While powered <> %00000100
gosub SEND_PU
powered = inbyte[0] & %00000100
wend
GOSUB SEND_CLR_INT
serout2 serial, 396, [bin8 INBYTE[0]]
return

SPI_TRANSFER:
SSPBUF = outbyte[ITER]
WHILE SSPSTAT.0 == 0
IF SSPSTAT.0 == 1 then
inbyte[ITER] = SSPBUF
SSPSTAT.0 = 0
return
endif
wend

CHECK_RDY:
gosub SEND_RD_STATUS
RDY = inbyte[2] & %00000001 'bitwise operator to isolate 0 bit
while rdy <> %00000001
GOSUB SEND_CLR_INT
gosub SEND_RD_STATUS
serout2 serial, 396, [BIN8 InByte[2]]
RDY = inbyte[2] & %00000001 'bitwise operator to isolate 0 bit
wend
' serout2 serial, 396, [bin8 INBYTE[0]]
return

CHECK_CMD_ERR:
cmd_err = inbyte[0] & %00000001 'bitwise operator to isolate 0 bit
while cmd_err == %00000001
gosub send_clr_int
serout2 serial, 396, [BIN8 InByte[0], " ", BIN8 InByte[1]]
gosub SEND_PU
serout2 serial, 396, [BIN8 InByte[0], " ", BIN8 InByte[1]]
cmd_err = inbyte[0] & %00000001 'bitwise operator to isolate 0 bit
wend

SEND_PU:
high led
pause 150
low led
OUTBYTE[0] = 1
outbyte[1] = 0
low SS
for ITER = 0 to 1
gosub SPI_TRANSFER
next iter
high SS
return

SEND_CLR_INT:
OUTBYTE[0] = clr_int
outbyte[1] = 0
low ss
for ITER = 0 to 1
gosub SPI_TRANSFER
next iter
high ss
return

SEND_RD_STATUS:
OUTBYTE[0] = RD_STATUS
outbyte[1] = 0
OUTBYTE[2] = 0
low ss
for ITER = 0 to 2
gosub SPI_TRANSFER
next iter
high ss
return

SEND_PLAY:
low ss
outbyte[0] = play
outbyte[1] = 0
for ITER = 0 to 1
gosub SPI_TRANSFER
next
high ss
return

SEND_REC:
low ss
outbyte[0] = REC
outbyte[1] = 0
for ITER = 0 to 1
gosub SPI_TRANSFER
next
high ss
return

SEND_STOP:
low ss
outbyte[0] = STOP_
outbyte[1] = 0
for ITER = 0 to 1
gosub SPI_TRANSFER
next
high ss
return