ISD1730 + PIC16F88 + SPI

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

ISD1730 + PIC16F88 + SPI

Mensagempor luiz barreto » 26 Jan 2009 10:02

BOM DIA AMIGOS JÁ COMECEI UM TOPICO SOBRE O ASSUNTO, MAS OBTIVE NENHUMA RESPOSTA.

ENCONTREI UM CODIGO NA NET, O TESTEI, MAS ACHO QUE HÁ ALGUM PROBLEMA NA TRANSMISSÃO SPI.

PELA LOGICA DO PROGRAMA NÃO HÁ NENHUM PROBLEMA, NÃO SE É O CRISTAL DO PIC QUE PRECISA SER DE 20MHZ OU SE É O MODO DE TRANSMISSÃO QUE ESTÁ ERRADO.

SEGUE ABAIXO O CODIGO.


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
'CMCON = 7
'for SPI
SSPSTAT = %10000000
SSPCON = %00100000 'bit 5 enables SSPEN


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 $01
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:
PAUSE 500
HIGH SS
gosub SEND_STARTUP
Goto main

MAIN:


gosub check_rdy
rec_button_sensor = record_button
play_button_sensor = play_button

'****************************************************************
'* OPERAÇÃO PARA GRAVAÇÃO *
'****************************************************************

if rec_button_sensor == 1 then
pause 10
rec_button_sensor = record_button

if rec_button_sensor == 1 then
gosub SEND_REC
pause 6000
gosub send_stop
gosub send_clr_int
endif
endif

'****************************************************************
'* OPERAÇÃO PARA REPRODUZIR *
'****************************************************************

if play_button_sensor == 1 then
pause 10
play_button_sensor = play_button
if play_button_sensor == 1 then
gosub SEND_PLAY
pause 6000
gosub send_clr_int
endif
endif

GOTO MAIN

SEND_STARTUP:

gosub SEND_PU
powered = inbyte[0] & %00000100
While powered <> %00000100
gosub SEND_PU
powered = inbyte[0] & %00000100
wend
GOSUB SEND_CLR_INT
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
RDY = inbyte[2] & %00000001 'bitwise operator to isolate 0 bit
wend
return

CHECK_CMD_ERR:

cmd_err = inbyte[0] & %00000001 'bitwise operator to isolate 0 bit
while cmd_err == %00000001
gosub send_clr_int
gosub SEND_PU
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

END [/img]
luiz barreto
 
Mensagens: 2
Registrado em: 30 Nov 2006 21:33
Localização: cotia

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x