;
;					EJEMPLO 3.18
;
;				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 saca, mediante el convertidor DAC presente en el dispositivo I2C PCF8591, una
;tensión analógica variable en función del valor binario introducido mediante los interruptores
;RA4-RA0 de entrada. El valor de dichos interruptores se multiplica por 8 para poder llegar 
;al fondo de escala que, debe coincidir con la tensión de referencia.
;
;Se recomienda colocar un voltímetro entre las bornas GND y AOUT del placa uPIC'Trainer PLUS
;para medir las tensiones de salida que proporciona el DAC.

		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

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
		movf	PORTA,W
		andlw	b'00011111'	;Lee el valor introducido por RA4-RA0
		movwf	A_out
		bcf	STATUS,C
		rlf	A_out,F
		rlf	A_out,F
		rlf	A_out,F		;Multiplica el valor leído por 8
		call	A_Output	;Envía al DAC
	
		goto	Loop		;No, ya está desactivada
		
		end			;Fin del programa fuente

