Control de Ds1307 con asm, da señales de ACK pero no actualiza la hora

hola amigos del foro, trabajo en un proyecto que implementa un RTC utilizando el pic16f886. resulta que sigo todos las pasos recomendados por microchip para manejar el RTC a traves el puerto mssp (i2c), cuando lo simulo en proteus isis 7.4 el reloj devuelve señales de ack pero no se actualiza la hora en la ventana que muestra estos datos. alguien tiene un ejemplo en asm que pueda compartir?
desde ya muchas gracias
 
aca posteo el codigo: utilizo el modulo MSSP del pic, si alguien lo uso agradecería algo de ayuda
Código:
LIST P=16F876A
#INCLUDE P16F876.INC
#define	LCDE	PORTC,0 		;Habilitación del LCD
#define	LCDRS	PORTC,1		;Selección de modo del LCD
ORG		00H
GOTO		INICIO
ORG		04H
GOTO		ISR
ORG		05H
		
		PCL				equ	0x02
		LCDlinea1		equ	H'0080'
		LCDlinea2		equ	H'00c0'
		LCDCLR			equ	H'0001'
		LCDCasa		equ	H'0002'
		LCDInc			equ	H'0006'
		LCDDec			equ	H'0004'
		LCDOn			equ	H'000C'
		LCDOff			equ	H'0008'
		CursorOn		equ	H'000E'
		CursorOff		equ	H'000C'				
		CursBlink		equ	H'000F'
		LCDIzda			equ	H'0018'
		LCDDecha		equ	H'001C'
		CursIzda		equ	H'0010'
		CursDecha		equ	H'0014'
		LCDFuncion		equ	H'0038'
		LCDCGRAM		equ	H'0040'
		RTCWRT			equ	b'11010000'
		RTCRD			equ b'11010001'
		AUX				equ H'0021'
		AUX1			equ H'0022'
		tiempo1			equ	0x23		;Usados para temporizar
		tiempo2			equ	0x24
		SEG				equ H'0025' ; usados para guardar los
		MIN 			equ H'0026' ; datos que
		HOR 			equ H'0027' ; se 
		DIA 			equ H'0028' ; muestran
		FECHA			equ	H'0029' ; en
		MES 			equ H'002A' ; el
		AÑO 			equ H'002B' ; LCD
		DIRI2C			equ H'002C'	; DATO TEMPORAL A SER ENVIADO A TRAVES DEL BUS I2C
		rtc_SEG			equ H'00'
		rtc_MIN 			equ H'01'
		rtc_HOR 		equ H'02'
		rtc_DIA 			equ H'03'
		rtc_FECHA		equ	H'04'
		rtc_MES 			equ H'05'
		rtc_AÑO 		equ H'06'
		rtc_CONTROL	equ	H'07'
		

INICIO		BCF			STATUS,RP0
			BCF			STATUS,RP1
			BCF			ADCON0,0
			BSF			STATUS,RP0
			MOVLW 	H'06'
			MOVWF		ADCON1
			BCF			STATUS,RP1
			MOVLW		H'D5'
			MOVWF		OPTION_REG
			CLRF		TRISA
			CLRF		TRISB
			CLRF		TRISC
			BSF			TRISC,3
			BSF			TRISC,4
			CLRF		PIE1
			CLRF		PIE2
			BCF 		STATUS,5
			CLRF		PIR1
			CLRF		PIR2
			CLRF		PORTA
			CLRF		PORTB
			MOVLW		.4
			CALL		Pausa5ms
			CALL      	INILCD		
			CALL	 	INIMSSP
			MOVLW		.0 ;EMPIEZO DESDE LOS SEGUNDOS
			CALL		I2CSTARTW
			MOVLW		H'51'
			CALL		I2CDATOW
			MOVLW		H'45'
			CALL		I2CDATOW
			MOVLW		H'23'
			CALL		I2CDATOW
			MOVLW		H'01'
			CALL		I2CDATOW
			MOVLW		H'14'
			CALL		I2CDATOW
			MOVLW		H'01'
			CALL		I2CDATOW
			MOVLW		H'99'
			CALL		I2CDATOW
			MOVLW		H'10'
			CALL		I2CDATOW
			CALL		I2CSTOPACK
			CLRF		STATUS
		      MOVLW		.10
			CALL		Pausa5ms
			MOVLW		H'FF'
			CALL		DATO
			MOVLW		H'57'
			CALL		CONTROL
			MOVLW		H'FF'
			CALL		DATO
			MOVLW		H'C0'
			CALL		CONTROL
			MOVLW		H'FF'
			CALL		DATO
			MOVLW		H'67'
			CALL		CONTROL
			MOVLW		H'FF'
			CALL		DATO
			NOP
			GOTO	$-1
			
;*************RUTINA DE SERVICIO DE INTERRUPCION*****************
		ISR		
					RETFIE	
