Anda di halaman 1dari 8

USART, MODO PUERTO SERIAL ASINCRONO

SISTEMA DE TRANSMISIN ASINCRONA PIC16F877X

TRANSMISIN ASINCRONA

REGISTRO DE ESTADO Y CONTROL DEL SISTEMA TRANSMISOR


DEL USART, MODO ASINCRONO

SISTEMA DE RECEPCIN ASINCRONA PIC16F877X

RECEPCIN ASINCRONA

REGISTRO DE ESTADO Y CONTROL DEL SISTEMA RECEPTOR


DEL USART, MODO ASINCRONO

PROGRAMACIN DEL BAUD RATE DEL USART, MODO ASINCRONO


Reloj Del USART, Modo Asncrono
Bit SYNC
Modo Asncrono

Bit BRGH=0 (Baja velocidad)

BR =

FOSC
64( X + 1)

Bit BRGH=1 (Alta velocidad)

BR =

FOSC
16( X + 1)

X es el valor depositado sobre el registro de baud rate, SPBRG, en el rango de 0 a 255

Por ejemplo, si el usuario programador instala un cristal oscilador de 4MHz y eligiese operar el puerto
serial asncrono con un baud rate de 9600 baudios (bits por segundo), usando la cadena de alta
velocidad, entonces tendra que elegir el bit BRGH=1, en el registro TXSTA, y calcular el valor X,
despejando de la frmula correspondiente; este valor debera de escribirse en el registro SPBRG:

X =
X =

FOSC
1
16 BR

4 10 6
1 = 25.0416 2510 1916
16 9600

Las tablas siguientes hacen el clculo del valor X bastante amigable, solamente elija la que
corresponda a su cristal oscilador y verifique en la columna de la izquierda el baud rate deseado:

;*************************************************************************************************************************************************************
; Programa ejemplo, para enviar un mensaje por el puerto serial asncrono USART del PIC16F877X. El mensaje se repite cuando
; se recibe un caracter 'R'.
;
; Escrito por: David Garca Mora
; Fecha: 07/Agosto/2005
;*************************************************************************************************************************************************************
;
LIST p=16F877X
#INCLUDE "P16F877.INC"
;
;*************************************************************************************************************************************************************
; Variables del programa
;*************************************************************************************************************************************************************
;
ADDRH
EQU
H'110'
; Apuntadores a un mensaje en la memoria de
programa
ADDRL
EQU
H'111'
; en banco 2
;
ORG
H'0000'
; Origen del programa principal
GOTO
MI_PROGRAMA
;
;*************************************************************************************************************************************************************
; Definicin del mensaje 1 de texto, que ser transmitido por el puerto serial asncrono del PIC16F877X
;*************************************************************************************************************************************************************
;
ORG
H'0005'
; Origen para el mensaje en memoria de programa
MENSAJE1:
DT
" Estamos probando la comunicacin por el puerto serial !!!"
; Texto de
mensaje
DW
H'0A'
; Avance de lnea
DW
H'0D'
; Enter o CR
DT
" Si funciona....Aleluya..."
; ms texto
DW
H'0A'
; Avance de lnea
DW
H'0D'
; Otro enter
DW H'0'
; Fin de mensaje
;
;*************************************************************************************************************************************************************
; Programa principal
;*************************************************************************************************************************************************************
;
MI_PROGRAMA:
CALL
PUERTOS
; Configurar patillas de Tx y Rx
CALL
USART_INIT
; Configuracin de Puerto Serial Asncrono
OTRA_VEZ:
CALL
APUNTA_MSG1
; Apuntar al mensaje1 en memoria de programa
CALL
OUTSTRING
; Transmitir una cadena de caracteres de texto
RECIBE:
CALL
INCHAR
; Esperar la recepcin de un carcter por puerto serial
SUBLW
'R'
; Comparar el character recibido con R
BTFSS
STATUS, Z
; Si el character es R, repite mensaje y espera
GOTO
RECIBE
; Si el carcter no es R contina esperango
GOTO
OTRA_VEZ
;
;*************************************************************************************************************************************************************
; Subrutina para configurar los puertos D y E para manejar una pantalla LCD; el puerto D se usar
; para el bus de datos y el puerto E para seales de control
;*************************************************************************************************************************************************************
;
PUERTOS:
BCF STATUS, RP0
BSF STATUS, RP0
; Banco 1
;
BSF
TRISC, 7
; RC7 actuar como lnea de entrada (RX)
BCF
TRISC, 6
; RC6 actuar como lnea de salida (TX)
;
RETURN

