;
;					EJEMPLO 32
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Micro'PIC Trainer Plus
;
;El módulo MSSP. Modo I2C Master. Trama de transmisión
;
;El módulo SSP de los dispositivos PIC16F87X incorpora por hardware el interface I2C tanto
;en el modo Master como en el modo Slave. Las líneas RC3/SCL y RC4/SDA actúan como señales
;de reloj y datos del bus I2C respectivamente.
;
;El dispositivo I2C PCF8574. Puerto de E/S de 8 bits
;
;El ejemplo lee el estado de los interruptores RA0-RA4 de Micro'PIC Trainer y lo visualiza
;sobre los leds que pilota el dispositivo I2C PCF8574. Dichos leds están complementados.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;Send_Start: Envía la condición de inicio

Send_Start	bcf	PIR1,SSPIF
		bsf	STATUS,RP0	;Seleciona página 1
		bsf	SSPCON2,SEN	;Activa secuencia de inicio
		bcf	STATUS,RP0
Start_Wait	btfss	PIR1,SSPIF	;Fin de secuencia de inicio ??
		goto	Start_Wait	;No, esperar		
		return

;Send_Stop: Envía la secuencia de stop

Send_Stop	bcf	PIR1,SSPIF
		bsf	STATUS,RP0	;Seleciona página 1
		bsf	SSPCON2,PEN	;Activa secuencia de stop
		bcf	STATUS,RP0
Stop_Wait	btfss	PIR1,SSPIF	;Fin de secuencia de Stop ??
		goto	Stop_Wait	;No, esperar
		return

;Send_Byte: Transmite el byte del W vía I2C. La rutina finaliza cuando se recibe /ACK

Send_Byte	bcf	PIR1,SSPIF
		movwf	SSPBUF		;Byte a transmitir pasa al buffer de salida
Send_Byte_Wait	btfss	PIR1,SSPIF	;Recibido el bit /ACK ??
		goto	Send_Byte_Wait	;No, esperar
		return

;Programa principal

Inicio	        clrf	PORTC		
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A digital
		movlw	b'11111111'
		movwf	TRISA		;Puerta A entrada
		movwf	TRISC		;RC3/SCL y RC4/SDA entradas
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		movlw	b'10000000'
		movwf	SSPSTAT		;Velocidad estándar con niveles I2C
		movlw	.9
		movwf	SSPADD		;Velocidad del bus I2C 100KHz
		bcf	STATUS,RP0	;Selecciona banco 0

;Módulo MSSP en el modo Master I2C

		movlw	b'00101000'
		movwf	SSPCON		;Módulo MSSP en On

		call	Send_Start	;Envía condición de inicio
		movlw	b'01110000'
		call	Send_Byte	;Envía byte de dirección del PCF8574
Loop		clrwdt
		comf	PORTA,W		;Lee y complementa el estado de RA0-RA4
		iorlw	b'11100000'
		call	Send_Byte	;Envía al PCF8574
	
		goto	Loop

		end			;Fin del programa fuente
