;
;rs232_5.asm
;Este ejemplo produce la intermitencia de la salida RB0.
;Desde el terminal del PC podemos programar el tiempo
;de ON y OFF de la intermitencia.

;Para entrar en modo "programación":
;1)Deberemos poner la entrada RA0 a 0 
;2)En el terminal teclearemos: XX
;donde la primera "X" es el tiempo de ON y la segunda el de OFF.
;IMPORTANTE: Los valores de "X" deben ser del 1 al 9    
;3)Volveremos a poner la entrada RA0 a 1

;IMPORTANTE: el led conectado en RB4 permanece encendido ya que 
;se utiliza como linea Txd para la comunicación serie. 

;La configuración es el estandar 8N1 (8 bits de datos, sin paridad, 
;y 1 bit de stop) y la velocidad de comunicación es de 9600 Bd. 


	list	p=16f84		;modelo de pic utilizado
	include	"p16f84.inc"	;Definición de registros
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración	
			
;Constantes de los parámetros para las rutinas de comunicación 

BAUDIOS		equ	.9600     	;Velocidad de comunicación
CLKIN		equ	.4000000	;Frecuencia de trabajo en c/s
T_MODO		equ	1		;transmitir primero el bit LSB
R_MODO		equ	1		;recibe primero el bit LSB
T_Nbit		equ	8		;transmitir datos de 8 bits
R_Nbit		equ	8		;recibe datos de 8 bits
Sbit		equ	1		;un bit de stop
												
;Espacio para el bloque de variables de las rutinas rs232.inc  

Rs232_var	equ	0x0C	;Inicio del bloque de variables reservadas
				;para las rutinas RS232.INC

;Registros para las variables de programa principal

TIEMPO_ON	equ	0x11
TIEMPO_OFF	equ	0x12
TEMP_ON		equ	0x13		
TEMP_OFF	equ	0x14
CONTA_0		equ	0x15	
CONTA_1		equ	0x16

		org	0x00
		goto 	INICIO
		org	0x05
				
		include	"rs232.inc"	;Rutinas de comunicación RS232

INICIO		bsf	STATUS,RP0    	;Selecciona página 1
		movlw	b'11101110'	;RB5 entrada, RB4 y RB0 salidas
		movwf	TRISB		;RB5=RxD y RB4=TxD
		movlw	0xFF
		movwf	TRISA		;PORTA todo entradas
		bcf	STATUS,RP0	;Seleccionar página 0
		clrf	PORTB				

;Inicia TIEMPO_ON y TIEMPO_OFF con valor de 1

		movlw	.1
		movwf	TIEMPO_ON
		movwf	TIEMPO_OFF

;Prepara lineas comunicación serie

		bsf	Txd_pin		;Línea de transmisión a "1"
		bsf	Rxd_pin		;Línea de recepción a "1"

;Bucle de intermitencia de RB0

BUCLE		bsf	PORTB,0
		call	PAUSA_ON
		bcf	PORTB,0
		call	PAUSA_OFF
		btfsc	PORTA,0		;esta RA0 a 0 ?
		goto	BUCLE		;No, sigue con la intermitencia

;Si RA=0, entra a programar:	

		call	RxD		;espera recibir primer carácter
		movf	Rxdreg,W
		addlw	0xD0		;convierte ASCII a binario...
					;sumando el complemento a dos de 0x30
		movwf	TIEMPO_ON	;guarda en tiempo ON	
		call	RxD		;espera recibir segundo carácter 
		movf	Rxdreg,W
		addlw	0xD0		;convierte ASCII a binario
		movwf	TIEMPO_OFF	;guarda en tiempo OFF	 
ESPERA		btfss	PORTA,0		;espera para salir de programación
		goto	ESPERA		;RA0 = 0 espera
		goto	BUCLE		;RA0 = 1 vuelve a bucle intermitencia	
		

;Subrutinas de pausa variables según el valor de TIEMPO_ON y TIEMPO_OFF

PAUSA_ON	movf	TIEMPO_ON,W	
		movwf	TEMP_ON		;pasa TIEMPO_ON a temporal TEMP_ON
P_ON		decfsz	CONTA_0,F
		goto	P_ON
		decfsz	CONTA_1,F
		goto	P_ON
		decfsz	TEMP_ON
		goto	P_ON
		return

PAUSA_OFF	movf	TIEMPO_OFF,W	
		movwf	TEMP_OFF
P_OFF		decfsz	CONTA_0,F
		goto	P_OFF
		decfsz	CONTA_1,F
		goto	P_OFF
		decfsz	TEMP_OFF,F
		goto	P_OFF
		return

		end