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]