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.
SteveCode:' 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




Bookmarks