Hello Guys,
I spent a few days reading the forum, checking and double checking, and I hit a dead end...
I have two PICs 16F88, one master and one slave... I'm able to tell the slave to do something, but I'm not able to read a byte from the slave...
This is the master, pretty simple:
Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
' Master
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
@ device pic16f88, intrc_osc_noclkout ' system clock options
@ device pic16f88, wdt_on ' watchdog timer
@ device pic16f88, pwrt_on ' power-on timer
@ device pic16f88, mclr_off ' master clear options (internal)
@ device pic16f88, protect_off ' code protect off
'-------------------------------------------------------------------------------
DEFINE OSC 8
OSCCON = %01110001 '8mhz
'-------------------------------------------------------------------------------
CMCON = 7
ADCON1 = 0 ' Disable A/D converter
ADCON0 = 0
ANSEL = 0 ' all analog pins to digital
'-------------------------------------------------------------------------------
DEFINE I2C_HOLD 1
DEFINE I2C_SLOW 1
scl VAR PORTB.4 ' i2c clock input
sda VAR PORTB.1 ' i2c data input
valor VAR BYTE ' value to read
LED VAR PORTA.6
'-------------------------------------------------------------------------------
main:
valor = 0
' I2CWrite sda, scl, $01, [31]
' High LED
' Pause 100
' I2CWrite sda, scl, $01, [30]
' Low LED
' Pause 100
I2CRead sda, scl, $01, [valor]
IF (valor = 24) Then
High LED
Pause 500
Low LED
EndIF
GoTo main
'-------------------------------------------------------------------------------
End
'-------------------------------------------------------------------------------
And, this is the slave:
Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
' Slave
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
@ device pic16f88, intrc_osc_noclkout ' system clock options
@ device pic16f88, wdt_on ' watchdog timer
@ device pic16f88, pwrt_on ' power-on timer
@ device pic16f88, mclr_off ' master clear options (internal)
@ device pic16f88, protect_off ' code protect off
'-------------------------------------------------------------------------------
DEFINE OSC 8
OSCCON = %01110001 '8mhz
'-------------------------------------------------------------------------------
CMCON = 7
ADCON1 = 0 ' Disable A/D converter
ADCON0 = 0
ANSEL = 0 ' all analog pins to digital
'-------------------------------------------------------------------------------
DEFINE I2C_HOLD 1
DEFINE I2C_SLOW 1
'-------------------------------------------------------------------------------
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
'-------------------------------------------------------------------------------
I2Caddress CON 1 ' Make our address 1
'-------------------------------------------------------------------------------
SSPADD = I2Caddress ' Set our address
SSPCON = $36 ' Set to I2C slave with 7-bit address
'-------------------------------------------------------------------------------
LEDR VAR PORTA.3 ' LED 1
LEDL VAR PORTB.3 ' LED 2
BZR VAR PORTA.7 ' Buzzer
RL6 VAR PORTB.6 ' Relay 1
RL12 VAR PORTB.5 ' Relay 2
'-------------------------------------------------------------------------------
datain VAR BYTE ' Data in
dataout VAR BYTE ' Data out
'-------------------------------------------------------------------------------
GoTo boot
'-------------------------------------------------------------------------------
i2cslave: ' I2C slave subroutine
SSPIF = 0
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
GoTo i2cexit
'-------------------------------------------------------------------------------
i2cwr: ' I2C write data to us
datain = SSPBUF ' Put data into array
GoTo i2cexit
'-------------------------------------------------------------------------------
i2crd: ' I2C read data from us
SSPBUF = dataout ' Get data from array
CKP = 1 ' Release SCL line
GoTo i2cexit ' That's it
'-------------------------------------------------------------------------------
i2cexit:
SSPOV = 0
WCOL = 0
Return
'-------------------------------------------------------------------------------
boot:
Pause 500
High RL12
High RL6
'-------------------------------------------------------------------------------
main:
dataout = 24
IF SSPIF = 1 Then
GoSub i2cslave
Toggle LEDL
EndIF
IF datain = 121 Then ' on 12v
High RL12
EndIF
IF datain = 120 Then ' off 12v
Low RL12
EndIF
IF datain = 61 Then ' on 6v
High RL6
EndIF
IF datain = 60 Then ' off 6v
Low RL6
EndIF
IF datain = 31 Then ' on buzer
High BZR
EndIF
IF datain = 30 Then ' off buzzer
Low BZR
EndIF
GoTo main
'-------------------------------------------------------------------------------
End
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Could someone please through some light over here... I really don't know what else to check...
Thanks a lot!
Daniel.
Bookmarks