Inicio
Siguiente
|
4.- Programa de recepción asíncrona con el PIC16F84.
|
Diagrama de bloques.
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