;------------------------------------------------------------------------------
; DECLARACIÓN DE VARIABLES
;------------------------------------------------------------------------------
#Define RxD PORTB,4 ; Receive Data
#Define TxD PORTB,5 ; Transmit Data
tempData1 EQU 0x44
counter2 EQU 0x45
counter1 EQU 0x46
;------------------------------------------------------------------------------
RS232_setUp:
bsf STATUS,RP0 ; Segundo banco
bsf RxD ; Configura la entrada
bcf TxD ; Configura la salida
bcf STATUS,RP0 ; Primer banco
return ; Retorna donde fue llamada
;------------------------------------------------------------------------------
RS232_readData:
movlw 0x08
movwf counter1
waitBegin
btfsc RxD ; Bit de START?
goto waitBegin ; No, sigue esperando
; Si, sigue el programa
call wait_mc100 ; Espera a que termine el bit de START
call wait_mc50 ; Espera medio bit para leer el primer bit de
; datos medio bit retrasado
readBit
bcf STATUS,C ; Supone que es "0"
btfsc RxD ; Es "0" realmente?
bsf STATUS,C ; No, es "1"
rrf tempData1,F
call wait_mc100
decfsz counter1,F; Ha leido todos los bits de datos?
goto readBit ; No, lee el próximo bit
call wait_mc200 ; Si, espera al bit de STOP
movf tempData1,W; Pone el resultado en el acumulador
return ; Retorna donde fue llamada
;------------------------------------------------------------------------------
RS232_sendAsciiNumber:
addlw '0'
RS232_sendData:
movwf tempData1 ; Guarda el contenido del byte a trans-
; mitir
movlw 0x08 ; Número de bits a transmitir
movwf counter1
bcf TxD ; Bit de START
call wait_mc100
sendBit ; Comienza a enviar tempData1s
rrf tempData1,F ; Lleva el bit que se quiere enviar al
btfss STATUS,0 ; Carry para deducir su valor. ¿Es un
; "1" el bit a transmitir?
goto sendZero ; No, pues envía un "0"
sendOne
bsf TxD ; Transmite un "1"
goto endSendBit
sendZero
bcf TxD ; Transmite un "0"
endSendBit
call wait_mc100 ; Este es el tiempo que estará en alto
; o bajo
decfsz counter1,1; Comprueba que es el último bit
goto sendBit ; Como no es el último bit repite la
; operación
bsf TxD ; Envía dos bits de stop
call wait_mc200
return ; Retorna donde fue llamada
;------------------------------------------------------------------------------
wait_createMc:
movwf counter2 ; Aporta 1 ciclo de máquina
waitLoop
decfsz counter2,1; Aporta 1 c.m. cuando no se salta, y
; 2 c.m. si se salta.
goto waitLoop ; Aporta 2 ciclos de máquina
return ; Aporta 2 ciclos de máquina
;------------------------------------------------------------------------------
; RETARDOS
;------------------------------------------------------------------------------
wait_mc50: ; La llamada "call" aporta 2 c.m.
nop ; Aporta 1 ciclo de máquina
movlw 0Eh ; Aporta 1 ciclo de máquina
goto wait_createMc; Aporta 2 ciclos de máquina
wait_mc100: ; La llamada "call" aporta 2 c.m.
movlw 1Fh ; Aporta 1 ciclo de máquina
goto wait_createMc; Aporta 2 ciclos de máquina
wait_mc200: ; La llamada "call" aporta 2 c.m.
nop ; Aporta 1 ciclo de máquina
movlw 40h ; Aporta 1 ciclo de máquina
goto wait_createMc; Aporta 2 ciclos de máquina