;*************************************************************************************
;									Servo_Incubadora.asm
;	Autor: Rodrigo Morales Moreno
;	Descripcion: Programa que Maneja el movimiento de un servo, lo mueve 90º hacia la derecha 
;	y luego de 1 hora y media, cuando es recibida la señal del Temporizador,con Flanco de bajada
;	por el Pin RB0/INT lo mueve 90º hacia la izquierda, en pasos de 10º cada 1 segundo.
;	y luego hacia la derecha nuevamente y asi continuamente.
;	La salida hacia el Servo es por el Pin7 del Puerto B del PIC16F84A
;	( 0º--> 0.3ms ,  180º--->2.1 ms   , periodo 50Hz) 
; ZONA DE DATOS **********************************************************************

	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	LIST	   P=16F84A
	INCLUDE  <P16F84A.INC>
	
	CBLOCK 0x0C
	Conta
	ENDC
	


#DEFINE	Salida	PORTB,7

; ZONA DE CÓDIGOS ******************************************************************** 

	ORG 	0
   	goto	Inicio
	ORG		.4
	goto	Timer0_Interrupcion
Inicio
	bsf		STATUS,RP0
	bcf		Salida
	movlw	b'00001000'
	movwf	OPTION_REG
	bcf		STATUS,RP0
	movlw	b'10010000'
	movwf	INTCON
	clrf	Lado

Principal
	sleep 
	goto	Principal
	
	
	CBLOCK
	Lado
	ENDC

Timer0_Interrupcion	
	btfsc	Lado,0				; ve si la posicion era la izquerda (Lado=.0), va a la Rutina_Derecha
	goto	Rutina_Izquierda	; si la posicion era la derecha (Lado=.1), va a la Rutina_Izquierda

Rutina_Derecha

	movlw	.50
	movwf	Conta
Paso0I							; Si la Ultima posicion era la Izquierda, comienza a moverse en pasos de
	bsf		Salida				; 10° y permanece en esa posicion por 1 segundo aproximadamente, los pasos
	call 	Retardo_200micros	; que da son los siguientes:
	call 	Retardo_100micros	; Paso0I=0°
	bcf		Salida				; Paso1I=10°
	call 	Retardo_10ms		; Paso2I=20°
	call 	Retardo_5ms			; Paso3I=30°
	call 	Retardo_2ms			; Paso4I=40°
	call 	Retardo_2ms			; Paso5I=50°
	call 	Retardo_500micros	; Paso6I=60°
	call 	Retardo_200micros	; Paso7I=70°
	decfsz	Conta,F				; Paso8I=80°
	goto	Paso0I				; Paso9I=90°
	movlw	.50					; y vuelve al estado SLEEP.
	movwf	Conta

Paso1I
	bsf		Salida
	call 	Retardo_200micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_500micros
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso1I
	movlw	.50
	movwf	Conta
	
Paso2I
	bsf		Salida
	call 	Retardo_500micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_500micros
	decfsz	Conta,F
	goto	Paso2I
	movlw	.50
	movwf	Conta
		
Paso3I
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso3I
	movlw	.50
	movwf	Conta
		
Paso4I
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso4I
	movlw	.50
	movwf	Conta
	
Paso5I
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso5I
	movlw	.50
	movwf	Conta
		
Paso6I
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso6I
	movlw	.50
	movwf	Conta
		
Paso7I
	bsf		Salida
	call 	Retardo_1ms
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	decfsz	Conta,F
	goto	Paso7I
	movlw	.50
	movwf	Conta
	
Paso8I
	bsf		Salida
	call 	Retardo_1ms
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_1ms
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso8I
	movlw	.50
	movwf	Conta
	
Paso9I
	bsf		Salida
	call 	Retardo_1ms
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_1ms
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso9I
	movlw	.1
	movwf	Lado
	goto	Fin_Interrupcion
		
Rutina_Izquierda

	movlw	.50
	movwf	Conta
Paso9D							; Si la Ultima posicion era la Derecha, comienza a moverse en pasos de
	bsf		Salida				; 10° y permanece en esa posicion por 1 segundo aproximadamente, los pasos
	call 	Retardo_1ms			; que da son los siguientes:
	call 	Retardo_200micros	; Paso9D=90°
	bcf		Salida				; Paso8D=80°
	call 	Retardo_10ms		; Paso7D=70°	
	call 	Retardo_5ms			; Paso6D=60°
	call 	Retardo_2ms			; Paso5D=50°
	call 	Retardo_1ms			; Paso4D=40°
	call 	Retardo_500micros	; Paso3D=30°
	call 	Retardo_200micros	; Paso2D=20°
	call 	Retardo_100micros	; Paso1D=10°
	decfsz	Conta,F				; Paso0D=0°
	goto	Paso9D				; y vuelve al estado SLEEP.
	movlw	.50
	movwf	Conta
Paso8D
	bsf		Salida
	call 	Retardo_1ms
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_1ms
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso8D
	movlw	.50
	movwf	Conta
	
Paso7D
	bsf		Salida
	call 	Retardo_1ms
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	decfsz	Conta,F
	goto	Paso7D
	movlw	.50
	movwf	Conta
	
Paso6D
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso6D
	movlw	.50
	movwf	Conta
	
Paso5D
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso5D
	movlw	.50
	movwf	Conta
		
Paso4D
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso4D
	movlw	.50
	movwf	Conta
	
Paso3D
	bsf		Salida
	call 	Retardo_500micros
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_200micros
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso3D
	movlw	.50
	movwf	Conta
		
Paso2D
	bsf		Salida
	call 	Retardo_500micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_500micros
	decfsz	Conta,F
	goto	Paso2D
	movlw	.50
	movwf	Conta
			
Paso1D
	bsf		Salida
	call 	Retardo_200micros
	call 	Retardo_200micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_500micros
	call 	Retardo_100micros
	decfsz	Conta,F
	goto	Paso1D
	movlw	.50
	movwf	Conta
			
Paso0D
	bsf		Salida
	call 	Retardo_200micros
	call 	Retardo_100micros
	bcf		Salida
	call 	Retardo_10ms
	call 	Retardo_5ms
	call 	Retardo_2ms
	call 	Retardo_2ms
	call 	Retardo_500micros
	call 	Retardo_200micros
	decfsz	Conta,F
	goto	Paso0D
	movlw	.0
	movwf	Lado
Fin_Interrupcion
	bcf		INTCON,INTF
	Retfie

	INCLUDE <RETARDOS.INC>
	END
