El PIC 16F84A no dispone de UART u otros elementos que nos permitan realizar mediante hardware la comunicación serie, pero sin embargo esto no impide que se pueda implementar mediante software la comunicación con otros dispositivos como pueden ser un microcontrolador o un PC.
Este ejemplo implementa la comunicación serie entre un PIC 16F84 y un PC a una velocidad de 38400 bps, con 8 bits de datos sin control de paridad y con un bit de Stop, es decir 38400-8-N-1. El programa transmite constantemente el mensaje "www.zonabot.com" , como pin de transmisión se usa el RA0, si se desea usar otro pin sólo es necesario modificar el valor de la etiqueta TX en el programa. Para ver el mensaje enviado por el PIC se puede utilizar el Hyperterminal configurándolo para 38400-8-N-1.
PROGRAMA
;******************************************************************************
; TRANSMISION DE DATOS EN SERIE CON PIC 16F84A
;******************************************************************************
LIST P=16F84 include "p16f84.inc"
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;******************************************************************************
; DEFINICION DE ETIQUETAS Y VARIABLES
;******************************************************************************
DatoTX equ 0x0c ;Carácter a transmitir
BITS equ 0x0d ;Contador de bits a transmitir
TX equ 0 ;Pin usado para transmisión
;******************************************************************************
; PROGRAMA
;******************************************************************************
org 0 ;Vector de reset
goto INICIO ;Saltar
org 4 ;Vector de Interrupcion
;******************************************************************************
; CONFIGURACION
;******************************************************************************
INICIO bsf STATUS,RP0 ;Banco 1
bcf TRISA,TX ;Pin de transmisión como salida
bcf STATUS,RP0 ;Banco 0
bsf PORTA,TX ;Línea de transmisión en reposo
;*****************************************************************************
; PROGRAMA
;******************************************************************************
MENSAJE clrf FSR ;Limpiar el offset
CARACTER movf FSR,W ;Copiar el OFFSET a W
call TABLA ;Cargar en W el caracter
iorlw 0 ;Comprobar si se ha transmitido todo el mensaje, se acaba al leer un cero
btfsc STATUS,Z ;Comprobar si se ha transmitido todo
goto FIN ;Fin transmisión del carácter
call ENVIAR ;Enviar carácter
incf FSR ;Incrementar puntero
goto CARACTER ;Enviar el siguiente carácter
FIN goto MENSAJE ;Enviar constantemente el mensaje
;******************************************************************************
; MENSAE A ENVIAR AL PC
;******************************************************************************
TABLA addwf PCL,1 dt "www.zonabot.com",0x0D,0x0A,0
;******************************************************************************
; ENVIAR CARACTER
;******************************************************************************
ENVIAR movwf DatoTX ;Cargar el contenido de W a DatoTX
bcf PORTA,TX ;Colocar la linea de TX en bajo para generar bit Start
movlw 8 ;Número de bits a transmitir
movwf BITS ;Contador de bits transmitidos
call RETARDO ;Esperar 833us
nop
nop
nop
nop
TXsig bcf PORTA,TX ;Colocar linea de transmisión a nivel bajo
rrf DatoTX ;Pasar el bit LSB al acarreo
btfsc STATUS,C ;Comprobar si es cero el acarreo
bsf PORTA,TX ;Si es uno, colocar linea TX a "1"
call RETARDO ;Esperar 833us
decfsz BITS ;Decrementar el contador de bits,salta si es cero
goto TXsig ;Transmitir siguiente bit
bsf PORTA,TX ;Colocar la linea TX en alto para generar
call RETARDO ;el bit de paro
nop
nop
nop
nop
nop
nop
return ;Fin, carácter enviado
;******************************************************************************
; TEMPORIZACION
;******************************************************************************
RETARDO movlw .252 ;retardo de 833us
addlw .1
btfss STATUS,C goto $-2 ;repetir el retardo
return
; Fin temporización
;******************************************************************************
end