;
;rs232_2.asm
;Este ejemplo envia varios mensajes al programa terminal del ordenador,
;si se recibe "CR" desde el terminal se repite el envio    

;Ejemplo de comunicación RS232 entre un pic16F84 y ordenador PC  
;La configuración es el estandar 8N1 (8 bits de datos, sin paridad, 
;y 1 bit de stop) y la velocidad de comunicación es de 9600 Bd. 


	list	p=16f84		;modelo de pic utilizado
	include	"p16f84.inc"	;Definición de registros
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración	
			
;Constantes de los parámetros para las rutinas de comunicación 

BAUDIOS		equ	.9600     	;Velocidad de comunicación
CLKIN		equ	.4000000	;Frecuencia de trabajo en c/s
T_MODO		equ	1		;transmitir primero el bit LSB
R_MODO		equ	1		;recibe primero el bit LSB
T_Nbit		equ	8		;transmitir datos de 8 bits
R_Nbit		equ	8		;recibe datos de 8 bits
Sbit		equ	1		;un bit de stop
												
;Espacio para el bloque de variables de las rutinas rs232.inc  

Rs232_var	equ	0x0C	;Inicio del bloque de variables reservadas
				;para las rutinas RS232.INC

;Registros para las variables de programa principal

TEMPORAL_0	equ	0x11
TEMPORAL_1	equ	0x12


		org	0x00
		goto 	INICIO
		org	0x05
				
		include	"rs232.inc"	;Rutinas de comunicación RS232
		
;Tablas de mensajes que se enviarán al programa terminal

TABLA_MENSAJES
		movwf	PCL		;mueve puntero hacia una tabla

M_0		equ	$
		dt	"CURSO MICROCONTROLADORES PIC",0x0D,0x0A,0x00
M_1		equ	$
		dt	"ESTE MENSAJE SE ENVIA VIA RS232",0x0D,0x0A,0x00
M_2		equ	$
		dt	"CADA VEZ QUE SE RECIBE -CR-",0x0D,0x0A,0x00
M_3		equ	$
		dt	"DESDE EL PROGRAMA TERMINAL",0x0D,0x0A,0x00

;Subrutina universal de envio de mensajes

MENSAJE		movwf	TEMPORAL_0
MENSAJE_1	movf	TEMPORAL_0,W
		call	TABLA_MENSAJES
		movwf	TEMPORAL_1
		movf	TEMPORAL_1,F
		btfss	STATUS,Z
		goto	NO_ULTIMO
		return
NO_ULTIMO	movwf	Txdreg
		call	TxD
		incf	TEMPORAL_0,F
		goto	MENSAJE_1

;Bucle del programa principal

INICIO		bsf	STATUS,RP0    	;Selecciona página 1
		movlw	b'11101111'	;RB5 entrada y RB4 salida
		movwf	TRISB		;RB5=RxD RB4=TxD
		bcf	STATUS,RP0	;Seleccionar página 0
				
		bsf	Txd_pin		;Línea de transmisión a "1"
		bsf	Rxd_pin		;Línea de recepción a "1"

BUCLE		movlw	M_0
		call	MENSAJE		;transmite primera tabla
		movlw	M_1
		call	MENSAJE		;transmite segunda tabla
		movlw	M_2
		call	MENSAJE		;transmite tercera tabla
		movlw	M_3
		call	MENSAJE		;transmite cuarta tabla
		
;Espera a recibir un CR desde el terminal
		
ESPERA		call	RxD		;llama a la rutina de RX
		movlw	.13		
		subwf	Rxdreg,W	;ha recibido un "CR" ?
		btfss	STATUS,Z		
		goto	ESPERA		;No, espera a recibir 
		movlw	.13		;Si, envia un CR
		movwf	Txdreg
		call	TxD
		movlw	.10		;envia avance de linea
		movwf	Txdreg
		call	TxD
		movlw	.13		;Si, envia un CR
		movwf	Txdreg
		call	TxD
		movlw	.10		;envia avance de linea
		movwf	Txdreg
		call	TxD
		goto	BUCLE		;y vuelve a enviar mensajes

		end
    