;---------------Encabezado-------------

	LIST p=16f876A
	radix hex

;------------Configuración de registros---------

STATUS  equ 0x03
TRISB   equ 0x06
PORTB   equ 0x06
TRISA   equ 0x05
PORTA   equ 0x05
TRISC   equ 0x07
PDel0   equ 0x21   ;registros para los 
PDel1   equ 0x22   ; retardos
PDel2   equ 0x23


;------------------Configuración de puertos-----------------

reset     org 0x00    ; origen del programa, aquí comenzará
		              ; siempre que ocurra un reset
          goto inicio ; salta a "inicio"

inicio    bsf  STATUS,5  ; pone rp0 a 1 y pasa al banco1
          movlw b'011111'
          movwf TRISA    ; Ra0-Ra4=entradas
          clrf TRISB     ; el puerto B y C los pongo
          clrf TRISC     ; como salidas aunque C no se usa
	      bcf  STATUS,5  ; pone rp0 a 0 y regresa al banco0


;---------------------Lectura de entradas------------------------

bucle   
	clrf  PORTB		;salidas a cero
	btfsc PORTA,0           ;salta la sig instrucción si RA0=0
	goto  bucle         ;si el conmutador está en paro no hace nada
	btfss PORTA,3     ;si está pulsado F1 salto la siguiente
	call  ERRORPOSICION 
	btfsc PORTA,1     ;salta la sig instrucción si RA1=0
	goto  MARCHA1       ;el conmutador está en 1
	goto  MARCHA2       ;el conmutador está en 2


;-----------------Marcha 1 seleccionada--------------------

MARCHA1 bsf PORTB,0      ;activo el giro a derechas
espera
	btfss PORTA,4       ;no hago nada hasta que se
	goto  espera    ;activa el F2
	clrf  PORTB     ;paro el motor
	call  TRESEG	;espero 3 seg antes de invertir
	bsf   PORTB,0   ;activo el giro a izqdas
esperar 
	btfss PORTA,3       ;no hago nada hasta que se
	goto  esperar   ;activa de nuevo F1
	goto  bucle     ;vuelvo a leer las entradas
;----------------------------------------------------------


;-------------------Marcha 2 seleccionada------------------

MARCHA2 movlw 0x01      ;activo el giro a derechas
	movwf PORTB
espera1	
	btfss PORTA,4       ;no hago nada hasta que se
	goto  espera1   ;activa el F2
	clrf  PORTB     ;paro el motor antes de invertir
	call  RETARDOi	;espero 1/2 seg antes de invertir
	movlw 0x02      ;activo el giro a izqdas
	movwf PORTB
espera2 
	btfss PORTA,3       ;no hago nada hasta que se
	goto  espera2   ;activa de nuevo F1
	goto  bucle     ;vuelvo a leer las entradas 
;------------------------------------------------------------


;----------------Espera de 3seg para marcha 1-----------------

TRESEG  movlw     .67       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .91       ; 1 set numero de repeticion  (B)
        movwf     PDel1      ; 1 |
PLoop1  movlw     .122      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDlL1   goto PDlL2         ; 2 ciclos delay
PDlL2   clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;------------------------------------------------------------


;--------------Espera de 1/2 seg antes de invertir-------------

RETARDOi  movlw     .239      ; 1 set numero de repeticion  (B)
          movwf     PDel0     ; 1 |
PLoop11   movlw     .232      ; 1 set numero de repeticion  (A)
          movwf     PDel1     ; 1 |
PLoop22   clrwdt              ; 1 clear watchdog
PDelL1    goto PDelL2         ; 2 ciclos delay
PDelL2    goto PDelL3         ; 2 ciclos delay
PDelL3    clrwdt              ; 1 ciclo delay
          decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
          goto      PLoop22   ; 2 no, loop
          decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
          goto      PLoop11   ; 2 no, loop
PDelL4    goto PDelL5         ; 2 ciclos delay
PDelL5    goto PDelL6         ; 2 ciclos delay
PDelL6    goto PDelL7         ; 2 ciclos delay
PDelL7    clrwdt              ; 1 ciclo delay
          return              ; 2+2 Fin.
;-----------------------------------------------------------


;---------------------Error de posición---------------------

ERRORPOSICION
	movlw 0x02
	movwf PORTB     ;activo giro a izqdas
espera3 
	btfss PORTA,3     ;no hago nada hasta que se
	goto  espera3   ;activa de nuevo F1
	clrf  PORTB     ;entonces paro el motor y regreso
	return
;-----------------------------------------------------------


;------------------------------------------
	end ; se acabó
;------------------------------------------