;
;*************************************************************************************************************************************************************
; Subrutina para inicializar el USART en modo ASINCRONO, comunicacin FULL DUPLEX, 9600 Baudios, 8 bits de datos
; 1 bit de paro.
;*************************************************************************************************************************************************************
;
USART_INIT:
BSF
STATUS, RP0
BCF
STATUS, RP1
; Banco 1
;
MOVLW
H'19'
; 25d
MOVWF
SPBRG
; Programar el registro de Baud Rate, SPBRG, del
puerto
;
; serial en 9600 Baudios.
MOVLW
B'00100100'
; Transmisin de 8 bits, TX9=0; Transmisor habilitado,
; TXEN=1; Modo asincrono, SYNC=0; Reloj de alta
; velocidad, BRGH=1.
;
MOVWF
TXSTA
; Programar el registro de control y estados del
; transmisor.
;
BCF
STATUS, RP0
; Nos vamos al banco 0...
;
MOVLW
B'10010000'
; Puerto serial habilitado, SPEN=1, Recepcin de 8 bits,
; RX9=0; SREN, no se usa en modo asincrono;
Recepcin
; continua habilitada, CREN=1;Deteccin de bit de
; direccin inhabilitado, ADDEN=0.
MOVWF
RCSTA
; Programar el registro de control y estados del
receptor.
;
RETURN
; Retorno de subrutina
;
;*************************************************************************************************************************************************************
; Subrutina para apuntar al inicio de un mensaje que esta en la memoria de programa
;*************************************************************************************************************************************************************
;
APUNTA_MSG1:
BCF
STATUS, RP0
BSF
STATUS, RP1
; Banco 2
;
MOVLW
H'05'
MOVWF
ADDRL
MOVLW
H'00'
MOVWF
ADDRH
; ADDRH:ADDRL= 0005H, Direccin del primer carcter
; del mensaje...
;
RETURN
;
;*************************************************************************************************************************************************************
; Subrutina OUTSTRING, para transmitir una cadena de caracteres por el puerto serial. La cadena de caracteres esta residente
; en la memoria de programa.
;*************************************************************************************************************************************************************
;
OUTSTRING:
CALL
FMEM_RD
IORLW
H'00'
BTFSC
STATUS, Z
GOTO
FIN_STRING
;
TRANSMITE:
CALL
OUTCHAR
; Transmite por el puerto serial el caracter apuntado...
;
BCF
STATUS, RP0
BSF
STATUS, RP1
; Banco 2
;
MOVLW
H'01'
; Incrementa el apuntador al mensaje...
ADDWF
ADDRL, F
BTFSC
STATUS, C
INCF
ADDRH, F
;
GOTO
OUTSTRING
; Ve a seguir transmitiendo caracteres...
;
FIN_STRING:
RETURN
; Retorno de la subrutina

;
;*************************************************************************************************************************************************************
; Subrutina para leer un dato residente en una posicin de la memoria flash (memoria de programa)
; debe de especificarse la direccin en los registros ADDRH:ADDRL, el dato retornar en el registro W
;*************************************************************************************************************************************************************
;
FMEM_RD:
BCF
STATUS, RP0
BSF
STATUS, RP1
; Banco 2
;
MOVF ADDRL, W
MOVWF EEADR
; Parte baja de direccin a leer
MOVF ADDRH, W
MOVWF EEADRH
; Parte alta de direccin a leer
;
BSF
STATUS, RP0
; ir a Banco 3
;
BSF
EECON1, EEPGD
; Accesar a memoria de programa
BSF
EECON1, RD
; Inicia lectura de memoria de programa (Borrada por
; Hardware)
NOP
NOP
; tiempo de espera de 2 ciclos de reloj
;
BCF
STATUS, RP0
; Volver a Banco 2
;
MOVF EEDATA, W
; Dato ledo va a W
;
RETURN
; Retorno de subrutina
;
;*************************************************************************************************************************************************************
; Subrutina OUTCHAR, para tyransmitir un caracter por el puerto serial (El dato a transmitir va en el registro W)
;*************************************************************************************************************************************************************
;
OUTCHAR:
BCF
STATUS, RP0
BCF
STATUS, RP1
; Banco 0
;
ESPERA_UART_TX:
BTFSS
PIR1, TXIF
; Esta vaci el Buffer de transmisin?
GOTO
ESPERA_UART_TX
; No, espera un poco a que el Buffer se desaloje...
;
MOVWF
TXREG
; El buffer de transmisin ya esta vaco. Ahora
transmite
; caracter
;
RETURN
; Retorno de subrutina
;
;*************************************************************************************************************************************************************
; Subrutina INCHAR, para recibir un caracter por el puerto serial
;*************************************************************************************************************************************************************
;
INCHAR:
BCF
STATUS, RP0
BCF
STATUS, RP1
; Banco 0
;
ESPERA_UART_RX:
BTFSS
PIR1, RCIF
; Esta lleno con datos el Buffer de recepcin?
GOTO
ESPERA_UART_RX
; No, espera. El Buffer de recepcin an est vaco...
;
MOVF
RCREG, W
; Ya llegaron datos, el buffer est lleno. Salvar dato
; recibido en registro W
;
RETURN
; Retorno de subrutina
;
;*************************************************************************************************************************************************************
END