;
;					EJEMPLO 3.9
;
;				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 ser un simple sistema de monitorización. Se lee el estado de los 
;interruptores RA0-RA4 de la uPIC Trainer y se envía, vía serie a un terminal para monito-
;rizar el estado de los mismos.

		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
Contador	equ	0x11		;Variable contador de bits
Temporal	equ	0x12		;Variable temporal de datos
Blancos		equ	0x13		;Variable con el número de blancos a transmitir
Temporal_1	equ	0x14		;Variable temporal
Temporal_2	equ	0x15		;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						

Mens_0		equ	$		;Mens_0 apunta al primer carácter del mensaje 0
		dt	"RA4 RA3 RA2 RA1 RA0",0x0d,0x0a,0x00
Mens_1		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"--- --- --- --- ---",0x0d,0x0a,0x0a,0x00

;******************************************************************************************
;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

;*************************************************************************************
;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
		movlw	0xff
		movwf	TRISA		;Puerta A entrada
		bcf	STATUS,RP0	;Selecciona página 0 de datos	
		
		movlw	Mens_0
		call	Mensaje		;Salida de mensaje 0
		movlw	Mens_1
		call	Mensaje		;Salida de mensaje 1
		
Loop		clrwdt
		movlw	.5
		movwf	Contador	;Inicia contador de bits
		movf	PORTA,W		;Lee el estado de la puerta A
		andlw	b'00011111'	
		movwf	Temporal	
		rlf	Temporal,F
		rlf	Temporal,F
		rlf	Temporal,F	;Almacena estado de RA4-RA0

Siguiente_bit	rlf	Temporal,F	;Desplaza el bit MSB a carry
		btfsc	STATUS,C	;Es "0" ??
		goto	Es_1		;No, es "1"
Es_0		movlw	'0'		;Código ASCII del "0"
		goto	Enviar
Es_1		movlw	'1'
Enviar		movwf	Txdreg
		call	TxD		;Transmite el código del bit
				
		movlw	.3
		movwf	Blancos
Txd_Blancos	movlw	' '
		movwf	Txdreg
		call	TxD
		decfsz	Blancos,F
		goto	Txd_Blancos

		decfsz	Contador,F	;Se han transmitido los 5 bits ??
		goto	Siguiente_bit	;Todavía no
		
		movlw	.13
		movwf	Txdreg
		call	TxD		;Transmite código de CR
		goto	Loop
		
		end			;Fin del programa fuente

