MOVLW 0X00
MOVWF SEGUNDOS
MOVLW 0X10
MOVWF DATO
MOVLW 0X07
MOVWF DIRECCION
CALL WRITE_RTC
MOVF SEGUNDOS,W
MOVWF DATO
CLRF DIRECCION
CALL WRITE_RTC
MOVF MINUTOS,W
MOVWF DATO
MOVLW 0X01
MOVWF DIRECCION
CALL WRITE_RTC
MOVF HORAS,W
MOVWF DATO
MOVLW 0X02
MOVWF DIRECCION
CALL WRITE_RTC
;////////////RUTINAS PARA OPERACIONES CON EL DS1307//////////////////
WRITE_RTC
CALL SEND_START
MOVLW 0XD0
CALL SEND_BYTE
MOVF DIRECCION,W
CALL SEND_BYTE
MOVF DATO,W
CALL SEND_BYTE
CALL SEND_STOP
RETURN
READ_RTC
CALL SEND_START
MOVLW 0XD0
CALL SEND_BYTE
MOVF DIRECCION,W
CALL SEND_BYTE
CALL SEND_START2
MOVLW 0XD1
CALL SEND_BYTE
CALL LEER_BYTE
CALL SEND_STOP
RETURN
;#####################################
;##### RUTINAS DEL PROTOCOLO I2C
;#####################################
;////////////RUTINA PARA ENVIAR UN START//////////////////
SEND_START
BCF PIR1,SSPIF
BANKSEL SSPCON2 ; SELECCIONA EL BANCO 1 DE RAM
BSF SSPCON2,SEN ; ACTIVA SECUENCIA DE INICIO
BANKSEL PIR1 ; REGRESA AL BANCO 0 DE RAM
BTFSS PIR1,SSPIF ; FIN DE SECUENCIA DE INICIO ??
GOTO $-1 ; NO, SEGUIR ESPERAR
RETURN
;////////////RUTINA PARA ENVIAR UN RE-START//////////////////
SEND_START2
BANKSEL SSPCON2
BSF SSPCON2,1 ; ACTIVA SECUENCIA RE-INICIO
BTFSC SSPCON2,1
GOTO $-1 ; NO, SEGUIR ESPERANDO
BANKSEL PORTC
RETURN
;////////////RUTINA PARA ENVIAR UN STOP//////////////////
SEND_STOP
NOP
BANKSEL PIR1
BCF PIR1,SSPIF
BANKSEL SSPCON2 ; PASA AL BANCO 1
BSF SSPCON2,PEN ; ACTIVA SECUENCIA DE STOP
BANKSEL PIR1 ; REGRESA AL BANCO 0
BTFSS PIR1,SSPIF ; FIN DE SECUENCIA DE STOP ??
GOTO $-1 ; NO, SEGUIR ESPERADO
RETURN
;////////////RUTINA PARA ENVIAR UN BYTE Y ESPERA DE ACK////////////
SEND_BYTE
BCF PIR1,SSPIF
MOVWF SSPBUF ; BYTE A TRANSMITIR PASA AL BUFFER DE SALIDA
BTFSS PIR1,SSPIF ; TERMINO DE TRANSMITIR??
GOTO $-1 ; NO, SEGUIR ESPERANDO
BANKSEL SSPCON2 ; SELECCIONA EL BANCO 0
MOVLW .40
MOVWF AUX_ACK
SIG_ACK
BTFSS SSPCON2,ACKSTAT ; MIRA EL ESTADO DEL BIT ACK
GOTO SALE_SEND
DECFSZ AUX_ACK,F
GOTO SIG_ACK
GOTO ERROR_I2C ; ERROR!!
SALE_SEND
NOP
BANKSEL PORTC
RETURN
;////////////RUTINA PARA RECIBIR UN BYTE Y ENVIAR UN NOACK////////////
LEER_BYTE
BCF PIR1,SSPIF ; BORRA LA BANDERA DEL MÓDULO MSSP
BANKSEL SSPCON2 ; SELECCIONA PÁGINA 1
BSF SSPCON2,RCEN ; ACTIVA EL MODO RECEPTOR
BANKSEL PIR1 ; SELECCIONA PÁGINA 0
BTFSS PIR1,SSPIF ; RECIBIDOS LOS 8 BITS ??
GOTO $-1 ; NO, SEGUIR ESPERADO
MOVF SSPBUF,W ; MOVER LOS DATOS RECIBIDO
MOVWF RECIBO ; AL REGISTRO DATOS PARA USARLOS LUEGO
BCF PIR1,SSPIF
BANKSEL SSPCON2
BSF SSPCON2,ACKDT ; ACTIVA GENERACIÓN DE ACK DEL MAESTRO
BSF SSPCON2,ACKEN
BANKSEL PIR1
BTFSS PIR1,SSPIF ; SE ENVIÓ ACK?
GOTO $-1
RETURN
ERROR_I2C
BANKSEL PORTC
CALL SEND_STOP
MOVLW 0X88
MOVWF INTCON
RETURN