HOLA, utilic tu codigo en asm, le envio un dato con i2cwrite y si me responde no me manda a error pero el dato como ke no llega bien siguiente te adjunto el codigo:
define OSC 20 ' Utilizando un Cristal de 4MHz
DEFINE HSER_BAUD 9600 'PARA USAR HSERIN Y HSEROUT
' Variables para la interrupcion
wsave var byte $20 system ' Variable que guarda el registro W
ssave var byte bank0 system ' Variable que guarda el registro STATUS
psave var byte bank0 system ' Variable que guarda el registro PCLATH
'*********** Variables de los valores de entrada****************************
BREAK3 VAR BYTE $31 system
BREAK2 VAR BYTE $32 system
BREAK1 VAR BYTE $33 system
BATERY VAR BYTE $34 system
SM05 VAR BYTE $35 system
SM06 VAR BYTE $36 system
BREAK3=00
BREAK2=00
'***************************************************************
SCL VAR PORTC.3 ' I2C clock input
SDA VAR PORTC.4 ' I2C data input
Index var byte ' Variable para el direccionamiento indirecto
I2Caddress CON $07 ' Direccion del esclavo es 0x04
define INTHAND Int_Vector ' Handler de Interrupcion
goto Inicio
'********************* Vector de Interrupcion******************
asm
Int_Vector
movwf wsave ; Guardamos el registro W
movf STATUS,W
clrf STATUS ; Guardamos el registro STATUS
movwf ssave
movf PCLATH,W ; Guardamos el registro PCLATH
movwf psave
clrf PCLATH
;*****************Código de interrupción**********************
banksel PIR1
btfss PIR1,SSPIF ; Pregunta si hay interrupcion de I2C
goto End_Int ; No, entonces salir de la interrupcion
bcf PIR1,SSPIF ; Borramos el flag de interrupcion
I2C_Int
banksel SSPSTAT
btfsc SSPSTAT,R_W ; Preguntamos si es lectura o escritura
goto End_Int ; Si es Lectura salir de la interrupcion
btfss SSPSTAT,BF ; Revisamos si el Buffer tiene o no tiene dato
goto End_Int ; Si esta vacio entonces salir
btfss SSPSTAT,D_A ; Preguntamos si el ultimo dato recibido fue un dato
goto I2C_Dir ; Si es direccion entonces ir a I2CDir
banksel SSPBUF
incf _Index,F
movlw 0x30
addwf _Index,W
movwf FSR
banksel SSPBUF
movf SSPBUF,W ;<<<<<<<<-------- Cargamos el vamor del Buffer al registro
movwf INDF
goto End_Int
I2C_Dir
banksel SSPBUF
movf SSPBUF,W
xorlw _I2Caddress ; Comparamos el valor en el buffer con la Direccion del Slave
btfss STATUS,Z
goto End_Int
clrf _Index
End_Int
clrf STATUS
movf psave,W
movwf PCLATH ; Restauramos el registro PCLATH
movf ssave,W
movwf STATUS ; Restauramos el registro STATUS
swapf wsave,F
swapf wsave,W ; Restauramos el registro W
retfie
endasm
'************************Inicio del Programa*************************
Inicio:
TRISB=$00
TRISC=%00011000 ' RC.3 y RC.4 config como entradas
'******* Inicializamos el modo I2C slave*****************************
SSPADD = I2Caddress ' Cargamos la direccion(0x02) del Slave
SSPCON2 = 0 ' Reseteamos el registro de control del I2C
SSPCON = %00110110 ' Configuramos en modo Slave
PIE1 = %00001000 ' Habilitamos la interrupcion por I2C
PIR1=0 ' Limpiamos los flags de interrupcion
INTCON = %11000000 ' Configuramos las Interrupciones por I2C
if break2=1 then
high PORTB.0
ENDIF
if break2=0 then
low portb.0
ENDIF
goto Inicio
end
con el master le envio un byte
I2CWRITE DPIN,CPIN,$07,[ABREAK3],ERROR
tiene sus resistencias de pull up en el bus