;
;					EJEMPLO 3.19
;
;				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 explora el teclado de uPIC Trainer Plus y saca por la puerta de salida
;del PCF8574 el valor binario del octeto tecleado. Este valor se verá reflejado en
;los leds de uPIC Trainer Plus que pilotan los niveles lógicos presentes en las líneas
;de E/S. Posteriormente dicho octeto se envía al DAC del PCF8591 que generará una 
;tensión analógica proporcional. Dicha tensión está disponible en la borna Aout de
;uPIC Trainer Plus y podrá ser medida con un polímetro

		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
Key_var		equ	0x12		;Inicio de las variables de manejo del teclado		
A_out		equ	0x18		;Variable analógica de salida

		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
		include "teclado.INC"	;Incluye rutinas de manejo del teclado

;**************************************************************************************
;A_Output: Esta rutina recoge el valor presente en la variable A_out y lo saca por el DAC
;del dispositivo PCF8591

A_Output:	call	Txt_Start_Bit	;Envía condición de inicio
		movlw	b'10010000'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del PCF8591 (escritura)
		movlw	b'01000000'
		movwf	DataByte
		call	Txt_Byte	;Transmite byte de control del PCF 8591
		movf	A_out,W
		movwf	DataByte
		call	Txt_Byte	;Transmite valor a convertir en analógico
		call	Txt_Stop_Bit	;Transmite secuencia de STOP
		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_out,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 A y 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
		clrf	A_out
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop		;No
		call	Key_BCD		;Si.Convierte código de tecla a BCD
		swapf	Tecla,w
		movwf	A_out		;Nible de más peso del octeto a sacar				

Loop_0_1	clrwdt
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfss	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_0_1	;Si, esperar

Loop_1:		clrwdt			;No, ya se leberó la tecla. Refrescar WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_1		;No
		call    Key_BCD		;Si. Convierte código de tecla a BCD
		movf	A_out,W
		iorwf	Tecla,W		;Concatena el 2º nible del octeto a sacar				
		movwf	A_out														
		call	SALIDA		;Salida del octeto a los leds del PCF8574
		call	A_Output	;Salida del octeto a través del DAC del PCF8591

Loop_1_1	clrwdt
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfss	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_1_1	;Si, esperar		

		goto	Loop		;No, la tecla ha sido liberada
			
		end			;Fin del programa fuente

