;envio de datos del PC al PIC
;pin 17 (ra0) -> entrada RS232
;pin 18 (ra1) -> 1200 bps
;pin  1 (ra2) -> 2400 bps
;pin  2 (ra3) -> 4800 bps
;pin  3 (ra4) -> 9600 bps

status	equ	3h		;registro de estados del micro
ptoa	equ	5h		;puerto a
ptob	equ	6h		;puerto b
cfga	equ	85h		;registro de config. puerto a
cfgb	equ	86h		;registro de config. puerto b
r0d	equ	0dh		;registros de proposito general
r0e	equ	0eh
bits	equ	10h
recep	equ	11h		;buffer de entrada
retsb	equ	12h		;retardo del bit de arranque
reteb	equ	13h		;retardo entre bits
z	equ	2h		;bandera de zero
c	equ	0h		;bandera de carry
p	equ	5h		;bit de seleccion de pagina
w	equ	0h		;para almacenar en w
r	equ	1h		;para almacenar en el mismo registro
rx	equ	0h		;bit de recepcion de datos en serie

	org	00h		;vector de reset
	goto	inicio		;salta al comienzo del programa
	org	05h		;saltea el vector de interrupcion

start	movf	retsb,w		;retardo para generar bit de arranque
	goto	startup
delay	movf	reteb,w		;retardo para generar bit de datos
startup	movwF	r0e
redo	nop			;pierde 12 microsegundos
	nop
	decfsz	r0e		;resta 1 al retardo
	goto	redo		;si falta tiempo itera
	retlw	0		;si termino retorna limpiando w

recibir	nop			;recibe un byte por RS232
	clrf	recep		;limpia el buffer de recepcion
	btfss	ptoa,rx		;mira el estado de la linea serie
	goto	recibir		;si esta inactiva queda a la espera
	call	start		;retardo para bit de arranque
rec	movlw	8		;carga cantidad de bits a recibir
	movwf	bits
rnext	bcf	status,c	;limpia el carry
	btfss	ptoa,rx		;mira la linea de recepcion
	bsf	status,c	;si esta en alto sube el carry
	rrf	recep		;rota el buffer de recepcion
	call	delay		;retardo entre bits
	decfsz	bits		;resta uno a la cant. de bits a recibir
	goto	rnext		;si faltan bits por recibir itera
	retlw	0		;si termino sale y limpia w

inicio	bsf	status,p	;selecciona la pagina 1 de memoria
	movlw	0ffh		;programa el puerto a como entradas
	movwf	cfga
	movlw	00h		;programa el puerto b como salidas
	movwf	cfgb
	bcf	status,p	;selecciona la pagina 0 de memoria
	clrf	recep		;limpia el buffer de recepcion
	clrf	ptob		;apaga todas las salidas

sel	btfss	ptoa,1		;mira si el pin 18 esta a masa
	goto	sel12		;selecciona valores para comunicacion a 1200 bps
	btfss	ptoa,2		;mira si el pin 1 esta a masa
	goto	sel24		;selecciona valores para comunicacion a 2400 bps
	btfss	ptoa,3		;mira si el pin 2 esta a masa
	goto	sel48		;selecciona valores para comunicacion a 4800 bps
	btfss	ptoa,4		;mira si el pin 3 esta a masa
	goto	sel96		;selecciona valores para comunicacion a 9600 bps
	goto	sel		;queda a la espera que se seleccione la velocidad

ciclo	call	recibir		;queda a la espera de recibir datos
	movf	recep,w		;carga en w el dato recibido
	movwf	ptob		;manda el dato a las salidas
	goto	ciclo		;itera indefinidamente

sel12	movlw	.249		;tiempo de bit de arranque para 1200 bps
	movwf	retsb
	movlw	.166		;tiempo entre bit y bit para 1200 bps
	movwf	reteb
	goto	ciclo

sel24	movlw	.124		;tiempo de bit de arranque para 2400 bps
	movwf	retsb
	movlw	.83		;tiempo entre bit y bit para 2400 bps
	movwf	reteb
	goto	ciclo

sel48	movlw	.62		;tiempo de bit de arranque para 4800 bps
	movwf	retsb
	movlw	.41		;tiempo entre bit y bit para 4800 bps
	movwf	reteb
	goto	ciclo

sel96	movlw	.31		;tiempo de bit de arranque para 9600 bps
	movwf	retsb
	movlw	.19		;tiempo entre bit y bit para 9600 bps (probar con 20)
	movwf	reteb
	goto	ciclo

	end
