hola. aqui les dejo unas rutinas que hice esta semana y funcionana a la perfeccion. junto con un ejemplo. estas rutinas estan en asm y son para los micros de microhip que posean el modulo MSSP i2c. para cualquier, probe la misma rutina en un 877a, y en un 88 y todo bien.
COSAS PARA QUE TE FUNCIONE, debes colocar el pto PORTC como entrada, aunque no he probado solo poniendo los pines que involucran al i2c.
saben que el i2c, lleva un start, stop, envio de byte y recepcion de byte, entonces habra una rutina para cada uno y las iras llamando dependiendo de como sea la comunicacion con el periferico.
S_STAR es la rutina de start
S_STOP es la rutina de stop
S_BYTE es la rutina de enviar byte
R_BYTE es la rutina de recivir byte.
;-----------------INICIO, CONFIGURACION DE PTOS Y I2C-------------------
CALL BANK_1 ; TE CAMBIAS AL BANCO 1
MOVLW 0FFH
MOVWF TRISC
MOVLW B'10000000'
MOVWF SSPSTAT
MOVLW .9
MOVWF SSPADD
CALL BANK_0 ; TE CAMBIAS AL BANCO 0
MOVLW B'00101000'
MOVWF SSPCON
MOVLW .0
;-------------RUTINAS I2C-------------------
S_START BCF PIR1,SSPIF ; CON ACK
CALL BANK_1
BSF SSPCON2,SEN
CALL BANK_0
START_W BTFSS PIR1,SSPIF
GOTO START_W
RETURN
S_STOP BCF PIR1,SSPIF
CALL BANK_1
BSF SSPCON2,PEN
CALL BANK_0
STOP_W BTFSS PIR1,SSPIF
GOTO STOP_W
RETURN
S_BYTE BCF PIR1,SSPIF
MOVWF SSPBUF
SEND_B BTFSS PIR1,SSPIF
GOTO SEND_B
RETURN
R_BYTE BCF PIR1,SSPIF ;PARA GRABAR
CALL BANK_1
BSF SSPCON2,RCEN
CALL BANK_0
READ_W BTFSS PIR1,SSPIF
GOTO READ_W
BCF PIR1,SSPIF
CALL BANK_1
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
CALL BANK_0
ACK_W BTFSS PIR1,SSPIF
GOTO ACK_W
MOVF SSPBUF,W
RETURN
;---------------------------BANCOS------------------
BANK_0 BCF STATUS,RP0
BCF STATUS,RP1
RETURN
BANK_1 BSF STATUS,RP0
BCF STATUS,RP1
RETURN
BANK_2 BCF STATUS,RP0
BSF STATUS,RP1
RETURN
BANK_3 BSF STATUS,RP0
BSF STATUS,RP1
RETURN
EJEMPLOvamos a usar una memoria i2c 24c32, o 64, 128, 16, como deseen.
la conectamos a la patitas SCK y SDA con sus respectivas resistencias de pull up a Vcc de 1k.
para grabar en la memoria, primero ponemos un start, luego le enviamos un dato que es siempre el mismo que es el de indetificacion, es 10100000, donde el ultimo bit significa leer o grabar. revisar pdf. luego le mandamos la direccion alta y luego a direccion baja de donde deseamos grabar ya que tiene 11bits de direccionamiento esta memoria. y luego le mandamos un byte que es el dato para grabar, si le sigues mandando dato, el automaticamente se incrementa de direccion y va grababdo el dato, al final le mandas un stop. entonces. el programa seria asi..
CALL S_START ;start
MOVLW B'10100000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
MOVLW .0 ; direccion alta
CALL S_BYTE ; envio de direccion alta
MOVLW .0 ; direccion baja
CALL S_BYTE ; envio de direccion baja
MOVLW .233 ; dato a grabar en posicion 000h
CALL S_BYTE ; envio de dato a grabar
CALL S_STOP ; stop, si deseas, mandas mas datos antes de parar