;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;************************************************************************************************
;
;
;
LIST P=18F4520
INCLUDE "P18F4520.INC"
CONFIG OSC = HS,FCMEN = OFF,IESO = OFF
CONFIG PWRT = OFF,BOREN = OFF,BORV = 3
CONFIG WDT = OFF
CONFIG MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF
CONFIG CCP2MX = PORTC,STVREN = OFF,LVP = OFF
CONFIG XINST = OFF,DEBUG = OFF
CONFIG CP0 = ON,CP1 = ON,CP2 = ON,CP3 = ON,CPB = ON,CPD = ON
CONFIG WRT0 = ON,WRT1 = ON,WRT2 = ON,WRT3 = ON,WRTB = ON,WRTC = ON,WRTD = ON
CONFIG EBTR0 = ON,EBTR1 = ON,EBTR2 = ON,EBTR3 = ON,EBTRB = ON
ERRORLEVEL -302
RADIX HEX
;************************************************************************************************
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
CBLOCK 100
SEGUNDO
MINUTO
HORA
DIA
MES
AÑO
CT_TIEMPO
BYTE_DE_CONTROL
CONTENIDO
DIRECCION
DIRECCION_H ;almacena la direccion de la EEPROM a acceder
DIRECCION_L ;almacena la direccion de la EEPROM a acceder
TXBUF ;posicion que alamcena los byytes a enviar
FALLA ;tipo de error
TEMP
TEMP2
ENDC
;************************************************************************************************
;************************************************************************************************
ORG 0X0000
GOTO INICIO
ORG 0X0020
;************************************************************************************************
;************************************************************************************************
;
INICIO CLRF ADCON0
MOVLW 0X0F
MOVWF ADCON1
MOVLW 0X07
MOVWF CMCON
CLRF TRISA
MOVLW 0X01
MOVWF TRISB
CLRF TRISD
CLRF TRISE
MOVLW 0XC7
MOVWF T0CON
MOVLW 0X01
MOVWF BSR
;**********************
INICIAR_I2C
MOVLW 0X18
MOVWF TRISC;SDA Y SCL CMO ENTRADAS
MOVLW 0X0C
MOVWF SSPADD;PARA 308KHZ CON OSC 4MHZ
MOVLW 0X80
MOVWF SSPSTAT
MOVLW 0X28
MOVWF SSPCON1
CLRF SSPCON2
CALL I2C_LIBERAR
;**********************
INICIAR_DS1307
MOVLW 0X15 ;MOVF SEGUNDOS,W
MOVWF CONTENIDO
CLRF DIRECCION ;CARGO SEGUNDOS 00
CALL ESCRIBIR_DS1307
MOVLW 0X08 ;MOVF MINUTOS,W
MOVWF CONTENIDO
INCF DIRECCION,F
CALL ESCRIBIR_DS1307
MOVLW 0X04 ;MOVF HORAS,W
MOVWF CONTENIDO
INCF DIRECCION,F
CALL ESCRIBIR_DS1307
INCF DIRECCION,F
MOVLW 0X03 ;CARGO DIA lunes
MOVWF CONTENIDO
CALL ESCRIBIR_DS1307
INCF DIRECCION,F
MOVLW 0X07 ;CARGO DATO DEL DIA 02
MOVWF CONTENIDO
CALL ESCRIBIR_DS1307
INCF DIRECCION,F
MOVLW 0X03 ;CARGO MES FEBRERO
MOVWF CONTENIDO
CALL ESCRIBIR_DS1307
INCF DIRECCION,F
MOVLW 0X81 ;CARGO AÑO 2005
MOVWF CONTENIDO
CALL ESCRIBIR_DS1307
INCF DIRECCION,F
MOVLW 0X10 ;ENCIENDO EL OSCILADOR A 1Hz
MOVWF CONTENIDO
CALL ESCRIBIR_DS1307
;************************************************************************************************
CLRF LATA
CLRF LATB
CLRF LATC
CLRF LATD
CLRF LATE
;************************************************************************************************
MOVLW D'16'
CALL TIEMPO
ESPERA BTFSS PORTB,0
GOTO $-2
CLRF DIRECCION
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF SEGUNDO
INCF DIRECCION,F
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF MINUTO
INCF DIRECCION,F
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF HORA
INCF DIRECCION,F
INCF DIRECCION,F
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF DIA
INCF DIRECCION,F
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF MES
INCF DIRECCION,F
CALL LEER_DS1307
MOVF CONTENIDO,W,1
MOVWF AÑO
BTFSC PORTB,0
GOTO $-2
GOTO ESPERA
;
;************************************************************************************************
; Rutina de Tiempo General
;************************************************************************************************
;
TIEMPO MOVWF CT_TIEMPO
CLRF TMR0L
BTFSS INTCON,TMR0IF
GOTO $-2
BCF INTCON,TMR0IF
DECFSZ CT_TIEMPO,F
GOTO TIEMPO+2
RETURN
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;************************************************************************************************
;
;
; RUTINAS PARA EL MANEJO DEL MODULO I2C EN MODO MASTER
;
;
;************************************************************************************************
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
I2C_LIBERAR
BTFSC SSPSTAT,R_W
GOTO $-2
MOVF SSPCON2,W,0
ANDLW 0X1F
BTFSS STATUS,Z
GOTO $-6
RETURN
;************************************************************************************************
; Escribir al DS1307
;************************************************************************************************
ESCRIBIR_DS1307
CALL BIT_START
MOVLW 0XD0
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
MOVF DIRECCION,W,1
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
MOVF CONTENIDO,W,1
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
CALL BIT_STOP
RETURN
FALLA_ESCRIBIR_DS1307
CALL BIT_STOP
GOTO ESCRIBIR_DS1307
;************************************************************************************************
; Leer del DS1307
;************************************************************************************************
LEER_DS1307
CALL BIT_START
MOVLW 0XD0;ESCRITURA
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
MOVF DIRECCION,W,1
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
CALL BIT_RESTART
MOVLW 0XD1;LECTURA
CALL I2C_TX
BTFSS FALLA,0
GOTO FALLA_ESCRIBIR_DS1307
CALL I2C_RX
CALL BIT_NACK
CALL BIT_STOP
RETURN
FALLA_LEER_DS1307
CALL BIT_STOP
GOTO ESCRIBIR_DS1307
;************************************************************************************************
I2C_GRABAR_PAGINA
CALL BIT_START ;llamada a subprograma que genera y comprueba bit de start.
MOVF BYTE_DE_CONTROL,W,1 ;cargamos en TXBUF la direccion de la EEPROM como esclavo que sera lo
CALL I2C_TX ;entonces el direccionamiento sera: 1010 000 0
BTFSS FALLA,0 ;donde el ultimo bit es el 0 de escritura
RETURN
MOVF DIRECCION_H,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
MOVF DIRECCION_L,W,1
CALL I2C_TX
RETURN
I2C_GRABAR
CALL BIT_START ;llamada a subprograma que genera y comprueba bit de start.
MOVF BYTE_DE_CONTROL,W,1 ;cargamos en TXBUF la direccion de la EEPROM como esclavo que sera lo
CALL I2C_TX ;entonces el direccionamiento sera: 1010 000 0
BTFSS FALLA,0 ;donde el ultimo bit es el 0 de escritura
RETURN
MOVF DIRECCION_H,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
MOVF DIRECCION_L,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOVF CONTENIDO,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
CALL BIT_STOP
RETURN
;************************************************************************************************
I2C_LEER
CALL BIT_START
MOVF BYTE_DE_CONTROL,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
MOVF DIRECCION_H,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
MOVF DIRECCION_L,W,1
CALL I2C_TX
BTFSS FALLA,0
RETURN
CALL BIT_RESTART
MOVF BYTE_DE_CONTROL,W,1
IORLW 0X01;LECTURA
CALL I2C_TX
BTFSS FALLA,0
RETURN
CALL I2C_RX
CALL BIT_NACK
CALL BIT_STOP
RETURN
;************************************************************************************************
;************************************************************************************************
BIT_START
CALL I2C_LIBERAR
BSF SSPCON2,SEN
BTFSC SSPCON2,SEN
GOTO $-2;1
BTFSS PIR1,SSPIF
GOTO $-2;1
BCF PIR1,SSPIF
RETURN
;************************************************************************************************
BIT_RESTART
BSF SSPCON2,RSEN
BTFSC SSPCON2,RSEN
GOTO $-2;$-1
RETURN
;************************************************************************************************
BIT_ACK BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
RETURN
;************************************************************************************************
BIT_NACK
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BTFSC SSPCON2,ACKEN
GOTO $-2
RETURN
;************************************************************************************************
BIT_STOP
BSF SSPCON2,PEN
BTFSC SSPCON2,PEN
GOTO $-2
CLRF TEMP
DECFSZ TEMP,F
GOTO $-2
RETURN
;************************************************************************************************
;************************************************************************************************
I2C_TX BCF FALLA,0
MOVWF SSPBUF ;Carga el valor a enviar en el buffer y se inicia el envio de los datos
BTFSC SSPSTAT,R_W ;Continua con el programa solo si es completada la transmision
GOTO $-2
NOP
BTFSS SSPCON2,ACKSTAT ;Solo continua si llaga el ACK
GOTO TX_CONFIRMADO
BSF SSPCON2,PEN
CALL I2C_LIBERAR
RETURN
TX_CONFIRMADO
BTFSS PIR1,SSPIF;NOVENO CLOCK
GOTO $-2
BCF PIR1,SSPIF
BSF FALLA,0
CALL I2C_LIBERAR
RETURN
;************************************************************************************************
I2C_RX ;CALL I2C_LIBERAR
BSF SSPCON2,RCEN
BTFSC SSPCON2,RCEN
GOTO $-2;$-1
BTFSS SSPSTAT,BF
GOTO $-2;$-1
MOVF SSPBUF,W,0
MOVWF CONTENIDO
RETURN
;************************************************************************************************
;************************************************************************************************
;************************************************************************************************
;************************************************************************************************
END