;transmite serialmente a 9600bps con un xtal de 4MHz
;se deben definir las siguientes variables:
; RXport
; RXtris
; TXport
; TXtris
; RS_TEMP1
; RS_TEMP2
; RXD
; TXD
; RB0, ES LA SEÑAL DE RX
#define RXport PORTB,0
#define RXtris TRISB,0
#define TXport PORTB,1
#define TXtris TRISB,1
CONSTANT LF = d'10'
CONSTANT CR = d'13'
CONSTANT TAB = d'9'
CONSTANT BS = d'8'
UDATA_SHR
RS_TEMP1 RES 1
RS_TEMP2 RES 1
RXD RES 1
TXD RES 1
;MACROS
RS232init macro
call RS_init
endm
SEND macro S_String
movlw S_String
call SENDsub
endm
SENDw macro
call SENDsub
endm
RECEIVE macro
call RECsub
endm
;subrutinas
;RS_init inicializa
RS_init bsf TXport
banksel OPTION_REG
clrf OPTION_REG
bcf TXtris
bsf RXtris
banksel TXport
bsf TXport
;movlw INTCON
RETURN
;RECsub recibe el dato serial
RECsub call RS_Wait
btfsc RXport ;
goto REENTRY ;
movlw 0x08
movwf RS_TEMP1
goto RECa
RECa call R_Wait
btfss RXport
goto RECb
bsf RXD,0x07
goto RECc
RECb bcf RXD,0x07
RECc decfsz RS_TEMP1,0
rrf RXD,1
decfsz RS_TEMP1,1
goto RECa
call R_Wait
btfss RXport
clrf RXD
retlw 0x01
;REENTRY limpia RXD en caso de malentendido
REENTRY
clrf RXD
movlw 0x0F
movwf RXD
retlw 0x01
;SENDsub transmite un dato almacenado en W
SENDsub movwf TXD
bcf TXport
movlw 0x08
movwf RS_TEMP1
call S_Wait
SENDa btfsc TXD,0
goto SENDb
bcf TXport
goto SENDc
SENDb bsf TXport
SENDc rrf TXD,1
call S_Wait
decfsz RS_TEMP1,1
goto SENDa
goto SENDd
SENDd bsf TXport
call S_Wait
call S_Wait
bsf TXport
RETURN
;rutinas de espera: deben ser cambiadas segun el xtal usado
;y la tasa de baudios.
S_Wait movlw 0x1E
movwf RS_TEMP2
goto X_Wait
RS_Wait movlw 0x0C
movwf RS_TEMP2
goto X_Wait
R_Wait movlw 0x1D
movwf RS_TEMP2
goto X_Wait
X_Wait decfsz RS_TEMP2,1
goto X_Wait
RETURN