;
;					EJEMPLO 41
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Micro'PIC Trainer Plus
;
;El módulo USART. Recepción asíncrona. 
;
;El módulo USART de los dispositivos PIC16F87X incorpora el hardware necesario para implemen-
;tar comunicación serie asíncrona full-duplex o sincrona half-duplex. En este último caso el
;USART se puede comportar como Master o Slave.
;
;En los ejemplos siguientes se propone utilizar un PC para que, con el software TERMINAL.EXE,
;actúe como un simple terminal de comunicaciones. EL usuario deberá preparar los cables de
;comunicación entre la Trainer PLUS y el PC, teniendo en cuenta de cruzar las señal de
;transmisión (TxD) con la de recepción (RxD) y viceversa.
;
;En el ejemplo se provoca una interrupción cada vez que se recibe un carácter vía serie. El
;programa de tratamiento visualiza, sobre los leds de la Trainer conectados a la Puerta B,
;el código binario del carácter recibido. Igualmente retransmite el carácter recibido, a 
;modo de ECO.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción
		goto	Inter

;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

Tx_Dato		bcf	PIR1,TXIF	;Restaura el flag del transmisor
		movwf	TXREG		;Almacena el byte a transmitir
		bsf	STATUS,RP0
Tx_Dato_Wait	btfss	TXSTA,TRMT	;Byte transmitido ??
		goto	Tx_Dato_Wait	;No, esperar
		bcf	STATUS,RP0
		return			;Si

;******************************************************************************************
;Tratamiento de la interrupción

Inter		btfss	PIR1,RCIF	;Ha sido interrupción en la recepción ??
		retfie			;No, falsa interrupción
		bcf	PIR1,RCIF	;Si, restaurar el flag de interrupción
		movf	RCREG,W		;Lee el dato recibido
		movwf	PORTB		;Lo saca por la puerta B
		call	Tx_Dato		;Lo retransmite a modo de eco
		retfie

;*******************************************************************************************
;Programa principal

Inicio	     	clrwdt
		clrf	PORTC		
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	PORTB		;Puerta B salida
		movlw	b'10111111'
		movwf	TRISC		;RC7/Rx entrada, RC6/Tx salida
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT

		movlw	b'00100100'	
		movwf	TXSTA		;TX en On, modo asíncrono con 8 bits y alta velocidad
		movlw	.25
		movwf	SPBRG		;9600 baudios con Fosc=4MHz
		bsf	PIE1,RCIE	;Habilita interrupción en la recepción
		bcf	STATUS,RP0	;Selecciona banco 0
		
		movlw	b'10010000'
		movwf	RCSTA		;USART en On, recepción contínua
		bsf	INTCON,PEIE	;Activa interrupción de periféricos
		bsf	INTCON,GIE	;Activa interrupciones

Loop		clrwdt
		goto	Loop

		end			;Fin del programa fuente
