;PROGRAMA QUE REALIZA EL PROTOCOLO DE COMUNICACION I2C EN MODO MAESTRO


  	    LIST P=PIC18F45J10
       include   <p18F45J10.inc> 

config DEBUG   = OFF
config XINST   = OFF
config STVREN  = ON          ; Stack Overflow/Underflow Reset = encendido        
config WDTEN   = OFF         ; Watchdog apagado
config CP0     = OFF         ; Code protection deshabilitados        
config FCMEN   = OFF         ; fail safe clock monitor
config IESO    = OFF
config FOSC2   = ON
config FOSC    = HS          ; Osc section bits
config WDTPS   = 1
config CCP2MX  = DEFAULT


VARIA		EQU	0x01
AUX1		EQU 0x02
AUX2		EQU 0x03

			org     0000H
			goto    INICIO
			ORG		0008H
			
			MOVLW	B'01000000'		;DIRECCION DEL ESCLAVO
			MOVWF	SSP2ADD
			MOVLW	B'00110110'		;HABILITA MODULO I2C EN MODO ESCLAVO
			MOVWF	SSP2CON1
			CALL	INTERR
			MOVLW	B'00101000'		
			MOVWF	SSP2CON1,0		;Vuelvo a ACTIVAR MODO I2C como MASTER
			MOVLW	.9
			MOVWF	SSP2ADD,0			;VELOCIDAD ESTANDAR 100KH
			MOVLW	B'11000000'		;Habilito las interrupciones.
			MOVWF	INTCON		
			RETURN

			ORG		0100H

		
INICIO
			MOVLW	B'00000000'
			MOVWF	OSCCON ,0
			MOVLW	B'00000000'
			MOVWF	OSCTUNE ,0

			movlw 	b'01000111'		;configuracion del TMR0 Preescaler 1:256
			movwf	T0CON,0

;Configuracion de interrupciones
			BCF		RCON,IPEN,0		;Deshabilitado prioridad de interrupciones.
			BSF		INTCON,7,0		;Habilita interrupciones con su bit habilitador activado
			BCF		INTCON,6,0		;Deshabilita interrupciones de perifericos

			MOVLW	B'1000000'		;Desactivo r de pull-up de la puerta B y asigno Prioridad Baja a todos lo perifericos
			MOVWF	INTCON2,0		; y al TMR0.

			CLRF	INTCON3,0		;Desactivo interrupciones externas.
			
			BSF		PIE3,SSP2IE,0	;Master Synchronous Seria Port 2 interrupt enable.

			MOVLW	B'00000011'		;CONFIG COMO I2C_RD0,RD1
			MOVWF	TRISD,0
			CLRF	TRISB,0
			MOVLW	B'00000111'
			MOVWF	TRISC,0
			CLRF	PORTB,0
			CLRF	PORTC,0
			MOVLW	B'10000000'		;DATOS SE MUESTRAN AL FINAL DEL PERIODO
			MOVWF	SSP2STAT,0			
			MOVLW	.9
			MOVWF	SSP2ADD,0			;VELOCIDAD ESTANDAR 100KH

			CLRF	AUX1,0			;CONTADOR INICIA EN CERO
			MOVLW	B'00101000'		
			MOVWF	SSP2CON1,0		;ACTIVAR MODO I2C
			BSF		PORTB,7,0
COMP
			BTFSS	PORTC,0,0
			GOTO	COMP
			GOTO	DATO1
			BTFSS	PORTC,1,0
			GOTO	COMP
			GOTO	DATO2
			

OTHER		CALL	START			;CONDICION DE INICIO
			CALL	RETARDO1
			MOVLW	B'01100000'		;DIRECCION MICRO ESCLAVO (1)
			CALL	SEND			;ENVIA DIRECCION
			CALL	RETARDO1
			CALL	DATO1			;DATO QUE SE VA A ENVIAR AL MICRO ESCLAVO (1)
			CALL	SEND			;ENVIA DATO
			CALL	RETARDO1
;			CALL	RSTART			;CONDICION DE REINICIO
;			MOVLW	B'01000001'		;DIRECCION MICRO ESCLAVO (2)
;			CALL	SEND			;ENVIA DIRECCION
;			CALL	DATO2			;DATO QUE SE VA A ENVIAR AL MICRO ESCLAVO (2)
;			CALL	SEND			;ENVIA DATO
;			CALL	DELAY			;TIEMPO DE RETARDO PARA ENVIAR EL SIGUIENTE DATO
;			CALL	RSTART			;CONDICION DE REINICIO
			CALL	STOP
			GOTO	OTHER



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA QUE GENERA LA CONDICION DE INICIO
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
START		BCF		PIR3,7			;CLAREA BANDERA I2C		
			BSF		SSP2CON2,0		;ENVIA BIT DE INICIO
