;
;					EJEMPLO 33
;
;				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 recepción
;
;El módulo MSSP 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 las entradas al dispositivo I2C PCF8574 y las visualiza sobre
;los leds de la Micro'PIC Trainer conectados RB0-RB7.

		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	;Restaura el flag del módulo MSSP
		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	;Restaura el flag del módulo MSSP
		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	;Restaura el flag del módulo MSSP
		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

;Read_Byte: Lee un byte procedente del dispositivo I2C selecionado y lo devuelve en W
;Seguidamente se genera y transmite el bit /ACK

Read_Byte	bcf	PIR1,SSPIF	;Restaura el flag del módulo MSSP
		bsf	STATUS,RP0	;Selecciona página 1
		bsf	SSPCON2,RCEN	;Activa el modo receptor
		bcf	STATUS,RP0	;Selecciona página 0
Read_Wait	btfss	PIR1,SSPIF	;Recibidos los 8 bits ??
		goto	Read_Wait	;No, esperar

		bcf	PIR1,SSPIF	;Restaura el flag del módulo MSSP
		bsf	STATUS,RP0	;Selecciona página 1
		bcf	SSPCON2,ACKDT	;Pone bit ACK a "0"
		bsf	SSPCON2,ACKEN	;Aciva la secuencia de generación del bit ACK
		bcf	STATUS,RP0	;Selecciona página 0
ACK_Wait	btfss	PIR1,SSPIF	;Secuencia ACK finalizada ??
		goto	ACK_Wait	;No, esperar
		movf	SSPBUF,W	;Lee el byte recibido
		return

;Programa principal

Inicio	        clrf	PORTB
		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
		clrf	TRISB		;Puerta B salida
		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'01110001'
		call	Send_Byte	;Envía byte de dirección del PCF8574 (lectura)
Loop		clrwdt
		call	Read_Byte	;Lee el dispositivo PCF8584
		movwf	PORTB		;Visualiza sobre los leds RB0-RB7 de la Trainer
		goto	Loop

		end			;Fin del programa fuente
