;
;					EJEMPLO 3.20
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS. Interface I2C gestionado por software.
;
;Haciendo uso de las rutinas incluidas en el fichero I2CLOW.INC, se trata de controlar
;el funcionamiento de los distintos dispositivos I2C, existentes en la tarjeta 
;Trainer PLUS. Estos dispositivos están conectados entre sí al bus I2C común. Se recomienda
;leer las especificaciones técnicas de los mismos, para tener un mayor conocimiento de las
;posibilidades de los mismos. Igualmente es importante desconectar los leds de la uPIC Trainer
;mediante el jumper J7 pues de lo contrario actuarían como carga adicional en las líneas RB6
;y RB7 que, en estos ejemplos, forman el bus I2C.
;
;El dispositivo I2C PCF8591. Convertidor DAC y ADC
;
;El programa lee el resultado de la conversión ADC de la tensión análogica presente en el
;canal 0 del convertidor PCF8591 y lo visualiza sobre los leds de la puerta de salida del
;dispositivo PCF8574. Estos representarán la combinación binaria de la conversión.
;
;Se recomienda conectar un potenciómetro en la borna AN0 de la uPIC'Trainer PLUS para 
;introducir una tensión analógica variable entre 0V y la tensión de referencia que se esté
;empleando.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

CLKIN		equ	.4000000	;Frecuencia de trabajo
                 
I2c_var		equ	0x0c		;Inicio de las variables para rutinas I2C_LOW	
A_inp		equ	0x12		;Resultado de la conversión AD de entrada

		org	0x00		;Vector de reset
		goto	Inicio
		org	0x05		;Salvar el vector de interrupción	

		include	"I2CLOW.INC"	;Incluye las rutinas de manejo del bus I2C
	
;****************************************************************************************
;A_Input: Esta rutina lee el valor binario procedente del canal 0 del ADC contenido en el
;dispositivo I2C PCF8591.

A_Input		call	Txt_Start_Bit	;Transmite secuencia de inicio
		movlw	b'10010001'
		movwf	DataByte
		call	Txt_Byte	;Dirección del PCF8591 (modo lectura)
		bsf	_Ultimo_Byte	;Recibe un único byte cada vez
		call	RcvByte		;Recibe resultado de conversión AD
		call	Txt_Stop_Bit    ;Transmite secuencia de STOP
		movf	DataByte,W
		movwf	A_inp		;Salva valor resultante de la conversión
		return

;**************************************************************************************
;SALIDA: Esta rutina recoge el valor del octeto a sacar y vía I2C lo transmite al PCF
;8574 para que lo represente en los leds conectados a sus líneas de E/S.

SALIDA:		call	Inicia_Bus	;Inicia líneas del bus I2C
		call	Txt_Start_Bit	;Envía condición de inicio
		movlw	b'01110000'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del PCF8574 (escritura)
		comf	A_inp,W		;Complementa el octeto a sacar puesto que
					;los leds pilotos conectados a las líneas
					;son activos por nivel "0"
		movwf	DataByte
		call	Txt_Byte	;Transmite el octeto a sacar.		
		call	Txt_Stop_Bit	;Transmite secuencia de STOP
		return

Inicio:		clrf	PORTA
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'00011111'
		movwf	TRISA		;RA0-RA4 entradas
		clrf	TRISB		;Puerta B salidas
		movlw	b'10000110'	;Preescaler de 128 para el TMR0. Pull_Up Off
		movwf	OPTION_REG				
		bcf	STATUS,RP0	;Selecciona página 0 de datos	

		call	Inicia_Bus	;Inicia el bus I2C
				
Loop:		clrwdt			;Refresca el WDT
		call	A_Input		;Obtiene el valor de la conversión ADC
		call	SALIDA		;Visualiza en los leds gobernados por el PCF8574

		goto	Loop

		end			;Fin del programa fuente

