Buenas Tardes.
saludos desde Venezuela, tengo una duda con respecto al manejo del Modulo I2C del micro-controlador 16F887
estoy usando el código que describiré a continuación y el mismo me funciona correctamente con el PIC16F877 pero al tratar de utilizarlo con el PIC16F887 me el proteus me genera el siguiente error.
Spurious SCL Tranition detected
Tengo las Resistencias a Pull-UP de 4k7 para el SCL y SDA y como les dije para el 877 me funciona correctamente y para el 887 no...
Les dejo el código para que por favor me ayuden con este inconveniente espero su respuesta, gracias.
INCLUDE <P16F887.INC>
LIST P=16F887
__CONFIG _CONFIG1, _LVP_OFF&_MCLRE_ON&_PWRTE_ON&_WDT_OFF&_INTOSCIO&_BOR_OFF&_FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF
;////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////// V A R I A B L E S /////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
CBLOCK 0x20
AUX
UNIDAD
DECENA
CENTENA
NUM
SEG
MIN
HOR
DIA
FECHA
MES
ANO
ENDC
#DEFINE EN1 PORTB,3
#DEFINE RS PORTB,2
#DEFINE EN2 PORTC,5
#DEFINE DIR_R 0xD0
#DEFINE DIREC 0X07
;////////////////////////////////////////////////////////////////////////////////////////////////////
;////////////////////////////////// V E C T O R D E I N I C I O ///////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
ORG 0x00
CALL CONF
CALL CONF_I2C
GOTO INICIO
;////////////////////////////////////////////////////////////////////////////////////////////////////
;/////////////////////////////// P R O G R A M A P R I N C I P A L ////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
INICIO
CALL READTIME
GOTO $
READTIME
CALL STARTBIT
MOVLW DIR_R
CALL WRITEI2C
MOVLW 0x00
CALL WRITEI2C
CALL STOPBIT
CALL STARTBIT
MOVLW 0xD1
CALL WRITEI2C
;///// RECIBO SEGUNCO /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF SEG
;///// RECIBO MINUTO /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF MIN
;///// RECIBO HORA /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF HOR
;///// RECIBO FECHA /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF FECHA
;///// RECIBO DIA /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF DIA
;///// RECIBO MES /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF MES
;///// RECIBO ANO /////
CALL BANCO1
BTFSC SSPSTAT,2
GOTO $-1
BSF SSPCON2,RCEN
CALL WAITMSSP
CALL BANCO0
BCF PIR1,SSPIF
CALL ACKBIT
MOVF SSPBUF,W
MOVWF ANO
CALL STOPBIT
;////////////////////
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////// V E C T O R C O N F I G U R A C I O N ////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
CONF
CALL BANCO1
CLRF TRISA
CLRF TRISB
MOVLW B'00011000'
MOVWF TRISC
CLRF TRISD
CLRF TRISE
CALL BANCO0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
RETURN
CONF_I2C
MOVLW B'00101000'
MOVWF SSPCON
CALL BANCO1
MOVLW B'10000000'
MOVWF SSPSTAT
MOVLW .9
MOVWF SSPADD
CALL BANCO0
;CALL STARTBIT
;MOVF DIR_R,W
;CALL WRITEI2C
;MOVF DIREC,W
;CALL WRITEI2C
;MOVLW 0x90
;CALL WRITEI2C
;CALL STOPBIT
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////// B A N C O S D E P R O G R A M A S ///////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
BANCO0
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
BANCO1
BSF STATUS,RP0
BCF STATUS,RP1
RETURN
BANCO2
BCF STATUS,RP0
BSF STATUS,RP1
RETURN
BANCO3
BSF STATUS,RP0
BSF STATUS,RP1
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////
;/////////////////////////////////////// R U T I N A S I 2 C ///////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
WRITEI2C
CALL BANCO0
MOVWF SSPBUF
CALL WAITMSSP
RETLW 0x00
STARTBIT
CALL BANCO1
BSF SSPCON2,SEN
CALL BANCO0
CALL WAITMSSP
RETLW 0x00
RESTARTBIT
CALL BANCO1
BSF SSPCON2,RSEN
CALL BANCO0
CALL WAITMSSP
RETLW 0x00
STOPBIT
CALL BANCO1
BSF SSPCON2,PEN
CALL BANCO0
CALL WAITMSSP
RETLW 0x00
ACKBIT
CALL BANCO1
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
CALL BANCO0
CALL WAITMSSP
RETLW 0x00
NACKBIT
CALL BANCO1
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
CALL BANCO0
CALL WAITMSSP
RETLW 0x00
WAITMSSP
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
RETLW 0
WRITETIME
CALL STARTBIT
MOVLW DIR_R
CALL WRITEI2C
MOVLW 0x00
CALL WRITEI2C
MOVLW .25
CALL BCD
SWAPF DECENA,W
MOVWF AUX
MOVF UNIDAD,W
IORWF AUX
MOVF AUX,W
CALL WRITEI2C
CALL STOPBIT
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////
;///////////////////////////////////// R U T I N A S B C D //////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////
BCD
CLRF CENTENA ; Carga los registros con el resultado inicial.
CLRF DECENA ; En principio (Centenas)=0 y (Decenas)=0.
MOVWF UNIDAD ; Se carga el número binario a convertir.
RES10
MOVLW .10 ; A las unidades se les va restando 10 en cada
SUBWF UNIDAD,W ; pasada. (W)=(Unidades)-10.
BTFSS STATUS,C ; ¿(C)=1?, ¿(W) positivo?, ¿(Unidades)>=10?.
GOTO BCD_FIN ; No, es menor de 10. Se acabó.
INC_DEC
MOVWF UNIDAD ; Recupera lo que queda por restar.
INCF DECENA,F ; Incrementa las decenas y comprueba si llega a
MOVLW .10 ; 10. Lo hace mediante una resta.
SUBWF DECENA,W ; (W)= (Decenas)-10.
BTFSS STATUS,C ; ¿(C)=1?, ¿(W) positivo?, ¿(Decenas)>=10?.
GOTO RES10 ; No. Vuelve a dar otra pasada, restándole 10.
INC_CEN
CLRF DECENA ; Pone a cero las decenas
INCF CENTENA,F ; e incrementa las centenas.
GOTO RES10 ; Otra pasada, resta 10 al número a convertir.
BCD_FIN
SWAPF DECENA,W ; En el nibble alto de W también las decenas.
ADDWF UNIDAD,W ; Las unidades están en el nibble bajo de W.
RETURN
END