;*************************************************************************************************************************************************
;
;  	PROGRAMA DE PRUEBA DE PLUMA PARA EVOLUPIC Bootloader 16F88
;	Por: Moisés Rafael Gutiérrez Damián para Punto Flotante, S.A.
;	SI SW1=0FF,SW2=0FF,SW3=0FF,SW4=OFF MOTOR QUEDA LIBRE, PLUMA SE PUEDE MANIPULAR MANUALMENTE
;	SI SW1=ON, SW2=0FF,SW3=0FF,SW4=OFF PLUMA SE LEVANTA OPRIMIENDO EL PUSH BUTTON ROJO Y BAJA AUTOMATICAMENTE
;	SI SW1=0N, SW2=ON, SW3=0FF,SW4=OFF PLUMA SE LEVANTA OPRIMIENDO EL PUSH Y BAJA OPRIMIENDO DE NUEVO EL PUSH
;	
;
;*************************************************************************************************************************************************

;CABECERA**********************************************************************************************************************************

		LIST	P=16F88		; MICROCONTROLADOR A USAR
		INCLUDE	<P16F88.INC>	; LLAMADA A CABECERA

;CONSTANTES, MACROS Y DECLARACIONES******************************************************************************************************************

#DEFINE		SPEN0	BCF		RCSTA,SPEN	
#DEFINE		SPEN1	BSF		RCSTA,SPEN
#DEFINE		PASS	PORTB,7
#DEFINE		LED	PORTB,3

BAJAPLUMA 	MACRO
			BSF		PORTB,1
			BCF		PORTB,0
			ENDM

SUBEPLUMA	MACRO
			BSF		PORTB,0
			BCF		PORTB,1
			ENDM

FRENA		MACRO
			BSF		PORTB,0
			BSF		PORTB,1
			ENDM

APAGA		MACRO
			BCF		PORTB,0
			BCF		PORTB,1
			ENDM

		CBLOCK	0x20			
		R_ContA					; Contadores para los retardos.
		R_ContB
		FLAGS					; Para tener registro de eventos.				
		ENDC

		ORG	0			; INICIO DEL PROGRAMA EN LA PRIMERA LOCACIÓN DE MEMORIA
		CLRF	PCLATH			; SOLICITADO POR EL BOOTLOADER.
		GOTO	INICIO			; DIRECCIONAMOS AL "INICIO" DEL BLOQUE DE INSTRUCCIONES
		ORG	3		


;RUTINA DE RETARDO*****************************************************************************************************************************

Retardo_ms
		movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
		movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
		movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
		nop							; Aporta KxMx1 ciclos máquina.
		decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
		goto	R1ms_BucleInterno	; Aporta (K-1)xMx2 ciclos máquina.
		decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
		goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
		return						; El salto del retorno aporta 2 ciclos máquina.
		
;PROGRAMA PRINCIPAL*********************************************************************************************************************************

INICIO

		BANKSEL	TRISA			; CONFIGURAMOS LOS PUERTOS
		MOVLW	B'11111110'		; PUERTO A	
		MOVWF	TRISA
		MOVLW	0xF0			; PUERTO B: RB0-RB3 => SALIDAS, RB4-RB7 => ENTRADAS					
		MOVWF	TRISB			; 
		BCF	OPTION_REG,NOT_RBPU	; HABILITAMOS LAS RESISTENCIAS DE PULL-UP
						
		CLRF	ANSEL			; DESHABILITAMOS EL CAD.
		MOVLW	.7
		MOVWF	CMCON
		CLRF	CVRCON			; DESHABILITAMOS LOS COMPARADORES.

		BANKSEL	PORTA
		CLRF	PORTA
		CLRF	PORTB

		BANKSEL	TXSTA
		MOVLW	.25			; 9600 bps
		MOVWF	SPBRG			; 
		MOVLW	0x04			; COMUNICACIÓN ASINCRONA, TX-RX A ALTA VELOCIDAD, DESHABILITAMOS LA TRANSMISIÓN.
		MOVWF	TXSTA

		BANKSEL	RCSTA
		MOVLW	0x90			; HABILITAMOS LA RECEPCIÓN CONTÍNUA.
		MOVWF	RCSTA
		SPEN0				; DESHABILITAMOS EL PUERTO SERIE

;********************************************************************************************************************************************
GUARDA
		BTFSC	PORTA,1
		GOTO	GUARDA
				
ALTO
		APAGA
		BTFSC	PASS		
		GOTO	ALTO
PASE
		BSF		LED
		SUBEPLUMA
		MOVLW	.200
		CALL	Retardo_ms
		FRENA
		BTFSS	PORTA,2
		GOTO 	PAUSA	
		MOVLW	.255
		CALL	Retardo_ms
		CALL	Retardo_ms
		CALL	Retardo_ms
		CALL	Retardo_ms
CONTINUA
		BAJAPLUMA
		MOVLW	.150
		CALL	Retardo_ms
		BCF		LED
		GOTO 	ALTO
PAUSA
		BTFSC	PASS		; ESPERAMOS EL SIGUIENTE CLICK
		GOTO 	PAUSA		
		GOTO	CONTINUA	; ESTÁ EN AUTOMÁTICO

;*************************************************************************************************************************************************	
	END