;-------------------------------------------------------------------------------------
;	Febrero 1, 2012.
;	Libreria DS1307.inc
;	PulKon
; 	Referencia: Capítulo 24, Desarrollo de Proyectos. "RELOJ CALENDARIO EN BUS 12C"
;	Comprende las siguientes subrutinas:
;	1. DS1307_Inicializa
;	2. DS1307_Lee
;	3. DS1307_Escribe
;	4. DS1307_CargaInicial
;	Estas subrutinas permiten realizar las tares del RTC DS1307, que transmite la
; 	información vía serie a través del BUS I2C
;-------------------------------------------------------------------------------------
;	Definicion de variables. 
;-------------------------------------------------------------------------------------
	CBLOCK	
	Anio					; Guarda los datos correspondientes.
	Mes
	Dia
	DiaSemana
	Hora
	Minuto
	Segundo
	ENDC
DS1307_DireccionEscrituraa	equ		0xD0	; Dirección del DS1307		
DS1307_DireccionLectura		equ		0xD1
;-------------------------------------------------------------------------------------
;	Subrutina DS1307_Inicializa - Configura la señal cuadrada de salida del DS1307
;	a 1 Hz SQW/OUT.
;-------------------------------------------------------------------------------------	
DS1307_Inicializa
	call	I2C_EnviaStart				; Envía condición de Start.
	movlw	DS1307_DireccionEscritura		; Indica al DS1307 que el byte a escribir
	call	I2C_EnviaByte				; está en la posición 07h, correspondiente 
	movlw	0x07					; al control de la onda cuadrada.
	call	I2C_EnviaByte
	movlw	b'00010000'				; Escribe en el registro de control para
	call	I2C_EnviaByte				; configurar a 1 Hz.
	call	I2C_EnviaStop				; Termina de enviar datos.
	return
;-------------------------------------------------------------------------------------
;	Subrutina DS1307_Lee - Se leen las variables de tiempo del DS1307 y
;	se guardan en los registros correspondientes.
;-------------------------------------------------------------------------------------	
DS1307_Lee
	bcf		I2C_UltimoByteLeer
	call	I2C_EnviaStart				; Envia condición de Start
	movlw	DS1307_DireccionEscritura		; Indica al DS1307 que el primer byte a leer
	call	I2C_EnviaByte				; está en la posición 00H, que correponde a 
	movlw	0x00					; los segundos.
	call	I2C_EnviaByte
	call	I2C_EnviaStop				; Envía condición de Stop.
							; Ahora va a leer el DS1307.
	call	I2C_EnviaStart
	movlw	DS1307_DireccionLectura
	call	I2C_EnviaByte
	call	I2C_LeeByte				; Lee los segundos.
	movwf	Segundo					; Lo carga en el registro correspondiente.
	call	I2C_LeeByte				; Procede de igual manera para los demas.
	movwf	Minuto
	call	I2C_LeeByte					
	movwf	Hora
	call	I2C_LeeByte					
	movwf	DiaSemana
	call	I2C_LeeByte					
	movwf	Dia
	call	I2C_LeeByte					
	movwf	Mes
	bsf		I2C_UltimoByteLeer		; Para concluir
	call	I2C_LeeByte					
	movwf	Anio
	call	I2C_EnviaStop				; Acaba de leer.
	return
;-------------------------------------------------------------------------------------
;	Subrutina DS1307_CargaInicial - Realiza una carga inicial en los registros internos
;	del RTC DS1307 a fecha: Domingo, 1 de Enero de 2012 a las 0:00:00.
;-------------------------------------------------------------------------------------	
DS1307_CargaInicial
	movlw	.1					; Inicializa todos los datos del reloj.
	movwf	Dia
	movwf	Mes
	movwf	DiaSemana
	movlw	.12
	movwf	Anio					; Inicia en el año 2012.
	clrf	Hora
	clrf	Minuto
	clrf	Segundo							
	call	DS1307_Escribe				; Después lo graba para ponerlo en marcha.
	return
;-------------------------------------------------------------------------------------
;	Subrutina DS1307_Escribe - Carga los datos de los registros dentro del DS1307.
;-------------------------------------------------------------------------------------	
DS1307_Escribe
	call	I2C_EnviaStart				; Envia condición de Start.
	movlw	DS1307_DireccionEscritura		; Indica al DS1307 que el primer byte a
	call	I2C_EnviaByte				; escribir está en la posición 00h
	movlw	0x00					; que corresponde a los segundos.	
	call	I2C_EnviaByte
	movf	Segundo,w				; Pasa los segundos de la memoria del PIC
	call	I2C_EnviaByte				; al RTC DS1307
	movf	Minuto,w				; Se repite el proceso para el resto.
	call	I2C_EnviaByte
	movf	Hora,w					
	call	I2C_EnviaByte
	movf	DiaSemana,w					
	call	I2C_EnviaByte
	movf	Dia,w					
	call	I2C_EnviaByte
	movf	Mes,w					
	call	I2C_EnviaByte
	movf	Anio,w					
	call	I2C_EnviaByte
	call	I2C_EnviaStop				; Termina de enviar datos.
	return
;-------------------------------------------------------------------------------------