Hola a todos, estoy intentanco comunicar por I2C el pic 18f45j10 con una memoria eeprom externa (24LC018). Estoy realizando un programa muy simple en el que mediante dos interruptores decido si escribir un byte o leerlo y lo muestro por el puerto B. Ya tengo el programa hecho pero no se si lo que falla es o la lectura o la escritura, aqui os paso el programa:
LIST P=PIC18F45J10
include <p18F45J10.inc>
config DEBUG = OFF
config XINST = OFF
config STVREN = ON ; Stack Overflow/Underflow Reset = encendido
config WDTEN = OFF ; Watchdog apagado
config CP0 = OFF ; Code protection deshabilitados
config FCMEN = OFF ; fail safe clock monitor
config IESO = OFF
config FOSC2 = ON
config FOSC = HS ; Osc section bits
config WDTPS = 1
config CCP2MX = DEFAULT
VARIA EQU 0x01
DATO_EEP EQU 0x02
ESCRIB_BYTE EQU 0x03
org 0000H
goto INICIO
ORG 0100H
INICIO
MOVLW B'00000000'
MOVWF OSCCON ,0
MOVLW B'00000000'
MOVWF OSCTUNE ,0
movlw b'01000111' ;configuracion del TMR0 Preescaler 1:256
movwf T0CON,0
MOVLW B'00000011' ;CONFIG COMO I2C_RD0,RD1
MOVWF TRISD,0
CLRF TRISB,0
MOVLW B'00000011'
MOVWF TRISA,0
MOVLW 0X0F
MOVWF ADCON1
MOVLW B'00101000'
MOVWF SSP2CON1,0 ;ACTIVAR MODO I2C
MOVLW B'10000000' ;DATOS SE MUESTRAN AL FINAL DEL PERIODO
MOVWF SSP2STAT,0
MOVLW .9
MOVWF SSP2ADD,0 ;VELOCIDAD ESTANDAR 100KH
CLRF PORTB,0
CLRF PORTA,0
CLRF DATO_EEP,0 ;CONTADOR INICIA EN CERO
COMP
BTFSC PORTA,0,0
GOTO COMP
BTFSC PORTA,1,0
GOTO LEER
GOTO ESCRIBIR
LEER
CALL START ;CONDICION DE INICIO
MOVLW B'10100000' ;Direccion de la eeprom el bit 0 a 1 indica que voy a leer
CALL SEND ;ENVIA DIRECCION
MOVLW B'00000001' ;DIRECCION DE LA EEPROM DONDE VOY A LEER O ESCRIBIR
CALL SEND ;ENVIO DIRECCION.
CALL STOP
call RSTART
MOVLW B'10100001' ;Direccion de la eeprom el bit 0 a 1 indica que voy a leer
CALL SEND ;ENVIA DIRECCION
CALL RECIBIR
CALL STOP
MOVF DATO_EEP,W,0
MOVWF LATB,0
GOTO COMP
ESCRIBIR
CALL START ;CONDICION DE INICIO
MOVLW B'10100000' ;Direccion de la eeprom el bit 0 a 0 indica que voy a escribir
CALL SEND ;ENVIA DIRECCION
MOVLW B'00000001' ;DIRECCION DE LA EEPROM DONDE VOY A LEER O ESCRIBIR
CALL SEND ;ENVIO DIRECCION.
CALL Retardo
MOVLW B'10101010' ;VALOR DEL DATO QUE VOY A GUARDAR EN LA EEPROM
CALL SEND ;ENVIO DATO A GUARDAR.
CALL Retardo
CALL STOP
GOTO COMP
;SUBRUTINA QUE GENERA LA CONDICION DE INICIO
START BCF PIR3,7,0 ;CLAREA BANDERA I2C
BSF SSP2CON2,0,0 ;ENVIA BIT DE INICIO
START_W BTFSS PIR3,7,0 ;TERMINO LA CONDICION DE INICIO
GOTO START_W
RETURN
;SUBRUTINA PARA REPETIR LA CONDICION DE INICIO
RSTART BCF PIR3,7,0 ;CLAREA BANDERA I2C
BSF SSP2CON2,1,0 ;ENVIA BIT DE INICIO
RSTART_W BTFSS PIR3,7,0 ;TERMINO LA CONDICION DE INICIO
GOTO START_W
RETURN
;SUBRUTINA PARA ENVIAR LA DIRECCION O DATOS A LOS MICROCONTROLADORES ESCLAVOS
SEND BCF PIR3,7,0 ;CLAREA BANDERA
MOVWF SSP2BUF,0 ;CARGA VALOR A ENVIAR POR EL BUS
BCF SSP2STAT,BF,0
SEND_W BTFSS PIR3,7,0 ;TERMINO EL ENVIO
GOTO SEND_W
RETURN
;SUBRUTINA PARA ENVIAR LA DIRECCION O DATOS A LOS MICROCONTROLADORES ESCLAVOS
RECIBIR BCF PIR3,7,0 ;CLAREA BANDERA
BSF SSP2CON2,RCEN,0 ;Iniciamos la lectura activando este bit
CALL Retardo
RECIB_W
BTFSS PIR3,7,0 ;TERMINO EL ENVIO
GOTO RECIB_W
BCF PIR3,7,0 ;CLAREA BANDERA
bcf SSP2CON2,ACKDT,0 ; Cargamos 0 en ACKDT para sacarlo luego
bsf SSP2CON2,ACKEN,0 ; Iniciamos la secuencia con ACKEN=1
CALL Retardo
G_ACKEN
btfsc SSP2CON2,ACKEN,0
goto G_ACKEN
movf SSP2BUF,W,0
MOVWF DATO_EEP,0
RETURN
;SUBRUTINA QUE GENERA LA CONDICION DE PARADA
STOP BCF PIR3,7,0 ;CLAREA BANDERA I2C
BSF SSP2CON2,2,0 ;ENVIA CONDICION DE PARADA
CLRF PORTB,0
STOP_W BTFSS PIR3,7,0 ;TERMINO CONDICION DE PARADA
GOTO STOP_W
RETURN
;SUBRUTINA DE RETARDO PARA ENVIAR EL SIGUIENTE DATO
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;**************************************************************************************************
; Retardo DE 32 ms
;**************************************************************************************************
Retardo
BSF T0CON,TMR0ON,0
clrf TMR0L,0 ; Ponemos a 0 el Timer0
bcf INTCON,TMR0IF,0
Explora btfss INTCON,TMR0IF,0 ; Comprobamos si el bit 7 de T0=1, salta=1
goto Explora ; Es 0, salta a explora
decfsz VARIA,f,0 ; T0=1 por tanto decrementamos VARIA, salta=0
goto Retardo ; VARIA nos es 0 por tanto salta a Retardo
BCF T0CON,TMR0ON,0
return
;**************************************************************************************************
; RETARDO DE 1 s
;**************************************************************************************************
RETARDO1
movlw .32 ; Veces que se repite la rutina de 32ms
movwf VARIA,0 ; Cargamos un valor en la variable VARIA
call Retardo
return
END
;Muchas gracias por su tiempo