;
;					EJEMPLO 3.22
;
;				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 PCF8583. Reloj/calendario en tiempo real más RAM
;
;Se trata de un simple programa que lee los segundos y centésimas de segundo del dispositivo
;PCF8583 para visualizarlos sobre los 4 displays controlados por el SAA1064, con formato
;ss.cc (segundos y centésimas).
;
;Se debe tener en cuenta que como el PCF8583 está permanentemente alimentado, la hora en curso
;siempre se mantiene.

		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
Digito_1	equ	0x18
Digito_2	equ	0x19
Digito_3	equ	0x1a		
Digito_4	equ	0x1b		;Buffer de salida al SAA1064 de los 4 dígitos
N_Bytes		equ	0x1c		;Número de bytes a leer
Dir_Ini		equ	0x1d		;Dirección inicial a leer
Buffer		equ	0x20		;Inicio del buffer donde se depositan los bytes leídos

		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

;**************************************************************************************
;VISUALIZA: Esta rutina recoge el valor de las cuatro variables "Dígito" y las transmi-
;te por el bus I2C para su visualización sobre los displays de uPIC Trainer Plus.

VISUALIZA:	call	Inicia_Bus	;Inicia líneas del bus I2C
		call	Txt_Start_Bit	;Envía condición de inicio
		movlw	b'01110110'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del dispositivo (escritura)
		clrf	DataByte
		call	Txt_Byte	;Transmite byte de instrucción
		movlw	b'01000111'
		movwf	DataByte	
		call	Txt_Byte	;Transmite byte de control
		movf	Digito_1,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 1
		movf	Digito_2,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 2
		movf	Digito_3,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 3
		movf	Digito_4,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 4
		call	Txt_Stop_Bit	;Transmite secuencia de STOP
		return

;*******************************************************************************************
;Lectura: Esta rutina lee desde el dispositivo PCF8583 tantos byte como indique la variable
;N_Bytes a partir de la dirección indicada por la variable Dir_Ini. Los bytes leidos se depo-
;sitan a partir del inicio del buffer (posición 0x30).

Lectura		movlw	Buffer
		movwf	FSR		;Inicia el buffer de recepción
		call	Inicia_Bus	;Inicia líneas del bus I2C
		call	Txt_Start_Bit	;Transmite secuencia de Inicio
		movlw	b'10100000'
		movwf	DataByte		
		call	Txt_Byte	;Transmite dirección del dispositivo (escritura)
		movf	Dir_Ini,W
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección inicial a leer
		call	Txt_Start_Bit	;Transmite secuencia de inicio
		movlw	b'10100001'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del dispositivo (lectura)
Lectura_1	decfsz	N_Bytes,F
		goto	Lec_no_fin
		goto	Lec_fin

Lec_no_fin	bcf	_Ultimo_Byte	;Indica que no es el último byte a leer
		call	RcvByte		;Recibe un byte
		movf	DataByte,W
		movwf	INDF		;Lo almacena en el buffer
		incf	FSR,F		;Apunta a la siguiente dirección del buffer
		goto	Lectura_1	;Siguiente byte a leer

Lec_fin		bsf	_Ultimo_Byte	;Indica que es el último byte a leer
		call	RcvByte		;Recibe el último byte
		movf	DataByte,W
		movwf	INDF		;Lo guarda en el buffer
		call	Txt_Stop_Bit	;Envía secuencia de stop
		return

;*************************************************************************************
;Un_Pack: Esta rutina recoge los dos bytes almacenados en Buffer y Buffer +1 los 
;desempaqueta en 4 dígitos BCD que son convertidos a código 7 segmentos para, posteriormente
;Visualizarlos sobre los displays

Un_Pack		swapf	Buffer+1,W
		call	BCD_7seg
		movwf	Digito_1	;Convierte nibble de más peso de Buffer_H
		movf	Buffer+1,W
		call	BCD_7seg
		movwf	Digito_2	;Convierte nibble de menos peso de Buffer_H
		bsf	Digito_2,7	;Activa punto decimal del dígito 2
		swapf	Buffer,W
		call	BCD_7seg
		movwf	Digito_3	;Convierte nibble de más peso de Buffer_L
		movf	Buffer,W
		call	BCD_7seg
		movwf	Digito_4	;Convierte nibble de menos peso de Buffer_L
		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
		movlw	.1
		movwf	Dir_Ini		;Dirección inicial a leer (la 1)
		movlw	.2
		movwf	N_Bytes		;Número de bytes a leer (2)
		call	Lectura		;Lectura del dispositivo PCF8583
		call	Un_Pack		;Desempaquetar y convertir a 7 segmentos
		call	VISUALIZA	;Visualizar
	
		goto	Loop

		end			;Fin del programa fuente

