;***************************** Librería "RS232.INC" *************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de la transmisión
; seríe asincrona según normas RS-232.
;
; Los parámetros adoptados para la comunicación son los siguientes:
; - Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.
; - Sin paridad.
; - Dos bits de final o Stop a nivel alto.
;
; El tiempo entre bit y bit  debe coincidir con el periodo de la señal leída o enviada.
; Como la velocidad de transmisión o recepción es de 9600 baudios, el periodo será:
; 1/9600 Baudios = 104 µs. Se utilizará pues la subrutina Retardos_100micros.

	CBLOCK
	RS232_ContadorBits
	RS232_Dato
	ENDC

#DEFINE  RS232_Entrada	PORTA,4		; Línea por la que se reciben los datos.
#DEFINE  RS232_Salida	PORTA,3		; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.

RS232_Inicializa
	bsf	RS232_Salida				; Al principio salida en alto para resposo.
	bsf	STATUS,RP0
	bsf	RS232_Entrada				; Esta línea se configura como entrada.
	bcf	RS232_Salida				; Esta línea se configura como salida.
	bcf	STATUS,RP0
	return

; Subrutina "RS232_LeeDato" -------------------------------------------------------------
;
; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor
; peso. El dato leído se envía finalmente en el registro de trabajo W.
;
; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no 
; envía información. La secuencia utilizada es:
; 1º	Espera que se ejecute el pulso negativo del bit Start o flanco de bajada.
; 2º	Deja pasar un tiempo una y media veces mayor que el periodo de transmisión para
;		saltarse el bit de Start y lee el primer bit en su mitad.
; 3º	Lee el resto de los bits de datos, esperando un tiempo igual a la duración del
;		período entre lectura y lectura para testearlos en mitad del bit.
;
; Salida: En el registro de trabajo W el byte leído.

RS232_LeeDato
	movlw	d'8'					; Número de bits a recibir.
	movwf	RS232_ContadorBits
RS232_EsperaBitStart
	btfsc	RS232_Entrada 			; Lee la entrada y espera a que sea "0".
	goto	RS232_EsperaBitStart	; No, pues espera el nivel bajo.
	call 	Retardo_100micros		; El primer bit debe leerlo un tiempo igual a una
	call 	Retardo_50micros 		; vez y media el periodo de transmisión.
RS232_LeeBit
	bcf		STATUS,C				; Ahora lee el pin. En principio supone que es 0.
	btfsc	RS232_Entrada			; ¿Realmente es cero?
	bsf		STATUS,C				; No, pues cambia a "1".
	rrf		RS232_Dato,F			; Introduce el bit en el registro de lectura.
	call	Retardo_100micros		; Los siguientes bits los lee un periodo más tarde.
	decfsz 	RS232_ContadorBits,F	; Comprueba que es el último bit.
	goto	RS232_LeeBit			; Si no es el último bit pasa a leer el siguiente.
	call	Retardo_200micros		; Espera un tiempo igual al los 2 bits de Stop.
	movf	RS232_Dato,W			; El resultado en el registro W.
	return	

; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------
;
; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor
; peso. En dato enviado será el que le llegue a través del registro de trabajo W.
; 1º.	Envía un "0" durante un tiempo igual al periodo de la velocidad de transmisión.
;		Este es el bit de "Start".
; 2º.	Envía el bit correspondiente:
; 		- Si va a enviar un "0" permanece en bajo durante el periodo correspondiente.
;		- Si va a escribir un "1" permanece en alto durante el periodo correspondiente.
; 3º.	Envía dos bits "1" durante un tiempo igual al período de la velocidad de 
;		transmisión cada uno. Estos son los dos bits de Stop.
;
; Entrada:	En (W) el dato a enviar.

RS232_EnviaNumero					; Envía el código ASCII de un número.
	addlw	'0'						; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
	movwf	RS232_Dato				; Guarda el contenido del byte a transmitir.
	movlw	d'8'					; Este es el número de bits a transmitir.
	movwf	RS232_ContadorBits
	bcf		RS232_Salida			; Bit de Start.
	call	Retardo_100micros
RS232_EnviaBit						; Comienza a enviar datos.
	rrf		RS232_Dato,F			; Lleva el bit que se quiere enviar al Carry para
	btfss	STATUS,C				; deducir su valor. ¿Es un "1" el bit a transmitir?
	goto	RS232_EnviaCero			; No, pues envía un "0".
RS232_EnviaUno
	bsf		RS232_Salida			; Transmite un "1".
	goto	RS232_FinEnviaBit
RS232_EnviaCero
	bcf		RS232_Salida			; Transmite un "0".
RS232_FinEnviaBit
	call	Retardo_100micros		; Este es el tiempo que estará en alto o bajo.
	decfsz 	RS232_ContadorBits,F	; Comprueba que es el último bit.
	goto	RS232_EnviaBit			; Como no es el último bit repite la operación.
	bsf		RS232_Salida			; Envía dos bits de Stop.
	call	Retardo_200micros
	return
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
