A long time ago Bruce helped me with I2C comms between chips. I was having problems because it was so easy. As an example here is the slave code. I built a board with an address selector switch connected to port C so that I could place them on a Bus without having to reprogram them. The Slaves are monitoring inputs from Volt Free Contacts conected to Port B.
Code:
' PicBasic Pro I2C slave program - PIC16F72/PIC-X1
' bootloader and OSC settings
'DEFINE LOADER_USED 1 ' bootloader
DEFINE osc 20
INCLUDE "modedefs.bas"
' Alias pins
scl VAR PORTC.3 ' I2C clock input
sda VAR PORTC.4 ' I2C data input
' Define used register flags
SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag
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
' Allocate RAM
result VAR BYTE ' ADC result
datain VAR BYTE ' Data in
readcnt VAR BYTE ' I2C read count
I2Caddress VAR BYTE ' Our address
' Initialize ports and directions
TRISA = %11111111
TRISB = %11111111
TRISC = %11111111
' Initialize I2C slave mode reading inputs from hardware address settings
I2Caddress=0
IF PORTC.0=0 Then I2Caddress=I2Caddress+1
IF PORTC.1=0 Then I2Caddress=I2Caddress+2
IF PORTC.2=0 Then I2Caddress=I2Caddress+4
IF PORTC.5=0 Then I2Caddress=I2Caddress+8
SSPADD = I2Caddress ' Set our address
SSPCON = $36 ' Set to I2C slave with 7-bit address
While 1>0
While NOT SSPIF
Wend ' Check for I2C interrupt flag
SSPIF = 0 ' Clear interrupt flag
IF D_A = 0 Then
readcnt = 0 ' Mark as first read
EndIF
SSPBUF = PORTB ' Get data from array
CKP = 1 ' Release SCL line
readcnt = readcnt + 1 ' Move along read count
Wend
Steve
Bookmarks