;
;					EJEMPLO 38
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Micro'PIC Trainer Plus
;
;El módulo USART. Transmisió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.
;
;El ejemplo transmite una trama cada segundo con el caracter ASCII de la letra A.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Delay		equ	0x20		;variable de temporización

		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		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 interrupción. Se espera que el TMR0 rebase 20 veces para un delay de 1 s. 
;Entonces se transmite el caracter

Inter		bcf	INTCON,T0IF	;Restaura el flag del TMR0
		movlw	~.195
		movwf	TMR0		;Reponer el TMR0
		decfsz	Delay,F		;Se han provocado 20 rebasamientos de 50mS (1s.) ?
		retfie			;Todavía no

		movlw	.20
		movwf	Delay		;Reponer variable de temporización con el valor 20
		movlw	'A'
		call	Tx_Dato		;Transmite el dato
		retfie

;*******************************************************************************************
;Programa principal

Inicio	     	clrwdt
		clrf	PORTC		
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'10111111'
		movwf	TRISC		;RC7/Rx entrada, RC6/Tx salida
		movlw	b'11000111'
		movwf	OPTION_REG	;Preescaler de 256 asociado al TMR0

		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

		bcf	STATUS,RP0	;Selecciona banco 0
		bsf	RCSTA,SPEN	;USART en On

;Trabajando a 4MHz y con un preescaler de 256, el TMR0 se carga con 195 para conseguir que
;rebase cada 50mS. Esto se repite tantas veces como indique la variable Delay para 
;obtener la temporización final deseada.

		bcf	INTCON,T0IF	;Restaura el flag del TMR0
		movlw	~.195
		movwf	TMR0		;El TMR0 rebasa cada 50 mS
		movlw	.20
		movwf	Delay		;Repetir 20 veces para obtener 1 seg.

		movlw	b'10100000'
		movwf	INTCON		;Habilita interrupción del TMR0

Loop		clrwdt
		goto	Loop

		end			;Fin del programa fuente
