;Habilita un Puerto Serie con el protocolo:9600N81
;PB.0 como salida (Tx) y PB.1 como entrada (Rx)
;Half Duplex. El programa hace la funci¢n "ECO"
;Todo caracter recibido es devuelto autom ticamente.
;** OJO ** caracter por caracter, si se transmite m s de un
;caracter a la vez, se perder  el que coincida con la transm.
 
       LIST   P=PIC16C84, R=HEX; XTAL=4MHz
       INCLUDE  pic16f84.inc
 
;Variables en RAM
       ORG    0C
;La directiva "RES", reserva posiciones de memoria a partir del ORG
dTx    RES    1            ;Registro del dato a transmitir
dRx    RES    1            ;Registro del dato entrante
cont1  RES    1            ;Variables aux. para retardo
ldato  RES    1            ;Regist. aux. para contar los bits
;
 
       ORG    0            ;Vector RESET
INI    BSF    STATUS,RP0   ;Selecc. banco 1
       BCF    TRISB,0      ;PB.0 como salida Tx y PB.1 = Rx
       BSF    TRISB,1
       BCF    STATUS,RP0   ;Selecciona banco 0
 
;**********  Rutina de lectura   ****************
Ndato  BTFSC  PORTB,1      ;Espera Bit START?
       GOTO   Ndato
       MOVLW  8            ;Datos de 8 bits
       MOVWF  ldato
       CLRF   dRx          ;Borra registro de dato entrante
       CALL   RetaRx       ;Retardo para fijar lectura en punto medio
                           ;de cada bit, despues de detectar el START
Birx   BCF    STATUS,C     ;Borra carry
       RRF    dRx          ;Por defecto el primer bit a "0"
       BTFSC  PORTB,1      ;Es un "0"?
       BSF    dRx,7        ;Es un 1
       CALL   RetaTx       ;Retardo de 104 us. => 9600 baudios
       DECFSZ ldato        ;Ultimo bit?
       GOTO   Birx
       MOVF   dRx,w        ;Copia registro del dato entrante en W y
       MOVWF  dTx          ;lo transfiere al registro de salida
 
;***********Rutina de transmisi¢n *********+
       MOVLW  8
       MOVWF  ldato        ;Datos de 8 bits
       BCF    PORTB,0      ;Saca bit de start
Bitx   CALL   RetaTx       ;Retardo para generar 9600 baudios
       RRF    dTx          ;Rota a la derecha para TX, prim. el
       BTFSC  STATUS,C     ;bit menos sig. ¨Es un "1" o un "0"?
       BSF    PORTB,0      ;Es un 1
       BTFSS  STATUS,C
       BCF    PORTB,0      ;Es un 0
       DECFSZ ldato        ;Ultimo bit?
       GOTO   Bitx
       CALL   RetaTx
       BSF    PORTB,0      ;Bit de STOP
       CALL   RetaTx
       GOTO   Ndato
 
;Retardo de TX de 104 ug. para 9600 baudios 
RetaTx MOVLW  d'31'        ;(1) Para lograr 104 ug, se repite el
       MOVWF  cont1        ;(1) bucle (104-4-2)/3 veces 
L2     DECFSZ cont1        ;(1)  VA con 30,31 y 32!
       GOTO   L2           ;(2) 
       RETURN              ;(2)
 
;Retardo para leer aprox. en la mitad de cada bit, despues del bit START
RetaRx MOVLW  d'43'        ;43 = 31 + 12
       MOVWF  cont1       
L3     DECFSZ cont1        
       GOTO   L3          
       RETURN              
 
       END