16f84

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.

  hyperpic

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

ESQUEMA

TX_232