PDA

View Full Version : pcf8566 emulator with 16f887



frankko
- 17th January 2015, 10:58
hi, I'm trying to interpret the output data "i2c" direct to a pcf8566, realizing a slave with 16f887 and using the command debug ver view these on the serial communicator, I used the routine slave published in http: //www.picbasic .co.uk / forum / showthread.php? t = 10141 & p = 70366, but other than the address of the device $ 7c other data do not seem to be reliable. Is there someone I can 'help? thank you.
this is the program.


'************************************************* ***************
'* Name : I2C_Slave *
'* Author : *
'* Notice : *
'* : All Rights Reserved *
'* Date : 03/01/2008 *
'* Version : 1.0 *
'* Notes : I2C Slave with Pic16F876 *
'* : *
'************************************************* ***************

'-- set device & tris port config here (don't use SCL & SDA pins other than I2C) ----
INCLUDE "modedefs.bas"
'@ Device PIC16F887
'----------------------------------------------------------------
'USARE PER MPASM'
@ __config _CONFIG1, _MCLRE_OFF & _LVP_OFF & _CP_OFF & _FCMEN_OFF & _CPD_OFF & _PWRTE_ON & _BOR_OFF & _HS_OSC & _WDT_ON '&_INTRC_OSC_NOCLKOUT & _WDT_OFF
@ __config _CONFIG2, _WRT_OFF & _BOR21V & _BOR40V
'------------------------------------------------------------------

Define OSC 20

'-------------------Definizioni COMUN. SERIALE------------------
DEFINE DEBUG_BAUD 9600 ' Set Debug baud rate (2400)
DEFINE DEBUG_MODE 1 ' Set Debug mode: 0 = true PER MAX232,
' 1 = inverted PER R=1K DIRETT. RS232
'DEFINE DEBUG_PACING 1 ' 1 ms di pausa se osc>4 mhz da provare
DEFINE DEBUG_REG PORTC ' Set Debug port
DEFINE DEBUG_BIT 7 ' Set Debug pin bit 6




DEFINE I2C_SLOW 1
DEFINE I2C_HOLD 1

'---------------- Alias pins -----------------------------------

SCLDIR var TRISC.3
SDADIR var TRISC.4

TRISC.3=1
TRISC.4=1
'--------------- Define used register flags -------------------

SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag
SSPIE VAR PIE1.3
BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
R_W VAR SSPSTAT.2 ' SSP (I2C) Read/Write
D_A VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKP VAR SSPCON.4 ' SSP (I2C) SCK Release Control
SSPEN VAR SSPCON.5 ' SSP (I2C) Enable
SSPOV VAR SSPCON.6 ' SSP (I2C) Receive Overflow Indicator
WCOL VAR SSPCON.7 ' SSP (I2C) Write Collision Detect

STAT_BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
STAT_RW VAR SSPSTAT.2 ' SSP (I2C) Read/Write
STAT_DA VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKE VAR SSPSTAT.6 ' SSP (I2C) Data/Address


'------------------- Rx Buffer defintion --------------------
RxBufferLEN con 96
RxBuffer var byte[Rxbufferlen]
RxBufferIndex var byte

'------------------ Tx Buffer defintion ----------------------
TxBufferLEN con 96
TxBuffer var byte[txbufferlen]
TxBufferIndex var byte


'------------------ Define constants ------------------------
I2Caddress CON %01111100 'indirizzo del pcf8566 hex 7c ' Make address = 2




' --------- Define here your variables and alias ------------------
readcnt VAR BYTE
datain VAR BYTE
WrData VAR BYTE
T VAR BYTE

' -------------- Initialize I2C slave mode ------------------------

SCLDIR = 1 ' SCL must be an input before enabling interrupts
SDADIR = 1
SSPADD = I2Caddress ' Set our address
SSPCON2.7 = 0 ' General call address disabled
SSPCON = $36 ' Set to I2C slave with 7-bit address
SSPSTAT = 0
SSPIE = 1
SSPIF = 0
RxBufferIndex = 0
TxBufferIndex = 0

'----------------- Initialization Done! -----------------------------



GoTo main


'------------------------- I2C subroutine --------------------------------

i2cslave: ' I2C slave subroutine
SSPIF = 0 ' Clear interrupt flag
IF R_W = 1 Then i2crd ' Read data from us
IF BF = 0 Then i2cexit ' Nothing in buffer so exit
'IF D_A = 1 Then i2cwr ' Data for us (not address)
IF SSPBUF != I2Caddress Then i2cexit ' Clear the address from the buffer
readcnt = 0 ' Mark as first read
GoTo i2cexit

i2cwr: ' I2C write data to us
datain = SSPBUF ' Put buffer data into array
Rxbuffer[Rxbufferindex]=datain
rxbufferindex =rxbufferindex+1

