;
;					EJEMPLO 3.17
;
;				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 creciente entre 0 y 5V y vuelta a empezar. Dicha tensión puede ser medida
;mediante un polímetro colocado entre las bormas GND y AOUT de la placa uPIC'Trainer PLUS.
;Si se activa el interruptor de entrada RA0, la tensión Aout pasa a 0V y se mantiene hasta
;desactivar RA0.

		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

;*********************************************************************************
;Delay_20_ms: Rutina de temporización de propósito general. Realiza un delay de 20 mS. 
;Si el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada uS. Si queremos 
;temporizar 20000 uS (20 mS) con un preescaler de 128, el TMR0 deberá contar 156 eventos
;(156 * 128). El valor 156 equivale a 9c hex. y como el TMR0 es ascedente habrá que
;cargar su complemento a 1 (63 hex.).

Delay_20_ms:	bcf	INTCON,T0IF	;Desconecta el flag de rebasamiento
		movlw	0x63		;Complemento hex. de 156
		movwf	TMR0		;carga el TMR0
Delay_20_ms_1	clrwdt			;Refrescar el WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Delay_20_ms_1	;Todavía no
		bcf	INTCON,T0IF	;Ahora si, reponer el flag
		return

Inicio:		clrf	PORTA
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'00000001'
		movwf	TRISA		;RA0 entrada
		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
		clrf	A_out		;Pone salida inicial a 0V		
				
Loop:		clrwdt			;Refresca el WDT
		incf	A_out,F		;Siguiente valor de tensión a sacar
		call	A_Output	;Salida de la tensión analógica por Aout
		call	Delay_20_ms	;Temporización entre un valor y el siguiente

		btfss	PORTA,0		;RA0 activada a "1" ??
		goto	Loop

		clrf	A_out
		call	A_Output	;Pone a 0V la tensión de salida

Wait		clrwdt			;Refrescar el WDT
		btfsc	PORTA,0		;RA0 se mantiene activada ??
		goto	Wait		;Si, seguir esperando
	
		goto	Loop		;No, ya está desactivada
		
		end			;Fin del programa fuente