;*********************BUS I2C***********
	INIMSSP			CLRF		STATUS
					MOVLW		H'28'
					MOVWF		SSPCON	;HABILITA PINES SDA Y SCL Y CONFIGURA AL PIC COMO I2C MASTER
					BSF			STATUS,RP0
					MOVLW		.9
					MOVWF		SSPADD; VALOR NECESARIO PARA QUE EL CLOCK SEA DE 100KHZ (CK=OSC/4(SSPADD+1)) OK
					BSF			SSPSTAT,7; TRANSMISION A 100KHZ
					BCF			SSPCON2,5; VALOR DEL ACK  CUANDO TERMINA DE RECIBIR UN BYTE (1 ES NACK)
					BCF			PIE1,3
					BCF			STATUS,RP0
					BCF			PIR1,3
					RETURN
	
	I2CSTARTW		BCF			STATUS,RP1 ; ESCRIBIR EN W LA PRIMER DIRECCION DE MEMORIA DONDE SE QUIERE ESCRIBIR Y LLAMAR
					BCF			STATUS,RP0
					MOVWF		DIRI2C
					BSF			STATUS,RP0
					BSF			SSPCON2,0; START
					CALL		I2CHEK     ; EL MODULO ESTA OCUPADO?
					BCF			STATUS,RP0
					MOVLW		RTCWRT	   ; DIRECCION DEL RTC MAS BIT DE ESC 0
					MOVWF		SSPBUF
					CALL		I2CHEK     ; EL MODULO ESTA OCUPADO?
					MOVF		DIRI2C,W  ; PRIMER DIRECCION DONDE VOY A ESCRIBIR 
					MOVWF		SSPBUF
					CALL		I2CHEK	; EL MODULO ESTA OCUPADO?
					RETURN
	
	I2CDATOW		; CARGAR EN W EL SIG DATO Y LLAMAR
					CALL		I2CHEK 
					BCF			STATUS,RP0
					BCF			STATUS,RP1
					MOVWF		SSPBUF
					CALL		I2CHEK
					RETURN
	
	I2CSTOPACK		BCF		STATUS,RP1
					BSF		STATUS,RP0
					BCF		SSPCON2,5 ;ANTES DEL STOP HABRA UN ACK SI ESTUVIESE EN RECIBIR 
					CALL	I2CHEK
					BSF		SSPCON2,2; STOP
					CALL	I2CHEK
					RETURN
					
	I2CSTOPNACK	BCF		STATUS,RP1
					BSF		STATUS,RP0
					BSF		SSPCON2,5 ;NACK ANTES DEL STOP  
					BSF		SSPCON2,4; NACK
					CALL	I2CHEK
					BSF		SSPCON2,2 ; STOP
					CALL	I2CHEK
					RETURN				
				
	
	I2CHEK			BCF		STATUS,RP1
					BSF		STATUS,RP0
					BTFSC	SSPSTAT,2; TRANSMICION EN PROGRESO?
					GOTO	$-1;ENTONCES ESPERA
			VER		MOVF	SSPCON2,W	;CHEQUEA 
					ANDLW	H'1F'		;QUE NO ESTE HACIENDO
					BTFSS	STATUS,Z	;OTRA TAREA
					GOTO	VER
					BCF		STATUS,RP0
					RETURN	
;*************RUTINA DE ESCRITURA Y CONTROL LCD*******		
		CONTROL	BCF    		LCDRS
					GOTO   		CHEK
		DATO		BSF	   		LCDRS
		CHEK		CLRF		STATUS
					MOVWF		PORTB
					BSF			STATUS,RP0
					BSF			TRISB,7
					CLRF		STATUS
					BSF			LCDE
					NOP
		        		BCF			LCDE
			    		NOP
			    		BTFSC		PORTB,7
					GOTO		$-1
					BSF			STATUS,RP0
					BCF			TRISB,7
					CLRF		STATUS
					RETURN			
;******INICIACION DEL LCD***********
		INILCD	CLRF		STATUS
				MOVLW		.6
				MOVWF		AUX1
				MOVF		AUX1,0 ;AUX1 -> W
				CALL 		LISTA1
				CALL    		CONTROL
				CLRF           STATUS
				DECFSZ		AUX1
				GOTO		$-4
				MOVLW		CursorOff
				CALL		CONTROL
				RETURN	
		LISTA1	ADDWF		PCL,1
				RETLW		CursBlink
				RETLW		LCDCLR
				RETLW		CursorOn
				RETLW		LCDOn
				RETLW		LCDInc
				RETLW		LCDFuncion
;******RUTINAS DE TEMPORIZACION*********						
Pausa5ms	CLRF		STATUS
			MOVWF		AUX	
HOLD		clrf			INTCON
			movlw		.178
			movwf		TMR0
			btfss		INTCON,2
			goto		$-1
			DECFSZ		AUX
			GOTO		HOLD
			return		
			END
tambien adjunto el archivo de proteus ( 7.4)
muchisimas gracias desde ya! !
 
Atrás
Arriba