;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 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 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=16F877A ;Tipo de procesador
include "P16F877A.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
;AQUI TU PROGRAMA
;para enviar datos sólo carga W con el valor a enviar y llama a la subrutina Tx_Dato
; Por ejemplo
MOVLW 0x55
call Tx_dato
;Lo recibido te lo guarda automáticamente en el registro RCREG y te lo muestra por puerto B
goto Loop
end ;Fin del programa fuente