if rxbufferindex=RxBufferLEN then ' end of buffer transfer
WrData=1
rxbufferindex=0
endif

GoTo i2cexit

i2crd: ' I2C read data from us
IF D_A = 0 Then
TxBufferIndex = 0
EndIF

while STAT_BF : wend ' loop while buffer is full
wcol = 0 ' clear collision flag
SSPBUF = TxBuffer[TxBufferIndex]
while wcol
wcol = 0
SSPBUF = TxBuffer[TxBufferIndex]
wend
CKP = 1 ' release clock, allowing read by master
TxBufferIndex = TxBufferIndex + 1 ' increment index
if TxBufferIndex = TxBufferlen then ' all bytes have been tx
TxBufferIndex = 0 ' reset index
endif

i2cexit:
Return

' -------------------------end I2C subroutine --------------------------------

Main:


IF SSPIF = 1 Then
GoSub i2cslave
EndIF

SSPOV = 0
WCOL = 0

Select case RXBuffer[0]
'--------------------- Place here your case select code

end select



'IF rxbuffer THEN
DEBUG "PROVA0: ",# rxBuffer[0]," ",# rXBuffer[1]," ",# rXBuffer[2]," ",# rXBuffer[3]," ",# rXBuffer[4]," ",# rXBuffer[5]," ",# rXBuffer[6]," ",# rXBuffer[7]," ",# rXBuffer[8]," ",# rXBuffer[9]," ",# rXBuffer[10]," ",# rXBuffer[11]," ",# rXBuffer[12]," ",# rXBuffer[13]," ",# rXBuffer[14]," ",# RXBuffer[15]," ",# rXBuffer[16]," ",# rXBuffer[17]," ",# rXBuffer[18]," ",# rXBuffer[19]," ",# rXBuffer[20]," ",# rXBuffer[21]," ",# rXBuffer[22]," ",# rXBuffer[23]," ",# rXBuffer[24]," ",# RXBuffer[25]," ",# RXBuffer[26]," ",# RXBuffer[27]," ",# RXBuffer[28]," ",# RXBuffer[29]," ",# RXBuffer[30]," ",# RXBuffer[31]," ",# RXBuffer[32]," ",# RXBuffer[33]," ",# RXBuffer[34]," ",# RXBuffer[35]," ",# RXBuffer[36]," ",# RXBuffer[37]," ",# RXBuffer[38]," ",# RXBuffer[39]," ",# RXBuffer[40]," ",# RXBuffer[41]," ",# RXBuffer[42]," ",# RXBuffer[43]," ",# RXBuffer[44]," ",# RXBuffer[45]," ",# RXBuffer[46]," ",# RXBuffer[47]," ",# RXBuffer[48]," ",# RXBuffer[49]," ",# RXBuffer[50]," ",# RXBuffer[51]_
," ",# RXBuffer[52]," ",# RXBuffer[53]," ",# RXBuffer[54]," ",# RXBuffer[55]," ",# RXBuffer[56]," ",# RXBuffer[57]," ",# RXBuffer[58]," ",# RXBuffer[59]," ",# RXBuffer[60]," ",# RXBuffer[61]," ",# RXBuffer[62]," ",# RXBuffer[63]," ",# RXBuffer[64]," ",# RXBuffer[65]," ",# RXBuffer[66]," ",# RXBuffer[67]," ",# RXBuffer[68]," ",# RXBuffer[69]," ",# RXBuffer[70]," ",# RXBuffer[71]," ",# RXBuffer[72]," ",# RXBuffer[73]," ",# RXBuffer[74]," ",# RXBuffer[75]," ",# RXBuffer[76]," ",# RXBuffer[77]," ",# RXBuffer[78]," ",# RXBuffer[79]," ",# RXBuffer[80]," ",# RXBuffer[81]," ",# RXBuffer[82]," ",# RXBuffer[83]," ",# RXBuffer[84]," ",# RXBuffer[85]," ",# RXBuffer[86]," ",# RXBuffer[87]," ",# RXBuffer[88]," ",# RXBuffer[89]," ",# RXBuffer[90]," ",# RXBuffer[91]," ",# RXBuffer[92]," ",# RXBuffer[93]," ",# RXBuffer[94]," ",# RXBuffer[95]," ",# RXBuffer[96]," ",# RXBuffer[97],10,13
'endif

'IF DATAIN=228 THEN
'DEBUG "SLAVE4 PCF8566: ",hex RXBuffer[0],10,13
'DEBUG "SLAVE PCF8566: ",hex RXBuffer[0]," ",DEC RXBuffer[1]," ",DEC RXBuffer[2]," ",DEC RXBuffer[3]," ",DEC RXBuffer[4]," ",DEC RXBuffer[5]," ",DEC RXBuffer[6],10,13'
'ENDIF

WrData=0

GoTo Main



' ----------------- This space for your program code

End