;************************************************************************************
;									EXPLORER
;
;	El programa es muy similar al de "Línea negra". Hace que el microbot se mueva 
;siguiendo una trayectoria que se va detectando mediante los bumpers frontales 
;conectados a J2 (Dcho.) y J3 (Izdo) y que a su vez están asociados a las líneas
;RB2 y RB3 del PIC.
;
;	 El recorrido se inicia al accionar cualquiera de dichos bumpers por vez primera.
;
;	Si durante el recorrido los bumpers detectan cualquier obstaculo frontal, el 
;PICBOT-1, retrocede, se detiene durante 0.5" y vuelve a intentarlo.
;
;							Autor: Mikel Etxebarria Isuskiza
;
;							(c) Microsystems Engineering
;								Bilbao, Enero de 1999
;

				LIST 	P=16C73			;Tipo de procesador
				LIST	C=132			;Nº de caracteres por línea
				LIST	N=66			;Nº de líneas por página
				
				include	"Regx84.inc"	;Definición de registros
				include "Macros.inc"	;Inclusión de macros
				
#DEFINE	J0			PORTB,0				;Sensor de posición 1
#DEFINE J1			PORTB,1				;Sensor de posición 2
#DEFINE J2			PORTB,2				;Sensor de obstáulo dcho.
#DEFINE J3			PORTB,3				;Sensor de obstáculo izdo.

Delay_1			equ		0x0c			;Varable temporal de temporización

				org		0x00
				goto	Reset			;Vector de RESET
				
				org		0x05

;Rutina de temporización que temporiza 50ms tantas veces como indique el valor de
;la variable Delay_1. Trabajando a una frecuencia de 4MHz, el TMR0 evoluciona cada
;microsegundo. Con un preescaler de 256, el TMR0 es cargado con el valor 195 que en
;hex. equivale a C3 y cuyo complemento es 3C, para consegur un delay de 50 ms.

Delay50ms:		movwf	Delay_1
Delay50ms_2		bcf		INTCON,T0IF		;Borra el flag T0IF			
				movlw	0x3c
				movwf	TMR0			;Complemento hex. del valor 195
Delay50ms_1		btfss	INTCON,T0IF		;TMR0 ha rebasado ??
				goto	Delay50ms_1		;Todavía no
				decfsz	Delay_1,F		;Decrementa variable "Delay_1"
				goto	Delay50ms_2		;Todavía no es 00
				return					;Ahora si				
						
Reset:			clrf	PORTA
				bsf		STATUS,RP0		;Selección de página 1
				movlw	b'00010000'
				movwf	TRISA			;RA0-RA3 salidas, RA4 entrada
				movlw	b'11111111'
				movwf	TRISB			;RB0-RB3 entradas
				movlw	b'11010111'     ;Preescaler de 256 para el TMR0
				movwf	OPTION_REG		;Fosc/4 clock del TMR0
				bcf		STATUS,RP0		;Página 0
				bcf		INTCON,GIE		;Interrupciones OFF
								
;Se espera a que se accione cualquier bumper delantero para iniciar la secuecia
				
Wait			clrwdt
				Stop					;Situación inicial de parada
				btfss 	J2				;Sensor de obsáculo dcho. ON ??
				goto	Loop			;Si, inicio
				btfsc	J3				;Sensor de obstáculo izdo ON ??
				goto 	Wait			;Si, inicio

;Bucle principal

Loop:			clrwdt									
				btfsc 	J2				;Sensor de obsáculo dcho. ON ??
				goto	No_Obstaculo	;No, parada
				btfsc	J3				;Sensor de obstáculo izdo ON ??	
				goto 	No_Obstaculo	;No, arranque
Retroceso		Atras					;Retroceso
				btfss	J2				;Libre el sensor dcho??
				goto	Retroceso		;No
				btfss	J3				;Libre el sensor izdo??
				goto	Retroceso		;No
				Stop					;Si. Parar motores
				call	Delay50ms		;Temporiza 0.5"
				goto	Loop
				
No_Obstaculo	btfsc	J2				;Ha salido por la izquierda ?
				goto	No_Izda			;No
				Izda					;Si, movimiento a la derecha
				goto	Loop

No_Izda			btfsc	J3				;Ha salido por la derecha ?
				goto	No_Dcha			;No
				Dcha					;Si, movimiento a la izquierda
				goto	Loop
				
No_Dcha			Adelante				;Avance del microbot
				goto	Loop

				end
				