Inicio Siguiente
4.- Programa de recepción asíncrona con el PIC16F84.
Diagrama de bloques.
RX con le PIC16F84
Programa:
;*****************************************************************************
;
;	RECEPCION SERIAL CON EL PIC16F84, LOS DATOS SE ENVIAN AL PORTB
;
;*****************************************************************************

LIST   P=16F84
include "p16f84.inc"	;PI6C84.INC Es un archivo estandar del 
			;ensamblador de Microchip que contiene las
			;definiciones de etiquetas asociadas a los
			;registros y bits del PIC16C84				
;*****************************************************************************
;
;DEFINICION DE ETIQUETAS Y VARIABLES
;
;*****************************************************************************

DatoRX		equ	0x0c	;Dato que se recibe
ContBITS	equ	0x0d	;Contador de bits a recibir
RX		equ	4	;linea de recepcion 
ContDEL		equ	0x0e	;contador de retardo
Banderas	equ	0x0f	;registro de banderas
OK		equ	0	;bandera de recepcion valida
ContRX		equ	0x10	;Contador de retardo para recepcion

;*****************************************************************************
;
;+++++++++++++ ASIGNACION DE MEMORIA DE PROGRAMA ++++++++++++++
;
;*****************************************************************************

org	0			;VECTOR DE RESET
	goto	INICIO_RECEPCION
	

;****************************************************************************
;
;	0000		INICIO RECEPCION PIC16F84
;
;****************************************************************************

INICIO_RECEPCION

LECTURA
	call	RECIBIR_DATO_SERIAL	;lectura del pin de recepcion
	btfss	Banderas,OK		;verificar si el dato es valido
	goto	LECTURA			;regresar, para hacer otra lectura
	movwf	PORTB			;Enviar caracter al PORTB
	goto	LECTURA			;regresar, para hacer otra lectura


;****************************************************************************
;
;	100	INICIA VARIABLES 			INICIA_VAR
;
;****************************************************************************
;Inicializa variables y puertos
INICIA_VAR

	clrf	Banderas	;Limpiar registro de banderas
	bsf	STATUS,RP0	;cambiar al banco 1 de memoria
	bsf	TRISA,RX	;programas RX como emtrada
	clrf	TRISB		;PORTB como salida
	bcf	STATUS,RP0	;regresar al banco 0

	return
;*****************************************************************************
;
;	200		RECIBIR DATO SERIAL		RECIBIR_DATO_SERIAL
;
;*****************************************************************************
;Se realiza recepcion serial a una velocidad de 1200bps, con datos de
;8 bits, sin paridad y con un bit de paro, a traves de pin RA4. El dato
;guarda en DatoRX y se regresa en el acumulador W.

RECIBIR_DATO_SERIAL

	clrwdt
	clrf		DatoRX		;limpiar registro de recepcion
	bcf		Banderas,OK	;borrar bandera
	btfsc		PORTA,RX	;linea de recepcion en bajo?
	goto		SalirRX		;si no lo esta salir
	call		RETARDO_MED	;retardo medio para confirmar
	btfsc		PORTA,RX	;se comprueba el bit de arranque
	goto		SalirRX		;salir
	call		RETARDO833	;generar un retardo
	movlw		8		;Numero de bit que se reciben
	movwf		ContBITS	;contador de bits
RXsig
	bsf		STATUS,C	;poner el acarroe a uno
	btfss		PORTA,RX	;verificar el estado de la linea
	bcf		STATUS,C	;si esta en cero apagar el acarreo
	rrf		DatoRX		;insertar el acarreo el DatoRX
	call		RETARDO833	;generar un retardo
	decfsz		ContBITS	;decrementar contador de bits
	goto		RXsig		;repetir lectura de la linea
	call		RETARDO_MED	;retardo medio para bit de paro
	bsf		Banderas,OK	;recepcion valida
	movf		DatoRX,W	;copiar el dato recibido a W
	return				;regresar

SalirRX
	bcf		Banderas,OK	;recepcion no valida
	return

;*****************************************************************************
;
;	300		RETARDO MEDIO		RETARDO_MED  
;
;*****************************************************************************
;Generar un retardo de la mitad del tiempo de bit para verificar si el
;bit de inicio es valido 

RETARDO_MED
	movlw	.83		;carga para 416us
	movwf	ContRX		;contador de retardo
RETARDORX
	nop
	nop
	decfsz	ContRX		;decrementar registro
	goto	RETARDORX	;repetir retardo
	return


;*****************************************************************************
;
;	400		RETARDO DE 833us		RETARDO_DE_833us  
;
;*****************************************************************************
;Genera un retardo de 833us, para poder transmitir a la velocidad 
;de 1200bps.

RETARDO833

	movlw	.166		;retardo de 833us aprox.
	movwf	ContDEL		;contador para generar retardo
RETARDO
	nop
	nop
	decfsz	ContDEL		;decrementar contador de retardo
	goto	RETARDO		;repetir el retardo
	
	return			;regresar

;--------------------------------------------------------------------------
end



Hosted by www.Geocities.ws

1