START_W		BTFSS	PIR3,7			;TERMINO LA CONDICION DE INICIO
			GOTO	START_W	
			RETURN
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA PARA REPETIR LA CONDICION DE INICIO
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RSTART		BCF		PIR3,7			;CLAREA BANDERA I2C
			BSF		SSP2CON2,1		;ENVIA BIT DE INICIO

RSTART_W	BTFSS	PIR3,7			;TERMINO LA CONDICION DE INICIO
			GOTO	START_W	
			RETURN
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA PARA ENVIAR LA DIRECCION O DATOS A LOS MICROCONTROLADORES ESCLAVOS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SEND		BCF		PIR3,7	;CLAREA BANDERA
			MOVF	AUX1,W,0		
			MOVWF	SSP2BUF,0			;CARGA VALOR A ENVIAR POR EL BUS
SEND_W		BTFSS	PIR3,7			;TERMINO EL ENVIO
			GOTO	SEND_W
			RETURN			
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA PARA GENERAR DATOS Y ENVIARLOS A LOS MICROCONTROLADORES ESCLAVOS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DATO1		MOVLW	B'00111001'			;ENVIA UNA SECUENCIA DE CONTEO AL MICRO ESCLAVO
			MOVF	AUX1,0			;Y ESTE LO MUESTRA POR PUERTO B. CONTEO ASCENDENTE
			GOTO	OTHER
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA PARA GENERAR DATOS Y ENVIARLOS A LOS MICROCONTROLADORES ESCLAVOS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DATO2		MOVLW	B'11000110'			;ENVIA UNA SECUENCIA DE CONTEO AL MICRO ESCLAVO
			MOVF	AUX1,0			;Y ESTE LO MUESTRA POR PUERTO B. CONTEO ASCENDENTE
			GOTO	OTHER
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA QUE GENERA LA CONDICION DE PARADA
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
STOP		BCF		PIR3,7			;CLAREA BANDERA I2C
			BSF		SSP2CON2,2		;ENVIA CONDICION DE PARADA	
STOP_W		BTFSS	PIR3,7			;TERMINO CONDICION DE PARADA
			GOTO	STOP_W	
			RETURN	
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTINA DE RETARDO PARA ENVIAR EL SIGUIENTE DATO
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;**************************************************************************************************
; Retardo DE 32 ms
;**************************************************************************************************
Retardo

			BSF		T0CON,TMR0ON,0
			clrf	TMR0L,0				; Ponemos a 0 el Timer0
			bcf		INTCON,TMR0IF,0


Explora		btfss	INTCON,TMR0IF,0		; Comprobamos si el bit 7 de T0=1, salta=1
			goto	Explora				; Es 0, salta a explora
			decfsz	VARIA,f,0			; T0=1 por tanto decrementamos VARIA, salta=0
			goto	Retardo			; VARIA nos es 0 por tanto salta a Retardo
			BCF 	T0CON,TMR0ON,0
			return

;**************************************************************************************************
; RETARDO DE 1 s
;**************************************************************************************************
RETARDO1
			movlw	.32				; Veces que se repite la rutina de 32ms
			movwf	VARIA,0		; Cargamos un valor en la variable VARIA
			call	Retardo
			return

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

INTERR

			BTFSS	PIR3,7,0		;PREGUNTA INTERR I2C
			RETURN	
			BCF		PIR3,7,0			;PONE A 0 BANDERA DE INTERR I2C
			BTFSC	SSP2STAT,5,0
			GOTO	DATOS

DIRECCION	BCF		SSP2STAT,0,0		;CLAREA LA BANDERA BF
			CLRF	SSP2BUF,0			;CLAREA LA DIRECCION RECIBIDA
			BCF		SSP2CON1,6,0		;CLAREA LA BANDEERA SSPOV
			RETURN

DATOS		BCF		SSP2STAT,0,0		;CLAREA LA BANDERA BF
			MOVF	SSP2BUF,0,0		;MUEVE EL DATO RECIBIDO AL WORK
			MOVWF	PORTB,0			;MUESTRA EL DATO POR EL PUERTO B
			CLRF	SSP2BUF,0
			BCF		SSP2CON1,6,0		;SE CLAREA LA BANDERA SSPOV
			RETURN

	END				
