Pues estoy intentando comunicar un 16f877 y una memoria 24lc256 pero tengo problemas.
El programa q utilizo es un ejemplo q Gokuden colgo en el foro, simplemente q he creado una libreria con las subrutinas de la comunicacion y en el programa principal he añadido un plusador en el puerto b para q empiece a transmitir. Os comento simulo con proteus 7.1 sp4 y mplab, con un watch en el mplab veo los registros q me interesan q son W I2c_BYTE y sspbuf, cuando voy simulando en esta ventana salen los registros con los valores correctamente, envio un start, el identificador de la memoria, la direccion en la q quiero escribir, luego el dato y luego un stop. Todo esto en la ventana del mplab es correcto pero en el i2c debugger del proteus salen valores q no tienen nada q ver o al menos eso creo yo.
este es el circuito
y esto lo q sale en el i2c debugger del proteus:
Os pego el programa principal
;**********************************************************************
;
; Filename: CONTROL I2C
; Date: 25.03.08
; File Versión: *.*
;
; Autor: LUCIANO GARCÍA ALMENA
; Company:
;
;
;**********************************************************************
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
ERRORLEVEL -302
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;**********************************************************************
BYTE_I2C EQU 20
ORG 0X00 ; processor reset vector
NOP
GOTO INICIO
ORG 0X05
INICIO
CALL CONFIGURACION
BSF STATUS,RP0
BCF STATUS,RP0
BCF OPTION_REG,NOT_RBPU
MOVLW B'11111111'
MOVWF TRISB
BTFSC PORTB,0
GOTO INICIO
CALL S_START ;start
MOVLW B'10100000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
MOVLW 0X00 ; direccion alta
CALL S_BYTE ; envio de direccion alta
MOVLW 0X00 ; direccion baja
CALL S_BYTE ; envio de direccion baja
INCF BYTE_I2C
MOVF BYTE_I2C,W ; 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
GOTO INICIO
INCLUDE <I2C.INC>
END
y la libreria:
;Libreria para comunicacion I2C
;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-------------------
CONFIGURACION
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
RETURN
;-------------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
os adjunto los dos archivos y el de proteus. El de proteus es el i2cproteus.zip