;---------------Encabezado-------------
LIST p=16f876A
include "p16F876A.inc"
radix hex
__config _XT_OSC & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF
;------------Configuración de registros de uso General---------
PDel0 equ 0x21 ;registros para los
PDel1 equ 0x22 ; retardos
PDel2 equ 0x23
;------------Definiciones---------
#DEFINE DESACTIVADO PORTA,0
#DEFINE VELOCIDAD PORTA,1
#DEFINE F1 PORTA,3
#DEFINE F2 PORTA,4
;------------------Configuración de puertos-----------------
ERRORLEVEL -302
reset org 0x00 ; origen del programa, aquí comenzará
; siempre que ocurra un reset
goto inicio ; salta a "inicio"
inicio bsf STATUS,RP0 ; pone rp0 a 1 y pasa al banco1
movlw 0x06
movwf ADCON1 ;todas entradas digitales!
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,RP0 ; pone rp0 a 0 y regresa al banco0
;---------------------Lectura de entradas------------------------
bucle
clrf PORTB ;salidas a cero
btfsc DESACTIVADO ;salta la sig instrucción si RA0=0
goto bucle ;si el conmutador está en paro no hace nada
btfss F1 ;si está pulsado F1 salto la siguiente
call ERRORPOSICION
btfsc VELOCIDAD ;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
movlw 0x01
movwf PORTB
espera
btfss F2 ;no hago nada hasta que se
goto espera ;activa el F2
clrf PORTB ;paro el motor
call TRESEG ;espero 3 seg antes de invertir
movlw 0x02 ;activo el giro a izqdas
movwf PORTB
esperar
btfss F1 ;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 F2 ;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 F1 ;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 F1 ;no hago nada hasta que se
goto espera3 ;activa de nuevo F1
clrf PORTB ;entonces paro el motor y regreso
return
;-----------------------------------------------------------
;------------------------------------------
end ; se acabó
;------------------------------------------