;
;					EJEMPLO 3.8
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS. Comunicación serie gestionada por software.
;
;Haciendo uso de las rutinas incluidas en el fichero RS232LOW.INC, se trata de utilizar el
;canal RS232 de la Trainer PLUS para comunicar vía serie con diferentes periféricos. En los
;ejemplos aquí propuestos se utilizará un PC para que, con el software TERMINAL.EXE, actue
;como un simple terminal de comunicaciones. El usuario deberá preparar los cables de comuni-
;cación entre la Trainer PLUS y el PC, teniendo en cuenta de cruzar la señal de Transmisión
;(TxD) con la de recepción (RxD) y viceversa.
;
;Este programa pretende mostrar el envío de mensajes desde el PIC de la uPIC Trainer, a través
;del canal serie de la Trainer PLUS, hacia el terminal. Cada vez que se pulse RETURN, se 
;repite el envío de los mismos mensajes. Se emplea una rutina de salida de mensajes similar 
;a la empleada en los ejemplos del LCD.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

CLKIN		equ	.4000000	;Frecuencia de trabajo
BAUDIOS		equ	.9600		;Velocidad de comunicación
T_MODO		equ	1		;Transmite primero bit LSB
R_MODO		equ	1		;Recibir primero bit LSB
T_Nbit		equ	8		;Transmite caracteres de 8 bits
R_Nbit		equ	8		;Recibe caracteres de 8 bits
Sbit		equ	2		;Transmite 2 bits de stop
                 
Rs232_var	equ	0x0c		;Inicio de las variables para rutinas RS232
Temporal_1	equ	0x11		;Variable temporal
Temporal_2	equ	0x12		;Variable temporal
				
		org	0x00		;Vector de reset
		goto	Inicio
		org	0x05		;Salvar el vector de interrupción	
					
		include	"RS232LOW.INC"	;Incluir rutinas de comunicación
						
;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes	movwf	PCL		;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga

Mens_0		equ	$		;Mens_0 apunta al primer carácter del mensaje 0
		dt	"Microsystems Engineering",0x0d,0x0a,0x00

Mens_1		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"Gral. Concha 39 48012 Bilbao",0x0d,0x0a,0x00

Mens_2		equ	$		;Mens_2 apunta al primer carácter del mensaje 2
		dt	"Tfno./Fax 94 4223263",0x0d,0x0a,0x00

;*************************************************************************************
;Mensaje: Esta rutina envía vía serie RS232 el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje         movwf   Temporal_1      ;Salva posición de la tabla
Mensaje_1       movf    Temporal_1,W    ;Recupera posición de la tabla
                call    Tabla_Mensajes  ;Busca caracter de salida
                movwf   Temporal_2      ;Guarda el caracter
                movf    Temporal_2,F
                btfss   STATUS,Z        ;Mira si es el último
                goto    No_es_ultimo
                return
No_es_ultimo    movwf	Txdreg
		call    TxD		;Transmite el carácter
                incf    Temporal_1,F    ;Siguiente caracter
                goto    Mensaje_1


Inicio:		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'10001111'	;Preescaler de 128 para el WDT. Pull_Up Off
		movwf	OPTION_REG	
		movlw	b'11101111'
		movwf	TRISB		;RB5 entrada y RB4 salida		
		bcf	STATUS,RP0	;Selecciona página 0 de datos	
				
Loop		clrwdt
		movlw	Mens_0
		call	Mensaje		;Visualiza el mensaje 0

		movlw	Mens_1
		call	Mensaje		;Visualiza el mensaje 1

		movlw	Mens_2
		call	Mensaje		;Visualiza el mensaje 2

No_CR		clrwdt
		call	RxD		;Espera recibir un carácter
		movlw	.13
		subwf	Rxdreg,W
		btfss	STATUS,Z	;Ha sido CR ??
		goto	No_CR		;No
		movlw	0x0a
		movwf	Txdreg
		call	TxD
		movlw	0x0a
		movwf	Txdreg
		call	TxD		;Envía 2 avances de línea (cod. 0x0a)

		goto	Loop
		
		end			;Fin del programa fuente

