;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