Hola Nuevamente a todos...
Despues de haber recibido su valiosa ayuda quiero compartir con todos las rutinas de I2C que utilice en base a las de marvicdigital que me fueron de mucha ayuda pero el detalle que se me presento es que queria leer en forma independiente a la que escribia... no se si no se podia o no le halle el pumm... pero como no pude me puse a la tarea de entender linea por linea y con ayudas de otras rutinas les comparto estas rutinas
las utilice con un 16f873A y 24lc04
CONFIG_TRANSMISION_I2C
call b1 ; SELECIONO LA PAGINA 1 DE LA MEMORIA
BSF TRISC,4
BSF TRISC,3
MOVLW 0x02 ; mueve 2 a W
MOVWF SSPADD ; TRANSMISION SERA DE 333 KHZ
call b0 ; SELECIONO LA PAGINA 0 DE LA MEMORIA
BCF PIR1,SSPIF
MOVLW B'00101000' ; PERMITE LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.
MOVWF SSPCON
GOTO VOLVER
BIT_START_I2C
call b1 ;BANCO 1
BSF SSPCON2,SEN ;START ACTIVADO
call b0 ;BANCO 0
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
GOTO VOLVER
TRANSMITIR_DATO_I2C
MOVWF SSPBUF ;CARGAR DATO EN BUFFER I2C
call b0 ;BANCO 0
CALL R20MS
BCF PIR1,SSPIF
CALL b1
BTFSS SSPCON2,ACKSTAT ; Si el esclavo pone ACKSTAT = 0 la transmision es correcta,
; Si no hay respuesta del esclavo enviamos STOP.
GOTO Trans_correcta
call TIC
GOTO BIT_STOP_I2C
Trans_correcta
call b0 ; Seleciono la pagina 0 de la memoria
GOTO VOLVER
RECIBIR_DATO_I2C
call b1 ;BANCO 1
BSF SSPCON2,RCEN ;ACTIVAR MODO LECTURA
CALL b0
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
MOVF SSPBUF,W ; Dato recibido en el registro SSPBUF
movwf buffer ; Mueve dato a buffer
CALL b1 ; Seleciono la pagina 1 de la memoria
BSF SSPCON2,ACKDT ; Pone el maestro el bit de reconocimiento de que ha llegado el Dato.
BSF SSPCON2,ACKEN ; Permito que el bit de reconocimiento este activo.
CALL b0 ; Seleciono la pagina 0 de la memoria
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
GOTO VOLVER
BIT_STOP_I2C
CALL b1 ; Seleciono la pagina 1 de la memoria
BSF SSPCON2,PEN
CALL b0 ; Seleciono la pagina 0 de la memoria
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
GOTO VOLVER
TIC BSF PORTC,7
CALL R500MS
BCF PORTC,7
GOTO VOLVER
RESTART_I2C
CALL b1
BSF SSPCON2,RSEN
CALL b0
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
VOLVER
RETURN
y explico:
los llamados "call bx" son rutinas que empleo adicionales para ubicarme en el banco que quiero trabajar (se que se puede hacer solo modificando uno de los bits en el reg STATUS pero lo hago para no perderme, "por novato")
La variable "buffer" la utilizo para trasladar el valor que quiero leer en las rutinas o para escribir en la memoria.
La rutina TIC sirve para encender un led en el puerto C para indicar que esta leyendo (informacion visual)
Llamado a rutina de escritura
BCF INTCON,7 ; GIE – Global interrupt DISABLE (1=habilitado)
call CONFIG_TRANSMISION_I2C
CALL BIT_START_I2C
MOVLW B'10100000' ;Establece la dir de la eeprom B0=0=escritura
CALL TRANSMITIR_DATO_I2C
movf IC2DIR,0 ; IC2DIR: Variable que posee direccion de la eeprom en la cual se grabara
CALL TRANSMITIR_DATO_I2C
MOVF buffer,0 ; buffer : Variable que posee dato a escribir
CALL TRANSMITIR_DATO_I2C
call BIT_STOP_I2C
; DESBLOQUEA INTERRUPCIONES*****************************
BSF INTCON,7 ; GIE – Global interrupt enable (1=habilitado)
Llamado a rutina de lectura
; BLOQUEA INTERRUPCIONES*****************************
BCF INTCON,7 ; GIE – Global interrupt DISABLE (1=habilitado)
call CONFIG_TRANSMISION_I2C
CALL BIT_START_I2C
MOVLW B'10100010' ;1010: standar para la eeprom
; 001: Indica que es en el bank 1 (000=Bank 0)
; B0=0=ESCRITURA (1=LECTURA)
CALL TRANSMITIR_DATO_I2C
movf IC2DIR_LECTURA,0 ; IC2DIR_LECTURA : Posee la direccion de la eeprom que se va a leer
CALL TRANSMITIR_DATO_I2C
CALL RESTART_I2C
MOVLW B'10100011' ;Establece la dir de la eeprom B0=1=LECTURA
CALL TRANSMITIR_DATO_I2C
CALL RECIBIR_DATO_I2C
MOVF buffer,0
call BIT_STOP_I2C
CALL TIC
; DESBLOQUEA INTERRUPCIONES*****************************
BSF INTCON,7 ; GIE – Global interrupt enable (1=habilitado)
Espero que les sirva .....
Saludos